cdk-nextjs 0.7.10 → 0.7.12
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 +76 -22
- package/.jsii.tabl.json +1 -1
- package/API.md +59 -3
- package/README.md +2 -2
- package/docs/breaking-changes.md +32 -0
- package/docs/harness-coverage.md +1 -1
- package/docs/next-build-output-guide.md +1 -1
- package/docs/nextjs-private-apis.md +128 -0
- package/lib/adapter/adapter.mjs +276 -24
- package/lib/adapter/build-outputs.d.ts +1 -1
- package/lib/adapter/build-outputs.js +29 -13
- package/lib/adapter/build-outputs.test.js +35 -7
- package/lib/adapter/cache-handler.d.ts +1 -1
- package/lib/adapter/cache-handler.js +1 -1
- package/lib/adapter/cache-kinds.d.ts +12 -1
- package/lib/adapter/cache-kinds.js +16 -4
- package/lib/adapter/init-cache.js +7 -7
- package/lib/adapter/local-file-cache-handler.d.ts +1 -1
- package/lib/adapter/local-file-cache-handler.js +1 -1
- package/lib/adapter/memory-cache-handler.d.ts +2 -2
- package/lib/adapter/memory-cache-handler.js +1 -1
- package/lib/adapter/s3-cache-handler.d.ts +2 -2
- package/lib/adapter/s3-cache-handler.js +1 -1
- package/lib/adapter/use-cache-common.d.ts +1 -1
- package/lib/adapter/use-cache-common.js +1 -1
- package/lib/adapter/use-cache-common.test.js +1 -1
- package/lib/adapter/use-cache-default-handler.d.ts +1 -1
- package/lib/adapter/use-cache-default-handler.js +1 -1
- package/lib/adapter/use-cache-handlers.test.js +1 -1
- package/lib/adapter/use-cache-remote-handler.d.ts +1 -1
- package/lib/adapter/use-cache-remote-handler.js +1 -1
- package/lib/cdk-nextjs-version.d.ts +10 -0
- package/lib/cdk-nextjs-version.js +15 -0
- package/lib/nextjs-api.js +1 -1
- package/lib/nextjs-build/nextjs-build.js +7 -6
- package/lib/nextjs-build/nextjs-build.test.js +16 -3
- package/lib/nextjs-cache.js +1 -1
- package/lib/nextjs-compute/nextjs-containers.js +1 -1
- package/lib/nextjs-compute/nextjs-functions.js +1 -1
- package/lib/nextjs-distribution.js +5 -5
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.d.ts +74 -5
- package/lib/nextjs-static-assets.js +276 -41
- package/lib/nextjs-static-assets.test.js +286 -1
- package/lib/root-constructs/nextjs-base-construct.d.ts +5 -4
- package/lib/root-constructs/nextjs-base-construct.js +17 -8
- package/lib/root-constructs/nextjs-global-containers.js +1 -1
- package/lib/root-constructs/nextjs-global-functions.js +1 -1
- package/lib/root-constructs/nextjs-regional-containers.js +1 -1
- package/lib/root-constructs/nextjs-regional-functions.js +1 -1
- package/lib/runtime/core.test.js +17 -8
- package/lib/runtime/dispatch.js +4 -5
- package/lib/runtime/image-utils.d.ts +1 -0
- package/lib/runtime/image-utils.js +2 -1
- package/lib/runtime/image-utils.test.js +17 -1
- package/lib/runtime/image.js +47 -33
- package/lib/runtime/image.test.js +47 -26
- package/lib/runtime/lambda.mjs +281 -37
- package/lib/runtime/manifest.d.ts +34 -8
- package/lib/runtime/manifest.js +7 -5
- package/lib/runtime/server.mjs +281 -37
- package/package.json +1 -1
- package/scripts/capture-adapter-fixture.mjs +13 -1
- package/scripts/zero-config-build.mjs +5 -1
|
@@ -5,6 +5,10 @@ const node_fs_1 = require("node:fs");
|
|
|
5
5
|
const node_os_1 = require("node:os");
|
|
6
6
|
const node_path_1 = require("node:path");
|
|
7
7
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
8
|
+
const assertions_1 = require("aws-cdk-lib/assertions");
|
|
9
|
+
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
|
10
|
+
const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
|
|
11
|
+
const cx_api_1 = require("aws-cdk-lib/cx-api");
|
|
8
12
|
const nextjs_static_assets_1 = require("./nextjs-static-assets");
|
|
9
13
|
describe("NextjsStaticAssets", () => {
|
|
10
14
|
let stack;
|
|
@@ -73,5 +77,286 @@ describe("NextjsStaticAssets", () => {
|
|
|
73
77
|
expect(staticAssets.keyPrefix).toBe("base");
|
|
74
78
|
});
|
|
75
79
|
});
|
|
80
|
+
describe("Cache-Control", () => {
|
|
81
|
+
const IMMUTABLE = "public, max-age=31536000, immutable";
|
|
82
|
+
/** The deployment resources' properties, by construct ID. */
|
|
83
|
+
function deployments() {
|
|
84
|
+
const resources = assertions_1.Template.fromStack(stack).findResources("Custom::CDKBucketDeployment");
|
|
85
|
+
return Object.fromEntries(Object.entries(resources).map(([logicalId, resource]) => [
|
|
86
|
+
logicalId.match(/NextjsStaticAssets(\w+?)CustomResource/)[1],
|
|
87
|
+
resource.Properties,
|
|
88
|
+
]));
|
|
89
|
+
}
|
|
90
|
+
function writePublicFile() {
|
|
91
|
+
const publicDir = (0, node_path_1.join)(buildDirectory, "public");
|
|
92
|
+
(0, node_fs_1.mkdirSync)(publicDir, { recursive: true });
|
|
93
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(publicDir, "logo.png"), "png");
|
|
94
|
+
}
|
|
95
|
+
// CloudFront and API Gateway serve these straight from S3, so the
|
|
96
|
+
// object's metadata is the only Cache-Control a browser gets.
|
|
97
|
+
it("uploads _next/static immutable and public/ without a header", () => {
|
|
98
|
+
writePublicFile();
|
|
99
|
+
const staticAssets = createStaticAssets({});
|
|
100
|
+
expect(staticAssets.staticDeployment).toBeDefined();
|
|
101
|
+
expect(staticAssets.publicDeployment).toBeDefined();
|
|
102
|
+
const { Deployment: staticUpload, PublicDeployment: publicUpload } = deployments();
|
|
103
|
+
expect(staticUpload.SystemMetadata).toEqual({
|
|
104
|
+
"cache-control": IMMUTABLE,
|
|
105
|
+
});
|
|
106
|
+
expect(publicUpload.SystemMetadata).toBeUndefined();
|
|
107
|
+
for (const upload of [staticUpload, publicUpload]) {
|
|
108
|
+
expect(upload.UserMetadata).toEqual({ build_id: "test-build-id" });
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
it("applies an overridden cacheControl to public/ files only", () => {
|
|
112
|
+
writePublicFile();
|
|
113
|
+
new nextjs_static_assets_1.NextjsStaticAssets(stack, "NextjsStaticAssets", {
|
|
114
|
+
buildDirectory,
|
|
115
|
+
buildId: "test-build-id",
|
|
116
|
+
overrides: {
|
|
117
|
+
bucketDeploymentProps: {
|
|
118
|
+
cacheControl: [aws_s3_deployment_1.CacheControl.fromString("public, max-age=3600")],
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
const { Deployment: staticUpload, PublicDeployment: publicUpload } = deployments();
|
|
123
|
+
expect(staticUpload.SystemMetadata).toEqual({
|
|
124
|
+
"cache-control": IMMUTABLE,
|
|
125
|
+
});
|
|
126
|
+
expect(publicUpload.SystemMetadata).toEqual({
|
|
127
|
+
"cache-control": "public, max-age=3600",
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
it("creates only the _next/static upload without a public/ directory", () => {
|
|
131
|
+
const staticAssets = createStaticAssets({ basePath: "/base" });
|
|
132
|
+
expect(staticAssets.publicDeployment).toBeUndefined();
|
|
133
|
+
expect(staticAssets.deployment).toBe(staticAssets.staticDeployment);
|
|
134
|
+
const uploads = deployments();
|
|
135
|
+
expect(Object.keys(uploads)).toEqual(["Deployment"]);
|
|
136
|
+
expect(uploads.Deployment.DestinationBucketKeyPrefix).toBe("base");
|
|
137
|
+
});
|
|
138
|
+
/**
|
|
139
|
+
* Keeps the staging directories, which are otherwise removed once CDK has
|
|
140
|
+
* copied them into `cdk.out`, so `stagedDir` can look inside them.
|
|
141
|
+
*/
|
|
142
|
+
function keepStaging() {
|
|
143
|
+
stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App({ context: { [cx_api_1.DISABLE_ASSET_STAGING_CONTEXT]: true } }), "TestStack");
|
|
144
|
+
}
|
|
145
|
+
/** The directory a deployment uploads, for checking what was staged. */
|
|
146
|
+
function stagedDir(deployment) {
|
|
147
|
+
// The deployment's own source asset, not the AWS CLI layer's.
|
|
148
|
+
return deployment.node
|
|
149
|
+
.findAll()
|
|
150
|
+
.filter((c) => c instanceof aws_cdk_lib_1.AssetStaging)
|
|
151
|
+
.map((c) => c.sourcePath)
|
|
152
|
+
.find((path) => path.includes("nextjs-assets-"));
|
|
153
|
+
}
|
|
154
|
+
// `next start` serves the built file over a public/ one at the same path,
|
|
155
|
+
// and the public/ one everywhere else.
|
|
156
|
+
it("leaves out only the public/_next/static files a built file shadows", () => {
|
|
157
|
+
keepStaging();
|
|
158
|
+
writePublicFile();
|
|
159
|
+
const shadowDir = (0, node_path_1.join)(buildDirectory, "public", "_next", "static");
|
|
160
|
+
(0, node_fs_1.mkdirSync)(shadowDir, { recursive: true });
|
|
161
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(shadowDir, "chunk.js"), "// shadowed");
|
|
162
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(shadowDir, "legacy.js"), "// public only");
|
|
163
|
+
const staticAssets = createStaticAssets({});
|
|
164
|
+
const staged = stagedDir(staticAssets.publicDeployment);
|
|
165
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staged, "logo.png"))).toBe(true);
|
|
166
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staged, "_next", "static", "chunk.js"))).toBe(false);
|
|
167
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staged, "_next", "static", "legacy.js"))).toBe(true);
|
|
168
|
+
});
|
|
169
|
+
// Next.js and S3 keys are case-sensitive, even where the filesystem isn't.
|
|
170
|
+
it("doesn't treat a public/_next/static file as shadowed by another case", () => {
|
|
171
|
+
keepStaging();
|
|
172
|
+
const shadowDir = (0, node_path_1.join)(buildDirectory, "public", "_next", "static");
|
|
173
|
+
(0, node_fs_1.mkdirSync)(shadowDir, { recursive: true });
|
|
174
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(shadowDir, "Chunk.js"), "// public only");
|
|
175
|
+
const staticAssets = createStaticAssets({});
|
|
176
|
+
const staged = stagedDir(staticAssets.publicDeployment);
|
|
177
|
+
expect((0, node_fs_1.readdirSync)((0, node_path_1.join)(staged, "_next", "static"))).toEqual([
|
|
178
|
+
"Chunk.js",
|
|
179
|
+
]);
|
|
180
|
+
});
|
|
181
|
+
it("uploads a .next/static/service-worker file with the other assets", () => {
|
|
182
|
+
keepStaging();
|
|
183
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(buildDirectory, ".next", "static", "service-worker"), "// not a directory");
|
|
184
|
+
const staticAssets = createStaticAssets({});
|
|
185
|
+
expect(staticAssets.serviceWorkerDeployment).toBeUndefined();
|
|
186
|
+
const staged = stagedDir(staticAssets.staticDeployment);
|
|
187
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staged, "_next", "static", "service-worker"))).toBe(true);
|
|
188
|
+
});
|
|
189
|
+
it("uploads a public/ made only of symlinks", () => {
|
|
190
|
+
const target = (0, node_path_1.join)(buildDirectory, "logo.png");
|
|
191
|
+
(0, node_fs_1.writeFileSync)(target, "png");
|
|
192
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.join)(buildDirectory, "public"));
|
|
193
|
+
(0, node_fs_1.symlinkSync)(target, (0, node_path_1.join)(buildDirectory, "public", "logo.png"));
|
|
194
|
+
const staticAssets = createStaticAssets({});
|
|
195
|
+
expect(staticAssets.publicDeployment).toBeDefined();
|
|
196
|
+
});
|
|
197
|
+
// A service worker keeps its URL across builds, so Next.js serves it
|
|
198
|
+
// revalidated rather than immutable.
|
|
199
|
+
it("uploads service workers with max-age=0, must-revalidate", () => {
|
|
200
|
+
keepStaging();
|
|
201
|
+
const swDir = (0, node_path_1.join)(buildDirectory, ".next", "static", "service-worker");
|
|
202
|
+
(0, node_fs_1.mkdirSync)(swDir, { recursive: true });
|
|
203
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(swDir, "sw.js"), "// sw");
|
|
204
|
+
const staticAssets = createStaticAssets({});
|
|
205
|
+
const { Deployment: staticUpload, ServiceWorkerDeployment: swUpload } = deployments();
|
|
206
|
+
expect(swUpload.SystemMetadata).toEqual({
|
|
207
|
+
"cache-control": "public, max-age=0, must-revalidate",
|
|
208
|
+
});
|
|
209
|
+
expect(staticUpload.SystemMetadata).toEqual({
|
|
210
|
+
"cache-control": IMMUTABLE,
|
|
211
|
+
});
|
|
212
|
+
const swStaged = stagedDir(staticAssets.serviceWorkerDeployment);
|
|
213
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.join)(swStaged, "_next", "static", "service-worker", "sw.js"))).toBe(true);
|
|
214
|
+
const staticStaged = stagedDir(staticAssets.staticDeployment);
|
|
215
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staticStaged, "_next", "static", "chunk.js"))).toBe(true);
|
|
216
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staticStaged, "_next", "static", "service-worker"))).toBe(false);
|
|
217
|
+
});
|
|
218
|
+
it("stages a symlinked .next/static", () => {
|
|
219
|
+
keepStaging();
|
|
220
|
+
const realStatic = (0, node_path_1.join)(buildDirectory, "real-static");
|
|
221
|
+
(0, node_fs_1.renameSync)((0, node_path_1.join)(buildDirectory, ".next", "static"), realStatic);
|
|
222
|
+
(0, node_fs_1.symlinkSync)(realStatic, (0, node_path_1.join)(buildDirectory, ".next", "static"));
|
|
223
|
+
const staticAssets = createStaticAssets({});
|
|
224
|
+
const staged = stagedDir(staticAssets.staticDeployment);
|
|
225
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staged, "_next", "static", "chunk.js"))).toBe(true);
|
|
226
|
+
});
|
|
227
|
+
// CDK uploads the files a linked directory holds, so they shadow too.
|
|
228
|
+
it("treats files under a symlinked .next/static directory as shadowing", () => {
|
|
229
|
+
keepStaging();
|
|
230
|
+
const realChunks = (0, node_path_1.join)(buildDirectory, "real-chunks");
|
|
231
|
+
(0, node_fs_1.mkdirSync)(realChunks);
|
|
232
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(realChunks, "a.js"), "// built");
|
|
233
|
+
(0, node_fs_1.symlinkSync)(realChunks, (0, node_path_1.join)(buildDirectory, ".next", "static", "chunks"));
|
|
234
|
+
const shadowDir = (0, node_path_1.join)(buildDirectory, "public", "_next", "static");
|
|
235
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.join)(shadowDir, "chunks"), { recursive: true });
|
|
236
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(shadowDir, "chunks", "a.js"), "// shadowed");
|
|
237
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(buildDirectory, "public", "logo.png"), "png");
|
|
238
|
+
const staticAssets = createStaticAssets({});
|
|
239
|
+
const staged = stagedDir(staticAssets.publicDeployment);
|
|
240
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staged, "_next", "static", "chunks", "a.js"))).toBe(false);
|
|
241
|
+
});
|
|
242
|
+
// CDK uploads a directory under every name a link gives it.
|
|
243
|
+
it("treats files reached through a second name as shadowing", () => {
|
|
244
|
+
keepStaging();
|
|
245
|
+
const builtStatic = (0, node_path_1.join)(buildDirectory, ".next", "static");
|
|
246
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.join)(builtStatic, "chunks"));
|
|
247
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(builtStatic, "chunks", "a.js"), "// built");
|
|
248
|
+
(0, node_fs_1.symlinkSync)((0, node_path_1.join)(builtStatic, "chunks"), (0, node_path_1.join)(builtStatic, "alias"));
|
|
249
|
+
const shadowDir = (0, node_path_1.join)(buildDirectory, "public", "_next", "static");
|
|
250
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.join)(shadowDir, "alias"), { recursive: true });
|
|
251
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(shadowDir, "alias", "a.js"), "// shadowed");
|
|
252
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(buildDirectory, "public", "logo.png"), "png");
|
|
253
|
+
const staticAssets = createStaticAssets({});
|
|
254
|
+
const staged = stagedDir(staticAssets.publicDeployment);
|
|
255
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staged, "_next", "static", "alias", "a.js"))).toBe(false);
|
|
256
|
+
});
|
|
257
|
+
it("leaves out a shadowed file under a symlinked public/ directory", () => {
|
|
258
|
+
keepStaging();
|
|
259
|
+
const linked = (0, node_path_1.join)(buildDirectory, "linked-static");
|
|
260
|
+
(0, node_fs_1.mkdirSync)(linked);
|
|
261
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(linked, "chunk.js"), "// shadowed");
|
|
262
|
+
(0, node_fs_1.writeFileSync)((0, node_path_1.join)(linked, "legacy.js"), "// public only");
|
|
263
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.join)(buildDirectory, "public", "_next"), { recursive: true });
|
|
264
|
+
(0, node_fs_1.symlinkSync)(linked, (0, node_path_1.join)(buildDirectory, "public", "_next", "static"));
|
|
265
|
+
const staticAssets = createStaticAssets({});
|
|
266
|
+
const staged = stagedDir(staticAssets.publicDeployment);
|
|
267
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staged, "_next", "static", "chunk.js"))).toBe(false);
|
|
268
|
+
expect((0, node_fs_1.existsSync)((0, node_path_1.join)(staged, "_next", "static", "legacy.js"))).toBe(true);
|
|
269
|
+
});
|
|
270
|
+
it("lists a .next/static holding a link loop", () => {
|
|
271
|
+
const builtStatic = (0, node_path_1.join)(buildDirectory, ".next", "static");
|
|
272
|
+
(0, node_fs_1.symlinkSync)((0, node_path_1.join)(builtStatic, "loop"), (0, node_path_1.join)(builtStatic, "loop"));
|
|
273
|
+
writePublicFile();
|
|
274
|
+
expect(() => createStaticAssets({})).not.toThrow(/ELOOP/);
|
|
275
|
+
});
|
|
276
|
+
it("removes the staging directories when a deployment fails", () => {
|
|
277
|
+
writePublicFile();
|
|
278
|
+
const before = new Set((0, node_fs_1.readdirSync)((0, node_os_1.tmpdir)()));
|
|
279
|
+
jest
|
|
280
|
+
.spyOn(nextjs_static_assets_1.NextjsStaticAssets.prototype, "createDeployment")
|
|
281
|
+
.mockImplementation(() => {
|
|
282
|
+
throw new Error("deployment failed");
|
|
283
|
+
});
|
|
284
|
+
try {
|
|
285
|
+
expect(() => createStaticAssets({})).toThrow("deployment failed");
|
|
286
|
+
}
|
|
287
|
+
finally {
|
|
288
|
+
jest.restoreAllMocks();
|
|
289
|
+
}
|
|
290
|
+
const leaked = (0, node_fs_1.readdirSync)((0, node_os_1.tmpdir)()).filter((name) => name.startsWith("nextjs-assets-") && !before.has(name));
|
|
291
|
+
expect(leaked).toEqual([]);
|
|
292
|
+
});
|
|
293
|
+
it("removes its staging directories once CDK has copied them", () => {
|
|
294
|
+
writePublicFile();
|
|
295
|
+
const staticAssets = createStaticAssets({});
|
|
296
|
+
for (const upload of [
|
|
297
|
+
staticAssets.staticDeployment,
|
|
298
|
+
staticAssets.publicDeployment,
|
|
299
|
+
]) {
|
|
300
|
+
expect((0, node_fs_1.existsSync)(stagedDir(upload))).toBe(false);
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
// The asset manifest then points at the staging directory itself.
|
|
304
|
+
it("keeps them when asset staging is disabled", () => {
|
|
305
|
+
keepStaging();
|
|
306
|
+
const staticAssets = createStaticAssets({});
|
|
307
|
+
expect((0, node_fs_1.existsSync)(stagedDir(staticAssets.staticDeployment))).toBe(true);
|
|
308
|
+
});
|
|
309
|
+
it("falls back to the public/ upload for a build without .next/static", () => {
|
|
310
|
+
(0, node_fs_1.rmSync)((0, node_path_1.join)(buildDirectory, ".next"), { recursive: true, force: true });
|
|
311
|
+
writePublicFile();
|
|
312
|
+
const staticAssets = createStaticAssets({});
|
|
313
|
+
expect(staticAssets.staticDeployment).toBeUndefined();
|
|
314
|
+
expect(staticAssets.deployment).toBe(staticAssets.publicDeployment);
|
|
315
|
+
expect(Object.keys(deployments())).toEqual(["PublicDeployment"]);
|
|
316
|
+
});
|
|
317
|
+
});
|
|
318
|
+
describe("bucketDeploymentProps that would break the other uploads", () => {
|
|
319
|
+
function withOverrides(bucketDeploymentProps) {
|
|
320
|
+
return () => new nextjs_static_assets_1.NextjsStaticAssets(stack, "NextjsStaticAssets", {
|
|
321
|
+
buildDirectory,
|
|
322
|
+
buildId: "test-build-id",
|
|
323
|
+
overrides: { bucketDeploymentProps: bucketDeploymentProps },
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
it("rejects prune: true", () => {
|
|
327
|
+
expect(withOverrides({ prune: true })).toThrow(/`prune: true`/);
|
|
328
|
+
});
|
|
329
|
+
// CDK's Update path deletes the old prefix without checking the bucket's
|
|
330
|
+
// owner, racing the other uploads, so no bucket is safe.
|
|
331
|
+
it("rejects retainOnDelete: false", () => {
|
|
332
|
+
expect(withOverrides({ retainOnDelete: false })).toThrow(/`retainOnDelete: false`/);
|
|
333
|
+
});
|
|
334
|
+
// The type requires both, so a typed caller always passes them.
|
|
335
|
+
it("ignores sources and destinationBucket", () => {
|
|
336
|
+
const other = aws_s3_1.Bucket.fromBucketName(stack, "Other", "other");
|
|
337
|
+
new nextjs_static_assets_1.NextjsStaticAssets(stack, "NextjsStaticAssets", {
|
|
338
|
+
buildDirectory,
|
|
339
|
+
buildId: "test-build-id",
|
|
340
|
+
overrides: {
|
|
341
|
+
bucketDeploymentProps: {
|
|
342
|
+
sources: [],
|
|
343
|
+
destinationBucket: other,
|
|
344
|
+
cacheControl: [aws_s3_deployment_1.CacheControl.fromString("public, max-age=60")],
|
|
345
|
+
},
|
|
346
|
+
},
|
|
347
|
+
});
|
|
348
|
+
const [upload] = Object.values(assertions_1.Template.fromStack(stack).findResources("Custom::CDKBucketDeployment"));
|
|
349
|
+
expect(upload.Properties.SourceObjectKeys).toHaveLength(1);
|
|
350
|
+
expect(JSON.stringify(upload.Properties.DestinationBucketName)).toContain("NextjsStaticAssetsBucket");
|
|
351
|
+
});
|
|
352
|
+
// A JSII binding can materialize an unset field as an explicit undefined.
|
|
353
|
+
it("allows the fields when they are explicitly undefined", () => {
|
|
354
|
+
expect(withOverrides({ prune: undefined, sources: undefined })).not.toThrow();
|
|
355
|
+
// Not CDK's default `prune: true`, nor a deployment with no sources.
|
|
356
|
+
const [upload] = Object.values(assertions_1.Template.fromStack(stack).findResources("Custom::CDKBucketDeployment"));
|
|
357
|
+
expect(upload.Properties.Prune).toBe(false);
|
|
358
|
+
expect(upload.Properties.SourceObjectKeys).toHaveLength(1);
|
|
359
|
+
});
|
|
360
|
+
});
|
|
76
361
|
});
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLXN0YXRpYy1hc3NldHMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtc3RhdGljLWFzc2V0cy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0RBQXNEO0FBQ3RELHFDQUF3RTtBQUN4RSxxQ0FBaUM7QUFDakMseUNBQWlDO0FBQ2pDLDZDQUF5QztBQUN6QyxpRUFBNEQ7QUFFNUQsUUFBUSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsRUFBRTtJQUNsQyxJQUFJLEtBQVksQ0FBQztJQUNqQixJQUFJLGNBQXNCLENBQUM7SUFFM0IsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsSUFBSSxpQkFBRyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUMsY0FBYyxHQUFHLElBQUEscUJBQVcsRUFBQyxJQUFBLGdCQUFJLEVBQUMsSUFBQSxnQkFBTSxHQUFFLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sU0FBUyxHQUFHLElBQUEsZ0JBQUksRUFBQyxjQUFjLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzFELElBQUEsbUJBQVMsRUFBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUMxQyxJQUFBLHVCQUFhLEVBQUMsSUFBQSxnQkFBSSxFQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN6RCxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixJQUFBLGdCQUFNLEVBQUMsY0FBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDLENBQUMsQ0FBQztJQUVILFNBQVMsa0JBQWtCLENBQUMsS0FHM0I7UUFDQyxPQUFPLElBQUkseUNBQWtCLENBQUMsS0FBSyxFQUFFLG9CQUFvQixFQUFFO1lBQ3pELGNBQWM7WUFDZCxPQUFPLEVBQUUsZUFBZTtZQUN4QixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7WUFDeEIsU0FBUyxFQUNQLEtBQUssQ0FBQyxvQkFBb0IsS0FBSyxTQUFTO2dCQUN0QyxDQUFDLENBQUMsU0FBUztnQkFDWCxDQUFDLENBQUM7b0JBQ0UscUJBQXFCLEVBQUU7d0JBQ3JCLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxvQkFBb0I7cUJBQzFDO2lCQUNUO1NBQ1IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFFBQVEsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFO1FBQ3pCLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7WUFDMUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxHQUFHLEVBQUU7WUFDbEQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDO1FBRUgseUVBQXlFO1FBQ3pFLHNFQUFzRTtRQUN0RSxrREFBa0Q7UUFDbEQsRUFBRSxDQUFDLCtEQUErRCxFQUFFLEdBQUcsRUFBRTtZQUN2RSxNQUFNLENBQ0osa0JBQWtCLENBQUM7Z0JBQ2pCLFFBQVEsRUFBRSxPQUFPO2dCQUNqQixvQkFBb0IsRUFBRSxVQUFVO2FBQ2pDLENBQUMsQ0FBQyxTQUFTLENBQ2IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNkNBQTZDLEVBQUUsR0FBRyxFQUFFO1lBQ3JELE1BQU0sQ0FDSixrQkFBa0IsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsRUFBRSxFQUFFLENBQUM7aUJBQ2hFLFNBQVMsQ0FDYixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNiLENBQUMsQ0FBQyxDQUFDO1FBRUgseUVBQXlFO1FBQ3pFLDJFQUEyRTtRQUMzRSw2RUFBNkU7UUFDN0UsMEVBQTBFO1FBQzFFLDJFQUEyRTtRQUMzRSxpQkFBaUI7UUFDakIsRUFBRSxDQUFDLHVFQUF1RSxFQUFFLEdBQUcsRUFBRTtZQUMvRSxNQUFNLFlBQVksR0FBRyxJQUFJLHlDQUFrQixDQUFDLEtBQUssRUFBRSxvQkFBb0IsRUFBRTtnQkFDdkUsY0FBYztnQkFDZCxPQUFPLEVBQUUsZUFBZTtnQkFDeEIsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLFNBQVMsRUFBRTtvQkFDVCxxQkFBcUIsRUFBRTt3QkFDckIsb0JBQW9CLEVBQUUsU0FBUztxQkFDekI7aUJBQ1Q7YUFDRixDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCB7IG1rZGlyU3luYywgbWtkdGVtcFN5bmMsIHJtU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IEFwcCwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IE5leHRqc1N0YXRpY0Fzc2V0cyB9IGZyb20gXCIuL25leHRqcy1zdGF0aWMtYXNzZXRzXCI7XG5cbmRlc2NyaWJlKFwiTmV4dGpzU3RhdGljQXNzZXRzXCIsICgpID0+IHtcbiAgbGV0IHN0YWNrOiBTdGFjaztcbiAgbGV0IGJ1aWxkRGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgc3RhY2sgPSBuZXcgU3RhY2sobmV3IEFwcCgpLCBcIlRlc3RTdGFja1wiKTtcbiAgICBidWlsZERpcmVjdG9yeSA9IG1rZHRlbXBTeW5jKGpvaW4odG1wZGlyKCksIFwibmV4dGpzLXN0YXRpYy1hc3NldHMtXCIpKTtcbiAgICBjb25zdCBzdGF0aWNEaXIgPSBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIsIFwic3RhdGljXCIpO1xuICAgIG1rZGlyU3luYyhzdGF0aWNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHdyaXRlRmlsZVN5bmMoam9pbihzdGF0aWNEaXIsIFwiY2h1bmsuanNcIiksIFwiLy8gY2h1bmtcIik7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgcm1TeW5jKGJ1aWxkRGlyZWN0b3J5LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZVN0YXRpY0Fzc2V0cyhwcm9wczoge1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xuICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4Pzogc3RyaW5nO1xuICB9KSB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNTdGF0aWNBc3NldHMoc3RhY2ssIFwiTmV4dGpzU3RhdGljQXNzZXRzXCIsIHtcbiAgICAgIGJ1aWxkRGlyZWN0b3J5LFxuICAgICAgYnVpbGRJZDogXCJ0ZXN0LWJ1aWxkLWlkXCIsXG4gICAgICBiYXNlUGF0aDogcHJvcHMuYmFzZVBhdGgsXG4gICAgICBvdmVycmlkZXM6XG4gICAgICAgIHByb3BzLmRlc3RpbmF0aW9uS2V5UHJlZml4ID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBidWNrZXREZXBsb3ltZW50UHJvcHM6IHtcbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbktleVByZWZpeDogcHJvcHMuZGVzdGluYXRpb25LZXlQcmVmaXgsXG4gICAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGRlc2NyaWJlKFwia2V5UHJlZml4XCIsICgpID0+IHtcbiAgICBpdChcImlzIGVtcHR5IHdoZW4gbm8gYmFzZVBhdGggaXMgc2V0XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChjcmVhdGVTdGF0aWNBc3NldHMoe30pLmtleVByZWZpeCkudG9CZShcIlwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwic3RyaXBzIHN1cnJvdW5kaW5nIHNsYXNoZXMgZnJvbSBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY3JlYXRlU3RhdGljQXNzZXRzKHsgYmFzZVBhdGg6IFwiL2Jhc2UvXCIgfSkua2V5UHJlZml4KS50b0JlKFwiYmFzZVwiKTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBvdmVycmlkZSBpcyBzcHJlYWQgbGFzdCBpbnRvIEJ1Y2tldERlcGxveW1lbnQsIHNvIGl0IGRlY2lkZXMgd2hlcmVcbiAgICAvLyB0aGUgb2JqZWN0cyBhY3R1YWxseSBsYW5kLiBDb25zdW1lcnMgcmVhZGluZyBhc3NldHMgYmFjayBvdXQgb2YgdGhlXG4gICAgLy8gYnVja2V0IGhhdmUgdG8gc2VlIHRoYXQsIG5vdCB0aGUgYmFzZVBhdGggcHJvcC5cbiAgICBpdChcInJlZmxlY3RzIGEgZGVzdGluYXRpb25LZXlQcmVmaXggb3ZlcnJpZGUgcmF0aGVyIHRoYW4gYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBjcmVhdGVTdGF0aWNBc3NldHMoe1xuICAgICAgICAgIGJhc2VQYXRoOiBcIi9iYXNlXCIsXG4gICAgICAgICAgZGVzdGluYXRpb25LZXlQcmVmaXg6IFwiYnJhbmNoLXhcIixcbiAgICAgICAgfSkua2V5UHJlZml4LFxuICAgICAgKS50b0JlKFwiYnJhbmNoLXhcIik7XG4gICAgfSk7XG5cbiAgICBpdChcImlzIGVtcHR5IHdoZW4gYW4gb3ZlcnJpZGUgY2xlYXJzIHRoZSBwcmVmaXhcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBjcmVhdGVTdGF0aWNBc3NldHMoeyBiYXNlUGF0aDogXCIvYmFzZVwiLCBkZXN0aW5hdGlvbktleVByZWZpeDogXCJcIiB9KVxuICAgICAgICAgIC5rZXlQcmVmaXgsXG4gICAgICApLnRvQmUoXCJcIik7XG4gICAgfSk7XG5cbiAgICAvLyBBIEpTSUkgbGFuZ3VhZ2UgYmluZGluZywgb3IgYSBwcm9ncmFtbWF0aWNhbGx5IGJ1aWx0IHByb3BzIG9iamVjdCwgY2FuXG4gICAgLy8gbWF0ZXJpYWxpemUgYW4gdW5zZXQgb3B0aW9uYWwgZmllbGQgYXMgYW4gZXhwbGljaXQgYHVuZGVmaW5lZGAuIFRyZWF0aW5nXG4gICAgLy8gdGhhdCBhcyBhbiBpbnRlbnRpb25hbCBcIm1vdmUgdGhlIGFzc2V0cyB0byB0aGUgYnVja2V0IHJvb3RcIiBvdmVycmlkZSB3b3VsZFxuICAgIC8vIHVwbG9hZCB0aGVtIHRoZXJlIHdoaWxlIENsb3VkRnJvbnQgc3RpbGwgcmVxdWVzdGVkIHRoZW0gdW5kZXIgYmFzZVBhdGgsXG4gICAgLy8gZmFpbGluZyBzeW50aCB3aXRoIGEga2V5IHByZWZpeCBtaXNtYXRjaCB0aGF0IG5hbWVzIG5laXRoZXIgdGhlIG92ZXJyaWRlXG4gICAgLy8gbm9yIHRoZSBjYXVzZS5cbiAgICBpdChcImZhbGxzIGJhY2sgdG8gYmFzZVBhdGggd2hlbiB0aGUgb3ZlcnJpZGUga2V5IGlzIHByZXNlbnQgYnV0IHVuZGVmaW5lZFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBzdGF0aWNBc3NldHMgPSBuZXcgTmV4dGpzU3RhdGljQXNzZXRzKHN0YWNrLCBcIk5leHRqc1N0YXRpY0Fzc2V0c1wiLCB7XG4gICAgICAgIGJ1aWxkRGlyZWN0b3J5LFxuICAgICAgICBidWlsZElkOiBcInRlc3QtYnVpbGQtaWRcIixcbiAgICAgICAgYmFzZVBhdGg6IFwiL2Jhc2VcIixcbiAgICAgICAgb3ZlcnJpZGVzOiB7XG4gICAgICAgICAgYnVja2V0RGVwbG95bWVudFByb3BzOiB7XG4gICAgICAgICAgICBkZXN0aW5hdGlvbktleVByZWZpeDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGV4cGVjdChzdGF0aWNBc3NldHMua2V5UHJlZml4KS50b0JlKFwiYmFzZVwiKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
362
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLXN0YXRpYy1hc3NldHMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9uZXh0anMtc3RhdGljLWFzc2V0cy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0RBQXNEO0FBQ3RELHFDQVNpQjtBQUNqQixxQ0FBaUM7QUFDakMseUNBQWlDO0FBQ2pDLDZDQUF1RDtBQUN2RCx1REFBa0Q7QUFDbEQsK0NBQTRDO0FBQzVDLHFFQUErRTtBQUMvRSwrQ0FBbUU7QUFDbkUsaUVBQTREO0FBRTVELFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxHQUFHLEVBQUU7SUFDbEMsSUFBSSxLQUFZLENBQUM7SUFDakIsSUFBSSxjQUFzQixDQUFDO0lBRTNCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxLQUFLLEdBQUcsSUFBSSxtQkFBSyxDQUFDLElBQUksaUJBQUcsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzFDLGNBQWMsR0FBRyxJQUFBLHFCQUFXLEVBQUMsSUFBQSxnQkFBSSxFQUFDLElBQUEsZ0JBQU0sR0FBRSxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQztRQUN0RSxNQUFNLFNBQVMsR0FBRyxJQUFBLGdCQUFJLEVBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMxRCxJQUFBLG1CQUFTLEVBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUMsSUFBQSx1QkFBYSxFQUFDLElBQUEsZ0JBQUksRUFBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsSUFBQSxnQkFBTSxFQUFDLGNBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0QsQ0FBQyxDQUFD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Q0FBQyw2QkFBNkIsQ0FBQyxDQUN2RSxDQUFDO1lBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0QsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUN2RSwwQkFBMEIsQ0FDM0IsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsMEVBQTBFO1FBQzFFLEVBQUUsQ0FBQyxzREFBc0QsRUFBRSxHQUFHLEVBQUU7WUFDOUQsTUFBTSxDQUNKLGFBQWEsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQ3hELENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2hCLHFFQUFxRTtZQUNyRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FDNUIscUJBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsYUFBYSxDQUFDLDZCQUE2QixDQUFDLENBQ3ZFLENBQUM7WUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgcmVuYW1lU3luYyxcbiAgcm1TeW5jLFxuICBzeW1saW5rU3luYyxcbiAgd3JpdGVGaWxlU3luYyxcbn0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQXBwLCBBc3NldFN0YWdpbmcsIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hc3NlcnRpb25zXCI7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBCdWNrZXREZXBsb3ltZW50LCBDYWNoZUNvbnRyb2wgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzLWRlcGxveW1lbnRcIjtcbmltcG9ydCB7IERJU0FCTEVfQVNTRVRfU1RBR0lOR19DT05URVhUIH0gZnJvbSBcImF3cy1jZGstbGliL2N4LWFwaVwiO1xuaW1wb3J0IHsgTmV4dGpzU3RhdGljQXNzZXRzIH0gZnJvbSBcIi4vbmV4dGpzLXN0YXRpYy1hc3NldHNcIjtcblxuZGVzY3JpYmUoXCJOZXh0anNTdGF0aWNBc3NldHNcIiwgKCkgPT4ge1xuICBsZXQgc3RhY2s6IFN0YWNrO1xuICBsZXQgYnVpbGREaXJlY3Rvcnk6IHN0cmluZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBzdGFjayA9IG5ldyBTdGFjayhuZXcgQXBwKCksIFwiVGVzdFN0YWNrXCIpO1xuICAgIGJ1aWxkRGlyZWN0b3J5ID0gbWtkdGVtcFN5bmMoam9pbih0bXBkaXIoKSwgXCJuZXh0anMtc3RhdGljLWFzc2V0cy1cIikpO1xuICAgIGNvbnN0IHN0YXRpY0RpciA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwiLm5leHRcIiwgXCJzdGF0aWNcIik7XG4gICAgbWtkaXJTeW5jKHN0YXRpY0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgd3JpdGVGaWxlU3luYyhqb2luKHN0YXRpY0RpciwgXCJjaHVuay5qc1wiKSwgXCIvLyBjaHVua1wiKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBybVN5bmMoYnVpbGREaXJlY3RvcnksIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RhdGljQXNzZXRzKHByb3BzOiB7XG4gICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gICAgZGVzdGluYXRpb25LZXlQcmVmaXg/OiBzdHJpbmc7XG4gIH0pIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc1N0YXRpY0Fzc2V0cyhzdGFjaywgXCJOZXh0anNTdGF0aWNBc3NldHNcIiwge1xuICAgICAgYnVpbGREaXJlY3RvcnksXG4gICAgICBidWlsZElkOiBcInRlc3QtYnVpbGQtaWRcIixcbiAgICAgIGJhc2VQYXRoOiBwcm9wcy5iYXNlUGF0aCxcbiAgICAgIG92ZXJyaWRlczpcbiAgICAgICAgcHJvcHMuZGVzdGluYXRpb25LZXlQcmVmaXggPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiB7XG4gICAgICAgICAgICAgIGJ1Y2tldERlcGxveW1lbnRQcm9wczoge1xuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBwcm9wcy5kZXN0aW5hdGlvbktleVByZWZpeCxcbiAgICAgICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgZGVzY3JpYmUoXCJrZXlQcmVmaXhcIiwgKCkgPT4ge1xuICAgIGl0KFwiaXMgZW1wdHkgd2hlbiBubyBiYXNlUGF0aCBpcyBzZXRcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSkua2V5UHJlZml4KS50b0JlKFwiXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzdHJpcHMgc3Vycm91bmRpbmcgc2xhc2hlcyBmcm9tIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChjcmVhdGVTdGF0aWNBc3NldHMoeyBiYXNlUGF0aDogXCIvYmFzZS9cIiB9KS5rZXlQcmVmaXgpLnRvQmUoXCJiYXNlXCIpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIG92ZXJyaWRlIGlzIHNwcmVhZCBsYXN0IGludG8gQnVja2V0RGVwbG95bWVudCwgc28gaXQgZGVjaWRlcyB3aGVyZVxuICAgIC8vIHRoZSBvYmplY3RzIGFjdHVhbGx5IGxhbmQuIENvbnN1bWVycyByZWFkaW5nIGFzc2V0cyBiYWNrIG91dCBvZiB0aGVcbiAgICAvLyBidWNrZXQgaGF2ZSB0byBzZWUgdGhhdCwgbm90IHRoZSBiYXNlUGF0aCBwcm9wLlxuICAgIGl0KFwicmVmbGVjdHMgYSBkZXN0aW5hdGlvbktleVByZWZpeCBvdmVycmlkZSByYXRoZXIgdGhhbiBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGNyZWF0ZVN0YXRpY0Fzc2V0cyh7XG4gICAgICAgICAgYmFzZVBhdGg6IFwiL2Jhc2VcIixcbiAgICAgICAgICBkZXN0aW5hdGlvbktleVByZWZpeDogXCJicmFuY2gteFwiLFxuICAgICAgICB9KS5rZXlQcmVmaXgsXG4gICAgICApLnRvQmUoXCJicmFuY2gteFwiKTtcbiAgICB9KTtcblxuICAgIGl0KFwiaXMgZW1wdHkgd2hlbiBhbiBvdmVycmlkZSBjbGVhcnMgdGhlIHByZWZpeFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGNyZWF0ZVN0YXRpY0Fzc2V0cyh7IGJhc2VQYXRoOiBcIi9iYXNlXCIsIGRlc3RpbmF0aW9uS2V5UHJlZml4OiBcIlwiIH0pXG4gICAgICAgICAgLmtleVByZWZpeCxcbiAgICAgICkudG9CZShcIlwiKTtcbiAgICB9KTtcblxuICAgIC8vIEEgSlNJSSBsYW5ndWFnZSBiaW5kaW5nLCBvciBhIHByb2dyYW1tYXRpY2FsbHkgYnVpbHQgcHJvcHMgb2JqZWN0LCBjYW5cbiAgICAvLyBtYXRlcmlhbGl6ZSBhbiB1bnNldCBvcHRpb25hbCBmaWVsZCBhcyBhbiBleHBsaWNpdCBgdW5kZWZpbmVkYC4gVHJlYXRpbmdcbiAgICAvLyB0aGF0IGFzIGFuIGludGVudGlvbmFsIFwibW92ZSB0aGUgYXNzZXRzIHRvIHRoZSBidWNrZXQgcm9vdFwiIG92ZXJyaWRlIHdvdWxkXG4gICAgLy8gdXBsb2FkIHRoZW0gdGhlcmUgd2hpbGUgQ2xvdWRGcm9udCBzdGlsbCByZXF1ZXN0ZWQgdGhlbSB1bmRlciBiYXNlUGF0aCxcbiAgICAvLyBmYWlsaW5nIHN5bnRoIHdpdGggYSBrZXkgcHJlZml4IG1pc21hdGNoIHRoYXQgbmFtZXMgbmVpdGhlciB0aGUgb3ZlcnJpZGVcbiAgICAvLyBub3IgdGhlIGNhdXNlLlxuICAgIGl0KFwiZmFsbHMgYmFjayB0byBiYXNlUGF0aCB3aGVuIHRoZSBvdmVycmlkZSBrZXkgaXMgcHJlc2VudCBidXQgdW5kZWZpbmVkXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IG5ldyBOZXh0anNTdGF0aWNBc3NldHMoc3RhY2ssIFwiTmV4dGpzU3RhdGljQXNzZXRzXCIsIHtcbiAgICAgICAgYnVpbGREaXJlY3RvcnksXG4gICAgICAgIGJ1aWxkSWQ6IFwidGVzdC1idWlsZC1pZFwiLFxuICAgICAgICBiYXNlUGF0aDogXCIvYmFzZVwiLFxuICAgICAgICBvdmVycmlkZXM6IHtcbiAgICAgICAgICBidWNrZXREZXBsb3ltZW50UHJvcHM6IHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uS2V5UHJlZml4OiB1bmRlZmluZWQsXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgZXhwZWN0KHN0YXRpY0Fzc2V0cy5rZXlQcmVmaXgpLnRvQmUoXCJiYXNlXCIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShcIkNhY2hlLUNvbnRyb2xcIiwgKCkgPT4ge1xuICAgIGNvbnN0IElNTVVUQUJMRSA9IFwicHVibGljLCBtYXgtYWdlPTMxNTM2MDAwLCBpbW11dGFibGVcIjtcblxuICAgIC8qKiBUaGUgZGVwbG95bWVudCByZXNvdXJjZXMnIHByb3BlcnRpZXMsIGJ5IGNvbnN0cnVjdCBJRC4gKi9cbiAgICBmdW5jdGlvbiBkZXBsb3ltZW50cygpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcbiAgICAgICAgXCJDdXN0b206OkNES0J1Y2tldERlcGxveW1lbnRcIixcbiAgICAgICk7XG4gICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhyZXNvdXJjZXMpLm1hcCgoW2xvZ2ljYWxJZCwgcmVzb3VyY2VdKSA9PiBbXG4gICAgICAgICAgbG9naWNhbElkLm1hdGNoKC9OZXh0anNTdGF0aWNBc3NldHMoXFx3Kz8pQ3VzdG9tUmVzb3VyY2UvKSFbMV0sXG4gICAgICAgICAgcmVzb3VyY2UuUHJvcGVydGllcyxcbiAgICAgICAgXSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdyaXRlUHVibGljRmlsZSgpIHtcbiAgICAgIGNvbnN0IHB1YmxpY0RpciA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIpO1xuICAgICAgbWtkaXJTeW5jKHB1YmxpY0RpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4ocHVibGljRGlyLCBcImxvZ28ucG5nXCIpLCBcInBuZ1wiKTtcbiAgICB9XG5cbiAgICAvLyBDbG91ZEZyb250IGFuZCBBUEkgR2F0ZXdheSBzZXJ2ZSB0aGVzZSBzdHJhaWdodCBmcm9tIFMzLCBzbyB0aGVcbiAgICAvLyBvYmplY3QncyBtZXRhZGF0YSBpcyB0aGUgb25seSBDYWNoZS1Db250cm9sIGEgYnJvd3NlciBnZXRzLlxuICAgIGl0KFwidXBsb2FkcyBfbmV4dC9zdGF0aWMgaW1tdXRhYmxlIGFuZCBwdWJsaWMvIHdpdGhvdXQgYSBoZWFkZXJcIiwgKCkgPT4ge1xuICAgICAgd3JpdGVQdWJsaWNGaWxlKCk7XG4gICAgICBjb25zdCBzdGF0aWNBc3NldHMgPSBjcmVhdGVTdGF0aWNBc3NldHMoe30pO1xuXG4gICAgICBleHBlY3Qoc3RhdGljQXNzZXRzLnN0YXRpY0RlcGxveW1lbnQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBleHBlY3Qoc3RhdGljQXNzZXRzLnB1YmxpY0RlcGxveW1lbnQpLnRvQmVEZWZpbmVkKCk7XG4gICAgICBjb25zdCB7IERlcGxveW1lbnQ6IHN0YXRpY1VwbG9hZCwgUHVibGljRGVwbG95bWVudDogcHVibGljVXBsb2FkIH0gPVxuICAgICAgICBkZXBsb3ltZW50cygpO1xuICAgICAgZXhwZWN0KHN0YXRpY1VwbG9hZC5TeXN0ZW1NZXRhZGF0YSkudG9FcXVhbCh7XG4gICAgICAgIFwiY2FjaGUtY29udHJvbFwiOiBJTU1VVEFCTEUsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChwdWJsaWNVcGxvYWQuU3lzdGVtTWV0YWRhdGEpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGZvciAoY29uc3QgdXBsb2FkIG9mIFtzdGF0aWNVcGxvYWQsIHB1YmxpY1VwbG9hZF0pIHtcbiAgICAgICAgZXhwZWN0KHVwbG9hZC5Vc2VyTWV0YWRhdGEpLnRvRXF1YWwoeyBidWlsZF9pZDogXCJ0ZXN0LWJ1aWxkLWlkXCIgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdChcImFwcGxpZXMgYW4gb3ZlcnJpZGRlbiBjYWNoZUNvbnRyb2wgdG8gcHVibGljLyBmaWxlcyBvbmx5XCIsICgpID0+IHtcbiAgICAgIHdyaXRlUHVibGljRmlsZSgpO1xuICAgICAgbmV3IE5leHRqc1N0YXRpY0Fzc2V0cyhzdGFjaywgXCJOZXh0anNTdGF0aWNBc3NldHNcIiwge1xuICAgICAgICBidWlsZERpcmVjdG9yeSxcbiAgICAgICAgYnVpbGRJZDogXCJ0ZXN0LWJ1aWxkLWlkXCIsXG4gICAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAgIGJ1Y2tldERlcGxveW1lbnRQcm9wczoge1xuICAgICAgICAgICAgY2FjaGVDb250cm9sOiBbQ2FjaGVDb250cm9sLmZyb21TdHJpbmcoXCJwdWJsaWMsIG1heC1hZ2U9MzYwMFwiKV0sXG4gICAgICAgICAgfSBhcyBhbnksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgeyBEZXBsb3ltZW50OiBzdGF0aWNVcGxvYWQsIFB1YmxpY0RlcGxveW1lbnQ6IHB1YmxpY1VwbG9hZCB9ID1cbiAgICAgICAgZGVwbG95bWVudHMoKTtcbiAgICAgIGV4cGVjdChzdGF0aWNVcGxvYWQuU3lzdGVtTWV0YWRhdGEpLnRvRXF1YWwoe1xuICAgICAgICBcImNhY2hlLWNvbnRyb2xcIjogSU1NVVRBQkxFLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QocHVibGljVXBsb2FkLlN5c3RlbU1ldGFkYXRhKS50b0VxdWFsKHtcbiAgICAgICAgXCJjYWNoZS1jb250cm9sXCI6IFwicHVibGljLCBtYXgtYWdlPTM2MDBcIixcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJjcmVhdGVzIG9ubHkgdGhlIF9uZXh0L3N0YXRpYyB1cGxvYWQgd2l0aG91dCBhIHB1YmxpYy8gZGlyZWN0b3J5XCIsICgpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7IGJhc2VQYXRoOiBcIi9iYXNlXCIgfSk7XG5cbiAgICAgIGV4cGVjdChzdGF0aWNBc3NldHMucHVibGljRGVwbG95bWVudCkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHN0YXRpY0Fzc2V0cy5kZXBsb3ltZW50KS50b0JlKHN0YXRpY0Fzc2V0cy5zdGF0aWNEZXBsb3ltZW50KTtcbiAgICAgIGNvbnN0IHVwbG9hZHMgPSBkZXBsb3ltZW50cygpO1xuICAgICAgZXhwZWN0KE9iamVjdC5rZXlzKHVwbG9hZHMpKS50b0VxdWFsKFtcIkRlcGxveW1lbnRcIl0pO1xuICAgICAgZXhwZWN0KHVwbG9hZHMuRGVwbG95bWVudC5EZXN0aW5hdGlvbkJ1Y2tldEtleVByZWZpeCkudG9CZShcImJhc2VcIik7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBLZWVwcyB0aGUgc3RhZ2luZyBkaXJlY3Rvcmllcywgd2hpY2ggYXJlIG90aGVyd2lzZSByZW1vdmVkIG9uY2UgQ0RLIGhhc1xuICAgICAqIGNvcGllZCB0aGVtIGludG8gYGNkay5vdXRgLCBzbyBgc3RhZ2VkRGlyYCBjYW4gbG9vayBpbnNpZGUgdGhlbS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBrZWVwU3RhZ2luZygpIHtcbiAgICAgIHN0YWNrID0gbmV3IFN0YWNrKFxuICAgICAgICBuZXcgQXBwKHsgY29udGV4dDogeyBbRElTQUJMRV9BU1NFVF9TVEFHSU5HX0NPTlRFWFRdOiB0cnVlIH0gfSksXG4gICAgICAgIFwiVGVzdFN0YWNrXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKiBUaGUgZGlyZWN0b3J5IGEgZGVwbG95bWVudCB1cGxvYWRzLCBmb3IgY2hlY2tpbmcgd2hhdCB3YXMgc3RhZ2VkLiAqL1xuICAgIGZ1bmN0aW9uIHN0YWdlZERpcihkZXBsb3ltZW50OiBCdWNrZXREZXBsb3ltZW50KTogc3RyaW5nIHtcbiAgICAgIC8vIFRoZSBkZXBsb3ltZW50J3Mgb3duIHNvdXJjZSBhc3NldCwgbm90IHRoZSBBV1MgQ0xJIGxheWVyJ3MuXG4gICAgICByZXR1cm4gZGVwbG95bWVudC5ub2RlXG4gICAgICAgIC5maW5kQWxsKClcbiAgICAgICAgLmZpbHRlcigoYyk6IGMgaXMgQXNzZXRTdGFnaW5nID0+IGMgaW5zdGFuY2VvZiBBc3NldFN0YWdpbmcpXG4gICAgICAgIC5tYXAoKGMpID0+IGMuc291cmNlUGF0aClcbiAgICAgICAgLmZpbmQoKHBhdGgpID0+IHBhdGguaW5jbHVkZXMoXCJuZXh0anMtYXNzZXRzLVwiKSkhO1xuICAgIH1cblxuICAgIC8vIGBuZXh0IHN0YXJ0YCBzZXJ2ZXMgdGhlIGJ1aWx0IGZpbGUgb3ZlciBhIHB1YmxpYy8gb25lIGF0IHRoZSBzYW1lIHBhdGgsXG4gICAgLy8gYW5kIHRoZSBwdWJsaWMvIG9uZSBldmVyeXdoZXJlIGVsc2UuXG4gICAgaXQoXCJsZWF2ZXMgb3V0IG9ubHkgdGhlIHB1YmxpYy9fbmV4dC9zdGF0aWMgZmlsZXMgYSBidWlsdCBmaWxlIHNoYWRvd3NcIiwgKCkgPT4ge1xuICAgICAga2VlcFN0YWdpbmcoKTtcbiAgICAgIHdyaXRlUHVibGljRmlsZSgpO1xuICAgICAgY29uc3Qgc2hhZG93RGlyID0gam9pbihidWlsZERpcmVjdG9yeSwgXCJwdWJsaWNcIiwgXCJfbmV4dFwiLCBcInN0YXRpY1wiKTtcbiAgICAgIG1rZGlyU3luYyhzaGFkb3dEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgd3JpdGVGaWxlU3luYyhqb2luKHNoYWRvd0RpciwgXCJjaHVuay5qc1wiKSwgXCIvLyBzaGFkb3dlZFwiKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoam9pbihzaGFkb3dEaXIsIFwibGVnYWN5LmpzXCIpLCBcIi8vIHB1YmxpYyBvbmx5XCIpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgY29uc3Qgc3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5wdWJsaWNEZXBsb3ltZW50ISk7XG4gICAgICBleHBlY3QoZXhpc3RzU3luYyhqb2luKHN0YWdlZCwgXCJsb2dvLnBuZ1wiKSkpLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QoZXhpc3RzU3luYyhqb2luKHN0YWdlZCwgXCJfbmV4dFwiLCBcInN0YXRpY1wiLCBcImNodW5rLmpzXCIpKSkudG9CZShcbiAgICAgICAgZmFsc2UsXG4gICAgICApO1xuICAgICAgZXhwZWN0KGV4aXN0c1N5bmMoam9pbihzdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJsZWdhY3kuanNcIikpKS50b0JlKFxuICAgICAgICB0cnVlLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vIE5leHQuanMgYW5kIFMzIGtleXMgYXJlIGNhc2Utc2Vuc2l0aXZlLCBldmVuIHdoZXJlIHRoZSBmaWxlc3lzdGVtIGlzbid0LlxuICAgIGl0KFwiZG9lc24ndCB0cmVhdCBhIHB1YmxpYy9fbmV4dC9zdGF0aWMgZmlsZSBhcyBzaGFkb3dlZCBieSBhbm90aGVyIGNhc2VcIiwgKCkgPT4ge1xuICAgICAga2VlcFN0YWdpbmcoKTtcbiAgICAgIGNvbnN0IHNoYWRvd0RpciA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwiX25leHRcIiwgXCJzdGF0aWNcIik7XG4gICAgICBta2RpclN5bmMoc2hhZG93RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoam9pbihzaGFkb3dEaXIsIFwiQ2h1bmsuanNcIiksIFwiLy8gcHVibGljIG9ubHlcIik7XG4gICAgICBjb25zdCBzdGF0aWNBc3NldHMgPSBjcmVhdGVTdGF0aWNBc3NldHMoe30pO1xuXG4gICAgICBjb25zdCBzdGFnZWQgPSBzdGFnZWREaXIoc3RhdGljQXNzZXRzLnB1YmxpY0RlcGxveW1lbnQhKTtcbiAgICAgIGV4cGVjdChyZWFkZGlyU3luYyhqb2luKHN0YWdlZCwgXCJfbmV4dFwiLCBcInN0YXRpY1wiKSkpLnRvRXF1YWwoW1xuICAgICAgICBcIkNodW5rLmpzXCIsXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KFwidXBsb2FkcyBhIC5uZXh0L3N0YXRpYy9zZXJ2aWNlLXdvcmtlciBmaWxlIHdpdGggdGhlIG90aGVyIGFzc2V0c1wiLCAoKSA9PiB7XG4gICAgICBrZWVwU3RhZ2luZygpO1xuICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiLCBcInN0YXRpY1wiLCBcInNlcnZpY2Utd29ya2VyXCIpLFxuICAgICAgICBcIi8vIG5vdCBhIGRpcmVjdG9yeVwiLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSk7XG5cbiAgICAgIGV4cGVjdChzdGF0aWNBc3NldHMuc2VydmljZVdvcmtlckRlcGxveW1lbnQpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGNvbnN0IHN0YWdlZCA9IHN0YWdlZERpcihzdGF0aWNBc3NldHMuc3RhdGljRGVwbG95bWVudCEpO1xuICAgICAgZXhwZWN0KFxuICAgICAgICBleGlzdHNTeW5jKGpvaW4oc3RhZ2VkLCBcIl9uZXh0XCIsIFwic3RhdGljXCIsIFwic2VydmljZS13b3JrZXJcIikpLFxuICAgICAgKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJ1cGxvYWRzIGEgcHVibGljLyBtYWRlIG9ubHkgb2Ygc3ltbGlua3NcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gam9pbihidWlsZERpcmVjdG9yeSwgXCJsb2dvLnBuZ1wiKTtcbiAgICAgIHdyaXRlRmlsZVN5bmModGFyZ2V0LCBcInBuZ1wiKTtcbiAgICAgIG1rZGlyU3luYyhqb2luKGJ1aWxkRGlyZWN0b3J5LCBcInB1YmxpY1wiKSk7XG4gICAgICBzeW1saW5rU3luYyh0YXJnZXQsIGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwibG9nby5wbmdcIikpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgZXhwZWN0KHN0YXRpY0Fzc2V0cy5wdWJsaWNEZXBsb3ltZW50KS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gQSBzZXJ2aWNlIHdvcmtlciBrZWVwcyBpdHMgVVJMIGFjcm9zcyBidWlsZHMsIHNvIE5leHQuanMgc2VydmVzIGl0XG4gICAgLy8gcmV2YWxpZGF0ZWQgcmF0aGVyIHRoYW4gaW1tdXRhYmxlLlxuICAgIGl0KFwidXBsb2FkcyBzZXJ2aWNlIHdvcmtlcnMgd2l0aCBtYXgtYWdlPTAsIG11c3QtcmV2YWxpZGF0ZVwiLCAoKSA9PiB7XG4gICAgICBrZWVwU3RhZ2luZygpO1xuICAgICAgY29uc3Qgc3dEaXIgPSBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIsIFwic3RhdGljXCIsIFwic2VydmljZS13b3JrZXJcIik7XG4gICAgICBta2RpclN5bmMoc3dEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgd3JpdGVGaWxlU3luYyhqb2luKHN3RGlyLCBcInN3LmpzXCIpLCBcIi8vIHN3XCIpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgY29uc3QgeyBEZXBsb3ltZW50OiBzdGF0aWNVcGxvYWQsIFNlcnZpY2VXb3JrZXJEZXBsb3ltZW50OiBzd1VwbG9hZCB9ID1cbiAgICAgICAgZGVwbG95bWVudHMoKTtcbiAgICAgIGV4cGVjdChzd1VwbG9hZC5TeXN0ZW1NZXRhZGF0YSkudG9FcXVhbCh7XG4gICAgICAgIFwiY2FjaGUtY29udHJvbFwiOiBcInB1YmxpYywgbWF4LWFnZT0wLCBtdXN0LXJldmFsaWRhdGVcIixcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHN0YXRpY1VwbG9hZC5TeXN0ZW1NZXRhZGF0YSkudG9FcXVhbCh7XG4gICAgICAgIFwiY2FjaGUtY29udHJvbFwiOiBJTU1VVEFCTEUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN3U3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5zZXJ2aWNlV29ya2VyRGVwbG95bWVudCEpO1xuICAgICAgZXhwZWN0KFxuICAgICAgICBleGlzdHNTeW5jKFxuICAgICAgICAgIGpvaW4oc3dTdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJzZXJ2aWNlLXdvcmtlclwiLCBcInN3LmpzXCIpLFxuICAgICAgICApLFxuICAgICAgKS50b0JlKHRydWUpO1xuICAgICAgY29uc3Qgc3RhdGljU3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5zdGF0aWNEZXBsb3ltZW50ISk7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGV4aXN0c1N5bmMoam9pbihzdGF0aWNTdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJjaHVuay5qc1wiKSksXG4gICAgICApLnRvQmUodHJ1ZSk7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGV4aXN0c1N5bmMoam9pbihzdGF0aWNTdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJzZXJ2aWNlLXdvcmtlclwiKSksXG4gICAgICApLnRvQmUoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzdGFnZXMgYSBzeW1saW5rZWQgLm5leHQvc3RhdGljXCIsICgpID0+IHtcbiAgICAgIGtlZXBTdGFnaW5nKCk7XG4gICAgICBjb25zdCByZWFsU3RhdGljID0gam9pbihidWlsZERpcmVjdG9yeSwgXCJyZWFsLXN0YXRpY1wiKTtcbiAgICAgIHJlbmFtZVN5bmMoam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiLCBcInN0YXRpY1wiKSwgcmVhbFN0YXRpYyk7XG4gICAgICBzeW1saW5rU3luYyhyZWFsU3RhdGljLCBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIsIFwic3RhdGljXCIpKTtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSk7XG5cbiAgICAgIGNvbnN0IHN0YWdlZCA9IHN0YWdlZERpcihzdGF0aWNBc3NldHMuc3RhdGljRGVwbG95bWVudCEpO1xuICAgICAgZXhwZWN0KGV4aXN0c1N5bmMoam9pbihzdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJjaHVuay5qc1wiKSkpLnRvQmUoXG4gICAgICAgIHRydWUsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gQ0RLIHVwbG9hZHMgdGhlIGZpbGVzIGEgbGlua2VkIGRpcmVjdG9yeSBob2xkcywgc28gdGhleSBzaGFkb3cgdG9vLlxuICAgIGl0KFwidHJlYXRzIGZpbGVzIHVuZGVyIGEgc3ltbGlua2VkIC5uZXh0L3N0YXRpYyBkaXJlY3RvcnkgYXMgc2hhZG93aW5nXCIsICgpID0+IHtcbiAgICAgIGtlZXBTdGFnaW5nKCk7XG4gICAgICBjb25zdCByZWFsQ2h1bmtzID0gam9pbihidWlsZERpcmVjdG9yeSwgXCJyZWFsLWNodW5rc1wiKTtcbiAgICAgIG1rZGlyU3luYyhyZWFsQ2h1bmtzKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoam9pbihyZWFsQ2h1bmtzLCBcImEuanNcIiksIFwiLy8gYnVpbHRcIik7XG4gICAgICBzeW1saW5rU3luYyhcbiAgICAgICAgcmVhbENodW5rcyxcbiAgICAgICAgam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiLCBcInN0YXRpY1wiLCBcImNodW5rc1wiKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBzaGFkb3dEaXIgPSBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcInB1YmxpY1wiLCBcIl9uZXh0XCIsIFwic3RhdGljXCIpO1xuICAgICAgbWtkaXJTeW5jKGpvaW4oc2hhZG93RGlyLCBcImNodW5rc1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4oc2hhZG93RGlyLCBcImNodW5rc1wiLCBcImEuanNcIiksIFwiLy8gc2hhZG93ZWRcIik7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwibG9nby5wbmdcIiksIFwicG5nXCIpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgY29uc3Qgc3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5wdWJsaWNEZXBsb3ltZW50ISk7XG4gICAgICBleHBlY3QoXG4gICAgICAgIGV4aXN0c1N5bmMoam9pbihzdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJjaHVua3NcIiwgXCJhLmpzXCIpKSxcbiAgICAgICkudG9CZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBDREsgdXBsb2FkcyBhIGRpcmVjdG9yeSB1bmRlciBldmVyeSBuYW1lIGEgbGluayBnaXZlcyBpdC5cbiAgICBpdChcInRyZWF0cyBmaWxlcyByZWFjaGVkIHRocm91Z2ggYSBzZWNvbmQgbmFtZSBhcyBzaGFkb3dpbmdcIiwgKCkgPT4ge1xuICAgICAga2VlcFN0YWdpbmcoKTtcbiAgICAgIGNvbnN0IGJ1aWx0U3RhdGljID0gam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiLCBcInN0YXRpY1wiKTtcbiAgICAgIG1rZGlyU3luYyhqb2luKGJ1aWx0U3RhdGljLCBcImNodW5rc1wiKSk7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4oYnVpbHRTdGF0aWMsIFwiY2h1bmtzXCIsIFwiYS5qc1wiKSwgXCIvLyBidWlsdFwiKTtcbiAgICAgIHN5bWxpbmtTeW5jKGpvaW4oYnVpbHRTdGF0aWMsIFwiY2h1bmtzXCIpLCBqb2luKGJ1aWx0U3RhdGljLCBcImFsaWFzXCIpKTtcbiAgICAgIGNvbnN0IHNoYWRvd0RpciA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwiX25leHRcIiwgXCJzdGF0aWNcIik7XG4gICAgICBta2RpclN5bmMoam9pbihzaGFkb3dEaXIsIFwiYWxpYXNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgd3JpdGVGaWxlU3luYyhqb2luKHNoYWRvd0RpciwgXCJhbGlhc1wiLCBcImEuanNcIiksIFwiLy8gc2hhZG93ZWRcIik7XG4gICAgICB3cml0ZUZpbGVTeW5jKGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwibG9nby5wbmdcIiksIFwicG5nXCIpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgY29uc3Qgc3RhZ2VkID0gc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5wdWJsaWNEZXBsb3ltZW50ISk7XG4gICAgICBleHBlY3QoZXhpc3RzU3luYyhqb2luKHN0YWdlZCwgXCJfbmV4dFwiLCBcInN0YXRpY1wiLCBcImFsaWFzXCIsIFwiYS5qc1wiKSkpLnRvQmUoXG4gICAgICAgIGZhbHNlLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwibGVhdmVzIG91dCBhIHNoYWRvd2VkIGZpbGUgdW5kZXIgYSBzeW1saW5rZWQgcHVibGljLyBkaXJlY3RvcnlcIiwgKCkgPT4ge1xuICAgICAga2VlcFN0YWdpbmcoKTtcbiAgICAgIGNvbnN0IGxpbmtlZCA9IGpvaW4oYnVpbGREaXJlY3RvcnksIFwibGlua2VkLXN0YXRpY1wiKTtcbiAgICAgIG1rZGlyU3luYyhsaW5rZWQpO1xuICAgICAgd3JpdGVGaWxlU3luYyhqb2luKGxpbmtlZCwgXCJjaHVuay5qc1wiKSwgXCIvLyBzaGFkb3dlZFwiKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMoam9pbihsaW5rZWQsIFwibGVnYWN5LmpzXCIpLCBcIi8vIHB1YmxpYyBvbmx5XCIpO1xuICAgICAgbWtkaXJTeW5jKGpvaW4oYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIsIFwiX25leHRcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgc3ltbGlua1N5bmMobGlua2VkLCBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcInB1YmxpY1wiLCBcIl9uZXh0XCIsIFwic3RhdGljXCIpKTtcbiAgICAgIGNvbnN0IHN0YXRpY0Fzc2V0cyA9IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSk7XG5cbiAgICAgIGNvbnN0IHN0YWdlZCA9IHN0YWdlZERpcihzdGF0aWNBc3NldHMucHVibGljRGVwbG95bWVudCEpO1xuICAgICAgZXhwZWN0KGV4aXN0c1N5bmMoam9pbihzdGFnZWQsIFwiX25leHRcIiwgXCJzdGF0aWNcIiwgXCJjaHVuay5qc1wiKSkpLnRvQmUoXG4gICAgICAgIGZhbHNlLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChleGlzdHNTeW5jKGpvaW4oc3RhZ2VkLCBcIl9uZXh0XCIsIFwic3RhdGljXCIsIFwibGVnYWN5LmpzXCIpKSkudG9CZShcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcImxpc3RzIGEgLm5leHQvc3RhdGljIGhvbGRpbmcgYSBsaW5rIGxvb3BcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgYnVpbHRTdGF0aWMgPSBqb2luKGJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIsIFwic3RhdGljXCIpO1xuICAgICAgc3ltbGlua1N5bmMoam9pbihidWlsdFN0YXRpYywgXCJsb29wXCIpLCBqb2luKGJ1aWx0U3RhdGljLCBcImxvb3BcIikpO1xuICAgICAgd3JpdGVQdWJsaWNGaWxlKCk7XG5cbiAgICAgIGV4cGVjdCgoKSA9PiBjcmVhdGVTdGF0aWNBc3NldHMoe30pKS5ub3QudG9UaHJvdygvRUxPT1AvKTtcbiAgICB9KTtcblxuICAgIGl0KFwicmVtb3ZlcyB0aGUgc3RhZ2luZyBkaXJlY3RvcmllcyB3aGVuIGEgZGVwbG95bWVudCBmYWlsc1wiLCAoKSA9PiB7XG4gICAgICB3cml0ZVB1YmxpY0ZpbGUoKTtcbiAgICAgIGNvbnN0IGJlZm9yZSA9IG5ldyBTZXQocmVhZGRpclN5bmModG1wZGlyKCkpKTtcbiAgICAgIGplc3RcbiAgICAgICAgLnNweU9uKE5leHRqc1N0YXRpY0Fzc2V0cy5wcm90b3R5cGUgYXMgYW55LCBcImNyZWF0ZURlcGxveW1lbnRcIilcbiAgICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZGVwbG95bWVudCBmYWlsZWRcIik7XG4gICAgICAgIH0pO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXhwZWN0KCgpID0+IGNyZWF0ZVN0YXRpY0Fzc2V0cyh7fSkpLnRvVGhyb3coXCJkZXBsb3ltZW50IGZhaWxlZFwiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGplc3QucmVzdG9yZUFsbE1vY2tzKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxlYWtlZCA9IHJlYWRkaXJTeW5jKHRtcGRpcigpKS5maWx0ZXIoXG4gICAgICAgIChuYW1lKSA9PiBuYW1lLnN0YXJ0c1dpdGgoXCJuZXh0anMtYXNzZXRzLVwiKSAmJiAhYmVmb3JlLmhhcyhuYW1lKSxcbiAgICAgICk7XG4gICAgICBleHBlY3QobGVha2VkKS50b0VxdWFsKFtdKTtcbiAgICB9KTtcblxuICAgIGl0KFwicmVtb3ZlcyBpdHMgc3RhZ2luZyBkaXJlY3RvcmllcyBvbmNlIENESyBoYXMgY29waWVkIHRoZW1cIiwgKCkgPT4ge1xuICAgICAgd3JpdGVQdWJsaWNGaWxlKCk7XG4gICAgICBjb25zdCBzdGF0aWNBc3NldHMgPSBjcmVhdGVTdGF0aWNBc3NldHMoe30pO1xuXG4gICAgICBmb3IgKGNvbnN0IHVwbG9hZCBvZiBbXG4gICAgICAgIHN0YXRpY0Fzc2V0cy5zdGF0aWNEZXBsb3ltZW50ISxcbiAgICAgICAgc3RhdGljQXNzZXRzLnB1YmxpY0RlcGxveW1lbnQhLFxuICAgICAgXSkge1xuICAgICAgICBleHBlY3QoZXhpc3RzU3luYyhzdGFnZWREaXIodXBsb2FkKSkpLnRvQmUoZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVGhlIGFzc2V0IG1hbmlmZXN0IHRoZW4gcG9pbnRzIGF0IHRoZSBzdGFnaW5nIGRpcmVjdG9yeSBpdHNlbGYuXG4gICAgaXQoXCJrZWVwcyB0aGVtIHdoZW4gYXNzZXQgc3RhZ2luZyBpcyBkaXNhYmxlZFwiLCAoKSA9PiB7XG4gICAgICBrZWVwU3RhZ2luZygpO1xuICAgICAgY29uc3Qgc3RhdGljQXNzZXRzID0gY3JlYXRlU3RhdGljQXNzZXRzKHt9KTtcblxuICAgICAgZXhwZWN0KGV4aXN0c1N5bmMoc3RhZ2VkRGlyKHN0YXRpY0Fzc2V0cy5zdGF0aWNEZXBsb3ltZW50ISkpKS50b0JlKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJmYWxscyBiYWNrIHRvIHRoZSBwdWJsaWMvIHVwbG9hZCBmb3IgYSBidWlsZCB3aXRob3V0IC5uZXh0L3N0YXRpY1wiLCAoKSA9PiB7XG4gICAgICBybVN5bmMoam9pbihidWlsZERpcmVjdG9yeSwgXCIubmV4dFwiKSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgICAgd3JpdGVQdWJsaWNGaWxlKCk7XG4gICAgICBjb25zdCBzdGF0aWNBc3NldHMgPSBjcmVhdGVTdGF0aWNBc3NldHMoe30pO1xuXG4gICAgICBleHBlY3Qoc3RhdGljQXNzZXRzLnN0YXRpY0RlcGxveW1lbnQpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChzdGF0aWNBc3NldHMuZGVwbG95bWVudCkudG9CZShzdGF0aWNBc3NldHMucHVibGljRGVwbG95bWVudCk7XG4gICAgICBleHBlY3QoT2JqZWN0LmtleXMoZGVwbG95bWVudHMoKSkpLnRvRXF1YWwoW1wiUHVibGljRGVwbG95bWVudFwiXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwiYnVja2V0RGVwbG95bWVudFByb3BzIHRoYXQgd291bGQgYnJlYWsgdGhlIG90aGVyIHVwbG9hZHNcIiwgKCkgPT4ge1xuICAgIGZ1bmN0aW9uIHdpdGhPdmVycmlkZXMoYnVja2V0RGVwbG95bWVudFByb3BzOiBvYmplY3QpIHtcbiAgICAgIHJldHVybiAoKSA9PlxuICAgICAgICBuZXcgTmV4dGpzU3RhdGljQXNzZXRzKHN0YWNrLCBcIk5leHRqc1N0YXRpY0Fzc2V0c1wiLCB7XG4gICAgICAgICAgYnVpbGREaXJlY3RvcnksXG4gICAgICAgICAgYnVpbGRJZDogXCJ0ZXN0LWJ1aWxkLWlkXCIsXG4gICAgICAgICAgb3ZlcnJpZGVzOiB7IGJ1Y2tldERlcGxveW1lbnRQcm9wczogYnVja2V0RGVwbG95bWVudFByb3BzIGFzIGFueSB9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpdChcInJlamVjdHMgcHJ1bmU6IHRydWVcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHdpdGhPdmVycmlkZXMoeyBwcnVuZTogdHJ1ZSB9KSkudG9UaHJvdygvYHBydW5lOiB0cnVlYC8pO1xuICAgIH0pO1xuXG4gICAgLy8gQ0RLJ3MgVXBkYXRlIHBhdGggZGVsZXRlcyB0aGUgb2xkIHByZWZpeCB3aXRob3V0IGNoZWNraW5nIHRoZSBidWNrZXQnc1xuICAgIC8vIG93bmVyLCByYWNpbmcgdGhlIG90aGVyIHVwbG9hZHMsIHNvIG5vIGJ1Y2tldCBpcyBzYWZlLlxuICAgIGl0KFwicmVqZWN0cyByZXRhaW5PbkRlbGV0ZTogZmFsc2VcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHdpdGhPdmVycmlkZXMoeyByZXRhaW5PbkRlbGV0ZTogZmFsc2UgfSkpLnRvVGhyb3coXG4gICAgICAgIC9gcmV0YWluT25EZWxldGU6IGZhbHNlYC8sXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIHR5cGUgcmVxdWlyZXMgYm90aCwgc28gYSB0eXBlZCBjYWxsZXIgYWx3YXlzIHBhc3NlcyB0aGVtLlxuICAgIGl0KFwiaWdub3JlcyBzb3VyY2VzIGFuZCBkZXN0aW5hdGlvbkJ1Y2tldFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBvdGhlciA9IEJ1Y2tldC5mcm9tQnVja2V0TmFtZShzdGFjaywgXCJPdGhlclwiLCBcIm90aGVyXCIpO1xuICAgICAgbmV3IE5leHRqc1N0YXRpY0Fzc2V0cyhzdGFjaywgXCJOZXh0anNTdGF0aWNBc3NldHNcIiwge1xuICAgICAgICBidWlsZERpcmVjdG9yeSxcbiAgICAgICAgYnVpbGRJZDogXCJ0ZXN0LWJ1aWxkLWlkXCIsXG4gICAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAgIGJ1Y2tldERlcGxveW1lbnRQcm9wczoge1xuICAgICAgICAgICAgc291cmNlczogW10sXG4gICAgICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogb3RoZXIsXG4gICAgICAgICAgICBjYWNoZUNvbnRyb2w6IFtDYWNoZUNvbnRyb2wuZnJvbVN0cmluZyhcInB1YmxpYywgbWF4LWFnZT02MFwiKV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBbdXBsb2FkXSA9IE9iamVjdC52YWx1ZXMoXG4gICAgICAgIFRlbXBsYXRlLmZyb21TdGFjayhzdGFjaykuZmluZFJlc291cmNlcyhcIkN1c3RvbTo6Q0RLQnVja2V0RGVwbG95bWVudFwiKSxcbiAgICAgICk7XG4gICAgICBleHBlY3QodXBsb2FkLlByb3BlcnRpZXMuU291cmNlT2JqZWN0S2V5cykudG9IYXZlTGVuZ3RoKDEpO1xuICAgICAgZXhwZWN0KEpTT04uc3RyaW5naWZ5KHVwbG9hZC5Qcm9wZXJ0aWVzLkRlc3RpbmF0aW9uQnVja2V0TmFtZSkpLnRvQ29udGFpbihcbiAgICAgICAgXCJOZXh0anNTdGF0aWNBc3NldHNCdWNrZXRcIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBBIEpTSUkgYmluZGluZyBjYW4gbWF0ZXJpYWxpemUgYW4gdW5zZXQgZmllbGQgYXMgYW4gZXhwbGljaXQgdW5kZWZpbmVkLlxuICAgIGl0KFwiYWxsb3dzIHRoZSBmaWVsZHMgd2hlbiB0aGV5IGFyZSBleHBsaWNpdGx5IHVuZGVmaW5lZFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHdpdGhPdmVycmlkZXMoeyBwcnVuZTogdW5kZWZpbmVkLCBzb3VyY2VzOiB1bmRlZmluZWQgfSksXG4gICAgICApLm5vdC50b1Rocm93KCk7XG4gICAgICAvLyBOb3QgQ0RLJ3MgZGVmYXVsdCBgcHJ1bmU6IHRydWVgLCBub3IgYSBkZXBsb3ltZW50IHdpdGggbm8gc291cmNlcy5cbiAgICAgIGNvbnN0IFt1cGxvYWRdID0gT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFwiQ3VzdG9tOjpDREtCdWNrZXREZXBsb3ltZW50XCIpLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh1cGxvYWQuUHJvcGVydGllcy5QcnVuZSkudG9CZShmYWxzZSk7XG4gICAgICBleHBlY3QodXBsb2FkLlByb3BlcnRpZXMuU291cmNlT2JqZWN0S2V5cykudG9IYXZlTGVuZ3RoKDEpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -226,10 +226,11 @@ export declare abstract class NextjsBaseConstruct extends Construct {
|
|
|
226
226
|
*/
|
|
227
227
|
protected computeBaseProps(): NextjsComputeBaseProps;
|
|
228
228
|
/**
|
|
229
|
-
* Runs after the init cache
|
|
230
|
-
*
|
|
231
|
-
* meant to drop, and
|
|
232
|
-
*
|
|
229
|
+
* Runs after the init cache and static asset uploads: invalidating the CDN
|
|
230
|
+
* before the new files are in place would only re-cache the responses the
|
|
231
|
+
* invalidation was meant to drop, and pruning before them could delete an
|
|
232
|
+
* object the upload is about to re-tag with this build's ID. CloudFormation
|
|
233
|
+
* infers no ordering between these custom resources on its own.
|
|
233
234
|
*/
|
|
234
235
|
protected createNextjsPostDeploy(distribution?: IDistribution): NextjsPostDeploy;
|
|
235
236
|
private createNextjsBuild;
|