cdk-nextjs 0.3.11 → 0.4.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 +1248 -748
- package/API.md +1033 -531
- package/README.md +1 -2
- package/assets/lambdas/assets-deployment/assets-deployment.lambda/assets-deployment.Dockerfile +12 -8
- package/assets/lambdas/assets-deployment/assets-deployment.lambda/index.js +67 -56
- package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +246 -0
- package/docs/breaking-changes.md +9 -0
- package/docs/notes.md +170 -20
- package/lib/constants.d.ts +32 -0
- package/lib/constants.js +38 -0
- package/lib/generated-structs/OptionalCustomResourceProps.d.ts +104 -0
- package/lib/generated-structs/OptionalCustomResourceProps.js +3 -0
- package/lib/generated-structs/OptionalDockerImageAssetProps.d.ts +21 -0
- package/lib/generated-structs/OptionalDockerImageAssetProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.d.ts +4 -3
- package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsBuildProps.d.ts +1 -1
- package/lib/generated-structs/OptionalNextjsBuildProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +3 -3
- package/lib/generated-structs/OptionalNextjsContainersProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsPostDeployProps.d.ts +42 -0
- package/lib/generated-structs/OptionalNextjsPostDeployProps.js +3 -0
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +41 -0
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.js +4 -0
- package/lib/index.d.ts +6 -5
- package/lib/index.js +6 -8
- package/lib/lambdas/assets-deployment/assets-deployment.lambda.js +5 -23
- package/lib/lambdas/assets-deployment/fs-to-fs.js +18 -3
- package/lib/lambdas/assets-deployment/fs-to-s3.d.ts +8 -2
- package/lib/lambdas/assets-deployment/fs-to-s3.js +14 -8
- package/lib/lambdas/post-deploy/create-invalidation.d.ts +2 -0
- package/lib/lambdas/post-deploy/create-invalidation.js +19 -0
- package/lib/lambdas/post-deploy/post-deploy-function.d.ts +13 -0
- package/lib/lambdas/post-deploy/post-deploy-function.js +22 -0
- package/lib/lambdas/post-deploy/post-deploy.lambda.d.ts +9 -0
- package/lib/lambdas/post-deploy/post-deploy.lambda.js +56 -0
- package/lib/lambdas/post-deploy/prune-fs.d.ts +10 -0
- package/lib/lambdas/post-deploy/prune-fs.js +33 -0
- package/lib/lambdas/post-deploy/prune-s3.d.ts +15 -0
- package/lib/lambdas/post-deploy/prune-s3.js +101 -0
- package/lib/lambdas/utils.js +35 -0
- package/lib/nextjs-assets-deployment.d.ts +15 -51
- package/lib/nextjs-assets-deployment.js +27 -25
- package/lib/nextjs-build/builder.Dockerfile +12 -8
- package/lib/nextjs-build/cdk-nextjs-cache-handler.cjs +63 -0
- package/lib/nextjs-build/cdk-nextjs-cache-handler.d.ts +21 -0
- package/lib/nextjs-build/cdk-nextjs-cache-handler.js +49 -0
- package/lib/nextjs-build/global-containers.Dockerfile +29 -19
- package/lib/nextjs-build/global-functions.Dockerfile +30 -24
- package/lib/nextjs-build/nextjs-build.d.ts +51 -26
- package/lib/nextjs-build/nextjs-build.js +108 -88
- package/lib/nextjs-build/regional-containers.Dockerfile +30 -20
- package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +0 -1
- package/lib/nextjs-compute/nextjs-compute-base-props.js +1 -1
- package/lib/nextjs-compute/nextjs-containers.d.ts +2 -1
- package/lib/nextjs-compute/nextjs-containers.js +7 -5
- package/lib/nextjs-compute/nextjs-functions.d.ts +1 -0
- package/lib/nextjs-compute/nextjs-functions.js +8 -11
- package/lib/nextjs-distribution.d.ts +1 -1
- package/lib/nextjs-distribution.js +4 -4
- package/lib/nextjs-file-system.js +1 -1
- package/lib/nextjs-post-deploy.d.ts +101 -0
- package/lib/nextjs-post-deploy.js +78 -0
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/nextjs-vpc.d.ts +1 -1
- package/lib/nextjs-vpc.js +4 -4
- package/lib/root-constructs/nextjs-base-overrides.d.ts +4 -0
- package/lib/root-constructs/nextjs-base-overrides.js +1 -1
- package/lib/root-constructs/nextjs-base-props.d.ts +15 -7
- package/lib/root-constructs/nextjs-base-props.js +1 -1
- package/lib/root-constructs/nextjs-global-containers.d.ts +8 -8
- package/lib/root-constructs/nextjs-global-containers.js +25 -15
- package/lib/root-constructs/nextjs-global-functions.d.ts +8 -11
- package/lib/root-constructs/nextjs-global-functions.js +25 -25
- package/lib/root-constructs/nextjs-regional-containers.d.ts +8 -0
- package/lib/root-constructs/nextjs-regional-containers.js +26 -9
- package/lib/utils/get-architecture.d.ts +2 -0
- package/lib/utils/get-architecture.js +8 -0
- package/lib/utils/handle-deprecated-properties.d.ts +7 -0
- package/lib/utils/handle-deprecated-properties.js +14 -0
- package/package.json +17 -19
- package/assets/lambdas/revalidate/revalidate.lambda/index.js +0 -67
- package/lib/common.d.ts +0 -25
- package/lib/common.js +0 -30
- package/lib/generated-structs/OptionalNextjsInvalidationProps.d.ts +0 -11
- package/lib/generated-structs/OptionalNextjsInvalidationProps.js +0 -3
- package/lib/lambdas/assets-deployment/prune-s3.d.ts +0 -15
- package/lib/lambdas/assets-deployment/prune-s3.js +0 -42
- package/lib/lambdas/assets-deployment/s3.d.ts +0 -2
- package/lib/lambdas/assets-deployment/s3.js +0 -7
- package/lib/lambdas/assets-deployment/utils.js +0 -35
- package/lib/lambdas/revalidate/revalidate-function.d.ts +0 -13
- package/lib/lambdas/revalidate/revalidate-function.js +0 -22
- package/lib/lambdas/revalidate/revalidate.lambda.d.ts +0 -2
- package/lib/lambdas/revalidate/revalidate.lambda.js +0 -53
- package/lib/nextjs-build/add-cache-handler.d.ts +0 -1
- package/lib/nextjs-build/add-cache-handler.js +0 -23
- package/lib/nextjs-build/add-cache-handler.mjs +0 -18
- package/lib/nextjs-build/cache-handler.cjs +0 -21878
- package/lib/nextjs-build/cache-handler.d.ts +0 -6
- package/lib/nextjs-build/cache-handler.js +0 -26
- package/lib/nextjs-invalidation.d.ts +0 -19
- package/lib/nextjs-invalidation.js +0 -52
- package/lib/nextjs-revalidation.d.ts +0 -30
- package/lib/nextjs-revalidation.js +0 -65
- /package/lib/lambdas/{assets-deployment/utils.d.ts → utils.d.ts} +0 -0
|
@@ -11,7 +11,7 @@ const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
|
11
11
|
const aws_ecr_assets_1 = require("aws-cdk-lib/aws-ecr-assets");
|
|
12
12
|
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
13
13
|
const constructs_1 = require("constructs");
|
|
14
|
-
const
|
|
14
|
+
const constants_1 = require("../constants");
|
|
15
15
|
/**
|
|
16
16
|
* Builds Next.js assets.
|
|
17
17
|
* @link https://nextjs.org/docs/pages/api-reference/next-config-js/output
|
|
@@ -20,24 +20,22 @@ class NextjsBuild extends constructs_1.Construct {
|
|
|
20
20
|
constructor(scope, id, props) {
|
|
21
21
|
super(scope, id);
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
24
|
-
* route cache will be symlinked to this location.
|
|
25
|
-
*
|
|
26
|
-
* Must comply with pattern: ^/mnt/[a-zA-Z0-9-_.]+$ due to lambda requirement.
|
|
27
|
-
* Fargate doesn't have this same requirement but we share code for lambda and
|
|
28
|
-
* fargate.
|
|
29
|
-
* @see https://docs.aws.amazon.com/lambda/latest/api/API_FileSystemConfig.html
|
|
23
|
+
* Repository name for the builder image.
|
|
30
24
|
*/
|
|
31
|
-
this.
|
|
25
|
+
this.builderImageRepo = "cdk-nextjs/builder";
|
|
32
26
|
this.containerRuntime = process.env.CDK_DOCKER || "docker";
|
|
33
|
-
this.
|
|
34
|
-
this.
|
|
27
|
+
this.builderImageAlias = `${this.builderImageRepo}:${this.node.addr.slice(30)}`;
|
|
28
|
+
this.relativePathToPackage = props.relativePathToPackage || ".";
|
|
35
29
|
this.props = props;
|
|
36
30
|
this.relativePathToEntrypoint = this.getRelativeEntrypointPath();
|
|
37
|
-
|
|
31
|
+
if (!props.builderImageProps?.skipBuild) {
|
|
32
|
+
this.createBuilderImage();
|
|
33
|
+
}
|
|
34
|
+
this.buildImageDigest = this.getBuilderImageDigest();
|
|
35
|
+
this.buildId = this.getBuildId();
|
|
38
36
|
this.publicDirEntries = this.getPublicDirEntries();
|
|
39
|
-
if (props.nextjsType ===
|
|
40
|
-
props.nextjsType ===
|
|
37
|
+
if (props.nextjsType === constants_1.NextjsType.GLOBAL_CONTAINERS ||
|
|
38
|
+
props.nextjsType === constants_1.NextjsType.REGIONAL_CONTAINERS) {
|
|
41
39
|
this.imageForNextjsContainers = this.createImageForNextjsContainers();
|
|
42
40
|
}
|
|
43
41
|
else {
|
|
@@ -48,7 +46,7 @@ class NextjsBuild extends constructs_1.Construct {
|
|
|
48
46
|
}
|
|
49
47
|
getRelativeEntrypointPath() {
|
|
50
48
|
// joinPosix b/c this will be used in linux container
|
|
51
|
-
return (0, posix_1.join)(this.props.
|
|
49
|
+
return (0, posix_1.join)(this.props.relativePathToPackage || "", "server.js");
|
|
52
50
|
}
|
|
53
51
|
/**
|
|
54
52
|
* A builder or base image needs to be created so that the same image can be
|
|
@@ -60,7 +58,7 @@ class NextjsBuild extends constructs_1.Construct {
|
|
|
60
58
|
const buildCommand = this.props.buildCommand || "npm run build";
|
|
61
59
|
const { buildArgs = {
|
|
62
60
|
BUILD_COMMAND: buildCommand,
|
|
63
|
-
|
|
61
|
+
RELATIVE_PATH_TO_PACKAGE: this.relativePathToPackage,
|
|
64
62
|
...this.props.builderImageProps?.buildArgs,
|
|
65
63
|
}, envVarNames = [], exclude = [
|
|
66
64
|
"**/node_modules",
|
|
@@ -69,92 +67,112 @@ class NextjsBuild extends constructs_1.Construct {
|
|
|
69
67
|
"**/.next",
|
|
70
68
|
".gitignore",
|
|
71
69
|
"*.md",
|
|
72
|
-
], file = "builder.Dockerfile", platform,
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
if (
|
|
83
|
-
|
|
70
|
+
], file = "builder.Dockerfile", platform, } = this.props.builderImageProps || {};
|
|
71
|
+
// to be added to user provided build context before builder image is built
|
|
72
|
+
const filePathsToCopy = [
|
|
73
|
+
(0, node_path_1.join)(__dirname, "cdk-nextjs-cache-handler.cjs"),
|
|
74
|
+
];
|
|
75
|
+
// to be removed from user provided build context after builder image is built
|
|
76
|
+
const filePathsToRemove = [
|
|
77
|
+
(0, node_path_1.join)(this.props.buildContext, "cdk-nextjs-cache-handler.cjs"),
|
|
78
|
+
];
|
|
79
|
+
// if custom file (Dockerfile) is not specified then use library's default builder.Dockerfile + .dockerignore
|
|
80
|
+
if (!this.props.builderImageProps?.file) {
|
|
81
|
+
filePathsToCopy.push((0, node_path_1.join)(__dirname, file));
|
|
82
|
+
filePathsToRemove.push((0, node_path_1.join)(this.props.buildContext, file));
|
|
83
|
+
const excludeFileStr = exclude?.join("\n");
|
|
84
|
+
const dockerignoreFilePath = (0, node_path_1.join)(this.props.buildContext, ".dockerignore");
|
|
85
|
+
(0, node_fs_1.writeFileSync)(dockerignoreFilePath, excludeFileStr);
|
|
86
|
+
filePathsToRemove.push(dockerignoreFilePath);
|
|
84
87
|
}
|
|
88
|
+
for (const filePathToCopy of filePathsToCopy) {
|
|
89
|
+
(0, node_fs_1.cpSync)(filePathToCopy, (0, node_path_1.join)(this.props.buildContext, (0, node_path_1.basename)(filePathToCopy)));
|
|
90
|
+
}
|
|
91
|
+
const buildArgsStr = this.createBuildArgStr(buildArgs);
|
|
92
|
+
this.injectBuilderDockerfileEnvVars((0, node_path_1.join)(this.props.buildContext, file), envVarNames);
|
|
85
93
|
const command = this.props.builderImageProps?.command ||
|
|
86
|
-
`${this.containerRuntime} build ${platform ? `--platform ${platform.platform}` : ""} --file ${file} --tag ${this.
|
|
94
|
+
`${this.containerRuntime} build ${platform ? `--platform ${platform.platform}` : ""} --file ${file} --tag ${this.builderImageAlias} ${buildArgsStr} .`;
|
|
87
95
|
let error;
|
|
88
96
|
try {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
+
console.log(`Building image with command: ${command} in directory: ${this.props.buildContext}`);
|
|
98
|
+
(0, node_child_process_1.execSync)(command, {
|
|
99
|
+
stdio: "inherit",
|
|
100
|
+
cwd: this.props.buildContext,
|
|
101
|
+
env: process.env,
|
|
102
|
+
});
|
|
97
103
|
}
|
|
98
104
|
catch (err) {
|
|
99
105
|
error = err;
|
|
100
106
|
}
|
|
101
107
|
finally {
|
|
102
|
-
(
|
|
103
|
-
|
|
104
|
-
if (envVarNames.length) {
|
|
105
|
-
(0, node_fs_1.rmSync)(loadEnvVarsScriptPath);
|
|
108
|
+
for (const filePathToRemove of filePathsToRemove) {
|
|
109
|
+
(0, node_fs_1.rmSync)(filePathToRemove);
|
|
106
110
|
}
|
|
107
111
|
}
|
|
108
112
|
if (error)
|
|
109
113
|
throw error;
|
|
110
|
-
|
|
114
|
+
}
|
|
115
|
+
injectBuilderDockerfileEnvVars(builderDockerfilePath, envVarNames) {
|
|
116
|
+
const envVars = {};
|
|
117
|
+
for (const envVarName of envVarNames) {
|
|
118
|
+
if (process.env[envVarName]) {
|
|
119
|
+
envVars[envVarName] = process.env[envVarName];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const content = Object.entries(envVars)
|
|
123
|
+
.map(([name, value]) => `${name}=${value}`)
|
|
124
|
+
.join(" ");
|
|
125
|
+
const oldFile = (0, node_fs_1.readFileSync)(builderDockerfilePath).toString();
|
|
126
|
+
const newFile = oldFile.replace(constants_1.INJECT_CDK_NEXTJS_BUILD_ENV_VARS, content);
|
|
127
|
+
(0, node_fs_1.writeFileSync)(builderDockerfilePath, newFile);
|
|
111
128
|
}
|
|
112
129
|
createBuildArgStr(buildArgs) {
|
|
113
130
|
return Object.entries(buildArgs).reduce((acc, [key, value]) => {
|
|
114
131
|
return `${acc} --build-arg ${key}="${value}"`;
|
|
115
132
|
}, "");
|
|
116
133
|
}
|
|
117
|
-
createLoadEnvVarsScript(envVarNames = [], loadEnvVarsScriptPath) {
|
|
118
|
-
let loadEnvVarsScript = "# Dynamically generated script to load env vars into build container";
|
|
119
|
-
for (const envVarName of envVarNames) {
|
|
120
|
-
loadEnvVarsScript += `\nexport ${envVarName}=${process.env[envVarName] || '""'}`;
|
|
121
|
-
}
|
|
122
|
-
(0, node_fs_1.writeFileSync)(loadEnvVarsScriptPath, loadEnvVarsScript);
|
|
123
|
-
}
|
|
124
134
|
getBuilderImageDigest() {
|
|
125
|
-
const digest = (0, node_child_process_1.execSync)(`${this.containerRuntime} images --no-trunc --quiet ${this.
|
|
135
|
+
const digest = (0, node_child_process_1.execSync)(`${this.containerRuntime} images --no-trunc --quiet ${this.builderImageAlias}`, { encoding: "utf-8" });
|
|
126
136
|
return digest.slice(0, -1); // remove trailing \n
|
|
127
137
|
}
|
|
128
138
|
getPublicDirEntries() {
|
|
129
|
-
const publicDirPath = (0, posix_1.join)("/app", this.props.
|
|
130
|
-
const publicDirEntriesString = (0, node_child_process_1.execSync)(`${this.containerRuntime} run ${this.
|
|
139
|
+
const publicDirPath = (0, posix_1.join)("/app", this.props.relativePathToPackage || "", "public");
|
|
140
|
+
const publicDirEntriesString = (0, node_child_process_1.execSync)(`${this.containerRuntime} run ${this.builderImageAlias} node -e "console.log(JSON.stringify(fs.readdirSync('${publicDirPath}', { withFileTypes: true }).map((e) => ({ name: e.name, isDirectory: e.isDirectory()}))))"`, { encoding: "utf-8" });
|
|
131
141
|
return JSON.parse(publicDirEntriesString);
|
|
132
142
|
}
|
|
143
|
+
getBuildId() {
|
|
144
|
+
const buildIdPath = (0, posix_1.join)("/app", this.props.relativePathToPackage || "", ".next", "BUILD_ID");
|
|
145
|
+
const buildId = (0, node_child_process_1.execSync)(`${this.containerRuntime} run ${this.builderImageAlias} /bin/sh -c "cat ${buildIdPath}"`, { encoding: "utf-8" });
|
|
146
|
+
return buildId;
|
|
147
|
+
}
|
|
133
148
|
createImageForNextjsContainers() {
|
|
134
|
-
const dockerfileNamePrefix = this.props.nextjsType ===
|
|
149
|
+
const dockerfileNamePrefix = this.props.nextjsType === constants_1.NextjsType.GLOBAL_CONTAINERS
|
|
135
150
|
? "global"
|
|
136
151
|
: "regional";
|
|
137
152
|
const dockerfileName = `${dockerfileNamePrefix}-containers.Dockerfile`;
|
|
138
153
|
// cdk-nextjs/builder-{hash} already contains built nextjs app which we'll
|
|
139
154
|
// `COPY --from=cdk-nextjs/builder-{hash}` so we just need the Dockerfile
|
|
140
155
|
// which is in lib/nextjs-build folder.
|
|
141
|
-
const buildContext =
|
|
156
|
+
const buildContext = this.props.overrides?.containersImageBuildContext ??
|
|
157
|
+
(0, node_path_1.join)(__dirname, "..", "..", "lib", "nextjs-build");
|
|
142
158
|
const dockerImageAsset = new aws_ecr_assets_1.DockerImageAsset(this, "Image", {
|
|
143
|
-
buildArgs: {
|
|
144
|
-
BUILDER_IMAGE_TAG: this.builderImageTag,
|
|
145
|
-
DATA_CACHE_DIR: common_1.DATA_CACHE_DIR,
|
|
146
|
-
FULL_ROUTE_CACHE_DIR: common_1.FULL_ROUTE_CACHE_DIR,
|
|
147
|
-
PUBLIC_DIR: common_1.PUBLIC_DIR,
|
|
148
|
-
IMAGE_CACHE_DIR: common_1.IMAGE_CACHE_DIR,
|
|
149
|
-
MOUNT_PATH: this.containerMountPathForEfs,
|
|
150
|
-
RELATIVE_PATH_TO_WORKSPACE: this.relativePathToWorkspace,
|
|
151
|
-
},
|
|
152
159
|
directory: buildContext,
|
|
153
|
-
exclude: ["*", `!${dockerfileName}`, "!add-cache-handler.mjs"],
|
|
154
160
|
extraHash: this.buildImageDigest, // rebuild when builder hash changes
|
|
155
161
|
file: dockerfileName,
|
|
156
162
|
ignoreMode: aws_cdk_lib_1.IgnoreMode.DOCKER,
|
|
157
163
|
...this.props.overrides?.nextjsContainersDockerImageAssetProps,
|
|
164
|
+
buildArgs: {
|
|
165
|
+
[constants_1.BUILD_ID_ARG_NAME]: this.buildId,
|
|
166
|
+
[constants_1.BUILDER_IMAGE_ALIAS_ARG_NAME]: this.builderImageAlias,
|
|
167
|
+
[constants_1.CACHE_PATH_ARG_NAME]: constants_1.CACHE_PATH,
|
|
168
|
+
[constants_1.DATA_CACHE_PATH_ARG_NAME]: constants_1.DATA_CACHE_PATH,
|
|
169
|
+
[constants_1.PUBLIC_PATH_ARG_NAME]: constants_1.PUBLIC_PATH,
|
|
170
|
+
[constants_1.IMAGE_CACHE_PATH_ARG_NAME]: constants_1.IMAGE_CACHE_PATH,
|
|
171
|
+
[constants_1.MOUNT_PATH_ARG_NAME]: constants_1.MOUNT_PATH,
|
|
172
|
+
[constants_1.RELATIVE_PATH_TO_PACKAGE_ARG_NAME]: this.relativePathToPackage,
|
|
173
|
+
...this.props.overrides?.nextjsContainersDockerImageAssetProps
|
|
174
|
+
?.buildArgs,
|
|
175
|
+
},
|
|
158
176
|
});
|
|
159
177
|
return dockerImageAsset;
|
|
160
178
|
}
|
|
@@ -163,28 +181,25 @@ class NextjsBuild extends constructs_1.Construct {
|
|
|
163
181
|
// cdk-nextjs/builder-{hash} already contains built nextjs app which we'll
|
|
164
182
|
// `COPY --from=cdk-nextjs/builder-{hash}` so we just need the Dockerfile
|
|
165
183
|
// which is in lib/nextjs-build folder.
|
|
166
|
-
const buildContext =
|
|
184
|
+
const buildContext = this.props.overrides?.functionsImageBuildContext ??
|
|
185
|
+
(0, node_path_1.join)(__dirname, "..", "..", "lib", "nextjs-build");
|
|
167
186
|
const dockerImageCode = aws_lambda_1.DockerImageCode.fromImageAsset(buildContext, {
|
|
168
|
-
buildArgs: {
|
|
169
|
-
BUILDER_IMAGE_TAG: this.builderImageTag,
|
|
170
|
-
DATA_CACHE_DIR: common_1.DATA_CACHE_DIR,
|
|
171
|
-
FULL_ROUTE_CACHE_DIR: common_1.FULL_ROUTE_CACHE_DIR,
|
|
172
|
-
PUBLIC_DIR: common_1.PUBLIC_DIR,
|
|
173
|
-
IMAGE_CACHE_DIR: common_1.IMAGE_CACHE_DIR,
|
|
174
|
-
MOUNT_PATH: this.containerMountPathForEfs,
|
|
175
|
-
RELATIVE_PATH_TO_WORKSPACE: this.relativePathToWorkspace,
|
|
176
|
-
},
|
|
177
187
|
cmd: ["node", this.relativePathToEntrypoint],
|
|
178
|
-
exclude: [
|
|
179
|
-
"*",
|
|
180
|
-
`!${dockerfileName}`,
|
|
181
|
-
"!add-cache-handler.mjs",
|
|
182
|
-
"!cache-handler.cjs",
|
|
183
|
-
],
|
|
184
188
|
extraHash: this.buildImageDigest, // rebuild when builder hash changes
|
|
185
189
|
file: dockerfileName,
|
|
186
190
|
ignoreMode: aws_cdk_lib_1.IgnoreMode.DOCKER,
|
|
187
191
|
...this.props.overrides?.nextjsFunctionsAssetImageCodeProps,
|
|
192
|
+
buildArgs: {
|
|
193
|
+
[constants_1.BUILD_ID_ARG_NAME]: this.buildId,
|
|
194
|
+
[constants_1.BUILDER_IMAGE_ALIAS_ARG_NAME]: this.builderImageAlias,
|
|
195
|
+
[constants_1.CACHE_PATH_ARG_NAME]: constants_1.CACHE_PATH,
|
|
196
|
+
[constants_1.DATA_CACHE_PATH_ARG_NAME]: constants_1.DATA_CACHE_PATH,
|
|
197
|
+
[constants_1.PUBLIC_PATH_ARG_NAME]: constants_1.PUBLIC_PATH,
|
|
198
|
+
[constants_1.IMAGE_CACHE_PATH_ARG_NAME]: constants_1.IMAGE_CACHE_PATH,
|
|
199
|
+
[constants_1.MOUNT_PATH_ARG_NAME]: constants_1.MOUNT_PATH,
|
|
200
|
+
[constants_1.RELATIVE_PATH_TO_PACKAGE_ARG_NAME]: this.relativePathToPackage,
|
|
201
|
+
...this.props.overrides?.nextjsFunctionsAssetImageCodeProps?.buildArgs,
|
|
202
|
+
},
|
|
188
203
|
});
|
|
189
204
|
// TODO: how to clean up temp dir?
|
|
190
205
|
// rmSync(tempDir, { recursive: true });
|
|
@@ -195,24 +210,29 @@ class NextjsBuild extends constructs_1.Construct {
|
|
|
195
210
|
/**
|
|
196
211
|
* Path to bundled custom resource code
|
|
197
212
|
*/
|
|
198
|
-
const
|
|
213
|
+
const buildContext = this.props.overrides?.assetsDeploymentImageBuildContext ??
|
|
214
|
+
(0, node_path_1.join)(__dirname, "..", "..", "assets", "lambdas", "assets-deployment", "assets-deployment.lambda");
|
|
199
215
|
// cdk-nextjs/builder-{hash} already contains Next.js built code which
|
|
200
216
|
// we'll copy into final image. But we also need lambda code to run
|
|
201
217
|
// asset deployment tasks
|
|
202
|
-
const dockerImageCode = aws_lambda_1.DockerImageCode.fromImageAsset(
|
|
203
|
-
buildArgs: {
|
|
204
|
-
BUILDER_IMAGE_TAG: this.builderImageTag,
|
|
205
|
-
RELATIVE_PATH_TO_WORKSPACE: this.relativePathToWorkspace,
|
|
206
|
-
},
|
|
218
|
+
const dockerImageCode = aws_lambda_1.DockerImageCode.fromImageAsset(buildContext, {
|
|
207
219
|
extraHash: this.buildImageDigest, // rebuild when builder hash changes
|
|
208
220
|
file: dockerfileName,
|
|
209
221
|
ignoreMode: aws_cdk_lib_1.IgnoreMode.DOCKER,
|
|
210
222
|
...this.props.overrides?.nextjsAssetDeploymentAssetImageCodeProps,
|
|
223
|
+
buildArgs: {
|
|
224
|
+
[constants_1.BUILD_ID_ARG_NAME]: this.buildId,
|
|
225
|
+
[constants_1.BUILDER_IMAGE_ALIAS_ARG_NAME]: this.builderImageAlias,
|
|
226
|
+
[constants_1.PUBLIC_PATH_ARG_NAME]: constants_1.PUBLIC_PATH,
|
|
227
|
+
[constants_1.RELATIVE_PATH_TO_PACKAGE_ARG_NAME]: this.relativePathToPackage,
|
|
228
|
+
...this.props.overrides?.nextjsAssetDeploymentAssetImageCodeProps
|
|
229
|
+
?.buildArgs,
|
|
230
|
+
},
|
|
211
231
|
});
|
|
212
232
|
return dockerImageCode;
|
|
213
233
|
}
|
|
214
234
|
}
|
|
215
235
|
exports.NextjsBuild = NextjsBuild;
|
|
216
236
|
_a = JSII_RTTI_SYMBOL_1;
|
|
217
|
-
NextjsBuild[_a] = { fqn: "cdk-nextjs.NextjsBuild", version: "0.
|
|
218
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJ1aWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwyREFBOEM7QUFDOUMscUNBQXdEO0FBQ3hELHlDQUFpQztBQUNqQywyQ0FBb0Q7QUFDcEQsNkNBQXlDO0FBQ3pDLCtEQUF3RTtBQUN4RSx1REFBOEU7QUFDOUUsMkNBQXVDO0FBQ3ZDLHNDQU1tQjtBQWtGbkI7OztHQUdHO0FBQ0gsTUFBYSxXQUFZLFNBQVEsc0JBQVM7SUFxRHhDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBdUI7UUFDL0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQS9DbkI7Ozs7Ozs7O1dBUUc7UUFDSCw2QkFBd0IsR0FBRyxpQkFBaUIsQ0FBQztRQWlDckMscUJBQWdCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDO1FBTTVELElBQUksQ0FBQyxlQUFlLEdBQUcsc0JBQXNCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3hFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUMsdUJBQXVCLElBQUksR0FBRyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNqRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ25ELElBQ0UsS0FBSyxDQUFDLFVBQVUsS0FBSyxtQkFBVSxDQUFDLGlCQUFpQjtZQUNqRCxLQUFLLENBQUMsVUFB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RSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsb0NBQW9DO1lBQ3RFLElBQUksRUFBRSxjQUFjO1lBQ3BCLFVBQVUsRUFBRSx3QkFBVSxDQUFDLE1BQU07WUFDN0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSx3Q0FBd0M7U0FDbEUsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQzs7QUFuUkgsa0NBb1JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBjcFN5bmMsIHJtU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgam9pbiBhcyBqb2luUG9zaXggfSBmcm9tIFwibm9kZTpwYXRoL3Bvc2l4XCI7XG5pbXBvcnQgeyBJZ25vcmVNb2RlIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBEb2NrZXJJbWFnZUFzc2V0LCBQbGF0Zm9ybSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNyLWFzc2V0c1wiO1xuaW1wb3J0IHsgQXNzZXRJbWFnZUNvZGVQcm9wcywgRG9ja2VySW1hZ2VDb2RlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICBEQVRBX0NBQ0hFX0RJUixcbiAgRlVMTF9ST1VURV9DQUNIRV9ESVIsXG4gIElNQUdFX0NBQ0hFX0RJUixcbiAgTmV4dGpzVHlwZSxcbiAgUFVCTElDX0RJUixcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHsgT3B0aW9uYWxEb2NrZXJJbWFnZUFzc2V0UHJvcHMgfSBmcm9tIFwiLi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxEb2NrZXJJbWFnZUFzc2V0UHJvcHNcIjtcbmltcG9ydCB7IE5leHRqc0Jhc2VQcm9wcyB9IGZyb20gXCIuLi9yb290LWNvbnN0cnVjdHMvbmV4dGpzLWJhc2UtcHJvcHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBCdWlsZGVySW1hZ2VQcm9wcyB7XG4gIC8qKlxuICAgKiBCdWlsZCBBcmdzIHRvIGJlIHBhc3NlZCB0byBgZG9ja2VyIGJ1aWxkYCBjb21tYW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRBcmdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqXG4gICAqIGBkb2NrZXIgYnVpbGQgLi4uYCBjb21tYW5kIHRvIHJ1biBpbiB7QGxpbmsgTmV4dEJhc2VQcm9wcy5idWlsZENvbnRleHR9LlxuICAgKiBEZWZhdWx0IGludGVycG9sYXRlcyBvdGhlciBwcm9wcy4gSWYgeW91IG92ZXJyaWRlLCBvdGhlciBwcm9wcyB3aWxsIGhhdmVcbiAgICogbm8gZWZmZWN0IG9uIGNvbW1hbmQuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kPzogc3RyaW5nO1xuICAvKipcbiAgICogRW52aXJvbm1lbnQgdmFyaWFibGVzIG5hbWVzIHRvIHBhc3MgZnJvbSBob3N0IHRvIGNvbnRhaW5lciBkdXJpbmcgYnVpbGQgcHJvY2Vzcy5cbiAgICpcbiAgICogTm90ZSwgYSBzaGVsbCBzY3JpcHQsIGNkay1uZXh0anMtbG9hZC1lbnYtdmFycy5zaCBpcyBjcmVhdGVkIHdpdGhpbiB0aGVcbiAgICoge0BsaW5rIE5leHRCYXNlUHJvcHMuYnVpbGRDb250ZXh0fSBkaXJlY3RvcnksIHdoaWNoIHdpbGwgY29udGFpbiBhbGwgdGhlXG4gICAqIGVudmlyb25tZW50IHZhcmlhYmxlcyBkZWZpbmVkIGluIHRoaXMgcHJvcC4gSWYgeW91J3ZlIGNyZWF0ZWQgeW91ciBvd25cbiAgICogY3VzdG9tIERvY2tlcmZpbGUgKHBhc3NlZCBpbiB2aWEge0BsaW5rIEJ1aWxkZXJJbWFnZVByb3BzLmN1c3RvbURvY2tlcmZpbGVQYXRofSlcbiAgICogdGhlbiB5b3UgbmVlZCB0byBtYWtlIHN1cmUgeW91J3JlIGNvcHlpbmcgaXQgaW50byB0aGUgaW1hZ2UuXG4gICAqXG4gICAqIEBleGFtcGxlIFtcIk1ZX0FQSV9LRVlcIl1cbiAgICovXG4gIHJlYWRvbmx5IGVudlZhck5hbWVzPzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBMaW5lcyBpbiAuZG9ja2VyaWdub3JlIGZpbGUgd2hpY2ggd2lsbCBiZSBjcmVhdGVkIGluIHlvdXIge0BsaW5rIE5leHRCYXNlUHJvcHMuYnVpbGRDb250ZXh0fVxuICAgKiBAZGVmYXVsdCBbXCJub2RlX21vZHVsZXNcIiwgXCIuZ2l0XCIsIFwiLmdpdGlnbm9yZVwiLCBcIi5tZFwiXVxuICAgKi9cbiAgcmVhZG9ubHkgZXhjbHVkZT86IHN0cmluZ1tdO1xuICAvKipcbiAgICogTmFtZSBvZiBEb2NrZXJmaWxlXG4gICAqIEBkZWZhdWx0IFwiYnVpbGRlci5Eb2NrZXJmaWxlXCJcbiAgICovXG4gIHJlYWRvbmx5IGZpbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsYXRmb3JtPzogUGxhdGZvcm07XG4gIC8qKlxuICAgKiBTa2lwIGJ1aWxkaW5nIHRoZSBidWlsZGVyIGltYWdlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcEJ1aWxkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFBhdGggdG8geW91ciBjdXN0b20gYnVpbGRlci5Eb2NrZXJmaWxlIHdoaWNoIHdpbGwgYmUgY29waWVkIGludG8ge0BsaW5rIE5leHRCYXNlUHJvcHMuYnVpbGRDb250ZXh0fS5cbiAgICogSXQgaXMgcmVjb21tZW5kZWQgdG8gb3ZlcnJpZGUgdGhpcyBwcm9wIHRvIG9wdGltaXplIGJ1aWxkIGNhY2hpbmcgZm9yIHlvdXIgc2V0dXAuXG4gICAqL1xuICByZWFkb25seSBjdXN0b21Eb2NrZXJmaWxlUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNCdWlsZE92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IG5leHRqc0NvbnRhaW5lcnNEb2NrZXJJbWFnZUFzc2V0UHJvcHM/OiBPcHRpb25hbERvY2tlckltYWdlQXNzZXRQcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzRnVuY3Rpb25zQXNzZXRJbWFnZUNvZGVQcm9wcz86IEFzc2V0SW1hZ2VDb2RlUHJvcHM7XG4gIHJlYWRvbmx5IG5leHRqc0Fzc2V0RGVwbG95bWVudEFzc2V0SW1hZ2VDb2RlUHJvcHM/OiBBc3NldEltYWdlQ29kZVByb3BzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0J1aWxkUHJvcHMge1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzW1wiYnVpbGRDb21tYW5kXCJdfVxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRDb21tYW5kOiBOZXh0anNCYXNlUHJvcHNbXCJidWlsZENvbW1hbmRcIl07XG4gIC8qKlxuICAgKiBAc2VlIHtAbGluayBOZXh0anNCYXNlUHJvcHNbXCJidWlsZENvbnRleHRcIl19XG4gICAqL1xuICByZWFkb25seSBidWlsZENvbnRleHQ6IE5leHRqc0Jhc2VQcm9wc1tcImJ1aWxkQ29udGV4dFwiXTtcbiAgLyoqXG4gICAqXG4gICAqL1xuICByZWFkb25seSBidWlsZGVySW1hZ2VQcm9wcz86IEJ1aWxkZXJJbWFnZVByb3BzO1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzLnJlbGF0aXZlUGF0aFRvV29ya3NwYWNlfVxuICAgKi9cbiAgcmVhZG9ubHkgcmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2U/OiBOZXh0anNCYXNlUHJvcHNbXCJyZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZVwiXTtcbiAgcmVhZG9ubHkgbmV4dGpzVHlwZTogTmV4dGpzVHlwZTtcbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogTmV4dGpzQnVpbGRPdmVycmlkZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGljRGlyRW50cnkge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlzRGlyZWN0b3J5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBOZXh0LmpzIGFzc2V0cy5cbiAqIEBsaW5rIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL3BhZ2VzL2FwaS1yZWZlcmVuY2UvbmV4dC1jb25maWctanMvb3V0cHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0anNCdWlsZCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBIYXNoIG9mIGJ1aWxkZXIgaW1hZ2Ugd2hpY2ggd2lsbCBjaGFuZ2Ugd2hlbmV2ZXIgdGhlIGltYWdlIGNoYW5nZXMuIFVzZWZ1bFxuICAgKiBmb3IgcGFzc2luZyB0byBwcm9wZXJ0aWVzIG9mIGN1c3RvbSByZXNvdXJjZXMgdGhhdCBkZXBlbmQgdXBvbiB0aGUgYnVpbGRlclxuICAgKiBpbWFnZSB0byByZS1ydW4gd2hlbiBidWlsZCBpbWFnZSBjaGFuZ2VzLlxuICAgKi9cbiAgYnVpbGRJbWFnZURpZ2VzdDogc3RyaW5nO1xuICAvKipcbiAgICogTW91bnQgcGF0aCBpbiBjb250YWluZXIgZm9yIEVGUy4gTmV4dC5qcyBpbWFnZSBvcHRpbWl6YXRpb24sIGRhdGEsIGFuZCBmdWxsXG4gICAqIHJvdXRlIGNhY2hlIHdpbGwgYmUgc3ltbGlua2VkIHRvIHRoaXMgbG9jYXRpb24uXG4gICAqXG4gICAqIE11c3QgY29tcGx5IHdpdGggcGF0dGVybjogXi9tbnQvW2EtekEtWjAtOS1fLl0rJCBkdWUgdG8gbGFtYmRhIHJlcXVpcmVtZW50LlxuICAgKiBGYXJnYXRlIGRvZXNuJ3QgaGF2ZSB0aGlzIHNhbWUgcmVxdWlyZW1lbnQgYnV0IHdlIHNoYXJlIGNvZGUgZm9yIGxhbWJkYSBhbmRcbiAgICogZmFyZ2F0ZS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFtYmRhL2xhdGVzdC9hcGkvQVBJX0ZpbGVTeXN0ZW1Db25maWcuaHRtbFxuICAgKi9cbiAgY29udGFpbmVyTW91bnRQYXRoRm9yRWZzID0gXCIvbW50L2Nkay1uZXh0anNcIjtcbiAgLyoqXG4gICAqIERvY2tlciBpbWFnZSBidWlsdCBpZiB1c2luZyBGYXJnYXRlLlxuICAgKi9cbiAgaW1hZ2VGb3JOZXh0anNDb250YWluZXJzPzogRG9ja2VySW1hZ2VBc3NldDtcbiAgLyoqXG4gICAqIERvY2tlciBpbWFnZSBidWlsdCBpZiB1c2luZyBMYW1iZGEuXG4gICAqL1xuICBpbWFnZUZvck5leHRqc0Z1bmN0aW9ucz86IERvY2tlckltYWdlQ29kZTtcbiAgLyoqXG4gICAqIERvY2tlciBpbWFnZSBidWlsdCBmb3IgYE5leHRqc0Fzc2V0c0RlcGxveW1lbnRgXG4gICAqL1xuICBpbWFnZUZvck5leHRqc0Fzc2V0c0RlcGxveW1lbnQ6IERvY2tlckltYWdlQ29kZTtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gcHVibGljLiBVc2UgYnkgQ2xvdWRGcm9udC9BTEIgdG8gY3JlYXRlIGJlaGF2aW9ycy9ydWxlc1xuICAgKiBAZXhhbXBsZSBcIi9Vc2Vycy9qb2huL215YXBwL3B1YmxpY1wiXG4gICAqL1xuICBwdWJsaWNEaXJFbnRyaWVzOiBQdWJsaWNEaXJFbnRyeVtdO1xuICAvKipcbiAgICogVGhlIGVudHJ5cG9pbnQgSmF2YVNjcmlwdCBmaWxlIHVzZWQgYXMgYW4gYXJndW1lbnQgZm9yIE5vZGUuanMgdG8gcnVuIHRoZVxuICAgKiBOZXh0LmpzIHN0YW5kYWxvbmUgc2VydmVyIHJlbGF0aXZlIHRvIHRoZSBzdGFuZGFsb25lIGRpcmVjdG9yeS5cbiAgICogQGV4YW1wbGUgXCIuL3NlcnZlci5qc1wiXG4gICAqIEBleGFtcGxlIFwiLi9wYWNrYWdlcy91aS9zZXJ2ZXIuanNcIiAobW9ub3JlcG8pXG4gICAqL1xuICByZWxhdGl2ZVBhdGhUb0VudHJ5cG9pbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGFnIG9mIGJ1aWxkZXIgaW1hZ2UgTmV4dC5qcyBhcHAgd2hpY2ggaXMgYnVpbHQgZm9yIG90aGVyIGltYWdlcyB0byBiZVxuICAgKiBidWlsdCBgRlJPTWAuIFRoaXMgaW1hZ2UgaXNuJ3QgYnVpbHQgd2l0aCBDREsgQXNzZXRzIGNvbnN0cnVjdCBiL2MgaXRcbiAgICogZG9lc24ndCBuZWVkIHRvIGJlIHVwbG9hZGVkIHRvIEVDUi4gV2Ugc3RpbGwgbmVlZCB0byBpbmNsdWRlIHNsaWNlIG9mXG4gICAqIGBub2RlLmFkZHJgIGluIHRhZyBpbiBjYXNlIG11bHRpcGxlIGNkay1uZXh0anMgY29uc3RydWN0cyBhcmUgdXNlZC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRlckltYWdlVGFnOiBzdHJpbmc7XG4gIHByaXZhdGUgY29udGFpbmVyUnVudGltZSA9IHByb2Nlc3MuZW52LkNES19ET0NLRVIgfHwgXCJkb2NrZXJcIjtcbiAgcHJpdmF0ZSBwcm9wczogTmV4dGpzQnVpbGRQcm9wcztcbiAgcHJpdmF0ZSByZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXh0anNCdWlsZFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLmJ1aWxkZXJJbWFnZVRhZyA9IGBjZGstbmV4dGpzL2J1aWxkZXItJHt0aGlzLm5vZGUuYWRkci5zbGljZSgzMCl9YDtcbiAgICB0aGlzLnJlbGF0aXZlUGF0aFRvV29ya3NwYWNlID0gcHJvcHMucmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2UgfHwgXCIuXCI7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMucmVsYXRpdmVQYXRoVG9FbnRyeXBvaW50ID0gdGhpcy5nZXRSZWxhdGl2ZUVudHJ5cG9pbnRQYXRoKCk7XG4gICAgdGhpcy5idWlsZEltYWdlRGlnZXN0ID0gdGhpcy5jcmVhdGVCdWlsZGVySW1hZ2UoKTtcbiAgICB0aGlzLnB1YmxpY0RpckVudHJpZXMgPSB0aGlzLmdldFB1YmxpY0RpckVudHJpZXMoKTtcbiAgICBpZiAoXG4gICAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTIHx8XG4gICAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLlJFR0lPTkFMX0NPTlRBSU5FUlNcbiAgICApIHtcbiAgICAgIHRoaXMuaW1hZ2VGb3JOZXh0anNDb250YWluZXJzID0gdGhpcy5jcmVhdGVJbWFnZUZvck5leHRqc0NvbnRhaW5lcnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbWFnZUZvck5leHRqc0Z1bmN0aW9ucyA9IHRoaXMuY3JlYXRlSW1hZ2VGb3JOZXh0anNGdW5jdGlvbnMoKTtcbiAgICB9XG4gICAgdGhpcy5pbWFnZUZvck5leHRqc0Fzc2V0c0RlcGxveW1lbnQgPVxuICAgICAgdGhpcy5jcmVhdGVJbWFnZUZvck5leHRqc0Fzc2V0c0RlcGxveW1lbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVsYXRpdmVFbnRyeXBvaW50UGF0aCgpIHtcbiAgICAvLyBqb2luUG9zaXggYi9jIHRoaXMgd2lsbCBiZSB1c2VkIGluIGxpbnV4IGNvbnRhaW5lclxuICAgIHJldHVybiBqb2luUG9zaXgodGhpcy5wcm9wcy5yZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZSB8fCBcIlwiLCBcInNlcnZlci5qc1wiKTtcbiAgfVxuICAvKipcbiAgICogQSBidWlsZGVyIG9yIGJhc2UgaW1hZ2UgbmVlZHMgdG8gYmUgY3JlYXRlZCBzbyB0aGF0IHRoZSBzYW1lIGltYWdlIGNhbiBiZVxuICAgKiBidWlsdCBgRlJPTWAgZm9yIGBOZXh0anNGdW5jdGlvbnNgIG9yIGBOZXh0anNDb250YWluZXJzYCBhbmQgYE5leHRqc0Fzc2V0c0RlcGxveW1lbnRgLlxuICAgKiBUaGlzIGltYWdlIGRvZXNuJ3QgbmVlZCB0byBiZSB1cGxvYWRlZCB0byBFQ1Igc28gd2UncmUgXCJtYW51YWxseVwiIGNyZWF0aW5nXG4gICAqIGl0IHdpdGggYGV4ZWNTeW5jYCBhbmQgb3RoZXIgaW1hZ2VzIHdpbGwgYmUgYnVpbHQgYEZST01gIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVCdWlsZGVySW1hZ2UoKSB7XG4gICAgY29uc3QgYnVpbGRDb21tYW5kID0gdGhpcy5wcm9wcy5idWlsZENvbW1hbmQgfHwgXCJucG0gcnVuIGJ1aWxkXCI7XG4gICAgY29uc3Qge1xuICAgICAgYnVpbGRBcmdzID0ge1xuICAgICAgICBCVUlMRF9DT01NQU5EOiBidWlsZENvbW1hbmQsXG4gICAgICAgIFJFTEFUSVZFX1BBVEhfVE9fV09SS1NQQUNFOiB0aGlzLnJlbGF0aXZlUGF0aFRvV29ya3NwYWNlLFxuICAgICAgICAuLi50aGlzLnByb3BzLmJ1aWxkZXJJbWFnZVByb3BzPy5idWlsZEFyZ3MsXG4gICAgICB9LFxuICAgICAgZW52VmFyTmFtZXMgPSBbXSxcbiAgICAgIGV4Y2x1ZGUgPSBbXG4gICAgICAgIFwiKiovbm9kZV9tb2R1bGVzXCIsXG4gICAgICAgIFwiLmdpdFwiLFxuICAgICAgICBcIioqL2Nkay5vdXRcIixcbiAgICAgICAgXCIqKi8ubmV4dFwiLFxuICAgICAgICBcIi5naXRpZ25vcmVcIixcbiAgICAgICAgXCIqLm1kXCIsXG4gICAgICBdLFxuICAgICAgZmlsZSA9IFwiYnVpbGRlci5Eb2NrZXJmaWxlXCIsXG4gICAgICBwbGF0Zm9ybSxcbiAgICAgIHNraXBCdWlsZCA9IGZhbHNlLFxuICAgIH0gPSB0aGlzLnByb3BzLmJ1aWxkZXJJbWFnZVByb3BzIHx8IHt9O1xuICAgIGNvbnN0IHNyY0RvY2tlcmZpbGVQYXRoID1cbiAgICAgIHRoaXMucHJvcHMuYnVpbGRlckltYWdlUHJvcHM/LmN1c3RvbURvY2tlcmZpbGVQYXRoIHx8XG4gICAgICBqb2luKF9fZGlybmFtZSwgZmlsZSk7XG4gICAgY29uc3QgZGVzdERvY2tlcmZpbGVQYXRoID0gam9pbih0aGlzLnByb3BzLmJ1aWxkQ29udGV4dCwgZmlsZSk7XG4gICAgY3BTeW5jKHNyY0RvY2tlcmZpbGVQYXRoLCBkZXN0RG9ja2VyZmlsZVBhdGgpO1xuICAgIGNvbnN0IGV4Y2x1ZGVGaWxlU3RyID0gZXhjbHVkZT8uam9pbihcIlxcblwiKTtcbiAgICBjb25zdCBkb2NrZXJpZ25vcmVGaWxlUGF0aCA9IGpvaW4odGhpcy5wcm9wcy5idWlsZENvbnRleHQsIFwiLmRvY2tlcmlnbm9yZVwiKTtcbiAgICB3cml0ZUZpbGVTeW5jKGRvY2tlcmlnbm9yZUZpbGVQYXRoLCBleGNsdWRlRmlsZVN0cik7XG4gICAgY29uc3QgYnVpbGRBcmdzU3RyID0gdGhpcy5jcmVhdGVCdWlsZEFyZ1N0cihidWlsZEFyZ3MpO1xuICAgIGNvbnN0IGxvYWRFbnZWYXJzU2NyaXB0UGF0aCA9IGpvaW4oXG4gICAgICB0aGlzLnByb3BzLmJ1aWxkQ29udGV4dCxcbiAgICAgIFwiY2RrLW5leHRqcy1sb2FkLWVudi12YXJzLnNoXCIsXG4gICAgKTtcbiAgICBpZiAoZW52VmFyTmFtZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNyZWF0ZUxvYWRFbnZWYXJzU2NyaXB0KGVudlZhck5hbWVzLCBsb2FkRW52VmFyc1NjcmlwdFBhdGgpO1xuICAgIH1cbiAgICBjb25zdCBjb21tYW5kID1cbiAgICAgIHRoaXMucHJvcHMuYnVpbGRlckltYWdlUHJvcHM/LmNvbW1hbmQgfHxcbiAgICAgIGAke3RoaXMuY29udGFpbmVyUnVudGltZX0gYnVpbGQgJHtwbGF0Zm9ybSA/IGAtLXBsYXRmb3JtICR7cGxhdGZvcm0ucGxhdGZvcm19YCA6IFwiXCJ9IC0tZmlsZSAke2ZpbGV9IC0tdGFnICR7dGhpcy5idWlsZGVySW1hZ2VUYWd9ICR7YnVpbGRBcmdzU3RyfSAuYDtcbiAgICBsZXQgZXJyb3I6IHVua25vd247XG4gICAgdHJ5IHtcbiAgICAgIGlmICghc2tpcEJ1aWxkKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGBCdWlsZGluZyBpbWFnZSB3aXRoIGNvbW1hbmQ6ICR7Y29tbWFuZH0gaW4gZGlyZWN0b3J5OiAke3RoaXMucHJvcHMuYnVpbGRDb250ZXh0fWAsXG4gICAgICAgICk7XG4gICAgICAgIGV4ZWNTeW5jKGNvbW1hbmQsIHtcbiAgICAgICAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgICAgICAgY3dkOiB0aGlzLnByb3BzLmJ1aWxkQ29udGV4dCxcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGVycm9yID0gZXJyO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBybVN5bmMoZGVzdERvY2tlcmZpbGVQYXRoKTtcbiAgICAgIHJtU3luYyhkb2NrZXJpZ25vcmVGaWxlUGF0aCk7XG4gICAgICBpZiAoZW52VmFyTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgIHJtU3luYyhsb2FkRW52VmFyc1NjcmlwdFBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXJyb3IpIHRocm93IGVycm9yO1xuICAgIHJldHVybiB0aGlzLmdldEJ1aWxkZXJJbWFnZURpZ2VzdCgpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlQnVpbGRBcmdTdHIoXG4gICAgYnVpbGRBcmdzOiBSZXF1aXJlZDxCdWlsZGVySW1hZ2VQcm9wcz5bXCJidWlsZEFyZ3NcIl0sXG4gICkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhidWlsZEFyZ3MpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHJldHVybiBgJHthY2N9IC0tYnVpbGQtYXJnICR7a2V5fT1cIiR7dmFsdWV9XCJgO1xuICAgIH0sIFwiXCIpO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlTG9hZEVudlZhcnNTY3JpcHQoXG4gICAgZW52VmFyTmFtZXM6IFJlcXVpcmVkPEJ1aWxkZXJJbWFnZVByb3BzPltcImVudlZhck5hbWVzXCJdID0gW10sXG4gICAgbG9hZEVudlZhcnNTY3JpcHRQYXRoOiBzdHJpbmcsXG4gICkge1xuICAgIGxldCBsb2FkRW52VmFyc1NjcmlwdCA9XG4gICAgICBcIiMgRHluYW1pY2FsbHkgZ2VuZXJhdGVkIHNjcmlwdCB0byBsb2FkIGVudiB2YXJzIGludG8gYnVpbGQgY29udGFpbmVyXCI7XG4gICAgZm9yIChjb25zdCBlbnZWYXJOYW1lIG9mIGVudlZhck5hbWVzKSB7XG4gICAgICBsb2FkRW52VmFyc1NjcmlwdCArPSBgXFxuZXhwb3J0ICR7ZW52VmFyTmFtZX09JHtwcm9jZXNzLmVudltlbnZWYXJOYW1lXSB8fCAnXCJcIid9YDtcbiAgICB9XG4gICAgd3JpdGVGaWxlU3luYyhsb2FkRW52VmFyc1NjcmlwdFBhdGgsIGxvYWRFbnZWYXJzU2NyaXB0KTtcbiAgfVxuICBwcml2YXRlIGdldEJ1aWxkZXJJbWFnZURpZ2VzdCgpIHtcbiAgICBjb25zdCBkaWdlc3QgPSBleGVjU3luYyhcbiAgICAgIGAke3RoaXMuY29udGFpbmVyUnVudGltZX0gaW1hZ2VzIC0tbm8tdHJ1bmMgLS1xdWlldCAke3RoaXMuYnVpbGRlckltYWdlVGFnfWAsXG4gICAgICB7IGVuY29kaW5nOiBcInV0Zi04XCIgfSxcbiAgICApO1xuICAgIHJldHVybiBkaWdlc3Quc2xpY2UoMCwgLTEpOyAvLyByZW1vdmUgdHJhaWxpbmcgXFxuXG4gIH1cbiAgcHJpdmF0ZSBnZXRQdWJsaWNEaXJFbnRyaWVzKCk6IFB1YmxpY0RpckVudHJ5W10ge1xuICAgIGNvbnN0IHB1YmxpY0RpclBhdGggPSBqb2luUG9zaXgoXG4gICAgICBcIi9hcHBcIixcbiAgICAgIHRoaXMucHJvcHMucmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2UgfHwgXCJcIixcbiAgICAgIFwicHVibGljXCIsXG4gICAgKTtcbiAgICBjb25zdCBwdWJsaWNEaXJFbnRyaWVzU3RyaW5nID0gZXhlY1N5bmMoXG4gICAgICBgJHt0aGlzLmNvbnRhaW5lclJ1bnRpbWV9IHJ1biAke3RoaXMuYnVpbGRlckltYWdlVGFnfSBub2RlIC1lIFwiY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZnMucmVhZGRpclN5bmMoJyR7cHVibGljRGlyUGF0aH0nLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkubWFwKChlKSA9PiAoeyBuYW1lOiBlLm5hbWUsIGlzRGlyZWN0b3J5OiBlLmlzRGlyZWN0b3J5KCl9KSkpKVwiYCxcbiAgICAgIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9LFxuICAgICk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UocHVibGljRGlyRW50cmllc1N0cmluZykgYXMgUHVibGljRGlyRW50cnlbXTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZUltYWdlRm9yTmV4dGpzQ29udGFpbmVycygpIHtcbiAgICBjb25zdCBkb2NrZXJmaWxlTmFtZVByZWZpeCA9XG4gICAgICB0aGlzLnByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuR0xPQkFMX0NPTlRBSU5FUlNcbiAgICAgICAgPyBcImdsb2JhbFwiXG4gICAgICAgIDogXCJyZWdpb25hbFwiO1xuICAgIGNvbnN0IGRvY2tlcmZpbGVOYW1lID0gYCR7ZG9ja2VyZmlsZU5hbWVQcmVmaXh9LWNvbnRhaW5lcnMuRG9ja2VyZmlsZWA7XG4gICAgLy8gY2RrLW5leHRqcy9idWlsZGVyLXtoYXNofSBhbHJlYWR5IGNvbnRhaW5zIGJ1aWx0IG5leHRqcyBhcHAgd2hpY2ggd2UnbGxcbiAgICAvLyBgQ09QWSAtLWZyb209Y2RrLW5leHRqcy9idWlsZGVyLXtoYXNofWAgc28gd2UganVzdCBuZWVkIHRoZSBEb2NrZXJmaWxlXG4gICAgLy8gd2hpY2ggaXMgaW4gbGliL25leHRqcy1idWlsZCBmb2xkZXIuXG4gICAgY29uc3QgYnVpbGRDb250ZXh0ID0gam9pbihfX2Rpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcImxpYlwiLCBcIm5leHRqcy1idWlsZFwiKTtcbiAgICBjb25zdCBkb2NrZXJJbWFnZUFzc2V0ID0gbmV3IERvY2tlckltYWdlQXNzZXQodGhpcywgXCJJbWFnZVwiLCB7XG4gICAgICBidWlsZEFyZ3M6IHtcbiAgICAgICAgQlVJTERFUl9JTUFHRV9UQUc6IHRoaXMuYnVpbGRlckltYWdlVGFnLFxuICAgICAgICBEQVRBX0NBQ0hFX0RJUixcbiAgICAgICAgRlVMTF9ST1VURV9DQUNIRV9ESVIsXG4gICAgICAgIFBVQkxJQ19ESVIsXG4gICAgICAgIElNQUdFX0NBQ0hFX0RJUixcbiAgICAgICAgTU9VTlRfUEFUSDogdGhpcy5jb250YWluZXJNb3VudFBhdGhGb3JFZnMsXG4gICAgICAgIFJFTEFUSVZFX1BBVEhfVE9fV09SS1NQQUNFOiB0aGlzLnJlbGF0aXZlUGF0aFRvV29ya3NwYWNlLFxuICAgICAgfSxcbiAgICAgIGRpcmVjdG9yeTogYnVpbGRDb250ZXh0LFxuICAgICAgZXhjbHVkZTogW1wiKlwiLCBgISR7ZG9ja2VyZmlsZU5hbWV9YCwgXCIhYWRkLWNhY2hlLWhhbmRsZXIubWpzXCJdLFxuICAgICAgZXh0cmFIYXNoOiB0aGlzLmJ1aWxkSW1hZ2VEaWdlc3QsIC8vIHJlYnVpbGQgd2hlbiBidWlsZGVyIGhhc2ggY2hhbmdlc1xuICAgICAgZmlsZTogZG9ja2VyZmlsZU5hbWUsXG4gICAgICBpZ25vcmVNb2RlOiBJZ25vcmVNb2RlLkRPQ0tFUixcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNDb250YWluZXJzRG9ja2VySW1hZ2VBc3NldFByb3BzLFxuICAgIH0pO1xuICAgIHJldHVybiBkb2NrZXJJbWFnZUFzc2V0O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVJbWFnZUZvck5leHRqc0Z1bmN0aW9ucygpIHtcbiAgICBjb25zdCBkb2NrZXJmaWxlTmFtZSA9IFwiZ2xvYmFsLWZ1bmN0aW9ucy5Eb2NrZXJmaWxlXCI7XG4gICAgLy8gY2RrLW5leHRqcy9idWlsZGVyLXtoYXNofSBhbHJlYWR5IGNvbnRhaW5zIGJ1aWx0IG5leHRqcyBhcHAgd2hpY2ggd2UnbGxcbiAgICAvLyBgQ09QWSAtLWZyb209Y2RrLW5leHRqcy9idWlsZGVyLXtoYXNofWAgc28gd2UganVzdCBuZWVkIHRoZSBEb2NrZXJmaWxlXG4gICAgLy8gd2hpY2ggaXMgaW4gbGliL25leHRqcy1idWlsZCBmb2xkZXIuXG4gICAgY29uc3QgYnVpbGRDb250ZXh0ID0gam9pbihfX2Rpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcImxpYlwiLCBcIm5leHRqcy1idWlsZFwiKTtcbiAgICBjb25zdCBkb2NrZXJJbWFnZUNvZGUgPSBEb2NrZXJJbWFnZUNvZGUuZnJvbUltYWdlQXNzZXQoYnVpbGRDb250ZXh0LCB7XG4gICAgICBidWlsZEFyZ3M6IHtcbiAgICAgICAgQlVJTERFUl9JTUFHRV9UQUc6IHRoaXMuYnVpbGRlckltYWdlVGFnLFxuICAgICAgICBEQVRBX0NBQ0hFX0RJUixcbiAgICAgICAgRlVMTF9ST1VURV9DQUNIRV9ESVIsXG4gICAgICAgIFBVQkxJQ19ESVIsXG4gICAgICAgIElNQUdFX0NBQ0hFX0RJUixcbiAgICAgICAgTU9VTlRfUEFUSDogdGhpcy5jb250YWluZXJNb3VudFBhdGhGb3JFZnMsXG4gICAgICAgIFJFTEFUSVZFX1BBVEhfVE9fV09SS1NQQUNFOiB0aGlzLnJlbGF0aXZlUGF0aFRvV29ya3NwYWNlLFxuICAgICAgfSxcbiAgICAgIGNtZDogW1wibm9kZVwiLCB0aGlzLnJlbGF0aXZlUGF0aFRvRW50cnlwb2ludF0sXG4gICAgICBleGNsdWRlOiBbXG4gICAgICAgIFwiKlwiLFxuICAgICAgICBgISR7ZG9ja2VyZmlsZU5hbWV9YCxcbiAgICAgICAgXCIhYWRkLWNhY2hlLWhhbmRsZXIubWpzXCIsXG4gICAgICAgIFwiIWNhY2hlLWhhbmRsZXIuY2pzXCIsXG4gICAgICBdLFxuICAgICAgZXh0cmFIYXNoOiB0aGlzLmJ1aWxkSW1hZ2VEaWdlc3QsIC8vIHJlYnVpbGQgd2hlbiBidWlsZGVyIGhhc2ggY2hhbmdlc1xuICAgICAgZmlsZTogZG9ja2VyZmlsZU5hbWUsXG4gICAgICBpZ25vcmVNb2RlOiBJZ25vcmVNb2RlLkRPQ0tFUixcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNGdW5jdGlvbnNBc3NldEltYWdlQ29kZVByb3BzLFxuICAgIH0pO1xuICAgIC8vIFRPRE86IGhvdyB0byBjbGVhbiB1cCB0ZW1wIGRpcj9cbiAgICAvLyBybVN5bmModGVtcERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgcmV0dXJuIGRvY2tlckltYWdlQ29kZTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSW1hZ2VGb3JOZXh0anNBc3NldHNEZXBsb3ltZW50KCkge1xuICAgIGNvbnN0IGRvY2tlcmZpbGVOYW1lID0gXCJhc3NldHMtZGVwbG95bWVudC5Eb2NrZXJmaWxlXCI7XG4gICAgLyoqXG4gICAgICogUGF0aCB0byBidW5kbGVkIGN1c3RvbSByZXNvdXJjZSBjb2RlXG4gICAgICovXG4gICAgY29uc3QgbGFtYmRhQnVpbGRDb250ZXh0ID0gam9pbihcbiAgICAgIF9fZGlybmFtZSxcbiAgICAgIFwiLi5cIixcbiAgICAgIFwiLi5cIixcbiAgICAgIFwiYXNzZXRzXCIsXG4gICAgICBcImxhbWJkYXNcIixcbiAgICAgIFwiYXNzZXRzLWRlcGxveW1lbnRcIixcbiAgICAgIFwiYXNzZXRzLWRlcGxveW1lbnQubGFtYmRhXCIsXG4gICAgKTtcbiAgICAvLyBjZGstbmV4dGpzL2J1aWxkZXIte2hhc2h9IGFscmVhZHkgY29udGFpbnMgTmV4dC5qcyBidWlsdCBjb2RlIHdoaWNoXG4gICAgLy8gd2UnbGwgY29weSBpbnRvIGZpbmFsIGltYWdlLiBCdXQgd2UgYWxzbyBuZWVkIGxhbWJkYSBjb2RlIHRvIHJ1blxuICAgIC8vIGFzc2V0IGRlcGxveW1lbnQgdGFza3NcbiAgICBjb25zdCBkb2NrZXJJbWFnZUNvZGUgPSBEb2NrZXJJbWFnZUNvZGUuZnJvbUltYWdlQXNzZXQobGFtYmRhQnVpbGRDb250ZXh0LCB7XG4gICAgICBidWlsZEFyZ3M6IHtcbiAgICAgICAgQlVJTERFUl9JTUFHRV9UQUc6IHRoaXMuYnVpbGRlckltYWdlVGFnLFxuICAgICAgICBSRUxBVElWRV9QQVRIX1RPX1dPUktTUEFDRTogdGhpcy5yZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZSxcbiAgICAgIH0sXG4gICAgICBleHRyYUhhc2g6IHRoaXMuYnVpbGRJbWFnZURpZ2VzdCwgLy8gcmVidWlsZCB3aGVuIGJ1aWxkZXIgaGFzaCBjaGFuZ2VzXG4gICAgICBmaWxlOiBkb2NrZXJmaWxlTmFtZSxcbiAgICAgIGlnbm9yZU1vZGU6IElnbm9yZU1vZGUuRE9DS0VSLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0Fzc2V0RGVwbG95bWVudEFzc2V0SW1hZ2VDb2RlUHJvcHMsXG4gICAgfSk7XG4gICAgcmV0dXJuIGRvY2tlckltYWdlQ29kZTtcbiAgfVxufVxuIl19
|
|
237
|
+
NextjsBuild[_a] = { fqn: "cdk-nextjs.NextjsBuild", version: "0.4.1" };
|
|
238
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJ1aWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwyREFBOEM7QUFDOUMscUNBQXNFO0FBQ3RFLHlDQUEyQztBQUMzQywyQ0FBb0Q7QUFDcEQsNkNBQXlDO0FBQ3pDLCtEQUF3RTtBQUN4RSx1REFBOEU7QUFDOUUsMkNBQXVDO0FBQ3ZDLDRDQWdCc0I7QUE0R3RCOzs7R0FHRztBQUNILE1BQWEsV0FBWSxTQUFRLHNCQUFTO0lBb0R4QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXVCO1FBQy9ELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFWbkI7O1dBRUc7UUFDSyxxQkFBZ0IsR0FBRyxvQkFBb0IsQ0FBQztRQUV4QyxxQkFBZ0IsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxRQUFRLENBQUM7UUFNNUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ2hGLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUMscUJBQXFCLElBQUksR0FBRyxDQUFDO1FBQ2hFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNqRSxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDckQsSUFBSSxD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QUVPLG9DQUFvQztRQUMxQyxNQUFNLGNBQWMsR0FBRyw4QkFBOEIsQ0FBQztRQUN0RDs7V0FFRztRQUNILE1BQU0sWUFBWSxHQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxpQ0FBaUM7WUFDdkQsSUFBQSxnQkFBSSxFQUNGLFNBQVMsRUFDVCxJQUFJLEVBQ0osSUFBSSxFQUNKLFFBQVEsRUFDUixTQUFTLEVBQ1QsbUJBQW1CLEVBQ25CLDBCQUEwQixDQUMzQixDQUFDO1FBQ0osc0VBQXNFO1FBQ3RFLG1FQUFtRTtRQUNuRSx5QkFBeUI7UUFDekIsTUFBTSxlQUFlLEdBQUcsNEJBQWUsQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFO1lBQ25FLFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsb0NBQW9DO1lBQ3RFLElBQUksRUFBRSxjQUFjO1lBQ3BCLFVBQVUsRUFBRSx3QkFBVSxDQUFDLE1BQU07WUFDN0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSx3Q0FBd0M7WUFDakUsU0FBUyxFQUFFO2dCQUNULENBQUMsNkJBQWlCLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDakMsQ0FBQyx3Q0FBNEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxpQkFBaUI7Z0JBQ3RELENBQUMsZ0NBQW9CLENBQUMsRUFBRSx1QkFBVztnQkFDbkMsQ0FBQyw2Q0FBaUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxxQkFBcUI7Z0JBQy9ELEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsd0NBQXdDO29CQUMvRCxFQUFFLFNBQVM7YUFDZDtTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7O0FBOVRILGtDQStUQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgY3BTeW5jLCByZWFkRmlsZVN5bmMsIHJtU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGpvaW4gYXMgam9pblBvc2l4IH0gZnJvbSBcIm5vZGU6cGF0aC9wb3NpeFwiO1xuaW1wb3J0IHsgSWdub3JlTW9kZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgRG9ja2VySW1hZ2VBc3NldCwgUGxhdGZvcm0gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjci1hc3NldHNcIjtcbmltcG9ydCB7IEFzc2V0SW1hZ2VDb2RlUHJvcHMsIERvY2tlckltYWdlQ29kZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtcbiAgQlVJTERFUl9JTUFHRV9BTElBU19BUkdfTkFNRSxcbiAgTU9VTlRfUEFUSCxcbiAgSU1BR0VfQ0FDSEVfUEFUSCxcbiAgSU1BR0VfQ0FDSEVfUEFUSF9BUkdfTkFNRSxcbiAgTU9VTlRfUEFUSF9BUkdfTkFNRSxcbiAgTmV4dGpzVHlwZSxcbiAgUFVCTElDX1BBVEgsXG4gIFBVQkxJQ19QQVRIX0FSR19OQU1FLFxuICBSRUxBVElWRV9QQVRIX1RPX1BBQ0tBR0VfQVJHX05BTUUsXG4gIEJVSUxEX0lEX0FSR19OQU1FLFxuICBEQVRBX0NBQ0hFX1BBVEhfQVJHX05BTUUsXG4gIERBVEFfQ0FDSEVfUEFUSCxcbiAgQ0FDSEVfUEFUSCxcbiAgQ0FDSEVfUEFUSF9BUkdfTkFNRSxcbiAgSU5KRUNUX0NES19ORVhUSlNfQlVJTERfRU5WX1ZBUlMsXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsRG9ja2VySW1hZ2VBc3NldFByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsRG9ja2VySW1hZ2VBc3NldFByb3BzXCI7XG5pbXBvcnQgeyBOZXh0anNCYXNlUHJvcHMgfSBmcm9tIFwiLi4vcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1iYXNlLXByb3BzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRlckltYWdlUHJvcHMge1xuICAvKipcbiAgICogQnVpbGQgQXJncyB0byBiZSBwYXNzZWQgdG8gYGRvY2tlciBidWlsZGAgY29tbWFuZC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQXJncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKlxuICAgKiBgZG9ja2VyIGJ1aWxkIC4uLmAgY29tbWFuZCB0byBydW4gaW4ge0BsaW5rIE5leHRCYXNlUHJvcHMuYnVpbGRDb250ZXh0fS5cbiAgICogRGVmYXVsdCBpbnRlcnBvbGF0ZXMgb3RoZXIgcHJvcHMuIElmIHlvdSBvdmVycmlkZSwgb3RoZXIgcHJvcHMgd2lsbCBoYXZlXG4gICAqIG5vIGVmZmVjdCBvbiBjb21tYW5kLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZD86IHN0cmluZztcbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcyBuYW1lcyB0byBwYXNzIGZyb20gaG9zdCB0byBjb250YWluZXIgZHVyaW5nIGJ1aWxkIHByb2Nlc3MuXG4gICAqXG4gICAqIE5vdGUsIGEgc2hlbGwgc2NyaXB0LCBjZGstbmV4dGpzLWxvYWQtZW52LXZhcnMuc2ggaXMgY3JlYXRlZCB3aXRoaW4gdGhlXG4gICAqIHtAbGluayBOZXh0QmFzZVByb3BzLmJ1aWxkQ29udGV4dH0gZGlyZWN0b3J5LCB3aGljaCB3aWxsIGNvbnRhaW4gYWxsIHRoZVxuICAgKiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGlzIHByb3AuIElmIHlvdSd2ZSBjcmVhdGVkIHlvdXIgb3duXG4gICAqIGN1c3RvbSBEb2NrZXJmaWxlIChwYXNzZWQgaW4gdmlhIHtAbGluayBCdWlsZGVySW1hZ2VQcm9wcy5jdXN0b21Eb2NrZXJmaWxlUGF0aH0pXG4gICAqIHRoZW4geW91IG5lZWQgdG8gbWFrZSBzdXJlIHlvdSdyZSBjb3B5aW5nIGl0IGludG8gdGhlIGltYWdlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBbXCJNWV9BUElfS0VZXCJdXG4gICAqL1xuICByZWFkb25seSBlbnZWYXJOYW1lcz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogTGluZXMgaW4gLmRvY2tlcmlnbm9yZSBmaWxlIHdoaWNoIHdpbGwgYmUgY3JlYXRlZCBpbiB5b3VyIHtAbGluayBOZXh0QmFzZVByb3BzLmJ1aWxkQ29udGV4dH1cbiAgICogQGRlZmF1bHQgW1wibm9kZV9tb2R1bGVzXCIsIFwiLmdpdFwiLCBcIi5naXRpZ25vcmVcIiwgXCIubWRcIl1cbiAgICovXG4gIHJlYWRvbmx5IGV4Y2x1ZGU/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIE5hbWUgb2YgRG9ja2VyZmlsZSBpbiBidWlsZGVyIGJ1aWxkIGNvbnRleHQuIElmIHNwZWNpZmllZCwgeW91IGFyZSByZXNwb25zaWJsZVxuICAgKiBmb3IgZW5zdXJpbmcgaXQgZXhpc3RzIGluIGJ1aWxkIGNvbnRleHQgYmVmb3JlIGNvbnN0cnVjdCBpcyBpbnN0YW50aWF0ZWQuXG4gICAqIEBkZWZhdWx0IFwiYnVpbGRlci5Eb2NrZXJmaWxlXCJcbiAgICovXG4gIHJlYWRvbmx5IGZpbGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBsYXRmb3JtPzogUGxhdGZvcm07XG4gIC8qKlxuICAgKiBTa2lwIGJ1aWxkaW5nIHRoZSBidWlsZGVyIGltYWdlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcEJ1aWxkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNCdWlsZE92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IG5leHRqc0NvbnRhaW5lcnNEb2NrZXJJbWFnZUFzc2V0UHJvcHM/OiBPcHRpb25hbERvY2tlckltYWdlQXNzZXRQcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzRnVuY3Rpb25zQXNzZXRJbWFnZUNvZGVQcm9wcz86IEFzc2V0SW1hZ2VDb2RlUHJvcHM7XG4gIHJlYWRvbmx5IG5leHRqc0Fzc2V0RGVwbG95bWVudEFzc2V0SW1hZ2VDb2RlUHJvcHM/OiBBc3NldEltYWdlQ29kZVByb3BzO1xuICAvKipcbiAgICogRGVmYXVsdCBmb2xkZXIgZm9yIGJ1aWxkIGNvbnRleHQgaXMgdGhlIFwibGliL25leHRqcy1idWlsZFwiIGZvbGRlciBpbiB0aGVcbiAgICogaW5zdGFsbGVkIGNkay1uZXh0anMgbGlicmFyeSB3aGljaCBoYXMgdGhlIFwiZ2xvYmFsLWZ1bmN0aW9ucy5Eb2NrZXJmaWxlXCIuXG4gICAqIE5vdGUsIGlmIHlvdSBzcGVjaWZ5IHRoaXMgdGhlbiB5b3UncmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoZSBkb2NrZXJmaWxlXG4gICAqIGlzIHByZXNlbnQgaW4gdGhlIGJ1aWxkIGNvbnRleHQgZGlyZWN0b3J5IGFuZCBhbnkgcmVmZXJlbmNlZCBmaWxlcyBhcmVcbiAgICogcHJlc2VudCBhcyB3ZWxsLiBZb3UgY2FuIHNwZWNpZnkgZG9ja2VyZmlsZSBuYW1lIHdpdGggYWRqYWNlbnRcbiAgICogYG5leHRqc0Z1bmN0aW9uc0Fzc2V0SW1hZ2VDb2RlUHJvcHMuZmlsZWAgcHJvcGVydHkuXG4gICAqIEBkZWZhdWx0IFwiY2RrLW5leHRqcy9saWIvbmV4dGpzLWJ1aWxkXCJcbiAgICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uc0ltYWdlQnVpbGRDb250ZXh0Pzogc3RyaW5nO1xuICAvKipcbiAgICogRGVmYXVsdCBmb2xkZXIgZm9yIGJ1aWxkIGNvbnRleHQgaXMgdGhlIFwibGliL25leHRqcy1idWlsZFwiIGZvbGRlciBpbiB0aGVcbiAgICogaW5zdGFsbGVkIGNkay1uZXh0anMgbGlicmFyeSB3aGljaCBoYXMgdGhlIFwiYXNzZXRzLWRlcGxveW1lbnQuRG9ja2VyZmlsZVwiLlxuICAgKiBOb3RlLCBpZiB5b3Ugc3BlY2lmeSB0aGlzIHRoZW4geW91J3JlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGUgZG9ja2VyZmlsZVxuICAgKiBpcyBwcmVzZW50IGluIHRoZSBidWlsZCBjb250ZXh0IGRpcmVjdG9yeSBhbmQgYW55IHJlZmVyZW5jZWQgZmlsZXMgYXJlXG4gICAqIHByZXNlbnQgYXMgd2VsbC4gWW91IGNhbiBzcGVjaWZ5IGRvY2tlcmZpbGUgbmFtZSB3aXRoIGFkamFjZW50XG4gICAqIGBuZXh0anNBc3NldERlcGxveW1lbnRBc3NldEltYWdlQ29kZVByb3BzLmZpbGVgIHByb3BlcnR5LlxuICAgKiBAZGVmYXVsdCBcImNkay1uZXh0anMvbGliL25leHRqcy1idWlsZFwiXG4gICAqL1xuICByZWFkb25seSBhc3NldHNEZXBsb3ltZW50SW1hZ2VCdWlsZENvbnRleHQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEZWZhdWx0IGZvbGRlciBmb3IgYnVpbGQgY29udGV4dCBpcyB0aGUgXCJhc3NldHMvbGFtYmRhcy9hc3NldHMtZGVwbG95bWVudC9hc3NldHMtZGVwbG95bWVudC5sYW1iZGFcIiBmb2xkZXIgaW4gdGhlXG4gICAqIGluc3RhbGxlZCBjZGstbmV4dGpzIGxpYnJhcnkgd2hpY2ggaGFzIHRoZSBcInsuLi59LWNvbnRhaW5lcnMuRG9ja2VyZmlsZVwiLlxuICAgKiBOb3RlLCBpZiB5b3Ugc3BlY2lmeSB0aGlzIHRoZW4geW91J3JlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGUgZG9ja2VyZmlsZVxuICAgKiBpcyBwcmVzZW50IGluIHRoZSBidWlsZCBjb250ZXh0IGRpcmVjdG9yeSBhbmQgYW55IHJlZmVyZW5jZWQgZmlsZXMgYXJlXG4gICAqIHByZXNlbnQgYXMgd2VsbC4gWW91IGNhbiBzcGVjaWZ5IGRvY2tlcmZpbGUgbmFtZSB3aXRoIGFkamFjZW50XG4gICAqIGBuZXh0anNDb250YWluZXJzRG9ja2VySW1hZ2VBc3NldFByb3BzLmZpbGVgIHByb3BlcnR5LlxuICAgKiBAZGVmYXVsdCBcImNkay1uZXh0anMvbGliL25leHRqcy1idWlsZFwiXG4gICAqL1xuICByZWFkb25seSBjb250YWluZXJzSW1hZ2VCdWlsZENvbnRleHQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQnVpbGRQcm9wcyB7XG4gIC8qKlxuICAgKiBAc2VlIHtAbGluayBOZXh0anNCYXNlUHJvcHNbXCJidWlsZENvbW1hbmRcIl19XG4gICAqL1xuICByZWFkb25seSBidWlsZENvbW1hbmQ6IE5leHRqc0Jhc2VQcm9wc1tcImJ1aWxkQ29tbWFuZFwiXTtcbiAgLyoqXG4gICAqIEBzZWUge0BsaW5rIE5leHRqc0Jhc2VQcm9wc1tcImJ1aWxkQ29udGV4dFwiXX1cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQ29udGV4dDogTmV4dGpzQmFzZVByb3BzW1wiYnVpbGRDb250ZXh0XCJdO1xuICAvKipcbiAgICpcbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkZXJJbWFnZVByb3BzPzogQnVpbGRlckltYWdlUHJvcHM7XG4gIC8qKlxuICAgKiBAc2VlIHtAbGluayBOZXh0anNCYXNlUHJvcHMucmVsYXRpdmVQYXRoVG9QYWNrYWdlfVxuICAgKi9cbiAgcmVhZG9ubHkgcmVsYXRpdmVQYXRoVG9QYWNrYWdlPzogTmV4dGpzQmFzZVByb3BzW1wicmVsYXRpdmVQYXRoVG9QYWNrYWdlXCJdO1xuICByZWFkb25seSBuZXh0anNUeXBlOiBOZXh0anNUeXBlO1xuICByZWFkb25seSBvdmVycmlkZXM/OiBOZXh0anNCdWlsZE92ZXJyaWRlcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdWJsaWNEaXJFbnRyeSB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgaXNEaXJlY3Rvcnk6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQnVpbGRzIE5leHQuanMgYXNzZXRzLlxuICogQGxpbmsgaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvcGFnZXMvYXBpLXJlZmVyZW5jZS9uZXh0LWNvbmZpZy1qcy9vdXRwdXRcbiAqL1xuZXhwb3J0IGNsYXNzIE5leHRqc0J1aWxkIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIEltYWdlIGFsaWFzIG9mIGJ1aWxkZXIgaW1hZ2UgTmV4dC5qcyBhcHAgd2hpY2ggaXMgYnVpbHQgZm9yIG90aGVyIGltYWdlcyB0byBiZVxuICAgKiBidWlsdCBgRlJPTWAuIFRoaXMgaW1hZ2UgaXNuJ3QgYnVpbHQgd2l0aCBDREsgQXNzZXRzIGNvbnN0cnVjdCBiL2MgaXRcbiAgICogZG9lc24ndCBuZWVkIHRvIGJlIHVwbG9hZGVkIHRvIEVDUi4gV2Ugc3RpbGwgbmVlZCB0byBpbmNsdWRlIHNsaWNlIG9mXG4gICAqIGBub2RlLmFkZHJgIGluIHRhZyBpbiBjYXNlIG11bHRpcGxlIGNkay1uZXh0anMgY29uc3RydWN0cyBhcmUgdXNlZC5cbiAgICovXG4gIGJ1aWxkZXJJbWFnZUFsaWFzOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBVbmlxdWUgaWQgZm9yIE5leHQuanMgYnVpbGQuIFVzZWQgdG8gcGFydGl0aW9uIEVGUyBGaWxlU3lzdGVtLlxuICAgKi9cbiAgYnVpbGRJZDogc3RyaW5nO1xuICAvKipcbiAgICogSGFzaCBvZiBidWlsZGVyIGltYWdlIHdoaWNoIHdpbGwgY2hhbmdlIHdoZW5ldmVyIHRoZSBpbWFnZSBjaGFuZ2VzLiBVc2VmdWxcbiAgICogZm9yIHBhc3NpbmcgdG8gcHJvcGVydGllcyBvZiBjdXN0b20gcmVzb3VyY2VzIHRoYXQgZGVwZW5kIHVwb24gdGhlIGJ1aWxkZXJcbiAgICogaW1hZ2UgdG8gcmUtcnVuIHdoZW4gYnVpbGQgaW1hZ2UgY2hhbmdlcy5cbiAgICovXG4gIGJ1aWxkSW1hZ2VEaWdlc3Q6IHN0cmluZztcbiAgLyoqXG4gICAqIERvY2tlciBpbWFnZSBidWlsdCBpZiB1c2luZyBGYXJnYXRlLlxuICAgKi9cbiAgaW1hZ2VGb3JOZXh0anNDb250YWluZXJzPzogRG9ja2VySW1hZ2VBc3NldDtcbiAgLyoqXG4gICAqIERvY2tlciBpbWFnZSBidWlsdCBpZiB1c2luZyBMYW1iZGEuXG4gICAqL1xuICBpbWFnZUZvck5leHRqc0Z1bmN0aW9ucz86IERvY2tlckltYWdlQ29kZTtcbiAgLyoqXG4gICAqIERvY2tlciBpbWFnZSBidWlsdCBmb3IgYE5leHRqc0Fzc2V0c0RlcGxveW1lbnRgXG4gICAqL1xuICBpbWFnZUZvck5leHRqc0Fzc2V0c0RlcGxveW1lbnQ6IERvY2tlckltYWdlQ29kZTtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gcHVibGljLiBVc2UgYnkgQ2xvdWRGcm9udC9BTEIgdG8gY3JlYXRlIGJlaGF2aW9ycy9ydWxlc1xuICAgKiBAZXhhbXBsZSBcIi9Vc2Vycy9qb2huL215YXBwL3B1YmxpY1wiXG4gICAqL1xuICBwdWJsaWNEaXJFbnRyaWVzOiBQdWJsaWNEaXJFbnRyeVtdO1xuICAvKipcbiAgICogVGhlIGVudHJ5cG9pbnQgSmF2YVNjcmlwdCBmaWxlIHVzZWQgYXMgYW4gYXJndW1lbnQgZm9yIE5vZGUuanMgdG8gcnVuIHRoZVxuICAgKiBOZXh0LmpzIHN0YW5kYWxvbmUgc2VydmVyIHJlbGF0aXZlIHRvIHRoZSBzdGFuZGFsb25lIGRpcmVjdG9yeS5cbiAgICogQGV4YW1wbGUgXCIuL3NlcnZlci5qc1wiXG4gICAqIEBleGFtcGxlIFwiLi9wYWNrYWdlcy91aS9zZXJ2ZXIuanNcIiAobW9ub3JlcG8pXG4gICAqL1xuICByZWxhdGl2ZVBhdGhUb0VudHJ5cG9pbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogUmVwb3NpdG9yeSBuYW1lIGZvciB0aGUgYnVpbGRlciBpbWFnZS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRlckltYWdlUmVwbyA9IFwiY2RrLW5leHRqcy9idWlsZGVyXCI7XG5cbiAgcHJpdmF0ZSBjb250YWluZXJSdW50aW1lID0gcHJvY2Vzcy5lbnYuQ0RLX0RPQ0tFUiB8fCBcImRvY2tlclwiO1xuICBwcml2YXRlIHByb3BzOiBOZXh0anNCdWlsZFByb3BzO1xuICBwcml2YXRlIHJlbGF0aXZlUGF0aFRvUGFja2FnZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXh0anNCdWlsZFByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLmJ1aWxkZXJJbWFnZUFsaWFzID0gYCR7dGhpcy5idWlsZGVySW1hZ2VSZXBvfToke3RoaXMubm9kZS5hZGRyLnNsaWNlKDMwKX1gO1xuICAgIHRoaXMucmVsYXRpdmVQYXRoVG9QYWNrYWdlID0gcHJvcHMucmVsYXRpdmVQYXRoVG9QYWNrYWdlIHx8IFwiLlwiO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLnJlbGF0aXZlUGF0aFRvRW50cnlwb2ludCA9IHRoaXMuZ2V0UmVsYXRpdmVFbnRyeXBvaW50UGF0aCgpO1xuICAgIGlmICghcHJvcHMuYnVpbGRlckltYWdlUHJvcHM/LnNraXBCdWlsZCkge1xuICAgICAgdGhpcy5jcmVhdGVCdWlsZGVySW1hZ2UoKTtcbiAgICB9XG4gICAgdGhpcy5idWlsZEltYWdlRGlnZXN0ID0gdGhpcy5nZXRCdWlsZGVySW1hZ2VEaWdlc3QoKTtcbiAgICB0aGlzLmJ1aWxkSWQgPSB0aGlzLmdldEJ1aWxkSWQoKTtcbiAgICB0aGlzLnB1YmxpY0RpckVudHJpZXMgPSB0aGlzLmdldFB1YmxpY0RpckVudHJpZXMoKTtcbiAgICBpZiAoXG4gICAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTIHx8XG4gICAgICBwcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLlJFR0lPTkFMX0NPTlRBSU5FUlNcbiAgICApIHtcbiAgICAgIHRoaXMuaW1hZ2VGb3JOZXh0anNDb250YWluZXJzID0gdGhpcy5jcmVhdGVJbWFnZUZvck5leHRqc0NvbnRhaW5lcnMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pbWFnZUZvck5leHRqc0Z1bmN0aW9ucyA9IHRoaXMuY3JlYXRlSW1hZ2VGb3JOZXh0anNGdW5jdGlvbnMoKTtcbiAgICB9XG4gICAgdGhpcy5pbWFnZUZvck5leHRqc0Fzc2V0c0RlcGxveW1lbnQgPVxuICAgICAgdGhpcy5jcmVhdGVJbWFnZUZvck5leHRqc0Fzc2V0c0RlcGxveW1lbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVsYXRpdmVFbnRyeXBvaW50UGF0aCgpIHtcbiAgICAvLyBqb2luUG9zaXggYi9jIHRoaXMgd2lsbCBiZSB1c2VkIGluIGxpbnV4IGNvbnRhaW5lclxuICAgIHJldHVybiBqb2luUG9zaXgodGhpcy5wcm9wcy5yZWxhdGl2ZVBhdGhUb1BhY2thZ2UgfHwgXCJcIiwgXCJzZXJ2ZXIuanNcIik7XG4gIH1cbiAgLyoqXG4gICAqIEEgYnVpbGRlciBvciBiYXNlIGltYWdlIG5lZWRzIHRvIGJlIGNyZWF0ZWQgc28gdGhhdCB0aGUgc2FtZSBpbWFnZSBjYW4gYmVcbiAgICogYnVpbHQgYEZST01gIGZvciBgTmV4dGpzRnVuY3Rpb25zYCBvciBgTmV4dGpzQ29udGFpbmVyc2AgYW5kIGBOZXh0anNBc3NldHNEZXBsb3ltZW50YC5cbiAgICogVGhpcyBpbWFnZSBkb2Vzbid0IG5lZWQgdG8gYmUgdXBsb2FkZWQgdG8gRUNSIHNvIHdlJ3JlIFwibWFudWFsbHlcIiBjcmVhdGluZ1xuICAgKiBpdCB3aXRoIGBleGVjU3luY2AgYW5kIG90aGVyIGltYWdlcyB3aWxsIGJlIGJ1aWx0IGBGUk9NYCBpdC5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlQnVpbGRlckltYWdlKCkge1xuICAgIGNvbnN0IGJ1aWxkQ29tbWFuZCA9IHRoaXMucHJvcHMuYnVpbGRDb21tYW5kIHx8IFwibnBtIHJ1biBidWlsZFwiO1xuICAgIGNvbnN0IHtcbiAgICAgIGJ1aWxkQXJncyA9IHtcbiAgICAgICAgQlVJTERfQ09NTUFORDogYnVpbGRDb21tYW5kLFxuICAgICAgICBSRUxBVElWRV9QQVRIX1RPX1BBQ0tBR0U6IHRoaXMucmVsYXRpdmVQYXRoVG9QYWNrYWdlLFxuICAgICAgICAuLi50aGlzLnByb3BzLmJ1aWxkZXJJbWFnZVByb3BzPy5idWlsZEFyZ3MsXG4gICAgICB9LFxuICAgICAgZW52VmFyTmFtZXMgPSBbXSxcbiAgICAgIGV4Y2x1ZGUgPSBbXG4gICAgICAgIFwiKiovbm9kZV9tb2R1bGVzXCIsXG4gICAgICAgIFwiLmdpdFwiLFxuICAgICAgICBcIioqL2Nkay5vdXRcIixcbiAgICAgICAgXCIqKi8ubmV4dFwiLFxuICAgICAgICBcIi5naXRpZ25vcmVcIixcbiAgICAgICAgXCIqLm1kXCIsXG4gICAgICBdLFxuICAgICAgZmlsZSA9IFwiYnVpbGRlci5Eb2NrZXJmaWxlXCIsXG4gICAgICBwbGF0Zm9ybSxcbiAgICB9ID0gdGhpcy5wcm9wcy5idWlsZGVySW1hZ2VQcm9wcyB8fCB7fTtcblxuICAgIC8vIHRvIGJlIGFkZGVkIHRvIHVzZXIgcHJvdmlkZWQgYnVpbGQgY29udGV4dCBiZWZvcmUgYnVpbGRlciBpbWFnZSBpcyBidWlsdFxuICAgIGNvbnN0IGZpbGVQYXRoc1RvQ29weTogc3RyaW5nW10gPSBbXG4gICAgICBqb2luKF9fZGlybmFtZSwgXCJjZGstbmV4dGpzLWNhY2hlLWhhbmRsZXIuY2pzXCIpLFxuICAgIF07XG4gICAgLy8gdG8gYmUgcmVtb3ZlZCBmcm9tIHVzZXIgcHJvdmlkZWQgYnVpbGQgY29udGV4dCBhZnRlciBidWlsZGVyIGltYWdlIGlzIGJ1aWx0XG4gICAgY29uc3QgZmlsZVBhdGhzVG9SZW1vdmU6IHN0cmluZ1tdID0gW1xuICAgICAgam9pbih0aGlzLnByb3BzLmJ1aWxkQ29udGV4dCwgXCJjZGstbmV4dGpzLWNhY2hlLWhhbmRsZXIuY2pzXCIpLFxuICAgIF07XG5cbiAgICAvLyBpZiBjdXN0b20gZmlsZSAoRG9ja2VyZmlsZSkgaXMgbm90IHNwZWNpZmllZCB0aGVuIHVzZSBsaWJyYXJ5J3MgZGVmYXVsdCBidWlsZGVyLkRvY2tlcmZpbGUgKyAuZG9ja2VyaWdub3JlXG4gICAgaWYgKCF0aGlzLnByb3BzLmJ1aWxkZXJJbWFnZVByb3BzPy5maWxlKSB7XG4gICAgICBmaWxlUGF0aHNUb0NvcHkucHVzaChqb2luKF9fZGlybmFtZSwgZmlsZSkpO1xuICAgICAgZmlsZVBhdGhzVG9SZW1vdmUucHVzaChqb2luKHRoaXMucHJvcHMuYnVpbGRDb250ZXh0LCBmaWxlKSk7XG4gICAgICBjb25zdCBleGNsdWRlRmlsZVN0ciA9IGV4Y2x1ZGU/LmpvaW4oXCJcXG5cIik7XG4gICAgICBjb25zdCBkb2NrZXJpZ25vcmVGaWxlUGF0aCA9IGpvaW4oXG4gICAgICAgIHRoaXMucHJvcHMuYnVpbGRDb250ZXh0LFxuICAgICAgICBcIi5kb2NrZXJpZ25vcmVcIixcbiAgICAgICk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGRvY2tlcmlnbm9yZUZpbGVQYXRoLCBleGNsdWRlRmlsZVN0cik7XG4gICAgICBmaWxlUGF0aHNUb1JlbW92ZS5wdXNoKGRvY2tlcmlnbm9yZUZpbGVQYXRoKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVQYXRoVG9Db3B5IG9mIGZpbGVQYXRoc1RvQ29weSkge1xuICAgICAgY3BTeW5jKFxuICAgICAgICBmaWxlUGF0aFRvQ29weSxcbiAgICAgICAgam9pbih0aGlzLnByb3BzLmJ1aWxkQ29udGV4dCwgYmFzZW5hbWUoZmlsZVBhdGhUb0NvcHkpKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYnVpbGRBcmdzU3RyID0gdGhpcy5jcmVhdGVCdWlsZEFyZ1N0cihidWlsZEFyZ3MpO1xuICAgIHRoaXMuaW5qZWN0QnVpbGRlckRvY2tlcmZpbGVFbnZWYXJzKFxuICAgICAgam9pbih0aGlzLnByb3BzLmJ1aWxkQ29udGV4dCwgZmlsZSksXG4gICAgICBlbnZWYXJOYW1lcyxcbiAgICApO1xuICAgIGNvbnN0IGNvbW1hbmQgPVxuICAgICAgdGhpcy5wcm9wcy5idWlsZGVySW1hZ2VQcm9wcz8uY29tbWFuZCB8fFxuICAgICAgYCR7dGhpcy5jb250YWluZXJSdW50aW1lfSBidWlsZCAke3BsYXRmb3JtID8gYC0tcGxhdGZvcm0gJHtwbGF0Zm9ybS5wbGF0Zm9ybX1gIDogXCJcIn0gLS1maWxlICR7ZmlsZX0gLS10YWcgJHt0aGlzLmJ1aWxkZXJJbWFnZUFsaWFzfSAke2J1aWxkQXJnc1N0cn0gLmA7XG4gICAgbGV0IGVycm9yOiB1bmtub3duO1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYEJ1aWxkaW5nIGltYWdlIHdpdGggY29tbWFuZDogJHtjb21tYW5kfSBpbiBkaXJlY3Rvcnk6ICR7dGhpcy5wcm9wcy5idWlsZENvbnRleHR9YCxcbiAgICAgICk7XG4gICAgICBleGVjU3luYyhjb21tYW5kLCB7XG4gICAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgICAgY3dkOiB0aGlzLnByb3BzLmJ1aWxkQ29udGV4dCxcbiAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgZXJyb3IgPSBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGZvciAoY29uc3QgZmlsZVBhdGhUb1JlbW92ZSBvZiBmaWxlUGF0aHNUb1JlbW92ZSkge1xuICAgICAgICBybVN5bmMoZmlsZVBhdGhUb1JlbW92ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3I7XG4gIH1cbiAgcHJpdmF0ZSBpbmplY3RCdWlsZGVyRG9ja2VyZmlsZUVudlZhcnMoXG4gICAgYnVpbGRlckRvY2tlcmZpbGVQYXRoOiBzdHJpbmcsXG4gICAgZW52VmFyTmFtZXM6IHN0cmluZ1tdLFxuICApIHtcbiAgICBjb25zdCBlbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCBlbnZWYXJOYW1lIG9mIGVudlZhck5hbWVzKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnZbZW52VmFyTmFtZV0pIHtcbiAgICAgICAgZW52VmFyc1tlbnZWYXJOYW1lXSA9IHByb2Nlc3MuZW52W2VudlZhck5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb250ZW50ID0gT2JqZWN0LmVudHJpZXMoZW52VmFycylcbiAgICAgIC5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+IGAke25hbWV9PSR7dmFsdWV9YClcbiAgICAgIC5qb2luKFwiIFwiKTtcbiAgICBjb25zdCBvbGRGaWxlID0gcmVhZEZpbGVTeW5jKGJ1aWxkZXJEb2NrZXJmaWxlUGF0aCkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBuZXdGaWxlID0gb2xkRmlsZS5yZXBsYWNlKElOSkVDVF9DREtfTkVYVEpTX0JVSUxEX0VOVl9WQVJTLCBjb250ZW50KTtcbiAgICB3cml0ZUZpbGVTeW5jKGJ1aWxkZXJEb2NrZXJmaWxlUGF0aCwgbmV3RmlsZSk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVCdWlsZEFyZ1N0cihcbiAgICBidWlsZEFyZ3M6IFJlcXVpcmVkPEJ1aWxkZXJJbWFnZVByb3BzPltcImJ1aWxkQXJnc1wiXSxcbiAgKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGJ1aWxkQXJncykucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgcmV0dXJuIGAke2FjY30gLS1idWlsZC1hcmcgJHtrZXl9PVwiJHt2YWx1ZX1cImA7XG4gICAgfSwgXCJcIik7XG4gIH1cbiAgcHJpdmF0ZSBnZXRCdWlsZGVySW1hZ2VEaWdlc3QoKSB7XG4gICAgY29uc3QgZGlnZXN0ID0gZXhlY1N5bmMoXG4gICAgICBgJHt0aGlzLmNvbnRhaW5lclJ1bnRpbWV9IGltYWdlcyAtLW5vLXRydW5jIC0tcXVpZXQgJHt0aGlzLmJ1aWxkZXJJbWFnZUFsaWFzfWAsXG4gICAgICB7IGVuY29kaW5nOiBcInV0Zi04XCIgfSxcbiAgICApO1xuICAgIHJldHVybiBkaWdlc3Quc2xpY2UoMCwgLTEpOyAvLyByZW1vdmUgdHJhaWxpbmcgXFxuXG4gIH1cbiAgcHJpdmF0ZSBnZXRQdWJsaWNEaXJFbnRyaWVzKCk6IFB1YmxpY0RpckVudHJ5W10ge1xuICAgIGNvbnN0IHB1YmxpY0RpclBhdGggPSBqb2luUG9zaXgoXG4gICAgICBcIi9hcHBcIixcbiAgICAgIHRoaXMucHJvcHMucmVsYXRpdmVQYXRoVG9QYWNrYWdlIHx8IFwiXCIsXG4gICAgICBcInB1YmxpY1wiLFxuICAgICk7XG4gICAgY29uc3QgcHVibGljRGlyRW50cmllc1N0cmluZyA9IGV4ZWNTeW5jKFxuICAgICAgYCR7dGhpcy5jb250YWluZXJSdW50aW1lfSBydW4gJHt0aGlzLmJ1aWxkZXJJbWFnZUFsaWFzfSBub2RlIC1lIFwiY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZnMucmVhZGRpclN5bmMoJyR7cHVibGljRGlyUGF0aH0nLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkubWFwKChlKSA9PiAoeyBuYW1lOiBlLm5hbWUsIGlzRGlyZWN0b3J5OiBlLmlzRGlyZWN0b3J5KCl9KSkpKVwiYCxcbiAgICAgIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9LFxuICAgICk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UocHVibGljRGlyRW50cmllc1N0cmluZykgYXMgUHVibGljRGlyRW50cnlbXTtcbiAgfVxuICBwcml2YXRlIGdldEJ1aWxkSWQoKSB7XG4gICAgY29uc3QgYnVpbGRJZFBhdGggPSBqb2luUG9zaXgoXG4gICAgICBcIi9hcHBcIixcbiAgICAgIHRoaXMucHJvcHMucmVsYXRpdmVQYXRoVG9QYWNrYWdlIHx8IFwiXCIsXG4gICAgICBcIi5uZXh0XCIsXG4gICAgICBcIkJVSUxEX0lEXCIsXG4gICAgKTtcbiAgICBjb25zdCBidWlsZElkID0gZXhlY1N5bmMoXG4gICAgICBgJHt0aGlzLmNvbnRhaW5lclJ1bnRpbWV9IHJ1biAke3RoaXMuYnVpbGRlckltYWdlQWxpYXN9IC9iaW4vc2ggLWMgXCJjYXQgJHtidWlsZElkUGF0aH1cImAsXG4gICAgICB7IGVuY29kaW5nOiBcInV0Zi04XCIgfSxcbiAgICApO1xuICAgIHJldHVybiBidWlsZElkO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlSW1hZ2VGb3JOZXh0anNDb250YWluZXJzKCkge1xuICAgIGNvbnN0IGRvY2tlcmZpbGVOYW1lUHJlZml4ID1cbiAgICAgIHRoaXMucHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfQ09OVEFJTkVSU1xuICAgICAgICA/IFwiZ2xvYmFsXCJcbiAgICAgICAgOiBcInJlZ2lvbmFsXCI7XG4gICAgY29uc3QgZG9ja2VyZmlsZU5hbWUgPSBgJHtkb2NrZXJmaWxlTmFtZVByZWZpeH0tY29udGFpbmVycy5Eb2NrZXJmaWxlYDtcbiAgICAvLyBjZGstbmV4dGpzL2J1aWxkZXIte2hhc2h9IGFscmVhZHkgY29udGFpbnMgYnVpbHQgbmV4dGpzIGFwcCB3aGljaCB3ZSdsbFxuICAgIC8vIGBDT1BZIC0tZnJvbT1jZGstbmV4dGpzL2J1aWxkZXIte2hhc2h9YCBzbyB3ZSBqdXN0IG5lZWQgdGhlIERvY2tlcmZpbGVcbiAgICAvLyB3aGljaCBpcyBpbiBsaWIvbmV4dGpzLWJ1aWxkIGZvbGRlci5cbiAgICBjb25zdCBidWlsZENvbnRleHQgPVxuICAgICAgdGhpcy5wcm9wcy5vdmVycmlkZXM/LmNvbnRhaW5lcnNJbWFnZUJ1aWxkQ29udGV4dCA/P1xuICAgICAgam9pbihfX2Rpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcImxpYlwiLCBcIm5leHRqcy1idWlsZFwiKTtcbiAgICBjb25zdCBkb2NrZXJJbWFnZUFzc2V0ID0gbmV3IERvY2tlckltYWdlQXNzZXQodGhpcywgXCJJbWFnZVwiLCB7XG4gICAgICBkaXJlY3Rvcnk6IGJ1aWxkQ29udGV4dCxcbiAgICAgIGV4dHJhSGFzaDogdGhpcy5idWlsZEltYWdlRGlnZXN0LCAvLyByZWJ1aWxkIHdoZW4gYnVpbGRlciBoYXNoIGNoYW5nZXNcbiAgICAgIGZpbGU6IGRvY2tlcmZpbGVOYW1lLFxuICAgICAgaWdub3JlTW9kZTogSWdub3JlTW9kZS5ET0NLRVIsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzQ29udGFpbmVyc0RvY2tlckltYWdlQXNzZXRQcm9wcyxcbiAgICAgIGJ1aWxkQXJnczoge1xuICAgICAgICBbQlVJTERfSURfQVJHX05BTUVdOiB0aGlzLmJ1aWxkSWQsXG4gICAgICAgIFtCVUlMREVSX0lNQUdFX0FMSUFTX0FSR19OQU1FXTogdGhpcy5idWlsZGVySW1hZ2VBbGlhcyxcbiAgICAgICAgW0NBQ0hFX1BBVEhfQVJHX05BTUVdOiBDQUNIRV9QQVRILFxuICAgICAgICBbREFUQV9DQUNIRV9QQVRIX0FSR19OQU1FXTogREFUQV9DQUNIRV9QQVRILFxuICAgICAgICBbUFVCTElDX1BBVEhfQVJHX05BTUVdOiBQVUJMSUNfUEFUSCxcbiAgICAgICAgW0lNQUdFX0NBQ0hFX1BBVEhfQVJHX05BTUVdOiBJTUFHRV9DQUNIRV9QQVRILFxuICAgICAgICBbTU9VTlRfUEFUSF9BUkdfTkFNRV06IE1PVU5UX1BBVEgsXG4gICAgICAgIFtSRUxBVElWRV9QQVRIX1RPX1BBQ0tBR0VfQVJHX05BTUVdOiB0aGlzLnJlbGF0aXZlUGF0aFRvUGFja2FnZSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0NvbnRhaW5lcnNEb2NrZXJJbWFnZUFzc2V0UHJvcHNcbiAgICAgICAgICA/LmJ1aWxkQXJncyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIGRvY2tlckltYWdlQXNzZXQ7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUltYWdlRm9yTmV4dGpzRnVuY3Rpb25zKCkge1xuICAgIGNvbnN0IGRvY2tlcmZpbGVOYW1lID0gXCJnbG9iYWwtZnVuY3Rpb25zLkRvY2tlcmZpbGVcIjtcbiAgICAvLyBjZGstbmV4dGpzL2J1aWxkZXIte2hhc2h9IGFscmVhZHkgY29udGFpbnMgYnVpbHQgbmV4dGpzIGFwcCB3aGljaCB3ZSdsbFxuICAgIC8vIGBDT1BZIC0tZnJvbT1jZGstbmV4dGpzL2J1aWxkZXIte2hhc2h9YCBzbyB3ZSBqdXN0IG5lZWQgdGhlIERvY2tlcmZpbGVcbiAgICAvLyB3aGljaCBpcyBpbiBsaWIvbmV4dGpzLWJ1aWxkIGZvbGRlci5cbiAgICBjb25zdCBidWlsZENvbnRleHQgPVxuICAgICAgdGhpcy5wcm9wcy5vdmVycmlkZXM/LmZ1bmN0aW9uc0ltYWdlQnVpbGRDb250ZXh0ID8/XG4gICAgICBqb2luKF9fZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwibGliXCIsIFwibmV4dGpzLWJ1aWxkXCIpO1xuICAgIGNvbnN0IGRvY2tlckltYWdlQ29kZSA9IERvY2tlckltYWdlQ29kZS5mcm9tSW1hZ2VBc3NldChidWlsZENvbnRleHQsIHtcbiAgICAgIGNtZDogW1wibm9kZVwiLCB0aGlzLnJlbGF0aXZlUGF0aFRvRW50cnlwb2ludF0sXG4gICAgICBleHRyYUhhc2g6IHRoaXMuYnVpbGRJbWFnZURpZ2VzdCwgLy8gcmVidWlsZCB3aGVuIGJ1aWxkZXIgaGFzaCBjaGFuZ2VzXG4gICAgICBmaWxlOiBkb2NrZXJmaWxlTmFtZSxcbiAgICAgIGlnbm9yZU1vZGU6IElnbm9yZU1vZGUuRE9DS0VSLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0Z1bmN0aW9uc0Fzc2V0SW1hZ2VDb2RlUHJvcHMsXG4gICAgICBidWlsZEFyZ3M6IHtcbiAgICAgICAgW0JVSUxEX0lEX0FSR19OQU1FXTogdGhpcy5idWlsZElkLFxuICAgICAgICBbQlVJTERFUl9JTUFHRV9BTElBU19BUkdfTkFNRV06IHRoaXMuYnVpbGRlckltYWdlQWxpYXMsXG4gICAgICAgIFtDQUNIRV9QQVRIX0FSR19OQU1FXTogQ0FDSEVfUEFUSCxcbiAgICAgICAgW0RBVEFfQ0FDSEVfUEFUSF9BUkdfTkFNRV06IERBVEFfQ0FDSEVfUEFUSCxcbiAgICAgICAgW1BVQkxJQ19QQVRIX0FSR19OQU1FXTogUFVCTElDX1BBVEgsXG4gICAgICAgIFtJTUFHRV9DQUNIRV9QQVRIX0FSR19OQU1FXTogSU1BR0VfQ0FDSEVfUEFUSCxcbiAgICAgICAgW01PVU5UX1BBVEhfQVJHX05BTUVdOiBNT1VOVF9QQVRILFxuICAgICAgICBbUkVMQVRJVkVfUEFUSF9UT19QQUNLQUdFX0FSR19OQU1FXTogdGhpcy5yZWxhdGl2ZVBhdGhUb1BhY2thZ2UsXG4gICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNGdW5jdGlvbnNBc3NldEltYWdlQ29kZVByb3BzPy5idWlsZEFyZ3MsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIC8vIFRPRE86IGhvdyB0byBjbGVhbiB1cCB0ZW1wIGRpcj9cbiAgICAvLyBybVN5bmModGVtcERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgcmV0dXJuIGRvY2tlckltYWdlQ29kZTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSW1hZ2VGb3JOZXh0anNBc3NldHNEZXBsb3ltZW50KCkge1xuICAgIGNvbnN0IGRvY2tlcmZpbGVOYW1lID0gXCJhc3NldHMtZGVwbG95bWVudC5Eb2NrZXJmaWxlXCI7XG4gICAgLyoqXG4gICAgICogUGF0aCB0byBidW5kbGVkIGN1c3RvbSByZXNvdXJjZSBjb2RlXG4gICAgICovXG4gICAgY29uc3QgYnVpbGRDb250ZXh0ID1cbiAgICAgIHRoaXMucHJvcHMub3ZlcnJpZGVzPy5hc3NldHNEZXBsb3ltZW50SW1hZ2VCdWlsZENvbnRleHQgPz9cbiAgICAgIGpvaW4oXG4gICAgICAgIF9fZGlybmFtZSxcbiAgICAgICAgXCIuLlwiLFxuICAgICAgICBcIi4uXCIsXG4gICAgICAgIFwiYXNzZXRzXCIsXG4gICAgICAgIFwibGFtYmRhc1wiLFxuICAgICAgICBcImFzc2V0cy1kZXBsb3ltZW50XCIsXG4gICAgICAgIFwiYXNzZXRzLWRlcGxveW1lbnQubGFtYmRhXCIsXG4gICAgICApO1xuICAgIC8vIGNkay1uZXh0anMvYnVpbGRlci17aGFzaH0gYWxyZWFkeSBjb250YWlucyBOZXh0LmpzIGJ1aWx0IGNvZGUgd2hpY2hcbiAgICAvLyB3ZSdsbCBjb3B5IGludG8gZmluYWwgaW1hZ2UuIEJ1dCB3ZSBhbHNvIG5lZWQgbGFtYmRhIGNvZGUgdG8gcnVuXG4gICAgLy8gYXNzZXQgZGVwbG95bWVudCB0YXNrc1xuICAgIGNvbnN0IGRvY2tlckltYWdlQ29kZSA9IERvY2tlckltYWdlQ29kZS5mcm9tSW1hZ2VBc3NldChidWlsZENvbnRleHQsIHtcbiAgICAgIGV4dHJhSGFzaDogdGhpcy5idWlsZEltYWdlRGlnZXN0LCAvLyByZWJ1aWxkIHdoZW4gYnVpbGRlciBoYXNoIGNoYW5nZXNcbiAgICAgIGZpbGU6IGRvY2tlcmZpbGVOYW1lLFxuICAgICAgaWdub3JlTW9kZTogSWdub3JlTW9kZS5ET0NLRVIsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzQXNzZXREZXBsb3ltZW50QXNzZXRJbWFnZUNvZGVQcm9wcyxcbiAgICAgIGJ1aWxkQXJnczoge1xuICAgICAgICBbQlVJTERfSURfQVJHX05BTUVdOiB0aGlzLmJ1aWxkSWQsXG4gICAgICAgIFtCVUlMREVSX0lNQUdFX0FMSUFTX0FSR19OQU1FXTogdGhpcy5idWlsZGVySW1hZ2VBbGlhcyxcbiAgICAgICAgW1BVQkxJQ19QQVRIX0FSR19OQU1FXTogUFVCTElDX1BBVEgsXG4gICAgICAgIFtSRUxBVElWRV9QQVRIX1RPX1BBQ0tBR0VfQVJHX05BTUVdOiB0aGlzLnJlbGF0aXZlUGF0aFRvUGFja2FnZSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0Fzc2V0RGVwbG95bWVudEFzc2V0SW1hZ2VDb2RlUHJvcHNcbiAgICAgICAgICA/LmJ1aWxkQXJncyxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIGRvY2tlckltYWdlQ29kZTtcbiAgfVxufVxuIl19
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#checkov:skip=CKV_DOCKER_2: healthcheck run by ALB and ECS
|
|
2
2
|
#checkov:skip=CKV_DOCKER_7: latest tag is ok to use for local builder container
|
|
3
3
|
# Modified from: https://github.com/vercel/next.js/blob/canary/examples/with-docker/Dockerfile
|
|
4
|
-
ARG
|
|
5
|
-
FROM $
|
|
4
|
+
ARG BUILDER_IMAGE_ALIAS=cdk-nextjs/builder:latest
|
|
5
|
+
FROM $BUILDER_IMAGE_ALIAS AS builder
|
|
6
6
|
# Production image, copy all the files and run next
|
|
7
|
-
FROM public.ecr.aws/docker/library/node:22-alpine
|
|
7
|
+
FROM public.ecr.aws/docker/library/node:22-alpine AS runner
|
|
8
8
|
WORKDIR /app
|
|
9
9
|
|
|
10
10
|
ENV NODE_ENV production
|
|
@@ -14,25 +14,35 @@ ENV NODE_ENV production
|
|
|
14
14
|
RUN addgroup --system --gid 1001 nodejs
|
|
15
15
|
RUN adduser --system --uid 1001 nextjs
|
|
16
16
|
|
|
17
|
-
ARG
|
|
18
|
-
COPY --from=builder --chown=nextjs:nodejs /app/$
|
|
17
|
+
ARG RELATIVE_PATH_TO_PACKAGE
|
|
18
|
+
COPY --from=builder --chown=nextjs:nodejs /app/$RELATIVE_PATH_TO_PACKAGE/.next/standalone ./
|
|
19
|
+
# html,rsc,body,meta files don't need to be in compute container b/c they're handled by cdk-nextjs-cache-handler.cjs
|
|
20
|
+
RUN find . -type f \( -name "*.html" -o -name "*.rsc" -name "*.body" -name "*.meta" \) -delete
|
|
21
|
+
COPY --from=builder --chown=nextjs:nodejs /app/cdk-nextjs-cache-handler.cjs ./$RELATIVE_PATH_TO_PACKAGE/
|
|
19
22
|
# static properties needed b/c we don't have cloudfront to serve them from s3
|
|
20
|
-
COPY --from=builder --chown=nextjs:nodejs /app/$
|
|
23
|
+
COPY --from=builder --chown=nextjs:nodejs /app/$RELATIVE_PATH_TO_PACKAGE/.next/static ./$RELATIVE_PATH_TO_PACKAGE/.next/static
|
|
24
|
+
ARG BUILD_ID
|
|
25
|
+
ARG CACHE_PATH
|
|
26
|
+
ARG DATA_CACHE_PATH
|
|
27
|
+
ARG IMAGE_CACHE_PATH
|
|
21
28
|
ARG MOUNT_PATH
|
|
22
|
-
ARG
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
mkdir -p $MOUNT_PATH/$
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
ln -s
|
|
34
|
-
ln -s $MOUNT_PATH/$
|
|
35
|
-
ln -s $MOUNT_PATH/$
|
|
29
|
+
ARG PUBLIC_PATH
|
|
30
|
+
RUN sed -i 's/"env":{},/"env":{},cacheHandler:"\.\.\/cdk-nextjs-cache-handler.cjs",/g' ./$RELATIVE_PATH_TO_PACKAGE/server.js && \
|
|
31
|
+
# locally in this docker image the paths where EFS will be mounted need to exist for symlinks to be made
|
|
32
|
+
mkdir -p $MOUNT_PATH/$BUILD_ID/$DATA_CACHE_PATH && \
|
|
33
|
+
mkdir -p $MOUNT_PATH/$BUILD_ID/$IMAGE_CACHE_PATH && \
|
|
34
|
+
mkdir -p $MOUNT_PATH/$BUILD_ID/$PUBLIC_PATH && \
|
|
35
|
+
# delete if exists so that symlinks can be made; image cache doesn't exist at build time
|
|
36
|
+
rm -rf ./$RELATIVE_PATH_TO_PACKAGE/$DATA_CACHE_PATH && \
|
|
37
|
+
rm -rf ./$RELATIVE_PATH_TO_PACKAGE/$PUBLIC_PATH && \
|
|
38
|
+
# create .next/cache if doesn't exist. won't exist if no cached fetch data.
|
|
39
|
+
mkdir -p ./$RELATIVE_PATH_TO_PACKAGE/$CACHE_PATH && \
|
|
40
|
+
# `ln -s <src_file> <target_file>` such that accessing <target_file> accesses <src_file>
|
|
41
|
+
ln -s $MOUNT_PATH/$BUILD_ID/$DATA_CACHE_PATH ./$RELATIVE_PATH_TO_PACKAGE/$DATA_CACHE_PATH && \
|
|
42
|
+
ln -s $MOUNT_PATH/$BUILD_ID/$IMAGE_CACHE_PATH ./$RELATIVE_PATH_TO_PACKAGE/$IMAGE_CACHE_PATH && \
|
|
43
|
+
ln -s $MOUNT_PATH/$BUILD_ID/$PUBLIC_PATH ./$RELATIVE_PATH_TO_PACKAGE/$PUBLIC_PATH && \
|
|
44
|
+
# chown needs to be at end after all files are added so that nextjs:nodejs can access all files
|
|
45
|
+
chown -R nextjs:nodejs $MOUNT_PATH/$BUILD_ID
|
|
36
46
|
|
|
37
47
|
USER nextjs
|
|
38
48
|
|
|
@@ -2,7 +2,6 @@ import { IVpc } from "aws-cdk-lib/aws-ec2";
|
|
|
2
2
|
import { AccessPoint } from "aws-cdk-lib/aws-efs";
|
|
3
3
|
export interface NextjsComputeBaseProps {
|
|
4
4
|
readonly accessPoint: AccessPoint;
|
|
5
|
-
readonly containerMountPathForEfs: string;
|
|
6
5
|
readonly healthCheckPath: string;
|
|
7
6
|
readonly vpc: IVpc;
|
|
8
7
|
}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWNvbXB1dGUtYmFzZS1wcm9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uZXh0anMtY29tcHV0ZS9uZXh0anMtY29tcHV0ZS1iYXNlLXByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJVnBjIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IEFjY2Vzc1BvaW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lZnNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNDb21wdXRlQmFzZVByb3BzIHtcbiAgcmVhZG9ubHkgYWNjZXNzUG9pbnQ6IEFjY2Vzc1BvaW50O1xuICByZWFkb25seSBoZWFsdGhDaGVja1BhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgdnBjOiBJVnBjO1xufVxuIl19
|
|
@@ -4,7 +4,7 @@ import { ApplicationLoadBalancedFargateService, ApplicationLoadBalancedFargateSe
|
|
|
4
4
|
import { FileSystem } from "aws-cdk-lib/aws-efs";
|
|
5
5
|
import { Construct } from "constructs";
|
|
6
6
|
import { NextjsComputeBaseProps } from "./nextjs-compute-base-props";
|
|
7
|
-
import { NextjsType } from "../
|
|
7
|
+
import { NextjsType } from "../constants";
|
|
8
8
|
import { OptionalApplicationLoadBalancedTaskImageOptions } from "../generated-structs/OptionalApplicationLoadBalancedTaskImageOptions";
|
|
9
9
|
import { OptionalClusterProps } from "../generated-structs/OptionalClusterProps";
|
|
10
10
|
export interface NextjsContainersOverrides {
|
|
@@ -18,6 +18,7 @@ export interface NextjsContainersProps extends NextjsComputeBaseProps {
|
|
|
18
18
|
readonly nextjsType: NextjsType;
|
|
19
19
|
readonly overrides?: NextjsContainersOverrides;
|
|
20
20
|
readonly relativeEntrypointPath: string;
|
|
21
|
+
readonly buildId: string;
|
|
21
22
|
}
|
|
22
23
|
/**
|
|
23
24
|
* Next.js load balanced via Application Load Balancer with containers via AWS
|