cdk-nextjs 0.6.2 → 0.7.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/.jsii +2404 -2723
- package/.jsii.tabl.json +1 -1
- package/API.md +1681 -1930
- package/CLAUDE.md +2 -1
- package/README.md +429 -130
- package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +148 -169
- package/assets/lambdas/redeploy-stage/redeploy-stage.lambda/index.js +875 -0
- package/docs/adapter-runtime.md +185 -0
- package/docs/breaking-changes.md +667 -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 +1551 -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 +857 -0
- package/lib/adapter/build-outputs.test.d.ts +1 -0
- package/lib/adapter/build-outputs.test.js +863 -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 +8 -0
- package/lib/generated-structs/OptionalNextjsPostDeployProps.js +1 -1
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +6 -4
- 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/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 +14 -5
- package/lib/lambdas/post-deploy/prune-s3.js +41 -12
- package/lib/lambdas/post-deploy/prune-s3.test.js +97 -18
- 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 +102 -18
- package/lib/nextjs-api.js +338 -38
- package/lib/nextjs-api.test.js +537 -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 +13 -5
- package/lib/nextjs-post-deploy.js +13 -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 +17 -4
- package/lib/nextjs-static-assets.js +22 -5
- package/lib/root-constructs/nextjs-base-construct.d.ts +102 -58
- package/lib/root-constructs/nextjs-base-construct.js +139 -47
- package/lib/root-constructs/nextjs-global-containers.d.ts +18 -20
- package/lib/root-constructs/nextjs-global-containers.js +20 -71
- package/lib/root-constructs/nextjs-global-functions.d.ts +26 -28
- package/lib/root-constructs/nextjs-global-functions.js +52 -70
- package/lib/root-constructs/nextjs-regional-containers.d.ts +18 -5
- package/lib/root-constructs/nextjs-regional-containers.js +8 -15
- package/lib/root-constructs/nextjs-regional-functions.d.ts +22 -18
- package/lib/root-constructs/nextjs-regional-functions.js +8 -26
- 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 +1216 -0
- package/lib/runtime/core.test.d.ts +1 -0
- package/lib/runtime/core.test.js +1686 -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 +41600 -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 +71 -0
- package/lib/runtime/next-modules.js +144 -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 +41593 -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 +106 -13
- package/lib/utils/base-path.js +254 -41
- package/lib/utils/base-path.test.js +219 -51
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/* eslint-disable import/no-extraneous-dependencies */
|
|
4
|
+
const node_child_process_1 = require("node:child_process");
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
const node_os_1 = require("node:os");
|
|
7
|
+
const node_path_1 = require("node:path");
|
|
8
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
9
|
+
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
10
|
+
const nextjs_build_1 = require("./nextjs-build");
|
|
11
|
+
const constants_1 = require("../constants");
|
|
12
|
+
let dir;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
dir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), "nextjs-build-test-"));
|
|
15
|
+
});
|
|
16
|
+
afterEach(() => {
|
|
17
|
+
(0, node_fs_1.rmSync)(dir, { recursive: true, force: true });
|
|
18
|
+
});
|
|
19
|
+
function write(path, content) {
|
|
20
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.join)(path, ".."), { recursive: true });
|
|
21
|
+
(0, node_fs_1.writeFileSync)(path, content);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The layout pnpm stages: `sharp`'s files in the virtual store, reached through
|
|
25
|
+
* links from the app and from `next`.
|
|
26
|
+
*/
|
|
27
|
+
function stagePnpmSharp(root) {
|
|
28
|
+
const store = (0, node_path_1.join)(root, "node_modules/.pnpm/sharp@0.34.5/node_modules/sharp");
|
|
29
|
+
write((0, node_path_1.join)(store, "package.json"), JSON.stringify({ name: "sharp", main: "index.js" }));
|
|
30
|
+
write((0, node_path_1.join)(store, "index.js"), 'module.exports = require("@img/sharp-linux-x64");');
|
|
31
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.join)(root, "node_modules/.pnpm/next@16/node_modules"), {
|
|
32
|
+
recursive: true,
|
|
33
|
+
});
|
|
34
|
+
(0, node_fs_1.symlinkSync)("../../sharp@0.34.5/node_modules/sharp", (0, node_path_1.join)(root, "node_modules/.pnpm/next@16/node_modules/sharp"));
|
|
35
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.join)(root, "apps/web/node_modules"), { recursive: true });
|
|
36
|
+
(0, node_fs_1.symlinkSync)("../../../node_modules/.pnpm/sharp@0.34.5/node_modules/sharp", (0, node_path_1.join)(root, "apps/web/node_modules/sharp"));
|
|
37
|
+
}
|
|
38
|
+
describe("sharpBinaryDir", () => {
|
|
39
|
+
it("is reachable from every copy of sharp, links kept or dereferenced", () => {
|
|
40
|
+
// The zip and the image keep links, so the store copy loads; a dereferenced
|
|
41
|
+
// copy resolves `@img/...` from where it sits, never from the store.
|
|
42
|
+
const staged = (0, node_path_1.join)(dir, "staged");
|
|
43
|
+
stagePnpmSharp(staged);
|
|
44
|
+
const binary = (0, node_path_1.join)((0, nextjs_build_1.sharpBinaryDir)(staged), "sharp-linux-x64");
|
|
45
|
+
write((0, node_path_1.join)(binary, "package.json"), JSON.stringify({ name: "@img/sharp-linux-x64", main: "index.js" }));
|
|
46
|
+
write((0, node_path_1.join)(binary, "index.js"), 'module.exports = "loaded";');
|
|
47
|
+
const zipped = (0, node_path_1.join)(dir, "zipped");
|
|
48
|
+
// `cp -RL`, not `cpSync`'s `dereference`, which only resolves the top-level
|
|
49
|
+
// source and re-links everything under it to the original.
|
|
50
|
+
(0, node_child_process_1.execFileSync)("cp", ["-RL", staged, zipped]);
|
|
51
|
+
for (const root of [staged, zipped]) {
|
|
52
|
+
for (const copy of [
|
|
53
|
+
"apps/web/node_modules/sharp",
|
|
54
|
+
"node_modules/.pnpm/next@16/node_modules/sharp",
|
|
55
|
+
"node_modules/.pnpm/sharp@0.34.5/node_modules/sharp",
|
|
56
|
+
]) {
|
|
57
|
+
// A real `node`, not jest's `require`, whose resolver differs from
|
|
58
|
+
// Node's in how it walks up from a module.
|
|
59
|
+
expect((0, node_child_process_1.execFileSync)(process.execPath, ["-p", `require(${JSON.stringify((0, node_path_1.join)(root, copy))})`], { encoding: "utf-8" }).trim()).toBe("loaded");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
describe("isSharpBinaryPackage", () => {
|
|
65
|
+
it.each([
|
|
66
|
+
["node_modules/@img", "sharp-linux-x64", true],
|
|
67
|
+
["node_modules/@img", "sharp-linuxmusl-arm64", true],
|
|
68
|
+
["node_modules/@img", "sharp-libvips-darwin-arm64", true],
|
|
69
|
+
["apps/web/node_modules/@img", "sharp-darwin-arm64", true],
|
|
70
|
+
["node_modules/.pnpm", "@img+sharp-darwin-arm64@0.34.5", true],
|
|
71
|
+
["node_modules/.pnpm", "@img+sharp-libvips-darwin-arm64@1.2.4", true],
|
|
72
|
+
[
|
|
73
|
+
"node_modules/.pnpm/sharp@0.34.5/node_modules/@img",
|
|
74
|
+
"sharp-linux-x64",
|
|
75
|
+
true,
|
|
76
|
+
],
|
|
77
|
+
// A route segment, not a package.
|
|
78
|
+
[".next/server/app", "sharp-edges", false],
|
|
79
|
+
// Unrelated `sharp-` dependencies.
|
|
80
|
+
["node_modules", "sharp-ico", false],
|
|
81
|
+
["node_modules/.pnpm", "sharp-phash@2.0.0", false],
|
|
82
|
+
["node_modules/.pnpm", "sharp@0.34.5", false],
|
|
83
|
+
// `sharp` itself, the JS wrapper that loads the binary.
|
|
84
|
+
["node_modules", "sharp", false],
|
|
85
|
+
["node_modules/@img", "colour", false],
|
|
86
|
+
// App directories that happen to share the names, outside `node_modules`.
|
|
87
|
+
["apps/web/@img", "sharp-linux-x64", false],
|
|
88
|
+
["apps/web/.pnpm", "@img+sharp-linux-x64@0.34.5", false],
|
|
89
|
+
])("%s/%s is %s", (parent, name, expected) => {
|
|
90
|
+
expect((0, nextjs_build_1.isSharpBinaryPackage)((0, node_path_1.join)(dir, parent), name)).toBe(expected);
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe("pickStagedSharpPackage", () => {
|
|
94
|
+
it("returns undefined when the tree has no sharp", () => {
|
|
95
|
+
expect((0, nextjs_build_1.pickStagedSharpPackage)([])).toBeUndefined();
|
|
96
|
+
});
|
|
97
|
+
it("prefers the shortest path, the closest to a hoisted install", () => {
|
|
98
|
+
expect((0, nextjs_build_1.pickStagedSharpPackage)([
|
|
99
|
+
"/r/node_modules/.pnpm/sharp@0.34.5/node_modules/sharp",
|
|
100
|
+
"/r/apps/web/node_modules/sharp",
|
|
101
|
+
"/r/node_modules/sharp",
|
|
102
|
+
])).toBe("/r/node_modules/sharp");
|
|
103
|
+
});
|
|
104
|
+
it("breaks a length tie by name, whatever order the walk found them in", () => {
|
|
105
|
+
const a = "/r/node_modules/.pnpm/sharp@0.34.4/node_modules/sharp";
|
|
106
|
+
const b = "/r/node_modules/.pnpm/sharp@0.34.5/node_modules/sharp";
|
|
107
|
+
expect((0, nextjs_build_1.pickStagedSharpPackage)([b, a])).toBe(a);
|
|
108
|
+
expect((0, nextjs_build_1.pickStagedSharpPackage)([a, b])).toBe(a);
|
|
109
|
+
});
|
|
110
|
+
// npm nests next's own `sharp` when the app's hoisted one is another version;
|
|
111
|
+
// the binaries have to match the copy the image optimizer loads.
|
|
112
|
+
it("picks the copy the staged next resolves, over a shorter one", () => {
|
|
113
|
+
const root = (0, node_path_1.join)(dir, "staged");
|
|
114
|
+
const hoisted = (0, node_path_1.join)(root, "node_modules/sharp");
|
|
115
|
+
const nested = (0, node_path_1.join)(root, "node_modules/next/node_modules/sharp");
|
|
116
|
+
for (const sharp of [hoisted, nested]) {
|
|
117
|
+
write((0, node_path_1.join)(sharp, "package.json"), JSON.stringify({ name: "sharp", main: "index.js" }));
|
|
118
|
+
write((0, node_path_1.join)(sharp, "index.js"), "");
|
|
119
|
+
}
|
|
120
|
+
write((0, node_path_1.join)(root, "node_modules/next/package.json"), JSON.stringify({ name: "next" }));
|
|
121
|
+
const nextSharp = (0, nextjs_build_1.resolveNextSharp)((0, node_path_1.join)(root, "apps/web"));
|
|
122
|
+
expect(nextSharp).toBe((0, node_path_1.join)((0, node_fs_1.realpathSync)(nested), "index.js"));
|
|
123
|
+
expect((0, nextjs_build_1.pickStagedSharpPackage)([hoisted, nested], nextSharp)).toBe(nested);
|
|
124
|
+
});
|
|
125
|
+
it("resolves nothing when the staged tree has no next", () => {
|
|
126
|
+
expect((0, nextjs_build_1.resolveNextSharp)((0, node_path_1.join)(dir, "apps/web"))).toBeUndefined();
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
describe("Sharp staging for the deployment target", () => {
|
|
130
|
+
// A version no real `sharp` pins, so the tarballs seeded into the shared
|
|
131
|
+
// download cache below are never mistaken for (or clobber) real ones.
|
|
132
|
+
const VERSION = "0.0.0-cdk-nextjs-test";
|
|
133
|
+
const cacheDir = (0, node_path_1.join)((0, node_os_1.tmpdir)(), "cdk-nextjs-sharp-cache");
|
|
134
|
+
const seeded = [];
|
|
135
|
+
afterAll(() => {
|
|
136
|
+
for (const file of seeded)
|
|
137
|
+
(0, node_fs_1.rmSync)(file, { force: true });
|
|
138
|
+
});
|
|
139
|
+
/** Seed the download cache so the install runs without the registry. */
|
|
140
|
+
function seedCache(name) {
|
|
141
|
+
const pkg = (0, node_path_1.join)(dir, "tgz", name, "package");
|
|
142
|
+
write((0, node_path_1.join)(pkg, "package.json"), JSON.stringify({ name: `@img/${name}` }));
|
|
143
|
+
(0, node_fs_1.mkdirSync)(cacheDir, { recursive: true });
|
|
144
|
+
const tgz = (0, node_path_1.join)(cacheDir, `${name}-${VERSION}.tgz`);
|
|
145
|
+
(0, node_child_process_1.execFileSync)("tar", ["-czf", tgz, "-C", (0, node_path_1.join)(pkg, ".."), "package"]);
|
|
146
|
+
seeded.push(tgz);
|
|
147
|
+
}
|
|
148
|
+
// Private: the methods `NextjsBuild` runs per deployment root, which only
|
|
149
|
+
// touch the filesystem, so they run here without a construct.
|
|
150
|
+
const build = nextjs_build_1.NextjsBuild.prototype;
|
|
151
|
+
/** A staged pnpm `sharp` that pins test-version binaries for `platform`. */
|
|
152
|
+
function stagePinnedSharp(root, platform) {
|
|
153
|
+
stagePnpmSharp(root);
|
|
154
|
+
write((0, node_path_1.join)(root, "node_modules/.pnpm/sharp@0.34.5/node_modules/sharp/package.json"), JSON.stringify({
|
|
155
|
+
name: "sharp",
|
|
156
|
+
version: "0.34.5",
|
|
157
|
+
optionalDependencies: {
|
|
158
|
+
[`@img/sharp-${platform}`]: VERSION,
|
|
159
|
+
[`@img/sharp-libvips-${platform}`]: VERSION,
|
|
160
|
+
},
|
|
161
|
+
}));
|
|
162
|
+
for (const name of [`sharp-${platform}`, `sharp-libvips-${platform}`]) {
|
|
163
|
+
seedCache(name);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
it.each([
|
|
167
|
+
["linux-x64", "darwin-arm64"],
|
|
168
|
+
["linux-arm64", "linux-x64"],
|
|
169
|
+
["linuxmusl-arm64", "linux-x64"],
|
|
170
|
+
])("replaces the host's binaries with %s ones, leaving look-alikes", (platform, host) => {
|
|
171
|
+
const root = (0, node_path_1.join)(dir, "staged");
|
|
172
|
+
stagePnpmSharp(root);
|
|
173
|
+
const store = (0, node_path_1.join)(root, "node_modules/.pnpm/sharp@0.34.5/node_modules/sharp");
|
|
174
|
+
write((0, node_path_1.join)(store, "package.json"), JSON.stringify({
|
|
175
|
+
name: "sharp",
|
|
176
|
+
version: "0.34.5",
|
|
177
|
+
optionalDependencies: {
|
|
178
|
+
[`@img/sharp-${platform}`]: VERSION,
|
|
179
|
+
[`@img/sharp-libvips-${platform}`]: VERSION,
|
|
180
|
+
},
|
|
181
|
+
}));
|
|
182
|
+
// The host's binaries as pnpm stages them: in the store, linked from
|
|
183
|
+
// next to `sharp`, and (hoisted) at the root.
|
|
184
|
+
for (const name of [`sharp-${host}`, `sharp-libvips-${host}`]) {
|
|
185
|
+
write((0, node_path_1.join)(root, `node_modules/.pnpm/@img+${name}@0.34.5/node_modules/@img/${name}/package.json`), "{}");
|
|
186
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.join)(root, "node_modules/.pnpm/sharp@0.34.5/node_modules/@img"), { recursive: true });
|
|
187
|
+
(0, node_fs_1.symlinkSync)(`../../../@img+${name}@0.34.5/node_modules/@img/${name}`, (0, node_path_1.join)(root, `node_modules/.pnpm/sharp@0.34.5/node_modules/@img/${name}`));
|
|
188
|
+
write((0, node_path_1.join)(root, `node_modules/@img/${name}/package.json`), "{}");
|
|
189
|
+
}
|
|
190
|
+
const lookalikes = [
|
|
191
|
+
"apps/web/.next/server/app/sharp-edges/page.js",
|
|
192
|
+
"node_modules/.pnpm/sharp-ico@0.1.5/node_modules/sharp-ico/package.json",
|
|
193
|
+
"apps/web/node_modules/sharp-ico/package.json",
|
|
194
|
+
];
|
|
195
|
+
for (const file of lookalikes)
|
|
196
|
+
write((0, node_path_1.join)(root, file), "");
|
|
197
|
+
for (const name of [`sharp-${platform}`, `sharp-libvips-${platform}`]) {
|
|
198
|
+
seedCache(name);
|
|
199
|
+
}
|
|
200
|
+
const source = build.removeExistingSharpBinaries(root, (0, node_path_1.join)(root, "apps/web"));
|
|
201
|
+
expect(source).toBe(store);
|
|
202
|
+
build.stageSharpForTarget({ name: "default", path: root }, (0, node_path_1.join)(root, "apps/web"), platform);
|
|
203
|
+
expect((0, node_fs_1.readdirSync)((0, nextjs_build_1.sharpBinaryDir)(root)).sort()).toEqual([`sharp-${platform}`, `sharp-libvips-${platform}`].sort());
|
|
204
|
+
expect(JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)((0, nextjs_build_1.sharpBinaryDir)(root), `sharp-${platform}/package.json`), "utf-8")).name).toBe(`@img/sharp-${platform}`);
|
|
205
|
+
// No host binary survives, dangling link or otherwise.
|
|
206
|
+
expect((0, nextjs_build_1.listTree)(root).filter((entry) => entry.name.includes(host))).toEqual([]);
|
|
207
|
+
for (const file of lookalikes) {
|
|
208
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.join)(root, file))).toBe(true);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
it("warns and installs nothing when the build staged no sharp", () => {
|
|
212
|
+
const root = (0, node_path_1.join)(dir, "staged");
|
|
213
|
+
write((0, node_path_1.join)(root, "apps/web/server.js"), "");
|
|
214
|
+
const warn = jest.spyOn(console, "warn").mockImplementation(() => { });
|
|
215
|
+
const source = build.removeExistingSharpBinaries(root, (0, node_path_1.join)(root, "apps/web"));
|
|
216
|
+
expect(source).toBeUndefined();
|
|
217
|
+
build.stageSharpForTarget({ name: "default", path: root }, (0, node_path_1.join)(root, "apps/web"), "linux-arm64");
|
|
218
|
+
expect((0, node_fs_1.existsSync)((0, nextjs_build_1.sharpBinaryDir)(root))).toBe(false);
|
|
219
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('"sharp" not found'));
|
|
220
|
+
warn.mockRestore();
|
|
221
|
+
});
|
|
222
|
+
describe("per function group", () => {
|
|
223
|
+
const platform = "linux-arm64";
|
|
224
|
+
const stage = (name) => build.stageSharpForTarget({ name, path: (0, node_path_1.join)(dir, "staged") }, (0, node_path_1.join)(dir, "staged/apps/web"), platform);
|
|
225
|
+
// Only `default` serves `/_next/image`, so a group without sharp is normal.
|
|
226
|
+
it("installs nothing and stays quiet for a group without sharp", () => {
|
|
227
|
+
write((0, node_path_1.join)(dir, "staged/apps/web/server.js"), "");
|
|
228
|
+
const warn = jest.spyOn(console, "warn").mockImplementation(() => { });
|
|
229
|
+
stage("api");
|
|
230
|
+
expect((0, node_fs_1.existsSync)((0, nextjs_build_1.sharpBinaryDir)((0, node_path_1.join)(dir, "staged")))).toBe(false);
|
|
231
|
+
expect(warn).not.toHaveBeenCalled();
|
|
232
|
+
warn.mockRestore();
|
|
233
|
+
});
|
|
234
|
+
it("warns for default without sharp, which can't optimize images", () => {
|
|
235
|
+
write((0, node_path_1.join)(dir, "staged/apps/web/server.js"), "");
|
|
236
|
+
const warn = jest.spyOn(console, "warn").mockImplementation(() => { });
|
|
237
|
+
stage("default");
|
|
238
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('"sharp" not found'));
|
|
239
|
+
warn.mockRestore();
|
|
240
|
+
});
|
|
241
|
+
it("installs the target's binaries for a group whose own routes use sharp", () => {
|
|
242
|
+
stagePinnedSharp((0, node_path_1.join)(dir, "staged"), platform);
|
|
243
|
+
stage("api");
|
|
244
|
+
expect((0, node_fs_1.readdirSync)((0, nextjs_build_1.sharpBinaryDir)((0, node_path_1.join)(dir, "staged"))).sort()).toEqual([`sharp-${platform}`, `sharp-libvips-${platform}`].sort());
|
|
245
|
+
});
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
describe("deploymentBuildId", () => {
|
|
249
|
+
it("is Next.js's build ID when the app sets no deploymentId", () => {
|
|
250
|
+
expect((0, nextjs_build_1.deploymentBuildId)({ buildId: "b1", config: { deploymentId: "" } })).toBe("b1");
|
|
251
|
+
});
|
|
252
|
+
// With `NEXT_DEPLOYMENT_ID`, Next's BUILD_ID is a constant, so without the
|
|
253
|
+
// suffix every deployment would share one cache partition.
|
|
254
|
+
it("is suffixed with the deploymentId when the app sets one", () => {
|
|
255
|
+
expect((0, nextjs_build_1.deploymentBuildId)({ buildId: "b1", config: { deploymentId: "d7" } })).toBe("b1-d7");
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
describe("listTree", () => {
|
|
259
|
+
it("lists links without descending into them, so a cycle ends", () => {
|
|
260
|
+
write((0, node_path_1.join)(dir, "packages/a/index.js"), "");
|
|
261
|
+
write((0, node_path_1.join)(dir, "packages/b/index.js"), "");
|
|
262
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.join)(dir, "packages/a/node_modules/@org"), { recursive: true });
|
|
263
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.join)(dir, "packages/b/node_modules/@org"), { recursive: true });
|
|
264
|
+
(0, node_fs_1.symlinkSync)("../../../b", (0, node_path_1.join)(dir, "packages/a/node_modules/@org/b"));
|
|
265
|
+
(0, node_fs_1.symlinkSync)("../../../a", (0, node_path_1.join)(dir, "packages/b/node_modules/@org/a"));
|
|
266
|
+
const files = (0, nextjs_build_1.listTree)(dir)
|
|
267
|
+
.filter((entry) => entry.name === "index.js")
|
|
268
|
+
.map((entry) => entry.parentPath);
|
|
269
|
+
expect(files.sort()).toEqual([
|
|
270
|
+
(0, node_path_1.join)(dir, "packages/a"),
|
|
271
|
+
(0, node_path_1.join)(dir, "packages/b"),
|
|
272
|
+
]);
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
describe("storedSize", () => {
|
|
276
|
+
it("counts a link as its target path, as the zip stores it", () => {
|
|
277
|
+
write((0, node_path_1.join)(dir, "store/pkg/file"), "x".repeat(100));
|
|
278
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.join)(dir, "a"));
|
|
279
|
+
(0, node_fs_1.symlinkSync)("../store/pkg", (0, node_path_1.join)(dir, "a/pkg"));
|
|
280
|
+
expect((0, nextjs_build_1.storedSize)(dir)).toBe(100 + "../store/pkg".length);
|
|
281
|
+
});
|
|
282
|
+
it("terminates on a cycle and counts a dangling link", () => {
|
|
283
|
+
write((0, node_path_1.join)(dir, "a/file"), "x".repeat(10));
|
|
284
|
+
(0, node_fs_1.symlinkSync)("..", (0, node_path_1.join)(dir, "a/up"));
|
|
285
|
+
(0, node_fs_1.symlinkSync)("missing", (0, node_path_1.join)(dir, "a/dangling"));
|
|
286
|
+
expect((0, nextjs_build_1.storedSize)(dir)).toBe(10 + "..".length + "missing".length);
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
describe("patchClientChunk", () => {
|
|
290
|
+
const chunk = "console.log('app');";
|
|
291
|
+
it("prepends the patch once", () => {
|
|
292
|
+
const patched = (0, nextjs_build_1.patchClientChunk)(chunk, "PATCH_V1", "chunk.js");
|
|
293
|
+
expect(patched).toMatch(/^\/\* cdk-nextjs:patch-fetch [0-9a-f]{16} \*\/\n/);
|
|
294
|
+
expect(patched).toContain("PATCH_V1");
|
|
295
|
+
expect(patched.endsWith(`\n${chunk}`)).toBe(true);
|
|
296
|
+
expect((0, nextjs_build_1.patchClientChunk)(patched, "PATCH_V1", "chunk.js")).toBeUndefined();
|
|
297
|
+
});
|
|
298
|
+
it("replaces a patch from another cdk-nextjs version", () => {
|
|
299
|
+
const old = (0, nextjs_build_1.patchClientChunk)(chunk, "PATCH_V1", "chunk.js");
|
|
300
|
+
const updated = (0, nextjs_build_1.patchClientChunk)(old, "PATCH_V2", "chunk.js");
|
|
301
|
+
expect(updated).toContain("PATCH_V2");
|
|
302
|
+
expect(updated).not.toContain("PATCH_V1");
|
|
303
|
+
expect(updated.endsWith(`\n${chunk}`)).toBe(true);
|
|
304
|
+
expect(updated).toBe((0, nextjs_build_1.patchClientChunk)(chunk, "PATCH_V2", "chunk.js"));
|
|
305
|
+
});
|
|
306
|
+
it("refuses a patch without an end marker rather than stacking on it", () => {
|
|
307
|
+
expect(() => (0, nextjs_build_1.patchClientChunk)(`/* cdk-nextjs:patch-fetch */\nOLD\n${chunk}`, "PATCH_V2", "chunk.js")).toThrow(/Re-run `next build`/);
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
describe("writePublicFileList", () => {
|
|
311
|
+
it("lists public/ the way the runtime lists it off disk", () => {
|
|
312
|
+
// Written at synth, after the build command, so a `postbuild` file (here
|
|
313
|
+
// `sitemap.xml`) is listed; a linked directory is followed.
|
|
314
|
+
const publicDir = (0, node_path_1.join)(dir, "public");
|
|
315
|
+
write((0, node_path_1.join)(publicDir, "sitemap.xml"), "<urlset/>");
|
|
316
|
+
write((0, node_path_1.join)(publicDir, "images", "logo@2x.png"), "png");
|
|
317
|
+
write((0, node_path_1.join)(dir, "shared", "hello e2e.txt"), "hi");
|
|
318
|
+
(0, node_fs_1.symlinkSync)((0, node_path_1.join)(dir, "shared"), (0, node_path_1.join)(publicDir, "static"));
|
|
319
|
+
const runtimeDir = (0, node_path_1.join)(dir, "cdk-nextjs-runtime");
|
|
320
|
+
(0, node_fs_1.mkdirSync)(runtimeDir);
|
|
321
|
+
(0, nextjs_build_1.writePublicFileList)(runtimeDir, publicDir);
|
|
322
|
+
expect(JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(runtimeDir, "public-files.json"), "utf-8"))).toEqual(["images/logo@2x.png", "sitemap.xml", "static/hello e2e.txt"]);
|
|
323
|
+
});
|
|
324
|
+
it("writes an empty list for an app without public/", () => {
|
|
325
|
+
(0, nextjs_build_1.writePublicFileList)(dir, (0, node_path_1.join)(dir, "public"));
|
|
326
|
+
expect(JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(dir, "public-files.json"), "utf-8"))).toEqual([]);
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
describe("NextjsBuild with skipBuild and no build output", () => {
|
|
330
|
+
it("reports the missing adapter manifest, not a bare ENOENT", () => {
|
|
331
|
+
// `GLOBAL_FUNCTIONS` patches `.next/static/chunks`, which used to be read
|
|
332
|
+
// first and fail on the missing directory.
|
|
333
|
+
expect(() => new nextjs_build_1.NextjsBuild(new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), "Stack"), "Build", {
|
|
334
|
+
buildCommand: "true",
|
|
335
|
+
buildDirectory: dir,
|
|
336
|
+
nextjsType: constants_1.NextjsType.GLOBAL_FUNCTIONS,
|
|
337
|
+
skipBuild: true,
|
|
338
|
+
})).toThrow(/cdk-nextjs adapter manifest not found/);
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
describe("NextjsBuild with a build split by other functionGroups", () => {
|
|
342
|
+
it("rejects a build whose groups kept their names but not their routes", () => {
|
|
343
|
+
// Moving `/reports/**` into `api` keeps the group names, and a names-only
|
|
344
|
+
// check let CloudFront send `reports/*` to a zip without those routes.
|
|
345
|
+
write((0, node_path_1.join)(dir, ".next", "BUILD_ID"), "b1");
|
|
346
|
+
write((0, node_path_1.join)(dir, ".next", "cdk-nextjs-adapter", "manifest.json"), JSON.stringify({
|
|
347
|
+
version: 1,
|
|
348
|
+
buildId: "b1",
|
|
349
|
+
relativeProjectDir: "",
|
|
350
|
+
config: { basePath: "", assetPrefix: "", trailingSlash: false },
|
|
351
|
+
entrypoints: {},
|
|
352
|
+
groups: { default: [], api: [] },
|
|
353
|
+
functionGroups: [{ name: "api", routes: ["/api/**"] }],
|
|
354
|
+
}));
|
|
355
|
+
expect(() => new nextjs_build_1.NextjsBuild(new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), "Stack"), "Build", {
|
|
356
|
+
buildCommand: "true",
|
|
357
|
+
buildDirectory: dir,
|
|
358
|
+
nextjsType: constants_1.NextjsType.REGIONAL_FUNCTIONS,
|
|
359
|
+
skipBuild: true,
|
|
360
|
+
functionGroups: [{ name: "api", routes: ["/api/**", "/reports/**"] }],
|
|
361
|
+
})).toThrow(/build output is\s+stale/);
|
|
362
|
+
});
|
|
363
|
+
it("accepts a build whose groups and routes were only listed in another order", () => {
|
|
364
|
+
// Only the stale check is under test: past it, the unstaged roots throw.
|
|
365
|
+
write((0, node_path_1.join)(dir, ".next", "BUILD_ID"), "b1");
|
|
366
|
+
write((0, node_path_1.join)(dir, ".next", "cdk-nextjs-adapter", "manifest.json"), JSON.stringify({
|
|
367
|
+
version: 1,
|
|
368
|
+
buildId: "b1",
|
|
369
|
+
relativeProjectDir: "",
|
|
370
|
+
config: { basePath: "", assetPrefix: "", trailingSlash: false },
|
|
371
|
+
entrypoints: {},
|
|
372
|
+
groups: { default: [], api: [], docs: [] },
|
|
373
|
+
functionGroups: [
|
|
374
|
+
{ name: "api", routes: ["/api/**", "/reports/**"] },
|
|
375
|
+
{ name: "docs", routes: ["/docs/**"] },
|
|
376
|
+
],
|
|
377
|
+
}));
|
|
378
|
+
expect(() => new nextjs_build_1.NextjsBuild(new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), "Stack"), "Build", {
|
|
379
|
+
buildCommand: "true",
|
|
380
|
+
buildDirectory: dir,
|
|
381
|
+
nextjsType: constants_1.NextjsType.REGIONAL_FUNCTIONS,
|
|
382
|
+
skipBuild: true,
|
|
383
|
+
functionGroups: [
|
|
384
|
+
{ name: "docs", routes: ["/docs/**"] },
|
|
385
|
+
{ name: "api", routes: ["/reports/**", "/api/**"] },
|
|
386
|
+
],
|
|
387
|
+
})).not.toThrow(/stale/);
|
|
388
|
+
});
|
|
389
|
+
});
|
|
390
|
+
describe("deploymentArchitecture", () => {
|
|
391
|
+
const base = { buildCommand: "", buildDirectory: "" };
|
|
392
|
+
const functions = { ...base, nextjsType: constants_1.NextjsType.GLOBAL_FUNCTIONS };
|
|
393
|
+
const host = process.arch.startsWith("arm") ? "arm64" : "x86_64";
|
|
394
|
+
it("stages the Functions types for the synth machine unless told otherwise", () => {
|
|
395
|
+
expect((0, nextjs_build_1.deploymentArchitecture)(functions).name).toBe(host);
|
|
396
|
+
});
|
|
397
|
+
// The point of honoring the prop: `sharp` for another architecture is only
|
|
398
|
+
// a download, so the build no longer has to run where the function will.
|
|
399
|
+
it("stages for the architecture asked for, not the synth machine's", () => {
|
|
400
|
+
const other = host === "arm64" ? aws_lambda_1.Architecture.X86_64 : aws_lambda_1.Architecture.ARM_64;
|
|
401
|
+
expect((0, nextjs_build_1.deploymentArchitecture)({ ...functions, architecture: other })).toBe(other);
|
|
402
|
+
});
|
|
403
|
+
it("follows the synth machine for the Containers types", () => {
|
|
404
|
+
const props = {
|
|
405
|
+
...base,
|
|
406
|
+
nextjsType: constants_1.NextjsType.REGIONAL_CONTAINERS,
|
|
407
|
+
architecture: host === "arm64" ? aws_lambda_1.Architecture.X86_64 : aws_lambda_1.Architecture.ARM_64,
|
|
408
|
+
};
|
|
409
|
+
expect((0, nextjs_build_1.deploymentArchitecture)(props).name).toBe(host);
|
|
410
|
+
});
|
|
411
|
+
});
|
|
412
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJ1aWxkLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmV4dGpzLWJ1aWxkL25leHRqcy1idWlsZC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0RBQXNEO0FBQ3RELDJEQUFrRDtBQUNsRCxxQ0FVaUI7QUFDakIscUNBQWlDO0FBQ2pDLHlDQUFpQztBQUNqQyw2Q0FBeUM7QUFDekMsdURBQXNEO0FBQ3RELGlEQVl3QjtBQUN4Qiw0Q0FBMEM7QUFFMUMsSUFBSSxHQUFXLENBQUM7QUFFaEIsVUFBVSxDQUFDLEdBQUcsRUFBRTtJQUNkLEdBQUcsR0FBRyxJQUFBLHFCQUFXLEVBQUMsSUFBQSxnQkFBSSxFQUFDLElBQUEsZ0JBQU0sR0FBRSxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQztBQUMxRCxDQUFDLENBQUMsQ0FBQztBQUVILFNBQVMsQ0FBQyxHQUFHLEVBQUU7SUFDYixJQUFBLGdCQUFNLEVBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNoRCxDQUFDLENBQUMsQ0FBQztBQUVILFNBQVMsS0FBSyxDQUFDLElBQVksRUFBRSxPQUFlO0lBQzFDLElBQUEsbUJBQVMsRUFBQyxJQUFBLGdCQUFJLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDakQsSUFBQSx1QkFBYSxFQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxjQUFjLENBQUMsSUFBWTtJQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFBLGdCQUFJLEVBQ2hCLElBQUksRUFDSixvREFBb0QsQ0FDckQsQ0FBQztJQUNGLEtBQUssQ0FDSCxJQUFBLGdCQUFJLEVBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxFQUMzQixJ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QyxDQUFDO0lBQ3hELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCB7IGV4ZWNGaWxlU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7XG4gIGV4aXN0c1N5bmMsXG4gIG1rZGlyU3luYyxcbiAgbWtkdGVtcFN5bmMsXG4gIHJlYWRkaXJTeW5jLFxuICByZWFkRmlsZVN5bmMsXG4gIHJlYWxwYXRoU3luYyxcbiAgcm1TeW5jLFxuICBzeW1saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luYyxcbn0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQXBwLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQXJjaGl0ZWN0dXJlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7XG4gIGRlcGxveW1lbnRBcmNoaXRlY3R1cmUsXG4gIGRlcGxveW1lbnRCdWlsZElkLFxuICBpc1NoYXJwQmluYXJ5UGFja2FnZSxcbiAgbGlzdFRyZWUsXG4gIE5leHRqc0J1aWxkLFxuICBwYXRjaENsaWVudENodW5rLFxuICBwaWNrU3RhZ2VkU2hhcnBQYWNrYWdlLFxuICByZXNvbHZlTmV4dFNoYXJwLFxuICBzaGFycEJpbmFyeURpcixcbiAgc3RvcmVkU2l6ZSxcbiAgd3JpdGVQdWJsaWNGaWxlTGlzdCxcbn0gZnJvbSBcIi4vbmV4dGpzLWJ1aWxkXCI7XG5pbXBvcnQgeyBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5sZXQgZGlyOiBzdHJpbmc7XG5cbmJlZm9yZUVhY2goKCkgPT4ge1xuICBkaXIgPSBta2R0ZW1wU3luYyhqb2luKHRtcGRpcigpLCBcIm5leHRqcy1idWlsZC10ZXN0LVwiKSk7XG59KTtcblxuYWZ0ZXJFYWNoKCgpID0+IHtcbiAgcm1TeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xufSk7XG5cbmZ1bmN0aW9uIHdyaXRlKHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKSB7XG4gIG1rZGlyU3luYyhqb2luKHBhdGgsIFwiLi5cIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB3cml0ZUZpbGVTeW5jKHBhdGgsIGNvbnRlbnQpO1xufVxuXG4vKipcbiAqIFRoZSBsYXlvdXQgcG5wbSBzdGFnZXM6IGBzaGFycGAncyBmaWxlcyBpbiB0aGUgdmlydHVhbCBzdG9yZSwgcmVhY2hlZCB0aHJvdWdoXG4gKiBsaW5rcyBmcm9tIHRoZSBhcHAgYW5kIGZyb20gYG5leHRgLlxuICovXG5mdW5jdGlvbiBzdGFnZVBucG1TaGFycChyb290OiBzdHJpbmcpIHtcbiAgY29uc3Qgc3RvcmUgPSBqb2luKFxuICAgIHJvb3QsXG4gICAgXCJub2RlX21vZHVsZXMvLnBucG0vc2hhcnBAMC4zNC41L25vZGVfbW9kdWxlcy9zaGFycFwiLFxuICApO1xuICB3cml0ZShcbiAgICBqb2luKHN0b3JlLCBcInBhY2thZ2UuanNvblwiKSxcbiAgICBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IFwic2hhcnBcIiwgbWFpbjogXCJpbmRleC5qc1wiIH0pLFxuICApO1xuICB3cml0ZShcbiAgICBqb2luKHN0b3JlLCBcImluZGV4LmpzXCIpLFxuICAgICdtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAaW1nL3NoYXJwLWxpbnV4LXg2NFwiKTsnLFxuICApO1xuICBta2RpclN5bmMoam9pbihyb290LCBcIm5vZGVfbW9kdWxlcy8ucG5wbS9uZXh0QDE2L25vZGVfbW9kdWxlc1wiKSwge1xuICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgfSk7XG4gIHN5bWxpbmtTeW5jKFxuICAgIFwiLi4vLi4vc2hhcnBAMC4zNC41L25vZGVfbW9kdWxlcy9zaGFycFwiLFxuICAgIGpvaW4ocm9vdCwgXCJub2RlX21vZHVsZXMvLnBucG0vbmV4dEAxNi9ub2RlX21vZHVsZXMvc2hhcnBcIiksXG4gICk7XG4gIG1rZGlyU3luYyhqb2luKHJvb3QsIFwiYXBwcy93ZWIvbm9kZV9tb2R1bGVzXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgc3ltbGlua1N5bmMoXG4gICAgXCIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vc2hhcnBAMC4zNC41L25vZGVfbW9kdWxlcy9zaGFycFwiLFxuICAgIGpvaW4ocm9vdCwgXCJhcHBzL3dlYi9ub2RlX21vZHVsZXMvc2hhcnBcIiksXG4gICk7XG59XG5cbmRlc2NyaWJlKFwic2hhcnBCaW5hcnlEaXJcIiwgKCkgPT4ge1xuICBpdChcImlzIHJlYWNoYWJsZSBmcm9tIGV2ZXJ5IGNvcHkgb2Ygc2hhcnAsIGxpbmtzIGtlcHQgb3IgZGVyZWZlcmVuY2VkXCIsICgpID0+IHtcbiAgICAvLyBUaGUgemlwIGFuZCB0aGUgaW1hZ2Uga2VlcCBsaW5rcywgc28gdGhlIHN0b3JlIGNvcHkgbG9hZHM7IGEgZGVyZWZlcmVuY2VkXG4gICAgLy8gY29weSByZXNvbHZlcyBgQGltZy8uLi5gIGZyb20gd2hlcmUgaXQgc2l0cywgbmV2ZXIgZnJvbSB0aGUgc3RvcmUuXG4gICAgY29uc3Qgc3RhZ2VkID0gam9pbihkaXIsIFwic3RhZ2VkXCIpO1xuICAgIHN0YWdlUG5wbVNoYXJwKHN0YWdlZCk7XG4gICAgY29uc3QgYmluYXJ5ID0gam9pbihzaGFycEJpbmFyeURpcihzdGFnZWQpLCBcInNoYXJwLWxpbnV4LXg2NFwiKTtcbiAgICB3cml0ZShcbiAgICAgIGpvaW4oYmluYXJ5LCBcInBhY2thZ2UuanNvblwiKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHsgbmFtZTogXCJAaW1nL3NoYXJwLWxpbnV4LXg2NFwiLCBtYWluOiBcImluZGV4LmpzXCIgfSksXG4gICAgKTtcbiAgICB3cml0ZShqb2luKGJpbmFyeSwgXCJpbmRleC5qc1wiKSwgJ21vZHVsZS5leHBvcnRzID0gXCJsb2FkZWRcIjsnKTtcblxuICAgIGNvbnN0IHppcHBlZCA9IGpvaW4oZGlyLCBcInppcHBlZFwiKTtcbiAgICAvLyBgY3AgLVJMYCwgbm90IGBjcFN5bmNgJ3MgYGRlcmVmZXJlbmNlYCwgd2hpY2ggb25seSByZXNvbHZlcyB0aGUgdG9wLWxldmVsXG4gICAgLy8gc291cmNlIGFuZCByZS1saW5rcyBldmVyeXRoaW5nIHVuZGVyIGl0IHRvIHRoZSBvcmlnaW5hbC5cbiAgICBleGVjRmlsZVN5bmMoXCJjcFwiLCBbXCItUkxcIiwgc3RhZ2VkLCB6aXBwZWRdKTtcblxuICAgIGZvciAoY29uc3Qgcm9vdCBvZiBbc3RhZ2VkLCB6aXBwZWRdKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvcHkgb2YgW1xuICAgICAgICBcImFwcHMvd2ViL25vZGVfbW9kdWxlcy9zaGFycFwiLFxuICAgICAgICBcIm5vZGVfbW9kdWxlcy8ucG5wbS9uZXh0QDE2L25vZGVfbW9kdWxlcy9zaGFycFwiLFxuICAgICAgICBcIm5vZGVfbW9kdWxlcy8ucG5wbS9zaGFycEAwLjM0LjUvbm9kZV9tb2R1bGVzL3NoYXJwXCIsXG4gICAgICBdKSB7XG4gICAgICAgIC8vIEEgcmVhbCBgbm9kZWAsIG5vdCBqZXN0J3MgYHJlcXVpcmVgLCB3aG9zZSByZXNvbHZlciBkaWZmZXJzIGZyb21cbiAgICAgICAgLy8gTm9kZSdzIGluIGhvdyBpdCB3YWxrcyB1cCBmcm9tIGEgbW9kdWxlLlxuICAgICAgICBleHBlY3QoXG4gICAgICAgICAgZXhlY0ZpbGVTeW5jKFxuICAgICAgICAgICAgcHJvY2Vzcy5leGVjUGF0aCxcbiAgICAgICAgICAgIFtcIi1wXCIsIGByZXF1aXJlKCR7SlNPTi5zdHJpbmdpZnkoam9pbihyb290LCBjb3B5KSl9KWBdLFxuICAgICAgICAgICAgeyBlbmNvZGluZzogXCJ1dGYtOFwiIH0sXG4gICAgICAgICAgKS50cmltKCksXG4gICAgICAgICkudG9CZShcImxvYWRlZFwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiaXNTaGFycEJpbmFyeVBhY2thZ2VcIiwgKCkgPT4ge1xuICBpdC5lYWNoKFtcbiAgICBbXCJub2RlX21vZHVsZXMvQGltZ1wiLCBcInNoYXJwLWxpbnV4LXg2NFwiLCB0cnVlXSxcbiAgICBbXCJub2RlX21vZHVsZXMvQGltZ1wiLCBcInNoYXJwLWxpbnV4bXVzbC1hcm02NFwiLCB0cnVlXSxcbiAgICBbXCJub2RlX21vZHVsZXMvQGltZ1wiLCBcInNoYXJwLWxpYnZpcHMtZGFyd2luLWFybTY0XCIsIHRydWVdLFxuICAgIFtcImFwcHMvd2ViL25vZGVfbW9kdWxlcy9AaW1nXCIsIFwic2hhcnAtZGFyd2luLWFybTY0XCIsIHRydWVdLFxuICAgIFtcIm5vZGVfbW9kdWxlcy8ucG5wbVwiLCBcIkBpbWcrc2hhcnAtZGFyd2luLWFybTY0QDAuMzQuNVwiLCB0cnVlXSxcbiAgICBbXCJub2RlX21vZHVsZXMvLnBucG1cIiwgXCJAaW1nK3NoYXJwLWxpYnZpcHMtZGFyd2luLWFybTY0QDEuMi40XCIsIHRydWVdLFxuICAgIFtcbiAgICAgIFwibm9kZV9tb2R1bGVzLy5wbnBtL3NoYXJwQDAuMzQuNS9ub2RlX21vZHVsZXMvQGltZ1wiLFxuICAgICAgXCJzaGFycC1saW51eC14NjRcIixcbiAgICAgIHRydWUsXG4gICAgXSxcbiAgICAvLyBBIHJvdXRlIHNlZ21lbnQsIG5vdCBhIHBhY2thZ2UuXG4gICAgW1wiLm5leHQvc2VydmVyL2FwcFwiLCBcInNoYXJwLWVkZ2VzXCIsIGZhbHNlXSxcbiAgICAvLyBVbnJlbGF0ZWQgYHNoYXJwLWAgZGVwZW5kZW5jaWVzLlxuICAgIFtcIm5vZGVfbW9kdWxlc1wiLCBcInNoYXJwLWljb1wiLCBmYWxzZV0sXG4gICAgW1wibm9kZV9tb2R1bGVzLy5wbnBtXCIsIFwic2hhcnAtcGhhc2hAMi4wLjBcIiwgZmFsc2VdLFxuICAgIFtcIm5vZGVfbW9kdWxlcy8ucG5wbVwiLCBcInNoYXJwQDAuMzQuNVwiLCBmYWxzZV0sXG4gICAgLy8gYHNoYXJwYCBpdHNlbGYsIHRoZSBKUyB3cmFwcGVyIHRoYXQgbG9hZHMgdGhlIGJpbmFyeS5cbiAgICBbXCJub2RlX21vZHVsZXNcIiwgXCJzaGFycFwiLCBmYWxzZV0sXG4gICAgW1wibm9kZV9tb2R1bGVzL0BpbWdcIiwgXCJjb2xvdXJcIiwgZmFsc2VdLFxuICAgIC8vIEFwcCBkaXJlY3RvcmllcyB0aGF0IGhhcHBlbiB0byBzaGFyZSB0aGUgbmFtZXMsIG91dHNpZGUgYG5vZGVfbW9kdWxlc2AuXG4gICAgW1wiYXBwcy93ZWIvQGltZ1wiLCBcInNoYXJwLWxpbnV4LXg2NFwiLCBmYWxzZV0sXG4gICAgW1wiYXBwcy93ZWIvLnBucG1cIiwgXCJAaW1nK3NoYXJwLWxpbnV4LXg2NEAwLjM0LjVcIiwgZmFsc2VdLFxuICBdKShcIiVzLyVzIGlzICVzXCIsIChwYXJlbnQsIG5hbWUsIGV4cGVjdGVkKSA9PiB7XG4gICAgZXhwZWN0KGlzU2hhcnBCaW5hcnlQYWNrYWdlKGpvaW4oZGlyLCBwYXJlbnQpLCBuYW1lKSkudG9CZShleHBlY3RlZCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwicGlja1N0YWdlZFNoYXJwUGFja2FnZVwiLCAoKSA9PiB7XG4gIGl0KFwicmV0dXJucyB1bmRlZmluZWQgd2hlbiB0aGUgdHJlZSBoYXMgbm8gc2hhcnBcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChwaWNrU3RhZ2VkU2hhcnBQYWNrYWdlKFtdKSkudG9CZVVuZGVmaW5lZCgpO1xuICB9KTtcblxuICBpdChcInByZWZlcnMgdGhlIHNob3J0ZXN0IHBhdGgsIHRoZSBjbG9zZXN0IHRvIGEgaG9pc3RlZCBpbnN0YWxsXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBwaWNrU3RhZ2VkU2hhcnBQYWNrYWdlKFtcbiAgICAgICAgXCIvci9ub2RlX21vZHVsZXMvLnBucG0vc2hhcnBAMC4zNC41L25vZGVfbW9kdWxlcy9zaGFycFwiLFxuICAgICAgICBcIi9yL2FwcHMvd2ViL25vZGVfbW9kdWxlcy9zaGFycFwiLFxuICAgICAgICBcIi9yL25vZGVfbW9kdWxlcy9zaGFycFwiLFxuICAgICAgXSksXG4gICAgKS50b0JlKFwiL3Ivbm9kZV9tb2R1bGVzL3NoYXJwXCIpO1xuICB9KTtcblxuICBpdChcImJyZWFrcyBhIGxlbmd0aCB0aWUgYnkgbmFtZSwgd2hhdGV2ZXIgb3JkZXIgdGhlIHdhbGsgZm91bmQgdGhlbSBpblwiLCAoKSA9PiB7XG4gICAgY29uc3QgYSA9IFwiL3Ivbm9kZV9tb2R1bGVzLy5wbnBtL3NoYXJwQDAuMzQuNC9ub2RlX21vZHVsZXMvc2hhcnBcIjtcbiAgICBjb25zdCBiID0gXCIvci9ub2RlX21vZHVsZXMvLnBucG0vc2hhcnBAMC4zNC41L25vZGVfbW9kdWxlcy9zaGFycFwiO1xuICAgIGV4cGVjdChwaWNrU3RhZ2VkU2hhcnBQYWNrYWdlKFtiLCBhXSkpLnRvQmUoYSk7XG4gICAgZXhwZWN0KHBpY2tTdGFnZWRTaGFycFBhY2thZ2UoW2EsIGJdKSkudG9CZShhKTtcbiAgfSk7XG5cbiAgLy8gbnBtIG5lc3RzIG5leHQncyBvd24gYHNoYXJwYCB3aGVuIHRoZSBhcHAncyBob2lzdGVkIG9uZSBpcyBhbm90aGVyIHZlcnNpb247XG4gIC8vIHRoZSBiaW5hcmllcyBoYXZlIHRvIG1hdGNoIHRoZSBjb3B5IHRoZSBpbWFnZSBvcHRpbWl6ZXIgbG9hZHMuXG4gIGl0KFwicGlja3MgdGhlIGNvcHkgdGhlIHN0YWdlZCBuZXh0IHJlc29sdmVzLCBvdmVyIGEgc2hvcnRlciBvbmVcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHJvb3QgPSBqb2luKGRpciwgXCJzdGFnZWRcIik7XG4gICAgY29uc3QgaG9pc3RlZCA9IGpvaW4ocm9vdCwgXCJub2RlX21vZHVsZXMvc2hhcnBcIik7XG4gICAgY29uc3QgbmVzdGVkID0gam9pbihyb290LCBcIm5vZGVfbW9kdWxlcy9uZXh0L25vZGVfbW9kdWxlcy9zaGFycFwiKTtcbiAgICBmb3IgKGNvbnN0IHNoYXJwIG9mIFtob2lzdGVkLCBuZXN0ZWRdKSB7XG4gICAgICB3cml0ZShcbiAgICAgICAgam9pbihzaGFycCwgXCJwYWNrYWdlLmpzb25cIiksXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHsgbmFtZTogXCJzaGFycFwiLCBtYWluOiBcImluZGV4LmpzXCIgfSksXG4gICAgICApO1xuICAgICAgd3JpdGUoam9pbihzaGFycCwgXCJpbmRleC5qc1wiKSwgXCJcIik7XG4gICAgfVxuICAgIHdyaXRlKFxuICAgICAgam9pbihyb290LCBcIm5vZGVfbW9kdWxlcy9uZXh0L3BhY2thZ2UuanNvblwiKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHsgbmFtZTogXCJuZXh0XCIgfSksXG4gICAgKTtcbiAgICBjb25zdCBuZXh0U2hhcnAgPSByZXNvbHZlTmV4dFNoYXJwKGpvaW4ocm9vdCwgXCJhcHBzL3dlYlwiKSk7XG4gICAgZXhwZWN0KG5leHRTaGFycCkudG9CZShqb2luKHJlYWxwYXRoU3luYyhuZXN0ZWQpLCBcImluZGV4LmpzXCIpKTtcbiAgICBleHBlY3QocGlja1N0YWdlZFNoYXJwUGFja2FnZShbaG9pc3RlZCwgbmVzdGVkXSwgbmV4dFNoYXJwKSkudG9CZShuZXN0ZWQpO1xuICB9KTtcblxuICBpdChcInJlc29sdmVzIG5vdGhpbmcgd2hlbiB0aGUgc3RhZ2VkIHRyZWUgaGFzIG5vIG5leHRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChyZXNvbHZlTmV4dFNoYXJwKGpvaW4oZGlyLCBcImFwcHMvd2ViXCIpKSkudG9CZVVuZGVmaW5lZCgpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIlNoYXJwIHN0YWdpbmcgZm9yIHRoZSBkZXBsb3ltZW50IHRhcmdldFwiLCAoKSA9PiB7XG4gIC8vIEEgdmVyc2lvbiBubyByZWFsIGBzaGFycGAgcGlucywgc28gdGhlIHRhcmJhbGxzIHNlZWRlZCBpbnRvIHRoZSBzaGFyZWRcbiAgLy8gZG93bmxvYWQgY2FjaGUgYmVsb3cgYXJlIG5ldmVyIG1pc3Rha2VuIGZvciAob3IgY2xvYmJlcikgcmVhbCBvbmVzLlxuICBjb25zdCBWRVJTSU9OID0gXCIwLjAuMC1jZGstbmV4dGpzLXRlc3RcIjtcbiAgY29uc3QgY2FjaGVEaXIgPSBqb2luKHRtcGRpcigpLCBcImNkay1uZXh0anMtc2hhcnAtY2FjaGVcIik7XG4gIGNvbnN0IHNlZWRlZDogc3RyaW5nW10gPSBbXTtcblxuICBhZnRlckFsbCgoKSA9PiB7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHNlZWRlZCkgcm1TeW5jKGZpbGUsIHsgZm9yY2U6IHRydWUgfSk7XG4gIH0pO1xuXG4gIC8qKiBTZWVkIHRoZSBkb3dubG9hZCBjYWNoZSBzbyB0aGUgaW5zdGFsbCBydW5zIHdpdGhvdXQgdGhlIHJlZ2lzdHJ5LiAqL1xuICBmdW5jdGlvbiBzZWVkQ2FjaGUobmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcGtnID0gam9pbihkaXIsIFwidGd6XCIsIG5hbWUsIFwicGFja2FnZVwiKTtcbiAgICB3cml0ZShqb2luKHBrZywgXCJwYWNrYWdlLmpzb25cIiksIEpTT04uc3RyaW5naWZ5KHsgbmFtZTogYEBpbWcvJHtuYW1lfWAgfSkpO1xuICAgIG1rZGlyU3luYyhjYWNoZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgY29uc3QgdGd6ID0gam9pbihjYWNoZURpciwgYCR7bmFtZX0tJHtWRVJTSU9OfS50Z3pgKTtcbiAgICBleGVjRmlsZVN5bmMoXCJ0YXJcIiwgW1wiLWN6ZlwiLCB0Z3osIFwiLUNcIiwgam9pbihwa2csIFwiLi5cIiksIFwicGFja2FnZVwiXSk7XG4gICAgc2VlZGVkLnB1c2godGd6KTtcbiAgfVxuXG4gIC8vIFByaXZhdGU6IHRoZSBtZXRob2RzIGBOZXh0anNCdWlsZGAgcnVucyBwZXIgZGVwbG95bWVudCByb290LCB3aGljaCBvbmx5XG4gIC8vIHRvdWNoIHRoZSBmaWxlc3lzdGVtLCBzbyB0aGV5IHJ1biBoZXJlIHdpdGhvdXQgYSBjb25zdHJ1Y3QuXG4gIGNvbnN0IGJ1aWxkID0gTmV4dGpzQnVpbGQucHJvdG90eXBlIGFzIHVua25vd24gYXMge1xuICAgIHJlbW92ZUV4aXN0aW5nU2hhcnBCaW5hcmllcyhcbiAgICAgIHJvb3Q6IHN0cmluZyxcbiAgICAgIHByb2plY3REaXI6IHN0cmluZyxcbiAgICApOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgc3RhZ2VTaGFycEZvclRhcmdldChcbiAgICAgIHJvb3Q6IHsgbmFtZTogc3RyaW5nOyBwYXRoOiBzdHJpbmcgfSxcbiAgICAgIHByb2plY3REaXI6IHN0cmluZyxcbiAgICAgIHBsYXRmb3JtOiBzdHJpbmcsXG4gICAgKTogdm9pZDtcbiAgfTtcblxuICAvKiogQSBzdGFnZWQgcG5wbSBgc2hhcnBgIHRoYXQgcGlucyB0ZXN0LXZlcnNpb24gYmluYXJpZXMgZm9yIGBwbGF0Zm9ybWAuICovXG4gIGZ1bmN0aW9uIHN0YWdlUGlubmVkU2hhcnAocm9vdDogc3RyaW5nLCBwbGF0Zm9ybTogc3RyaW5nKSB7XG4gICAgc3RhZ2VQbnBtU2hhcnAocm9vdCk7XG4gICAgd3JpdGUoXG4gICAgICBqb2luKFxuICAgICAgICByb290LFxuICAgICAgICBcIm5vZGVfbW9kdWxlcy8ucG5wbS9zaGFycEAwLjM0LjUvbm9kZV9tb2R1bGVzL3NoYXJwL3BhY2thZ2UuanNvblwiLFxuICAgICAgKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgbmFtZTogXCJzaGFycFwiLFxuICAgICAgICB2ZXJzaW9uOiBcIjAuMzQuNVwiLFxuICAgICAgICBvcHRpb25hbERlcGVuZGVuY2llczoge1xuICAgICAgICAgIFtgQGltZy9zaGFycC0ke3BsYXRmb3JtfWBdOiBWRVJTSU9OLFxuICAgICAgICAgIFtgQGltZy9zaGFycC1saWJ2aXBzLSR7cGxhdGZvcm19YF06IFZFUlNJT04sXG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBbYHNoYXJwLSR7cGxhdGZvcm19YCwgYHNoYXJwLWxpYnZpcHMtJHtwbGF0Zm9ybX1gXSkge1xuICAgICAgc2VlZENhY2hlKG5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIGl0LmVhY2goW1xuICAgIFtcImxpbnV4LXg2NFwiLCBcImRhcndpbi1hcm02NFwiXSxcbiAgICBbXCJsaW51eC1hcm02NFwiLCBcImxpbnV4LXg2NFwiXSxcbiAgICBbXCJsaW51eG11c2wtYXJtNjRcIiwgXCJsaW51eC14NjRcIl0sXG4gIF0pKFxuICAgIFwicmVwbGFjZXMgdGhlIGhvc3QncyBiaW5hcmllcyB3aXRoICVzIG9uZXMsIGxlYXZpbmcgbG9vay1hbGlrZXNcIixcbiAgICAocGxhdGZvcm0sIGhvc3QpID0+IHtcbiAgICAgIGNvbnN0IHJvb3QgPSBqb2luKGRpciwgXCJzdGFnZWRcIik7XG4gICAgICBzdGFnZVBucG1TaGFycChyb290KTtcbiAgICAgIGNvbnN0IHN0b3JlID0gam9pbihcbiAgICAgICAgcm9vdCxcbiAgICAgICAgXCJub2RlX21vZHVsZXMvLnBucG0vc2hhcnBAMC4zNC41L25vZGVfbW9kdWxlcy9zaGFycFwiLFxuICAgICAgKTtcbiAgICAgIHdyaXRlKFxuICAgICAgICBqb2luKHN0b3JlLCBcInBhY2thZ2UuanNvblwiKSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIG5hbWU6IFwic2hhcnBcIixcbiAgICAgICAgICB2ZXJzaW9uOiBcIjAuMzQuNVwiLFxuICAgICAgICAgIG9wdGlvbmFsRGVwZW5kZW5jaWVzOiB7XG4gICAgICAgICAgICBbYEBpbWcvc2hhcnAtJHtwbGF0Zm9ybX1gXTogVkVSU0lPTixcbiAgICAgICAgICAgIFtgQGltZy9zaGFycC1saWJ2aXBzLSR7cGxhdGZvcm19YF06IFZFUlNJT04sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgLy8gVGhlIGhvc3QncyBiaW5hcmllcyBhcyBwbnBtIHN0YWdlcyB0aGVtOiBpbiB0aGUgc3RvcmUsIGxpbmtlZCBmcm9tXG4gICAgICAvLyBuZXh0IHRvIGBzaGFycGAsIGFuZCAoaG9pc3RlZCkgYXQgdGhlIHJvb3QuXG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgW2BzaGFycC0ke2hvc3R9YCwgYHNoYXJwLWxpYnZpcHMtJHtob3N0fWBdKSB7XG4gICAgICAgIHdyaXRlKFxuICAgICAgICAgIGpvaW4oXG4gICAgICAgICAgICByb290LFxuICAgICAgICAgICAgYG5vZGVfbW9kdWxlcy8ucG5wbS9AaW1nKyR7bmFtZX1AMC4zNC41L25vZGVfbW9kdWxlcy9AaW1nLyR7bmFtZX0vcGFja2FnZS5qc29uYCxcbiAgICAgICAgICApLFxuICAgICAgICAgIFwie31cIixcbiAgICAgICAgKTtcbiAgICAgICAgbWtkaXJTeW5jKFxuICAgICAgICAgIGpvaW4ocm9vdCwgXCJub2RlX21vZHVsZXMvLnBucG0vc2hhcnBAMC4zNC41L25vZGVfbW9kdWxlcy9AaW1nXCIpLFxuICAgICAgICAgIHsgcmVjdXJzaXZlOiB0cnVlIH0sXG4gICAgICAgICk7XG4gICAgICAgIHN5bWxpbmtTeW5jKFxuICAgICAgICAgIGAuLi8uLi8uLi9AaW1nKyR7bmFtZX1AMC4zNC41L25vZGVfbW9kdWxlcy9AaW1nLyR7bmFtZX1gLFxuICAgICAgICAgIGpvaW4oXG4gICAgICAgICAgICByb290LFxuICAgICAgICAgICAgYG5vZGVfbW9kdWxlcy8ucG5wbS9zaGFycEAwLjM0LjUvbm9kZV9tb2R1bGVzL0BpbWcvJHtuYW1lfWAsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgICAgd3JpdGUoam9pbihyb290LCBgbm9kZV9tb2R1bGVzL0BpbWcvJHtuYW1lfS9wYWNrYWdlLmpzb25gKSwgXCJ7fVwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvb2thbGlrZXMgPSBbXG4gICAgICAgIFwiYXBwcy93ZWIvLm5leHQvc2VydmVyL2FwcC9zaGFycC1lZGdlcy9wYWdlLmpzXCIsXG4gICAgICAgIFwibm9kZV9tb2R1bGVzLy5wbnBtL3NoYXJwLWljb0AwLjEuNS9ub2RlX21vZHVsZXMvc2hhcnAtaWNvL3BhY2thZ2UuanNvblwiLFxuICAgICAgICBcImFwcHMvd2ViL25vZGVfbW9kdWxlcy9zaGFycC1pY28vcGFja2FnZS5qc29uXCIsXG4gICAgICBdO1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGxvb2thbGlrZXMpIHdyaXRlKGpvaW4ocm9vdCwgZmlsZSksIFwiXCIpO1xuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIFtgc2hhcnAtJHtwbGF0Zm9ybX1gLCBgc2hhcnAtbGlidmlwcy0ke3BsYXRmb3JtfWBdKSB7XG4gICAgICAgIHNlZWRDYWNoZShuYW1lKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc291cmNlID0gYnVpbGQucmVtb3ZlRXhpc3RpbmdTaGFycEJpbmFyaWVzKFxuICAgICAgICByb290LFxuICAgICAgICBqb2luKHJvb3QsIFwiYXBwcy93ZWJcIiksXG4gICAgICApO1xuICAgICAgZXhwZWN0KHNvdXJjZSkudG9CZShzdG9yZSk7XG4gICAgICBidWlsZC5zdGFnZVNoYXJwRm9yVGFyZ2V0KFxuICAgICAgICB7IG5hbWU6IFwiZGVmYXVsdFwiLCBwYXRoOiByb290IH0sXG4gICAgICAgIGpvaW4ocm9vdCwgXCJhcHBzL3dlYlwiKSxcbiAgICAgICAgcGxhdGZvcm0sXG4gICAgICApO1xuXG4gICAgICBleHBlY3QocmVhZGRpclN5bmMoc2hhcnBCaW5hcnlEaXIocm9vdCkpLnNvcnQoKSkudG9FcXVhbChcbiAgICAgICAgW2BzaGFycC0ke3BsYXRmb3JtfWAsIGBzaGFycC1saWJ2aXBzLSR7cGxhdGZvcm19YF0uc29ydCgpLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgSlNPTi5wYXJzZShcbiAgICAgICAgICByZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICBqb2luKHNoYXJwQmluYXJ5RGlyKHJvb3QpLCBgc2hhcnAtJHtwbGF0Zm9ybX0vcGFja2FnZS5qc29uYCksXG4gICAgICAgICAgICBcInV0Zi04XCIsXG4gICAgICAgICAgKSxcbiAgICAgICAgKS5uYW1lLFxuICAgICAgKS50b0JlKGBAaW1nL3NoYXJwLSR7cGxhdGZvcm19YCk7XG4gICAgICAvLyBObyBob3N0IGJpbmFyeSBzdXJ2aXZlcywgZGFuZ2xpbmcgbGluayBvciBvdGhlcndpc2UuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGxpc3RUcmVlKHJvb3QpLmZpbHRlcigoZW50cnkpID0+IGVudHJ5Lm5hbWUuaW5jbHVkZXMoaG9zdCkpLFxuICAgICAgKS50b0VxdWFsKFtdKTtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBsb29rYWxpa2VzKSB7XG4gICAgICAgIGV4cGVjdChleGlzdHNTeW5jKGpvaW4ocm9vdCwgZmlsZSkpKS50b0JlKHRydWUpO1xuICAgICAgfVxuICAgIH0sXG4gICk7XG5cbiAgaXQoXCJ3YXJucyBhbmQgaW5zdGFsbHMgbm90aGluZyB3aGVuIHRoZSBidWlsZCBzdGFnZWQgbm8gc2hhcnBcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHJvb3QgPSBqb2luKGRpciwgXCJzdGFnZWRcIik7XG4gICAgd3JpdGUoam9pbihyb290LCBcImFwcHMvd2ViL3NlcnZlci5qc1wiKSwgXCJcIik7XG4gICAgY29uc3Qgd2FybiA9IGplc3Quc3B5T24oY29uc29sZSwgXCJ3YXJuXCIpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSk7XG4gICAgY29uc3Qgc291cmNlID0gYnVpbGQucmVtb3ZlRXhpc3RpbmdTaGFycEJpbmFyaWVzKFxuICAgICAgcm9vdCxcbiAgICAgIGpvaW4ocm9vdCwgXCJhcHBzL3dlYlwiKSxcbiAgICApO1xuICAgIGV4cGVjdChzb3VyY2UpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBidWlsZC5zdGFnZVNoYXJwRm9yVGFyZ2V0KFxuICAgICAgeyBuYW1lOiBcImRlZmF1bHRcIiwgcGF0aDogcm9vdCB9LFxuICAgICAgam9pbihyb290LCBcImFwcHMvd2ViXCIpLFxuICAgICAgXCJsaW51eC1hcm02NFwiLFxuICAgICk7XG4gICAgZXhwZWN0KGV4aXN0c1N5bmMoc2hhcnBCaW5hcnlEaXIocm9vdCkpKS50b0JlKGZhbHNlKTtcbiAgICBleHBlY3Qod2FybikudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICBleHBlY3Quc3RyaW5nQ29udGFpbmluZygnXCJzaGFycFwiIG5vdCBmb3VuZCcpLFxuICAgICk7XG4gICAgd2Fybi5tb2NrUmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZShcInBlciBmdW5jdGlvbiBncm91cFwiLCAoKSA9PiB7XG4gICAgY29uc3QgcGxhdGZvcm0gPSBcImxpbnV4LWFybTY0XCI7XG4gICAgY29uc3Qgc3RhZ2UgPSAobmFtZTogc3RyaW5nKSA9PlxuICAgICAgYnVpbGQuc3RhZ2VTaGFycEZvclRhcmdldChcbiAgICAgICAgeyBuYW1lLCBwYXRoOiBqb2luKGRpciwgXCJzdGFnZWRcIikgfSxcbiAgICAgICAgam9pbihkaXIsIFwic3RhZ2VkL2FwcHMvd2ViXCIpLFxuICAgICAgICBwbGF0Zm9ybSxcbiAgICAgICk7XG5cbiAgICAvLyBPbmx5IGBkZWZhdWx0YCBzZXJ2ZXMgYC9fbmV4dC9pbWFnZWAsIHNvIGEgZ3JvdXAgd2l0aG91dCBzaGFycCBpcyBub3JtYWwuXG4gICAgaXQoXCJpbnN0YWxscyBub3RoaW5nIGFuZCBzdGF5cyBxdWlldCBmb3IgYSBncm91cCB3aXRob3V0IHNoYXJwXCIsICgpID0+IHtcbiAgICAgIHdyaXRlKGpvaW4oZGlyLCBcInN0YWdlZC9hcHBzL3dlYi9zZXJ2ZXIuanNcIiksIFwiXCIpO1xuICAgICAgY29uc3Qgd2FybiA9IGplc3Quc3B5T24oY29uc29sZSwgXCJ3YXJuXCIpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSk7XG4gICAgICBzdGFnZShcImFwaVwiKTtcbiAgICAgIGV4cGVjdChleGlzdHNTeW5jKHNoYXJwQmluYXJ5RGlyKGpvaW4oZGlyLCBcInN0YWdlZFwiKSkpKS50b0JlKGZhbHNlKTtcbiAgICAgIGV4cGVjdCh3YXJuKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgd2Fybi5tb2NrUmVzdG9yZSgpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJ3YXJucyBmb3IgZGVmYXVsdCB3aXRob3V0IHNoYXJwLCB3aGljaCBjYW4ndCBvcHRpbWl6ZSBpbWFnZXNcIiwgKCkgPT4ge1xuICAgICAgd3JpdGUoam9pbihkaXIsIFwic3RhZ2VkL2FwcHMvd2ViL3NlcnZlci5qc1wiKSwgXCJcIik7XG4gICAgICBjb25zdCB3YXJuID0gamVzdC5zcHlPbihjb25zb2xlLCBcIndhcm5cIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcbiAgICAgIHN0YWdlKFwiZGVmYXVsdFwiKTtcbiAgICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ1wic2hhcnBcIiBub3QgZm91bmQnKSxcbiAgICAgICk7XG4gICAgICB3YXJuLm1vY2tSZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdChcImluc3RhbGxzIHRoZSB0YXJnZXQncyBiaW5hcmllcyBmb3IgYSBncm91cCB3aG9zZSBvd24gcm91dGVzIHVzZSBzaGFycFwiLCAoKSA9PiB7XG4gICAgICBzdGFnZVBpbm5lZFNoYXJwKGpvaW4oZGlyLCBcInN0YWdlZFwiKSwgcGxhdGZvcm0pO1xuICAgICAgc3RhZ2UoXCJhcGlcIik7XG4gICAgICBleHBlY3QocmVhZGRpclN5bmMoc2hhcnBCaW5hcnlEaXIoam9pbihkaXIsIFwic3RhZ2VkXCIpKSkuc29ydCgpKS50b0VxdWFsKFxuICAgICAgICBbYHNoYXJwLSR7cGxhdGZvcm19YCwgYHNoYXJwLWxpYnZpcHMtJHtwbGF0Zm9ybX1gXS5zb3J0KCksXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcImRlcGxveW1lbnRCdWlsZElkXCIsICgpID0+IHtcbiAgaXQoXCJpcyBOZXh0LmpzJ3MgYnVpbGQgSUQgd2hlbiB0aGUgYXBwIHNldHMgbm8gZGVwbG95bWVudElkXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBkZXBsb3ltZW50QnVpbGRJZCh7IGJ1aWxkSWQ6IFwiYjFcIiwgY29uZmlnOiB7IGRlcGxveW1lbnRJZDogXCJcIiB9IH0pLFxuICAgICkudG9CZShcImIxXCIpO1xuICB9KTtcblxuICAvLyBXaXRoIGBORVhUX0RFUExPWU1FTlRfSURgLCBOZXh0J3MgQlVJTERfSUQgaXMgYSBjb25zdGFudCwgc28gd2l0aG91dCB0aGVcbiAgLy8gc3VmZml4IGV2ZXJ5IGRlcGxveW1lbnQgd291bGQgc2hhcmUgb25lIGNhY2hlIHBhcnRpdGlvbi5cbiAgaXQoXCJpcyBzdWZmaXhlZCB3aXRoIHRoZSBkZXBsb3ltZW50SWQgd2hlbiB0aGUgYXBwIHNldHMgb25lXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBkZXBsb3ltZW50QnVpbGRJZCh7IGJ1aWxkSWQ6IFwiYjFcIiwgY29uZmlnOiB7IGRlcGxveW1lbnRJZDogXCJkN1wiIH0gfSksXG4gICAgKS50b0JlKFwiYjEtZDdcIik7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwibGlzdFRyZWVcIiwgKCkgPT4ge1xuICBpdChcImxpc3RzIGxpbmtzIHdpdGhvdXQgZGVzY2VuZGluZyBpbnRvIHRoZW0sIHNvIGEgY3ljbGUgZW5kc1wiLCAoKSA9PiB7XG4gICAgd3JpdGUoam9pbihkaXIsIFwicGFja2FnZXMvYS9pbmRleC5qc1wiKSwgXCJcIik7XG4gICAgd3JpdGUoam9pbihkaXIsIFwicGFja2FnZXMvYi9pbmRleC5qc1wiKSwgXCJcIik7XG4gICAgbWtkaXJTeW5jKGpvaW4oZGlyLCBcInBhY2thZ2VzL2Evbm9kZV9tb2R1bGVzL0BvcmdcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIG1rZGlyU3luYyhqb2luKGRpciwgXCJwYWNrYWdlcy9iL25vZGVfbW9kdWxlcy9Ab3JnXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBzeW1saW5rU3luYyhcIi4uLy4uLy4uL2JcIiwgam9pbihkaXIsIFwicGFja2FnZXMvYS9ub2RlX21vZHVsZXMvQG9yZy9iXCIpKTtcbiAgICBzeW1saW5rU3luYyhcIi4uLy4uLy4uL2FcIiwgam9pbihkaXIsIFwicGFja2FnZXMvYi9ub2RlX21vZHVsZXMvQG9yZy9hXCIpKTtcblxuICAgIGNvbnN0IGZpbGVzID0gbGlzdFRyZWUoZGlyKVxuICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09IFwiaW5kZXguanNcIilcbiAgICAgIC5tYXAoKGVudHJ5KSA9PiBlbnRyeS5wYXJlbnRQYXRoKTtcbiAgICBleHBlY3QoZmlsZXMuc29ydCgpKS50b0VxdWFsKFtcbiAgICAgIGpvaW4oZGlyLCBcInBhY2thZ2VzL2FcIiksXG4gICAgICBqb2luKGRpciwgXCJwYWNrYWdlcy9iXCIpLFxuICAgIF0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcInN0b3JlZFNpemVcIiwgKCkgPT4ge1xuICBpdChcImNvdW50cyBhIGxpbmsgYXMgaXRzIHRhcmdldCBwYXRoLCBhcyB0aGUgemlwIHN0b3JlcyBpdFwiLCAoKSA9PiB7XG4gICAgd3JpdGUoam9pbihkaXIsIFwic3RvcmUvcGtnL2ZpbGVcIiksIFwieFwiLnJlcGVhdCgxMDApKTtcbiAgICBta2RpclN5bmMoam9pbihkaXIsIFwiYVwiKSk7XG4gICAgc3ltbGlua1N5bmMoXCIuLi9zdG9yZS9wa2dcIiwgam9pbihkaXIsIFwiYS9wa2dcIikpO1xuXG4gICAgZXhwZWN0KHN0b3JlZFNpemUoZGlyKSkudG9CZSgxMDAgKyBcIi4uL3N0b3JlL3BrZ1wiLmxlbmd0aCk7XG4gIH0pO1xuXG4gIGl0KFwidGVybWluYXRlcyBvbiBhIGN5Y2xlIGFuZCBjb3VudHMgYSBkYW5nbGluZyBsaW5rXCIsICgpID0+IHtcbiAgICB3cml0ZShqb2luKGRpciwgXCJhL2ZpbGVcIiksIFwieFwiLnJlcGVhdCgxMCkpO1xuICAgIHN5bWxpbmtTeW5jKFwiLi5cIiwgam9pbihkaXIsIFwiYS91cFwiKSk7XG4gICAgc3ltbGlua1N5bmMoXCJtaXNzaW5nXCIsIGpvaW4oZGlyLCBcImEvZGFuZ2xpbmdcIikpO1xuXG4gICAgZXhwZWN0KHN0b3JlZFNpemUoZGlyKSkudG9CZSgxMCArIFwiLi5cIi5sZW5ndGggKyBcIm1pc3NpbmdcIi5sZW5ndGgpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcInBhdGNoQ2xpZW50Q2h1bmtcIiwgKCkgPT4ge1xuICBjb25zdCBjaHVuayA9IFwiY29uc29sZS5sb2coJ2FwcCcpO1wiO1xuXG4gIGl0KFwicHJlcGVuZHMgdGhlIHBhdGNoIG9uY2VcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHBhdGNoZWQgPSBwYXRjaENsaWVudENodW5rKGNodW5rLCBcIlBBVENIX1YxXCIsIFwiY2h1bmsuanNcIikhO1xuICAgIGV4cGVjdChwYXRjaGVkKS50b01hdGNoKC9eXFwvXFwqIGNkay1uZXh0anM6cGF0Y2gtZmV0Y2ggWzAtOWEtZl17MTZ9IFxcKlxcL1xcbi8pO1xuICAgIGV4cGVjdChwYXRjaGVkKS50b0NvbnRhaW4oXCJQQVRDSF9WMVwiKTtcbiAgICBleHBlY3QocGF0Y2hlZC5lbmRzV2l0aChgXFxuJHtjaHVua31gKSkudG9CZSh0cnVlKTtcbiAgICBleHBlY3QocGF0Y2hDbGllbnRDaHVuayhwYXRjaGVkLCBcIlBBVENIX1YxXCIsIFwiY2h1bmsuanNcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoXCJyZXBsYWNlcyBhIHBhdGNoIGZyb20gYW5vdGhlciBjZGstbmV4dGpzIHZlcnNpb25cIiwgKCkgPT4ge1xuICAgIGNvbnN0IG9sZCA9IHBhdGNoQ2xpZW50Q2h1bmsoY2h1bmssIFwiUEFUQ0hfVjFcIiwgXCJjaHVuay5qc1wiKSE7XG4gICAgY29uc3QgdXBkYXRlZCA9IHBhdGNoQ2xpZW50Q2h1bmsob2xkLCBcIlBBVENIX1YyXCIsIFwiY2h1bmsuanNcIikhO1xuXG4gICAgZXhwZWN0KHVwZGF0ZWQpLnRvQ29udGFpbihcIlBBVENIX1YyXCIpO1xuICAgIGV4cGVjdCh1cGRhdGVkKS5ub3QudG9Db250YWluKFwiUEFUQ0hfVjFcIik7XG4gICAgZXhwZWN0KHVwZGF0ZWQuZW5kc1dpdGgoYFxcbiR7Y2h1bmt9YCkpLnRvQmUodHJ1ZSk7XG4gICAgZXhwZWN0KHVwZGF0ZWQpLnRvQmUocGF0Y2hDbGllbnRDaHVuayhjaHVuaywgXCJQQVRDSF9WMlwiLCBcImNodW5rLmpzXCIpKTtcbiAgfSk7XG5cbiAgaXQoXCJyZWZ1c2VzIGEgcGF0Y2ggd2l0aG91dCBhbiBlbmQgbWFya2VyIHJhdGhlciB0aGFuIHN0YWNraW5nIG9uIGl0XCIsICgpID0+IHtcbiAgICBleHBlY3QoKCkgPT5cbiAgICAgIHBhdGNoQ2xpZW50Q2h1bmsoXG4gICAgICAgIGAvKiBjZGstbmV4dGpzOnBhdGNoLWZldGNoICovXFxuT0xEXFxuJHtjaHVua31gLFxuICAgICAgICBcIlBBVENIX1YyXCIsXG4gICAgICAgIFwiY2h1bmsuanNcIixcbiAgICAgICksXG4gICAgKS50b1Rocm93KC9SZS1ydW4gYG5leHQgYnVpbGRgLyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwid3JpdGVQdWJsaWNGaWxlTGlzdFwiLCAoKSA9PiB7XG4gIGl0KFwibGlzdHMgcHVibGljLyB0aGUgd2F5IHRoZSBydW50aW1lIGxpc3RzIGl0IG9mZiBkaXNrXCIsICgpID0+IHtcbiAgICAvLyBXcml0dGVuIGF0IHN5bnRoLCBhZnRlciB0aGUgYnVpbGQgY29tbWFuZCwgc28gYSBgcG9zdGJ1aWxkYCBmaWxlIChoZXJlXG4gICAgLy8gYHNpdGVtYXAueG1sYCkgaXMgbGlzdGVkOyBhIGxpbmtlZCBkaXJlY3RvcnkgaXMgZm9sbG93ZWQuXG4gICAgY29uc3QgcHVibGljRGlyID0gam9pbihkaXIsIFwicHVibGljXCIpO1xuICAgIHdyaXRlKGpvaW4ocHVibGljRGlyLCBcInNpdGVtYXAueG1sXCIpLCBcIjx1cmxzZXQvPlwiKTtcbiAgICB3cml0ZShqb2luKHB1YmxpY0RpciwgXCJpbWFnZXNcIiwgXCJsb2dvQDJ4LnBuZ1wiKSwgXCJwbmdcIik7XG4gICAgd3JpdGUoam9pbihkaXIsIFwic2hhcmVkXCIsIFwiaGVsbG8gZTJlLnR4dFwiKSwgXCJoaVwiKTtcbiAgICBzeW1saW5rU3luYyhqb2luKGRpciwgXCJzaGFyZWRcIiksIGpvaW4ocHVibGljRGlyLCBcInN0YXRpY1wiKSk7XG4gICAgY29uc3QgcnVudGltZURpciA9IGpvaW4oZGlyLCBcImNkay1uZXh0anMtcnVudGltZVwiKTtcbiAgICBta2RpclN5bmMocnVudGltZURpcik7XG4gICAgd3JpdGVQdWJsaWNGaWxlTGlzdChydW50aW1lRGlyLCBwdWJsaWNEaXIpO1xuICAgIGV4cGVjdChcbiAgICAgIEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGpvaW4ocnVudGltZURpciwgXCJwdWJsaWMtZmlsZXMuanNvblwiKSwgXCJ1dGYtOFwiKSksXG4gICAgKS50b0VxdWFsKFtcImltYWdlcy9sb2dvQDJ4LnBuZ1wiLCBcInNpdGVtYXAueG1sXCIsIFwic3RhdGljL2hlbGxvIGUyZS50eHRcIl0pO1xuICB9KTtcblxuICBpdChcIndyaXRlcyBhbiBlbXB0eSBsaXN0IGZvciBhbiBhcHAgd2l0aG91dCBwdWJsaWMvXCIsICgpID0+IHtcbiAgICB3cml0ZVB1YmxpY0ZpbGVMaXN0KGRpciwgam9pbihkaXIsIFwicHVibGljXCIpKTtcbiAgICBleHBlY3QoXG4gICAgICBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhqb2luKGRpciwgXCJwdWJsaWMtZmlsZXMuanNvblwiKSwgXCJ1dGYtOFwiKSksXG4gICAgKS50b0VxdWFsKFtdKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJOZXh0anNCdWlsZCB3aXRoIHNraXBCdWlsZCBhbmQgbm8gYnVpbGQgb3V0cHV0XCIsICgpID0+IHtcbiAgaXQoXCJyZXBvcnRzIHRoZSBtaXNzaW5nIGFkYXB0ZXIgbWFuaWZlc3QsIG5vdCBhIGJhcmUgRU5PRU5UXCIsICgpID0+IHtcbiAgICAvLyBgR0xPQkFMX0ZVTkNUSU9OU2AgcGF0Y2hlcyBgLm5leHQvc3RhdGljL2NodW5rc2AsIHdoaWNoIHVzZWQgdG8gYmUgcmVhZFxuICAgIC8vIGZpcnN0IGFuZCBmYWlsIG9uIHRoZSBtaXNzaW5nIGRpcmVjdG9yeS5cbiAgICBleHBlY3QoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzQnVpbGQobmV3IFN0YWNrKG5ldyBBcHAoKSwgXCJTdGFja1wiKSwgXCJCdWlsZFwiLCB7XG4gICAgICAgICAgYnVpbGRDb21tYW5kOiBcInRydWVcIixcbiAgICAgICAgICBidWlsZERpcmVjdG9yeTogZGlyLFxuICAgICAgICAgIG5leHRqc1R5cGU6IE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUyxcbiAgICAgICAgICBza2lwQnVpbGQ6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICkudG9UaHJvdygvY2RrLW5leHRqcyBhZGFwdGVyIG1hbmlmZXN0IG5vdCBmb3VuZC8pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIk5leHRqc0J1aWxkIHdpdGggYSBidWlsZCBzcGxpdCBieSBvdGhlciBmdW5jdGlvbkdyb3Vwc1wiLCAoKSA9PiB7XG4gIGl0KFwicmVqZWN0cyBhIGJ1aWxkIHdob3NlIGdyb3VwcyBrZXB0IHRoZWlyIG5hbWVzIGJ1dCBub3QgdGhlaXIgcm91dGVzXCIsICgpID0+IHtcbiAgICAvLyBNb3ZpbmcgYC9yZXBvcnRzLyoqYCBpbnRvIGBhcGlgIGtlZXBzIHRoZSBncm91cCBuYW1lcywgYW5kIGEgbmFtZXMtb25seVxuICAgIC8vIGNoZWNrIGxldCBDbG91ZEZyb250IHNlbmQgYHJlcG9ydHMvKmAgdG8gYSB6aXAgd2l0aG91dCB0aG9zZSByb3V0ZXMuXG4gICAgd3JpdGUoam9pbihkaXIsIFwiLm5leHRcIiwgXCJCVUlMRF9JRFwiKSwgXCJiMVwiKTtcbiAgICB3cml0ZShcbiAgICAgIGpvaW4oZGlyLCBcIi5uZXh0XCIsIFwiY2RrLW5leHRqcy1hZGFwdGVyXCIsIFwibWFuaWZlc3QuanNvblwiKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdmVyc2lvbjogMSxcbiAgICAgICAgYnVpbGRJZDogXCJiMVwiLFxuICAgICAgICByZWxhdGl2ZVByb2plY3REaXI6IFwiXCIsXG4gICAgICAgIGNvbmZpZzogeyBiYXNlUGF0aDogXCJcIiwgYXNzZXRQcmVmaXg6IFwiXCIsIHRyYWlsaW5nU2xhc2g6IGZhbHNlIH0sXG4gICAgICAgIGVudHJ5cG9pbnRzOiB7fSxcbiAgICAgICAgZ3JvdXBzOiB7IGRlZmF1bHQ6IFtdLCBhcGk6IFtdIH0sXG4gICAgICAgIGZ1bmN0aW9uR3JvdXBzOiBbeyBuYW1lOiBcImFwaVwiLCByb3V0ZXM6IFtcIi9hcGkvKipcIl0gfV0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNCdWlsZChuZXcgU3RhY2sobmV3IEFwcCgpLCBcIlN0YWNrXCIpLCBcIkJ1aWxkXCIsIHtcbiAgICAgICAgICBidWlsZENvbW1hbmQ6IFwidHJ1ZVwiLFxuICAgICAgICAgIGJ1aWxkRGlyZWN0b3J5OiBkaXIsXG4gICAgICAgICAgbmV4dGpzVHlwZTogTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsXG4gICAgICAgICAgc2tpcEJ1aWxkOiB0cnVlLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBzOiBbeyBuYW1lOiBcImFwaVwiLCByb3V0ZXM6IFtcIi9hcGkvKipcIiwgXCIvcmVwb3J0cy8qKlwiXSB9XSxcbiAgICAgICAgfSksXG4gICAgKS50b1Rocm93KC9idWlsZCBvdXRwdXQgaXNcXHMrc3RhbGUvKTtcbiAgfSk7XG5cbiAgaXQoXCJhY2NlcHRzIGEgYnVpbGQgd2hvc2UgZ3JvdXBzIGFuZCByb3V0ZXMgd2VyZSBvbmx5IGxpc3RlZCBpbiBhbm90aGVyIG9yZGVyXCIsICgpID0+IHtcbiAgICAvLyBPbmx5IHRoZSBzdGFsZSBjaGVjayBpcyB1bmRlciB0ZXN0OiBwYXN0IGl0LCB0aGUgdW5zdGFnZWQgcm9vdHMgdGhyb3cuXG4gICAgd3JpdGUoam9pbihkaXIsIFwiLm5leHRcIiwgXCJCVUlMRF9JRFwiKSwgXCJiMVwiKTtcbiAgICB3cml0ZShcbiAgICAgIGpvaW4oZGlyLCBcIi5uZXh0XCIsIFwiY2RrLW5leHRqcy1hZGFwdGVyXCIsIFwibWFuaWZlc3QuanNvblwiKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdmVyc2lvbjogMSxcbiAgICAgICAgYnVpbGRJZDogXCJiMVwiLFxuICAgICAgICByZWxhdGl2ZVByb2plY3REaXI6IFwiXCIsXG4gICAgICAgIGNvbmZpZzogeyBiYXNlUGF0aDogXCJcIiwgYXNzZXRQcmVmaXg6IFwiXCIsIHRyYWlsaW5nU2xhc2g6IGZhbHNlIH0sXG4gICAgICAgIGVudHJ5cG9pbnRzOiB7fSxcbiAgICAgICAgZ3JvdXBzOiB7IGRlZmF1bHQ6IFtdLCBhcGk6IFtdLCBkb2NzOiBbXSB9LFxuICAgICAgICBmdW5jdGlvbkdyb3VwczogW1xuICAgICAgICAgIHsgbmFtZTogXCJhcGlcIiwgcm91dGVzOiBbXCIvYXBpLyoqXCIsIFwiL3JlcG9ydHMvKipcIl0gfSxcbiAgICAgICAgICB7IG5hbWU6IFwiZG9jc1wiLCByb3V0ZXM6IFtcIi9kb2NzLyoqXCJdIH0sXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIGV4cGVjdChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBOZXh0anNCdWlsZChuZXcgU3RhY2sobmV3IEFwcCgpLCBcIlN0YWNrXCIpLCBcIkJ1aWxkXCIsIHtcbiAgICAgICAgICBidWlsZENvbW1hbmQ6IFwidHJ1ZVwiLFxuICAgICAgICAgIGJ1aWxkRGlyZWN0b3J5OiBkaXIsXG4gICAgICAgICAgbmV4dGpzVHlwZTogTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsXG4gICAgICAgICAgc2tpcEJ1aWxkOiB0cnVlLFxuICAgICAgICAgIGZ1bmN0aW9uR3JvdXBzOiBbXG4gICAgICAgICAgICB7IG5hbWU6IFwiZG9jc1wiLCByb3V0ZXM6IFtcIi9kb2NzLyoqXCJdIH0sXG4gICAgICAgICAgICB7IG5hbWU6IFwiYXBpXCIsIHJvdXRlczogW1wiL3JlcG9ydHMvKipcIiwgXCIvYXBpLyoqXCJdIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSksXG4gICAgKS5ub3QudG9UaHJvdygvc3RhbGUvKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJkZXBsb3ltZW50QXJjaGl0ZWN0dXJlXCIsICgpID0+IHtcbiAgY29uc3QgYmFzZSA9IHsgYnVpbGRDb21tYW5kOiBcIlwiLCBidWlsZERpcmVjdG9yeTogXCJcIiB9O1xuICBjb25zdCBmdW5jdGlvbnMgPSB7IC4uLmJhc2UsIG5leHRqc1R5cGU6IE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUyB9O1xuXG4gIGNvbnN0IGhvc3QgPSBwcm9jZXNzLmFyY2guc3RhcnRzV2l0aChcImFybVwiKSA/IFwiYXJtNjRcIiA6IFwieDg2XzY0XCI7XG5cbiAgaXQoXCJzdGFnZXMgdGhlIEZ1bmN0aW9ucyB0eXBlcyBmb3IgdGhlIHN5bnRoIG1hY2hpbmUgdW5sZXNzIHRvbGQgb3RoZXJ3aXNlXCIsICgpID0+IHtcbiAgICBleHBlY3QoZGVwbG95bWVudEFyY2hpdGVjdHVyZShmdW5jdGlvbnMpLm5hbWUpLnRvQmUoaG9zdCk7XG4gIH0pO1xuXG4gIC8vIFRoZSBwb2ludCBvZiBob25vcmluZyB0aGUgcHJvcDogYHNoYXJwYCBmb3IgYW5vdGhlciBhcmNoaXRlY3R1cmUgaXMgb25seVxuICAvLyBhIGRvd25sb2FkLCBzbyB0aGUgYnVpbGQgbm8gbG9uZ2VyIGhhcyB0byBydW4gd2hlcmUgdGhlIGZ1bmN0aW9uIHdpbGwuXG4gIGl0KFwic3RhZ2VzIGZvciB0aGUgYXJjaGl0ZWN0dXJlIGFza2VkIGZvciwgbm90IHRoZSBzeW50aCBtYWNoaW5lJ3NcIiwgKCkgPT4ge1xuICAgIGNvbnN0IG90aGVyID0gaG9zdCA9PT0gXCJhcm02NFwiID8gQXJjaGl0ZWN0dXJlLlg4Nl82NCA6IEFyY2hpdGVjdHVyZS5BUk1fNjQ7XG4gICAgZXhwZWN0KGRlcGxveW1lbnRBcmNoaXRlY3R1cmUoeyAuLi5mdW5jdGlvbnMsIGFyY2hpdGVjdHVyZTogb3RoZXIgfSkpLnRvQmUoXG4gICAgICBvdGhlcixcbiAgICApO1xuICB9KTtcblxuICBpdChcImZvbGxvd3MgdGhlIHN5bnRoIG1hY2hpbmUgZm9yIHRoZSBDb250YWluZXJzIHR5cGVzXCIsICgpID0+IHtcbiAgICBjb25zdCBwcm9wcyA9IHtcbiAgICAgIC4uLmJhc2UsXG4gICAgICBuZXh0anNUeXBlOiBOZXh0anNUeXBlLlJFR0lPTkFMX0NPTlRBSU5FUlMsXG4gICAgICBhcmNoaXRlY3R1cmU6XG4gICAgICAgIGhvc3QgPT09IFwiYXJtNjRcIiA/IEFyY2hpdGVjdHVyZS5YODZfNjQgOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgIH07XG4gICAgZXhwZWN0KGRlcGxveW1lbnRBcmNoaXRlY3R1cmUocHJvcHMpLm5hbWUpLnRvQmUoaG9zdCk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";(()=>{async function f(e){let t=typeof e=="string"?new TextEncoder().encode(e):e,
|
|
1
|
+
"use strict";(()=>{async function f(e){let t=typeof e=="string"?new TextEncoder().encode(e):e,n=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(n)).map(i=>i.toString(16).padStart(2,"0")).join("")}async function u(e){if(!e)return{bytes:new Uint8Array(0),body:e};if(typeof e=="string")return{bytes:new TextEncoder().encode(e),body:e};if(e instanceof FormData){let t=new Response(e),n=new Uint8Array(await t.arrayBuffer());return{bytes:n,body:n,contentType:t.headers.get("content-type")??void 0}}return e instanceof Blob?{bytes:new Uint8Array(await e.arrayBuffer()),body:e}:e instanceof ArrayBuffer?{bytes:new Uint8Array(e),body:e}:ArrayBuffer.isView(e)?{bytes:new Uint8Array(e.buffer,e.byteOffset,e.byteLength),body:e}:e instanceof URLSearchParams?{bytes:new TextEncoder().encode(e.toString()),body:e}:{bytes:new TextEncoder().encode(String(e)),body:e}}var o=Symbol.for("cdk-nextjs:patch-fetch"),a=globalThis.fetch;async function h(e,t){let n=e instanceof Request?e:void 0,s=(t?.method??n?.method)?.toUpperCase();if(s!=="PUT"&&s!=="POST"||new URL(n?n.url:String(e),location.href).hostname!==location.hostname)return a(e,t);t=t??{};let c=new Headers(t.headers??n?.headers),r=n&&t.body==null?{bytes:new Uint8Array(await n.clone().arrayBuffer())}:await u(t.body);r.contentType&&c.set("content-type",r.contentType),r.body!==t.body&&(t.body=r.body);let l=r.bytes,p=await f(l);return c.set("x-amz-content-sha256",p),t.headers=c,a(e,t)}a[o]||(h[o]=!0,globalThis.fetch=h);if(typeof globalThis.XMLHttpRequest<"u"&&!globalThis.XMLHttpRequest[o]){let e=globalThis.XMLHttpRequest;globalThis.XMLHttpRequest=class extends e{constructor(){super(),this.method="",this.url="",this.originalOpen=super.open,this.originalSend=super.send,super.open=(t,n,...s)=>{this.method=t.toUpperCase(),this.url=n,this.originalOpen.apply(this,[t,n,...s])},super.send=async t=>{if((this.method==="PUT"||this.method==="POST")&&new URL(this.url,location.href).hostname===location.hostname&&t){let n=await u(t);n.contentType&&this.setRequestHeader("content-type",n.contentType),t=n.body;let s=await f(n.bytes);this.setRequestHeader("x-amz-content-sha256",s)}this.originalSend.apply(this,[t])}}},globalThis.XMLHttpRequest[o]=!0}})();
|