cdk-nextjs 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +2467 -2714
- package/.jsii.tabl.json +1 -1
- package/API.md +1725 -1909
- package/CLAUDE.md +2 -1
- package/README.md +429 -130
- package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +152 -170
- package/assets/lambdas/redeploy-stage/redeploy-stage.lambda/index.js +875 -0
- package/docs/adapter-runtime.md +185 -0
- package/docs/breaking-changes.md +687 -4
- package/docs/caching-guide.md +156 -112
- package/docs/cdk-nextjs-cfn-exec-policy.json +2 -1
- package/docs/development-guide.md +1 -1
- package/docs/harness-coverage.md +598 -0
- package/docs/init-cache-deployment.md +32 -1
- package/docs/next-build-output-guide.md +30 -20
- package/examples/README.md +5 -1
- package/lib/adapter/__fixtures__/app-playground-base-path.json +4926 -0
- package/lib/adapter/__fixtures__/app-playground.json +4917 -0
- package/lib/adapter/__fixtures__/pages-i18n.json +1728 -0
- package/lib/adapter/adapter.mjs +1548 -185
- package/lib/adapter/adapter.test.js +106 -0
- package/lib/adapter/aws-cache-store.d.ts +489 -0
- package/lib/adapter/aws-cache-store.js +1004 -0
- package/lib/adapter/aws-cache-store.test.d.ts +1 -0
- package/lib/adapter/aws-cache-store.test.js +361 -0
- package/lib/adapter/build-outputs.d.ts +80 -0
- package/lib/adapter/build-outputs.js +852 -0
- package/lib/adapter/build-outputs.test.d.ts +1 -0
- package/lib/adapter/build-outputs.test.js +861 -0
- package/lib/adapter/cache-handler.d.ts +9 -2
- package/lib/adapter/cache-handler.js +72 -96
- package/lib/adapter/cache-handler.mjs +18956 -17774
- package/lib/adapter/cache-handler.test.js +263 -31
- package/lib/adapter/cache-kinds.d.ts +32 -0
- package/lib/adapter/cache-kinds.js +35 -0
- package/lib/adapter/cache-kinds.test.d.ts +1 -0
- package/lib/adapter/cache-kinds.test.js +69 -0
- package/lib/adapter/cache-utils.d.ts +90 -0
- package/lib/adapter/cache-utils.js +199 -4
- package/lib/adapter/cache-utils.test.d.ts +1 -0
- package/lib/adapter/cache-utils.test.js +179 -0
- package/lib/adapter/function-groups.d.ts +215 -0
- package/lib/adapter/function-groups.js +1099 -0
- package/lib/adapter/function-groups.test.d.ts +1 -0
- package/lib/adapter/function-groups.test.js +743 -0
- package/lib/adapter/init-cache.d.ts +6 -0
- package/lib/adapter/init-cache.js +245 -0
- package/lib/adapter/init-cache.test.d.ts +1 -0
- package/lib/adapter/init-cache.test.js +137 -0
- package/lib/adapter/local-file-cache-handler.d.ts +23 -0
- package/lib/adapter/local-file-cache-handler.js +52 -1
- package/lib/adapter/memory-cache-handler.d.ts +26 -17
- package/lib/adapter/memory-cache-handler.js +32 -50
- package/lib/adapter/memory-cache-handler.test.js +105 -85
- package/lib/adapter/s3-cache-handler.d.ts +179 -40
- package/lib/adapter/s3-cache-handler.js +807 -277
- package/lib/adapter/s3-cache-handler.test.js +1186 -31
- package/lib/adapter/use-cache-common.d.ts +90 -0
- package/lib/adapter/use-cache-common.js +250 -0
- package/lib/adapter/use-cache-common.test.d.ts +1 -0
- package/lib/adapter/use-cache-common.test.js +646 -0
- package/lib/adapter/use-cache-default-handler.d.ts +24 -0
- package/lib/adapter/use-cache-default-handler.js +90 -0
- package/lib/adapter/use-cache-default-handler.mjs +38645 -0
- package/lib/adapter/use-cache-handlers.test.d.ts +1 -0
- package/lib/adapter/use-cache-handlers.test.js +349 -0
- package/lib/adapter/use-cache-remote-handler.d.ts +26 -0
- package/lib/adapter/use-cache-remote-handler.js +186 -0
- package/lib/{image-optimization/handler.mjs → adapter/use-cache-remote-handler.mjs} +33572 -38798
- package/lib/generated-structs/OptionalNextjsApiProps.d.ts +59 -0
- package/lib/generated-structs/OptionalNextjsApiProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsCacheProps.d.ts +15 -6
- package/lib/generated-structs/OptionalNextjsCacheProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +25 -11
- package/lib/generated-structs/OptionalNextjsContainersProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +31 -9
- package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsPostDeployProps.d.ts +13 -0
- package/lib/generated-structs/OptionalNextjsPostDeployProps.js +1 -1
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +11 -2
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.js +1 -1
- package/lib/index.d.ts +6 -7
- package/lib/index.js +2 -4
- package/lib/lambdas/post-deploy/post-deploy.lambda.js +3 -2
- package/lib/lambdas/post-deploy/prune-cache-bucket.d.ts +7 -3
- package/lib/lambdas/post-deploy/prune-cache-bucket.js +57 -71
- package/lib/lambdas/post-deploy/prune-cache-bucket.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-cache-bucket.test.js +114 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.js +23 -31
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +71 -0
- package/lib/lambdas/post-deploy/prune-s3.d.ts +19 -3
- package/lib/lambdas/post-deploy/prune-s3.js +54 -15
- package/lib/lambdas/post-deploy/prune-s3.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-s3.test.js +255 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage-function.d.ts +13 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage-function.js +55 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.d.ts +24 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.js +68 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.d.ts +20 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.js +24 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.test.d.ts +1 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.test.js +93 -0
- package/lib/nextjs-api.d.ts +107 -18
- package/lib/nextjs-api.js +349 -39
- package/lib/nextjs-api.test.js +582 -1
- package/lib/nextjs-build/global-containers.Dockerfile +15 -10
- package/lib/nextjs-build/nextjs-build.d.ts +339 -63
- package/lib/nextjs-build/nextjs-build.js +684 -327
- package/lib/nextjs-build/nextjs-build.test.d.ts +1 -0
- package/lib/nextjs-build/nextjs-build.test.js +412 -0
- package/lib/nextjs-build/patch-fetch.js +1 -1
- package/lib/nextjs-build/patch-fetch.test.js +166 -11
- package/lib/nextjs-build/regional-containers.Dockerfile +17 -10
- package/lib/nextjs-cache.d.ts +82 -4
- package/lib/nextjs-cache.js +186 -10
- package/lib/nextjs-cache.test.js +176 -1
- package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +21 -8
- package/lib/nextjs-compute/nextjs-compute-base-props.js +41 -1
- package/lib/nextjs-compute/nextjs-compute-base-props.test.d.ts +1 -0
- package/lib/nextjs-compute/nextjs-compute-base-props.test.js +44 -0
- package/lib/nextjs-compute/nextjs-containers.d.ts +19 -0
- package/lib/nextjs-compute/nextjs-containers.js +57 -20
- package/lib/nextjs-compute/nextjs-functions.d.ts +122 -7
- package/lib/nextjs-compute/nextjs-functions.js +113 -67
- package/lib/nextjs-compute/nextjs-functions.test.d.ts +1 -0
- package/lib/nextjs-compute/nextjs-functions.test.js +99 -0
- package/lib/nextjs-distribution.d.ts +194 -23
- package/lib/nextjs-distribution.js +535 -62
- package/lib/nextjs-distribution.test.d.ts +1 -0
- package/lib/nextjs-distribution.test.js +697 -0
- package/lib/nextjs-post-deploy.d.ts +23 -3
- package/lib/nextjs-post-deploy.js +14 -10
- package/lib/nextjs-post-deploy.test.d.ts +1 -0
- package/lib/nextjs-post-deploy.test.js +34 -0
- package/lib/nextjs-static-assets.d.ts +23 -4
- package/lib/nextjs-static-assets.js +29 -6
- package/lib/nextjs-static-assets.test.js +20 -1
- package/lib/root-constructs/nextjs-base-construct.d.ts +105 -45
- package/lib/root-constructs/nextjs-base-construct.js +144 -34
- package/lib/root-constructs/nextjs-global-containers.d.ts +18 -20
- package/lib/root-constructs/nextjs-global-containers.js +20 -70
- package/lib/root-constructs/nextjs-global-functions.d.ts +26 -28
- package/lib/root-constructs/nextjs-global-functions.js +52 -69
- package/lib/root-constructs/nextjs-regional-containers.d.ts +25 -5
- package/lib/root-constructs/nextjs-regional-containers.js +17 -15
- package/lib/root-constructs/nextjs-regional-functions.d.ts +22 -18
- package/lib/root-constructs/nextjs-regional-functions.js +8 -25
- package/lib/runtime/api-gateway-path.d.ts +34 -0
- package/lib/runtime/api-gateway-path.js +71 -0
- package/lib/runtime/api-gateway-path.test.d.ts +1 -0
- package/lib/runtime/api-gateway-path.test.js +65 -0
- package/lib/runtime/case-redirect.d.ts +22 -0
- package/lib/runtime/case-redirect.js +63 -0
- package/lib/runtime/case-redirect.test.d.ts +1 -0
- package/lib/runtime/case-redirect.test.js +32 -0
- package/lib/runtime/core.d.ts +234 -0
- package/lib/runtime/core.js +1213 -0
- package/lib/runtime/core.test.d.ts +1 -0
- package/lib/runtime/core.test.js +1678 -0
- package/lib/runtime/deployment-root.d.ts +13 -0
- package/lib/runtime/deployment-root.js +29 -0
- package/lib/runtime/dispatch.d.ts +331 -0
- package/lib/runtime/dispatch.js +751 -0
- package/lib/runtime/dispatch.test.d.ts +1 -0
- package/lib/runtime/dispatch.test.js +853 -0
- package/lib/runtime/entrypoints.d.ts +57 -0
- package/lib/runtime/entrypoints.js +115 -0
- package/lib/runtime/http/abort-signal.d.ts +6 -0
- package/lib/runtime/http/abort-signal.js +19 -0
- package/lib/runtime/http/abort-signal.test.d.ts +1 -0
- package/lib/runtime/http/abort-signal.test.js +49 -0
- package/lib/runtime/http/node-server.d.ts +38 -0
- package/lib/runtime/http/node-server.js +99 -0
- package/lib/runtime/http/node-server.test.d.ts +1 -0
- package/lib/runtime/http/node-server.test.js +96 -0
- package/lib/runtime/http/node-sink.d.ts +16 -0
- package/lib/runtime/http/node-sink.js +48 -0
- package/lib/runtime/http/node-sink.test.d.ts +1 -0
- package/lib/runtime/http/node-sink.test.js +66 -0
- package/lib/runtime/http/request.d.ts +62 -0
- package/lib/runtime/http/request.js +134 -0
- package/lib/runtime/http/request.test.d.ts +1 -0
- package/lib/runtime/http/request.test.js +103 -0
- package/lib/runtime/http/response.d.ts +77 -0
- package/lib/runtime/http/response.js +229 -0
- package/lib/runtime/http/response.test.d.ts +1 -0
- package/lib/runtime/http/response.test.js +178 -0
- package/lib/runtime/http/sink.d.ts +73 -0
- package/lib/runtime/http/sink.js +188 -0
- package/lib/runtime/http/sink.test.d.ts +1 -0
- package/lib/runtime/http/sink.test.js +257 -0
- package/lib/runtime/image-utils.d.ts +78 -0
- package/lib/runtime/image-utils.js +129 -0
- package/lib/runtime/image-utils.test.d.ts +1 -0
- package/lib/runtime/image-utils.test.js +237 -0
- package/lib/runtime/image.d.ts +76 -0
- package/lib/runtime/image.js +296 -0
- package/lib/runtime/image.test.d.ts +1 -0
- package/lib/runtime/image.test.js +405 -0
- package/lib/runtime/lambda-event.d.ts +4 -0
- package/lib/runtime/lambda-event.js +113 -0
- package/lib/runtime/lambda-event.test.d.ts +1 -0
- package/lib/runtime/lambda-event.test.js +119 -0
- package/lib/runtime/lambda.mjs +41595 -0
- package/lib/runtime/load-module.d.ts +8 -0
- package/lib/runtime/load-module.js +35 -0
- package/lib/runtime/manifest.d.ts +215 -0
- package/lib/runtime/manifest.js +118 -0
- package/lib/runtime/middleware.d.ts +43 -0
- package/lib/runtime/middleware.js +113 -0
- package/lib/runtime/middleware.test.d.ts +1 -0
- package/lib/runtime/middleware.test.js +259 -0
- package/lib/runtime/next-modules.d.ts +55 -0
- package/lib/runtime/next-modules.js +124 -0
- package/lib/runtime/next-modules.test.d.ts +1 -0
- package/lib/runtime/next-modules.test.js +34 -0
- package/lib/runtime/public-files.d.ts +32 -0
- package/lib/runtime/public-files.js +117 -0
- package/lib/runtime/public-files.test.d.ts +1 -0
- package/lib/runtime/public-files.test.js +97 -0
- package/lib/runtime/server.mjs +41588 -0
- package/lib/runtime/static-files.d.ts +50 -0
- package/lib/runtime/static-files.js +266 -0
- package/lib/runtime/static-files.test.d.ts +1 -0
- package/lib/runtime/static-files.test.js +118 -0
- package/lib/runtime/util.d.ts +28 -0
- package/lib/runtime/util.js +79 -0
- package/lib/utils/base-path.d.ts +123 -11
- package/lib/utils/base-path.js +276 -39
- package/lib/utils/base-path.test.js +275 -50
- package/lib/utils/get-architecture.d.ts +7 -8
- package/lib/utils/get-architecture.js +12 -13
- package/lib/utils/zip-directory.d.ts +14 -0
- package/lib/utils/zip-directory.js +121 -0
- package/lib/utils/zip-directory.test.d.ts +1 -0
- package/lib/utils/zip-directory.test.js +99 -0
- package/package.json +22 -3
- package/scripts/capture-adapter-fixture.mjs +325 -0
- package/scripts/e2e-deploy.sh +398 -0
- package/scripts/e2e-harness/README.md +707 -0
- package/scripts/e2e-harness/app.js +370 -0
- package/scripts/e2e-harness/common.sh +249 -0
- package/scripts/e2e-harness/screen.mjs +302 -0
- package/scripts/e2e-harness/stage-proxy.mjs +145 -0
- package/scripts/e2e-harness/type-filters.mjs +47 -0
- package/scripts/e2e-logs.sh +75 -0
- package/scripts/e2e-offline.sh +91 -0
- package/scripts/e2e-sweep.sh +370 -0
- package/scripts/e2e-warm.sh +114 -0
- package/scripts/zero-config-build.mjs +418 -0
- package/docs/1k-concurrent-users-executions.png +0 -0
- package/docs/plans/adapter-runtime-release.md +0 -362
- package/docs/plans/phase-0-image-function-opt-in.md +0 -295
- package/lib/generated-structs/OptionalDockerImageFunctionProps.d.ts +0 -425
- package/lib/generated-structs/OptionalDockerImageFunctionProps.js +0 -3
- package/lib/image-optimization/handler-utils.d.ts +0 -34
- package/lib/image-optimization/handler-utils.js +0 -83
- package/lib/image-optimization/handler-utils.test.js +0 -178
- package/lib/nextjs-build/functions.Dockerfile +0 -31
- package/lib/nextjs-compute/nextjs-image-function.d.ts +0 -53
- package/lib/nextjs-compute/nextjs-image-function.js +0 -59
- package/lib/utils/experimental-flags.d.ts +0 -24
- package/lib/utils/experimental-flags.js +0 -30
- /package/lib/{image-optimization/handler-utils.test.d.ts → adapter/adapter.test.d.ts} +0 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createRequire` anchored to the module being loaded, rather than a bare
|
|
3
|
+
* `require`: this file is bundled to ESM by esbuild, where the ambient `require`
|
|
4
|
+
* resolves relative to `lib/runtime/`, not the staged app tree.
|
|
5
|
+
*/
|
|
6
|
+
export declare function loadBuiltModule(absolutePath: string): Promise<unknown>;
|
|
7
|
+
/** Pulls a named function export off a loaded module, or throws saying why not. */
|
|
8
|
+
export declare function requireFunctionExport<T>(exports: unknown, name: string, describe: () => string): T;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadBuiltModule = loadBuiltModule;
|
|
4
|
+
exports.requireFunctionExport = requireFunctionExport;
|
|
5
|
+
/**
|
|
6
|
+
* Loading built Next.js modules out of the staged deployment tree.
|
|
7
|
+
*
|
|
8
|
+
* Shared by the middleware runner and the entrypoint registry, because the one
|
|
9
|
+
* non-obvious part is the same for both: Turbopack emits **async modules** whose
|
|
10
|
+
* `module.exports` is a `Promise`. Its keys live behind
|
|
11
|
+
* `Symbol(turbopack exports)`, so `Object.keys` reports nothing and a
|
|
12
|
+
* synchronous `require(...).handler` is `undefined` — which looks exactly like
|
|
13
|
+
* Next.js having changed its template API. `await` covers both that and the
|
|
14
|
+
* plain-CJS/webpack shape.
|
|
15
|
+
*/
|
|
16
|
+
const node_module_1 = require("node:module");
|
|
17
|
+
/**
|
|
18
|
+
* `createRequire` anchored to the module being loaded, rather than a bare
|
|
19
|
+
* `require`: this file is bundled to ESM by esbuild, where the ambient `require`
|
|
20
|
+
* resolves relative to `lib/runtime/`, not the staged app tree.
|
|
21
|
+
*/
|
|
22
|
+
async function loadBuiltModule(absolutePath) {
|
|
23
|
+
return (0, node_module_1.createRequire)(absolutePath)(absolutePath);
|
|
24
|
+
}
|
|
25
|
+
/** Pulls a named function export off a loaded module, or throws saying why not. */
|
|
26
|
+
function requireFunctionExport(exports, name, describe) {
|
|
27
|
+
const value = exports?.[name];
|
|
28
|
+
if (typeof value !== "function") {
|
|
29
|
+
throw new Error(`${describe()} does not export a \`${name}\` function (got ` +
|
|
30
|
+
`${typeof value}). This means Next.js changed the shape of its build ` +
|
|
31
|
+
`templates (next/dist/build/templates/).`);
|
|
32
|
+
}
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9sb2FkLW1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWtCQSwwQ0FFQztBQUdELHNEQWNDO0FBckNEOzs7Ozs7Ozs7O0dBVUc7QUFDSCw2Q0FBNEM7QUFFNUM7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxlQUFlLENBQUMsWUFBb0I7SUFDeEQsT0FBTyxJQUFBLDJCQUFhLEVBQUMsWUFBWSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVELG1GQUFtRjtBQUNuRixTQUFnQixxQkFBcUIsQ0FDbkMsT0FBZ0IsRUFDaEIsSUFBWSxFQUNaLFFBQXNCO0lBRXRCLE1BQU0sS0FBSyxHQUFJLE9BQStDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RSxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQ2IsR0FBRyxRQUFRLEVBQUUsd0JBQXdCLElBQUksbUJBQW1CO1lBQzFELEdBQUcsT0FBTyxLQUFLLHVEQUF1RDtZQUN0RSx5Q0FBeUMsQ0FDNUMsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLEtBQVUsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMb2FkaW5nIGJ1aWx0IE5leHQuanMgbW9kdWxlcyBvdXQgb2YgdGhlIHN0YWdlZCBkZXBsb3ltZW50IHRyZWUuXG4gKlxuICogU2hhcmVkIGJ5IHRoZSBtaWRkbGV3YXJlIHJ1bm5lciBhbmQgdGhlIGVudHJ5cG9pbnQgcmVnaXN0cnksIGJlY2F1c2UgdGhlIG9uZVxuICogbm9uLW9idmlvdXMgcGFydCBpcyB0aGUgc2FtZSBmb3IgYm90aDogVHVyYm9wYWNrIGVtaXRzICoqYXN5bmMgbW9kdWxlcyoqIHdob3NlXG4gKiBgbW9kdWxlLmV4cG9ydHNgIGlzIGEgYFByb21pc2VgLiBJdHMga2V5cyBsaXZlIGJlaGluZFxuICogYFN5bWJvbCh0dXJib3BhY2sgZXhwb3J0cylgLCBzbyBgT2JqZWN0LmtleXNgIHJlcG9ydHMgbm90aGluZyBhbmQgYVxuICogc3luY2hyb25vdXMgYHJlcXVpcmUoLi4uKS5oYW5kbGVyYCBpcyBgdW5kZWZpbmVkYCDigJQgd2hpY2ggbG9va3MgZXhhY3RseSBsaWtlXG4gKiBOZXh0LmpzIGhhdmluZyBjaGFuZ2VkIGl0cyB0ZW1wbGF0ZSBBUEkuIGBhd2FpdGAgY292ZXJzIGJvdGggdGhhdCBhbmQgdGhlXG4gKiBwbGFpbi1DSlMvd2VicGFjayBzaGFwZS5cbiAqL1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuXG4vKipcbiAqIGBjcmVhdGVSZXF1aXJlYCBhbmNob3JlZCB0byB0aGUgbW9kdWxlIGJlaW5nIGxvYWRlZCwgcmF0aGVyIHRoYW4gYSBiYXJlXG4gKiBgcmVxdWlyZWA6IHRoaXMgZmlsZSBpcyBidW5kbGVkIHRvIEVTTSBieSBlc2J1aWxkLCB3aGVyZSB0aGUgYW1iaWVudCBgcmVxdWlyZWBcbiAqIHJlc29sdmVzIHJlbGF0aXZlIHRvIGBsaWIvcnVudGltZS9gLCBub3QgdGhlIHN0YWdlZCBhcHAgdHJlZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRCdWlsdE1vZHVsZShhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICByZXR1cm4gY3JlYXRlUmVxdWlyZShhYnNvbHV0ZVBhdGgpKGFic29sdXRlUGF0aCk7XG59XG5cbi8qKiBQdWxscyBhIG5hbWVkIGZ1bmN0aW9uIGV4cG9ydCBvZmYgYSBsb2FkZWQgbW9kdWxlLCBvciB0aHJvd3Mgc2F5aW5nIHdoeSBub3QuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUZ1bmN0aW9uRXhwb3J0PFQ+KFxuICBleHBvcnRzOiB1bmtub3duLFxuICBuYW1lOiBzdHJpbmcsXG4gIGRlc2NyaWJlOiAoKSA9PiBzdHJpbmcsXG4pOiBUIHtcbiAgY29uc3QgdmFsdWUgPSAoZXhwb3J0cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk/LltuYW1lXTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7ZGVzY3JpYmUoKX0gZG9lcyBub3QgZXhwb3J0IGEgXFxgJHtuYW1lfVxcYCBmdW5jdGlvbiAoZ290IGAgK1xuICAgICAgICBgJHt0eXBlb2YgdmFsdWV9KS4gVGhpcyBtZWFucyBOZXh0LmpzIGNoYW5nZWQgdGhlIHNoYXBlIG9mIGl0cyBidWlsZCBgICtcbiAgICAgICAgYHRlbXBsYXRlcyAobmV4dC9kaXN0L2J1aWxkL3RlbXBsYXRlcy8pLmAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdmFsdWUgYXMgVDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/** Current {@link AdapterManifest.version}. Bump on any breaking shape change. */
|
|
2
|
+
export declare const ADAPTER_MANIFEST_VERSION = 1;
|
|
3
|
+
/**
|
|
4
|
+
* Directory written inside `distDir` (`.next`), matching the existing
|
|
5
|
+
* `cdk-nextjs-init-cache` convention.
|
|
6
|
+
*/
|
|
7
|
+
export declare const ADAPTER_DIR_NAME = "cdk-nextjs-adapter";
|
|
8
|
+
/**
|
|
9
|
+
* Deployment root inside {@link ADAPTER_DIR_NAME}: the staged union of every
|
|
10
|
+
* shipped output's traced `assets`, keyed by repo-root-relative path. This is
|
|
11
|
+
* what replaces `output: "standalone"`.
|
|
12
|
+
*/
|
|
13
|
+
export declare const STAGING_DIR_NAME = "app";
|
|
14
|
+
/**
|
|
15
|
+
* Parent of the per-group deployment roots, used instead of
|
|
16
|
+
* {@link STAGING_DIR_NAME} when `functionGroups` splits the app: each group is
|
|
17
|
+
* staged at `<distDir>/cdk-nextjs-adapter/groups/<name>/`, including the implicit
|
|
18
|
+
* `default` one.
|
|
19
|
+
*
|
|
20
|
+
* Splitting gets its own subtree rather than reusing `app/` for the default group
|
|
21
|
+
* so that a tree left over from a build with different grouping can never be
|
|
22
|
+
* mistaken for this build's, and so `du` on either directory answers "how big is
|
|
23
|
+
* the thing I deploy" without qualification.
|
|
24
|
+
*/
|
|
25
|
+
export declare const GROUPS_DIR_NAME = "groups";
|
|
26
|
+
/**
|
|
27
|
+
* Which group the running function *is*. Set per Lambda at synth, read by the
|
|
28
|
+
* runtime only to make a misroute say so; see `ownedRouteError`.
|
|
29
|
+
*/
|
|
30
|
+
export declare const FUNCTION_GROUP_ENV_VAR = "CDK_NEXTJS_FUNCTION_GROUP";
|
|
31
|
+
/**
|
|
32
|
+
* The global the cache handler (`src/adapter/s3-cache-handler.ts`) registers its
|
|
33
|
+
* CloudFront invalidation hook under, and the runtime (`core.ts`) calls. A global
|
|
34
|
+
* rather than an import, because the cache handler is a separate bundle that
|
|
35
|
+
* Next.js loads itself: the two share a process, not a module graph.
|
|
36
|
+
*/
|
|
37
|
+
export declare const REVALIDATED_PAGE_HOOK: unique symbol;
|
|
38
|
+
/**
|
|
39
|
+
* Directory inside {@link ADAPTER_DIR_NAME} holding one deployment root, relative
|
|
40
|
+
* and POSIX. `undefined` means "not splitting", which is its own layout rather
|
|
41
|
+
* than a group named `default`.
|
|
42
|
+
*/
|
|
43
|
+
export declare function groupStagingDirName(group?: string): string;
|
|
44
|
+
/** {@link AdapterManifest}, written inside {@link ADAPTER_DIR_NAME}. */
|
|
45
|
+
export declare const MANIFEST_FILE_NAME = "manifest.json";
|
|
46
|
+
/**
|
|
47
|
+
* The entrypoints the runtime renders a 404 or a 500 with, in the order it
|
|
48
|
+
* tries them, and `/_error`, the last resort for both. Before basePath.
|
|
49
|
+
*/
|
|
50
|
+
export declare const STATUS_PAGE_SUFFIXES: {
|
|
51
|
+
404: string[];
|
|
52
|
+
500: string[];
|
|
53
|
+
fallback: string;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Every {@link STATUS_PAGE_SUFFIXES} page: App Router's `/_not-found`, Pages
|
|
57
|
+
* Router's `/404` and `/500`, and `/_error`. The runtime may render any request
|
|
58
|
+
* with them, wherever it landed, so every function group stages them
|
|
59
|
+
* (`collectGroupStagingPlan`) and no URL has to be routed to them.
|
|
60
|
+
*/
|
|
61
|
+
export declare const ERROR_PAGE_SUFFIXES: string[];
|
|
62
|
+
/**
|
|
63
|
+
* Reserved key inside the staging tree that cdk-nextjs's own bundled runtime
|
|
64
|
+
* files are copied to at synth (Lambda handler
|
|
65
|
+
* `cdk-nextjs-runtime/lambda.handler`). Reserved because a repo-root-relative
|
|
66
|
+
* asset key could otherwise collide with it.
|
|
67
|
+
*/
|
|
68
|
+
export declare const RUNTIME_DIR_NAME = "cdk-nextjs-runtime";
|
|
69
|
+
/**
|
|
70
|
+
* The file, next to the manifest in {@link RUNTIME_DIR_NAME}, that lists
|
|
71
|
+
* `public/` on every type but `NextjsRegionalContainers`: a JSON array of
|
|
72
|
+
* `/`-separated paths relative to `public/`, as `readPublicFiles` returns them.
|
|
73
|
+
* Synth writes it after the build command (so `postbuild` output is listed)
|
|
74
|
+
* because those deployment packages do not carry `public/` itself; the runtime
|
|
75
|
+
* serves a listed file from S3. The RegionalContainers image copies `public/`
|
|
76
|
+
* in and has no such file.
|
|
77
|
+
*/
|
|
78
|
+
export declare const PUBLIC_FILES_FILE_NAME = "public-files.json";
|
|
79
|
+
/**
|
|
80
|
+
* Where the runtime reads {@link AdapterManifest} from, given the deployment
|
|
81
|
+
* root. Synth copies `manifest.json` in next to the bundled shells rather than
|
|
82
|
+
* leaving it at its build-time location (`<distDir>/cdk-nextjs-adapter/`, one
|
|
83
|
+
* level *above* the staging tree) so that a single asset is self-describing.
|
|
84
|
+
*/
|
|
85
|
+
export declare function deployedManifestPath(deploymentRoot: string): string;
|
|
86
|
+
export interface AdapterManifest {
|
|
87
|
+
readonly version: 1;
|
|
88
|
+
readonly buildId: string;
|
|
89
|
+
/**
|
|
90
|
+
* From the deployment root to the Next.js project dir. "" when the app is at
|
|
91
|
+
* the repo root.
|
|
92
|
+
*
|
|
93
|
+
* **The runtime `chdir`s here at cold start, and that is load-bearing.** Next
|
|
94
|
+
* inlines `__NEXT_RELATIVE_PROJECT_DIR = relative(buildCwd, projectDir)` into
|
|
95
|
+
* every entrypoint at build time (`next/dist/build/define-env.js`), and the
|
|
96
|
+
* built code resolves it as `join(process.cwd(), relativeProjectDir)` to find
|
|
97
|
+
* `required-server-files.json`, the prerender manifest, and the app's own
|
|
98
|
+
* files. `requestMeta.relativeProjectDir` overrides it in
|
|
99
|
+
* `next/dist/server/route-modules/route-module.js` but **not** in
|
|
100
|
+
* `app-page-runtime.js`, which passes the inlined value through as the render
|
|
101
|
+
* `dir` — so `process.cwd()` is the only mechanism that covers every
|
|
102
|
+
* entrypoint type. `build-outputs.ts` asserts `buildCwd === projectDir` to
|
|
103
|
+
* keep the inlined value `""` and this field the whole answer.
|
|
104
|
+
*/
|
|
105
|
+
readonly relativeProjectDir: string;
|
|
106
|
+
readonly config: AdapterManifestConfig;
|
|
107
|
+
/** `ctx.routing` verbatim, including `middlewareMatchers`. */
|
|
108
|
+
readonly routing: unknown;
|
|
109
|
+
/**
|
|
110
|
+
* Every pathname `resolveRoutes` is allowed to match: the {@link entrypoints}
|
|
111
|
+
* keys plus {@link staticFiles}. Sorted and deduped.
|
|
112
|
+
*/
|
|
113
|
+
readonly pathnames: string[];
|
|
114
|
+
/**
|
|
115
|
+
* Route *template* (`/blog/[slug]`) → entrypoint. Keys are basePath- and
|
|
116
|
+
* locale-prefixed exactly as `resolveRoutes` reports `resolvedPathname`, so
|
|
117
|
+
* the lookup is a plain index with no normalization.
|
|
118
|
+
*
|
|
119
|
+
* Includes dynamic *prerender* templates (notably Pages Router
|
|
120
|
+
* `/_next/data/<buildId>/<locale>/blog/[slug].json`) mapped to the entrypoint
|
|
121
|
+
* of the route that owns them.
|
|
122
|
+
*/
|
|
123
|
+
readonly entrypoints: Record<string, AdapterEntrypoint>;
|
|
124
|
+
readonly middleware: AdapterMiddleware | null;
|
|
125
|
+
/**
|
|
126
|
+
* Pathname → repo-root-relative POSIX key of the file to serve.
|
|
127
|
+
*
|
|
128
|
+
* A map rather than a list of pathnames because the two are not derivable from
|
|
129
|
+
* each other: `/favicon.ico` is `<distDir>/server/app/favicon.ico.body`, `/404`
|
|
130
|
+
* is `<distDir>/server/pages/404.html`, and a fully-static Pages Router route
|
|
131
|
+
* is `<distDir>/server/pages/<route>.html`. The runtime serves these itself —
|
|
132
|
+
* `NextjsStaticAssets` only uploads `<distDir>/static` and `public`, so nothing
|
|
133
|
+
* in front of the compute can answer them.
|
|
134
|
+
*
|
|
135
|
+
* Whether the file is present in the deployment package depends on the
|
|
136
|
+
* deployment type; see `stageServedStaticFiles` in `build-outputs.ts`.
|
|
137
|
+
*/
|
|
138
|
+
readonly staticFiles: Record<string, string>;
|
|
139
|
+
/**
|
|
140
|
+
* Group name → the route templates that group's deployment package holds,
|
|
141
|
+
* including the implicit `default`. Absent when `functionGroups` is not used.
|
|
142
|
+
*
|
|
143
|
+
* Every group gets the *same* manifest, because routing is identical in all of
|
|
144
|
+
* them: middleware, redirects and rewrites are duplicated by design, and a
|
|
145
|
+
* group has to be able to resolve a pathname it does not own in order to say so
|
|
146
|
+
* rather than crash on a missing file. This field is what lets it say so.
|
|
147
|
+
*/
|
|
148
|
+
readonly groups?: Record<string, string[]>;
|
|
149
|
+
/**
|
|
150
|
+
* Every behavior the edge routes a non-default group on, most specific first
|
|
151
|
+
* (`GroupBehavior` in `function-groups.ts`). Present exactly when
|
|
152
|
+
* {@link groups} is. Recorded by the assignment rather than recomputed at
|
|
153
|
+
* synth, so the behaviors deployed are the ones it checked.
|
|
154
|
+
*/
|
|
155
|
+
readonly behaviors?: {
|
|
156
|
+
group: string;
|
|
157
|
+
route: string;
|
|
158
|
+
pattern: string;
|
|
159
|
+
}[];
|
|
160
|
+
/**
|
|
161
|
+
* The `functionGroups` the build was split by (name and routes, as passed in
|
|
162
|
+
* `CDK_NEXTJS_FUNCTION_GROUPS`), present exactly when {@link groups} is. Synth
|
|
163
|
+
* compares it with its own props to catch a stale or hand-run build.
|
|
164
|
+
*/
|
|
165
|
+
readonly functionGroups?: {
|
|
166
|
+
name: string;
|
|
167
|
+
routes: string[];
|
|
168
|
+
}[];
|
|
169
|
+
}
|
|
170
|
+
export interface AdapterManifestConfig {
|
|
171
|
+
readonly basePath: string;
|
|
172
|
+
readonly trailingSlash: boolean;
|
|
173
|
+
readonly assetPrefix: string;
|
|
174
|
+
/**
|
|
175
|
+
* `distDir` relative to the project dir — `.next` unless configured. POSIX.
|
|
176
|
+
* The runtime reads `required-server-files.json` from here for the image
|
|
177
|
+
* optimizer's config.
|
|
178
|
+
*/
|
|
179
|
+
readonly distDir: string;
|
|
180
|
+
/**
|
|
181
|
+
* `next.config` `compress`. The runtime gzips streamed responses itself
|
|
182
|
+
* (neither API Gateway in STREAM mode nor CloudFront can), so honoring this
|
|
183
|
+
* is on us.
|
|
184
|
+
*/
|
|
185
|
+
readonly compress: boolean;
|
|
186
|
+
/**
|
|
187
|
+
* `next.config` `generateEtags`. Honored for the files the runtime serves
|
|
188
|
+
* itself, as `next start` does (`serveStatic`'s `etag` option).
|
|
189
|
+
*/
|
|
190
|
+
readonly generateEtags: boolean;
|
|
191
|
+
/**
|
|
192
|
+
* `ResolveRoutesParams["i18n"]`-shaped, narrower than NextConfigComplete.
|
|
193
|
+
* `null` when the app configures no `i18n`.
|
|
194
|
+
*/
|
|
195
|
+
readonly i18n: unknown | null;
|
|
196
|
+
/**
|
|
197
|
+
* `next.config` `deploymentId` (or `NEXT_DEPLOYMENT_ID`), reduced to the
|
|
198
|
+
* characters safe in an S3 key prefix and a DynamoDB partition key — `/` in
|
|
199
|
+
* particular would split the prefix `prune-cache-bucket.ts` matches on. `""`
|
|
200
|
+
* when the app sets none.
|
|
201
|
+
*/
|
|
202
|
+
readonly deploymentId: string;
|
|
203
|
+
}
|
|
204
|
+
export type AdapterEntrypointType = "app-page" | "app-route" | "page" | "page-api";
|
|
205
|
+
export interface AdapterEntrypoint {
|
|
206
|
+
readonly id: string;
|
|
207
|
+
/** Repo-root-relative POSIX key inside the staging tree. Never absolute. */
|
|
208
|
+
readonly filePath: string;
|
|
209
|
+
readonly type: AdapterEntrypointType;
|
|
210
|
+
}
|
|
211
|
+
export interface AdapterMiddleware {
|
|
212
|
+
readonly id: string;
|
|
213
|
+
/** Repo-root-relative POSIX key inside the staging tree. Never absolute. */
|
|
214
|
+
readonly filePath: string;
|
|
215
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PUBLIC_FILES_FILE_NAME = exports.RUNTIME_DIR_NAME = exports.ERROR_PAGE_SUFFIXES = exports.STATUS_PAGE_SUFFIXES = exports.MANIFEST_FILE_NAME = exports.REVALIDATED_PAGE_HOOK = exports.FUNCTION_GROUP_ENV_VAR = exports.GROUPS_DIR_NAME = exports.STAGING_DIR_NAME = exports.ADAPTER_DIR_NAME = exports.ADAPTER_MANIFEST_VERSION = void 0;
|
|
4
|
+
exports.groupStagingDirName = groupStagingDirName;
|
|
5
|
+
exports.deployedManifestPath = deployedManifestPath;
|
|
6
|
+
/**
|
|
7
|
+
* The build-time → run-time contract for the adapter runtime.
|
|
8
|
+
*
|
|
9
|
+
* `src/adapter/build-outputs.ts` writes an {@link AdapterManifest} during
|
|
10
|
+
* `next build`; the runtime shells in `src/runtime/` read it at cold start and
|
|
11
|
+
* the CDK constructs read it at synth. It is the only thing that crosses those
|
|
12
|
+
* three boundaries, so it is deliberately plain JSON.
|
|
13
|
+
*
|
|
14
|
+
* **Every path in this manifest is a repo-root-relative POSIX key**, never a
|
|
15
|
+
* build-machine absolute path: absolute paths work on the build machine and
|
|
16
|
+
* fail in Lambda. The staging tree those keys index into is
|
|
17
|
+
* `<distDir>/cdk-nextjs-adapter/app`; the runtime calls that directory the
|
|
18
|
+
* *deployment root* and resolves every key against it.
|
|
19
|
+
*
|
|
20
|
+
* This file is intentionally not exported from `src/index.ts`: it is an
|
|
21
|
+
* internal contract, not public construct API, so it is exempt from the JSII
|
|
22
|
+
* restrictions the rest of `src/` follows.
|
|
23
|
+
*/
|
|
24
|
+
const node_path_1 = require("node:path");
|
|
25
|
+
/** Current {@link AdapterManifest.version}. Bump on any breaking shape change. */
|
|
26
|
+
exports.ADAPTER_MANIFEST_VERSION = 1;
|
|
27
|
+
/**
|
|
28
|
+
* Directory written inside `distDir` (`.next`), matching the existing
|
|
29
|
+
* `cdk-nextjs-init-cache` convention.
|
|
30
|
+
*/
|
|
31
|
+
exports.ADAPTER_DIR_NAME = "cdk-nextjs-adapter";
|
|
32
|
+
/**
|
|
33
|
+
* Deployment root inside {@link ADAPTER_DIR_NAME}: the staged union of every
|
|
34
|
+
* shipped output's traced `assets`, keyed by repo-root-relative path. This is
|
|
35
|
+
* what replaces `output: "standalone"`.
|
|
36
|
+
*/
|
|
37
|
+
exports.STAGING_DIR_NAME = "app";
|
|
38
|
+
/**
|
|
39
|
+
* Parent of the per-group deployment roots, used instead of
|
|
40
|
+
* {@link STAGING_DIR_NAME} when `functionGroups` splits the app: each group is
|
|
41
|
+
* staged at `<distDir>/cdk-nextjs-adapter/groups/<name>/`, including the implicit
|
|
42
|
+
* `default` one.
|
|
43
|
+
*
|
|
44
|
+
* Splitting gets its own subtree rather than reusing `app/` for the default group
|
|
45
|
+
* so that a tree left over from a build with different grouping can never be
|
|
46
|
+
* mistaken for this build's, and so `du` on either directory answers "how big is
|
|
47
|
+
* the thing I deploy" without qualification.
|
|
48
|
+
*/
|
|
49
|
+
exports.GROUPS_DIR_NAME = "groups";
|
|
50
|
+
/**
|
|
51
|
+
* Which group the running function *is*. Set per Lambda at synth, read by the
|
|
52
|
+
* runtime only to make a misroute say so; see `ownedRouteError`.
|
|
53
|
+
*/
|
|
54
|
+
exports.FUNCTION_GROUP_ENV_VAR = "CDK_NEXTJS_FUNCTION_GROUP";
|
|
55
|
+
/**
|
|
56
|
+
* The global the cache handler (`src/adapter/s3-cache-handler.ts`) registers its
|
|
57
|
+
* CloudFront invalidation hook under, and the runtime (`core.ts`) calls. A global
|
|
58
|
+
* rather than an import, because the cache handler is a separate bundle that
|
|
59
|
+
* Next.js loads itself: the two share a process, not a module graph.
|
|
60
|
+
*/
|
|
61
|
+
exports.REVALIDATED_PAGE_HOOK = Symbol.for("cdk-nextjs.invalidateRevalidatedPage");
|
|
62
|
+
/**
|
|
63
|
+
* Directory inside {@link ADAPTER_DIR_NAME} holding one deployment root, relative
|
|
64
|
+
* and POSIX. `undefined` means "not splitting", which is its own layout rather
|
|
65
|
+
* than a group named `default`.
|
|
66
|
+
*/
|
|
67
|
+
function groupStagingDirName(group) {
|
|
68
|
+
return group === undefined ? exports.STAGING_DIR_NAME : `${exports.GROUPS_DIR_NAME}/${group}`;
|
|
69
|
+
}
|
|
70
|
+
/** {@link AdapterManifest}, written inside {@link ADAPTER_DIR_NAME}. */
|
|
71
|
+
exports.MANIFEST_FILE_NAME = "manifest.json";
|
|
72
|
+
/**
|
|
73
|
+
* The entrypoints the runtime renders a 404 or a 500 with, in the order it
|
|
74
|
+
* tries them, and `/_error`, the last resort for both. Before basePath.
|
|
75
|
+
*/
|
|
76
|
+
exports.STATUS_PAGE_SUFFIXES = {
|
|
77
|
+
404: ["/_not-found", "/404"],
|
|
78
|
+
500: ["/500"],
|
|
79
|
+
fallback: "/_error",
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Every {@link STATUS_PAGE_SUFFIXES} page: App Router's `/_not-found`, Pages
|
|
83
|
+
* Router's `/404` and `/500`, and `/_error`. The runtime may render any request
|
|
84
|
+
* with them, wherever it landed, so every function group stages them
|
|
85
|
+
* (`collectGroupStagingPlan`) and no URL has to be routed to them.
|
|
86
|
+
*/
|
|
87
|
+
exports.ERROR_PAGE_SUFFIXES = [
|
|
88
|
+
...exports.STATUS_PAGE_SUFFIXES[404],
|
|
89
|
+
...exports.STATUS_PAGE_SUFFIXES[500],
|
|
90
|
+
exports.STATUS_PAGE_SUFFIXES.fallback,
|
|
91
|
+
];
|
|
92
|
+
/**
|
|
93
|
+
* Reserved key inside the staging tree that cdk-nextjs's own bundled runtime
|
|
94
|
+
* files are copied to at synth (Lambda handler
|
|
95
|
+
* `cdk-nextjs-runtime/lambda.handler`). Reserved because a repo-root-relative
|
|
96
|
+
* asset key could otherwise collide with it.
|
|
97
|
+
*/
|
|
98
|
+
exports.RUNTIME_DIR_NAME = "cdk-nextjs-runtime";
|
|
99
|
+
/**
|
|
100
|
+
* The file, next to the manifest in {@link RUNTIME_DIR_NAME}, that lists
|
|
101
|
+
* `public/` on every type but `NextjsRegionalContainers`: a JSON array of
|
|
102
|
+
* `/`-separated paths relative to `public/`, as `readPublicFiles` returns them.
|
|
103
|
+
* Synth writes it after the build command (so `postbuild` output is listed)
|
|
104
|
+
* because those deployment packages do not carry `public/` itself; the runtime
|
|
105
|
+
* serves a listed file from S3. The RegionalContainers image copies `public/`
|
|
106
|
+
* in and has no such file.
|
|
107
|
+
*/
|
|
108
|
+
exports.PUBLIC_FILES_FILE_NAME = "public-files.json";
|
|
109
|
+
/**
|
|
110
|
+
* Where the runtime reads {@link AdapterManifest} from, given the deployment
|
|
111
|
+
* root. Synth copies `manifest.json` in next to the bundled shells rather than
|
|
112
|
+
* leaving it at its build-time location (`<distDir>/cdk-nextjs-adapter/`, one
|
|
113
|
+
* level *above* the staging tree) so that a single asset is self-describing.
|
|
114
|
+
*/
|
|
115
|
+
function deployedManifestPath(deploymentRoot) {
|
|
116
|
+
return (0, node_path_1.join)(deploymentRoot, exports.RUNTIME_DIR_NAME, exports.MANIFEST_FILE_NAME);
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuaWZlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9tYW5pZmVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFzRUEsa0RBRUM7QUFvREQsb0RBRUM7QUE5SEQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gseUNBQWlDO0FBRWpDLGtGQUFrRjtBQUNyRSxRQUFBLHdCQUF3QixHQUFHLENBQUMsQ0FBQztBQUUxQzs7O0dBR0c7QUFDVSxRQUFBLGdCQUFnQixHQUFHLG9CQUFvQixDQUFDO0FBRXJEOzs7O0dBSUc7QUFDVSxRQUFBLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUV0Qzs7Ozs7Ozs7OztHQVVHO0FBQ1UsUUFBQSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBRXhDOzs7R0FHRztBQUNVLFFBQUEsc0JBQXNCLEdBQUcsMkJBQTJCLENBQUM7QUFFbEU7Ozs7O0dBS0c7QUFDVSxRQUFBLHFCQUFxQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQzdDLHNDQUFzQyxDQUN2QyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILFNBQWdCLG1CQUFtQixDQUFDLEtBQWM7SUFDaEQsT0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyx3QkFBZ0IsQ0FBQyxDQUFDLENBQUMsR0FBRyx1QkFBZSxJQUFJLEtBQUssRUFBRSxDQUFDO0FBQ2hGLENBQUM7QUFFRCx3RUFBd0U7QUFDM0QsUUFBQSxrQkFBa0IsR0FBRyxlQUFlLENBQUM7QUFFbEQ7OztHQUdHO0FBQ1UsUUFBQSxvQkFBb0IsR0FBRztJQUNsQyxHQUFHLEVBQUUsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDO0lBQzVCLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUNiLFFBQVEsRUFBRSxTQUFTO0NBQ3BCLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNVLFFBQUEsbUJBQW1CLEdBQUc7SUFDakMsR0FBRyw0QkFBb0IsQ0FBQyxHQUFHLENBQUM7SUFDNUIsR0FBRyw0QkFBb0IsQ0FBQyxHQUFHLENBQUM7SUFDNUIsNEJBQW9CLENBQUMsUUFBUTtDQUM5QixDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDVSxRQUFBLGdCQUFnQixHQUFHLG9CQUFvQixDQUFDO0FBRXJEOzs7Ozs7OztHQVFHO0FBQ1UsUUFBQSxzQkFBc0IsR0FBRyxtQkFBbUIsQ0FBQztBQUUxRDs7Ozs7R0FLRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLGNBQXNCO0lBQ3pELE9BQU8sSUFBQSxnQkFBSSxFQUFDLGNBQWMsRUFBRSx3QkFBZ0IsRUFBRSwwQkFBa0IsQ0FBQyxDQUFDO0FBQ3BFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBidWlsZC10aW1lIOKGkiBydW4tdGltZSBjb250cmFjdCBmb3IgdGhlIGFkYXB0ZXIgcnVudGltZS5cbiAqXG4gKiBgc3JjL2FkYXB0ZXIvYnVpbGQtb3V0cHV0cy50c2Agd3JpdGVzIGFuIHtAbGluayBBZGFwdGVyTWFuaWZlc3R9IGR1cmluZ1xuICogYG5leHQgYnVpbGRgOyB0aGUgcnVudGltZSBzaGVsbHMgaW4gYHNyYy9ydW50aW1lL2AgcmVhZCBpdCBhdCBjb2xkIHN0YXJ0IGFuZFxuICogdGhlIENESyBjb25zdHJ1Y3RzIHJlYWQgaXQgYXQgc3ludGguIEl0IGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgY3Jvc3NlcyB0aG9zZVxuICogdGhyZWUgYm91bmRhcmllcywgc28gaXQgaXMgZGVsaWJlcmF0ZWx5IHBsYWluIEpTT04uXG4gKlxuICogKipFdmVyeSBwYXRoIGluIHRoaXMgbWFuaWZlc3QgaXMgYSByZXBvLXJvb3QtcmVsYXRpdmUgUE9TSVgga2V5KiosIG5ldmVyIGFcbiAqIGJ1aWxkLW1hY2hpbmUgYWJzb2x1dGUgcGF0aDogYWJzb2x1dGUgcGF0aHMgd29yayBvbiB0aGUgYnVpbGQgbWFjaGluZSBhbmRcbiAqIGZhaWwgaW4gTGFtYmRhLiBUaGUgc3RhZ2luZyB0cmVlIHRob3NlIGtleXMgaW5kZXggaW50byBpc1xuICogYDxkaXN0RGlyPi9jZGstbmV4dGpzLWFkYXB0ZXIvYXBwYDsgdGhlIHJ1bnRpbWUgY2FsbHMgdGhhdCBkaXJlY3RvcnkgdGhlXG4gKiAqZGVwbG95bWVudCByb290KiBhbmQgcmVzb2x2ZXMgZXZlcnkga2V5IGFnYWluc3QgaXQuXG4gKlxuICogVGhpcyBmaWxlIGlzIGludGVudGlvbmFsbHkgbm90IGV4cG9ydGVkIGZyb20gYHNyYy9pbmRleC50c2A6IGl0IGlzIGFuXG4gKiBpbnRlcm5hbCBjb250cmFjdCwgbm90IHB1YmxpYyBjb25zdHJ1Y3QgQVBJLCBzbyBpdCBpcyBleGVtcHQgZnJvbSB0aGUgSlNJSVxuICogcmVzdHJpY3Rpb25zIHRoZSByZXN0IG9mIGBzcmMvYCBmb2xsb3dzLlxuICovXG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG4vKiogQ3VycmVudCB7QGxpbmsgQWRhcHRlck1hbmlmZXN0LnZlcnNpb259LiBCdW1wIG9uIGFueSBicmVha2luZyBzaGFwZSBjaGFuZ2UuICovXG5leHBvcnQgY29uc3QgQURBUFRFUl9NQU5JRkVTVF9WRVJTSU9OID0gMTtcblxuLyoqXG4gKiBEaXJlY3Rvcnkgd3JpdHRlbiBpbnNpZGUgYGRpc3REaXJgIChgLm5leHRgKSwgbWF0Y2hpbmcgdGhlIGV4aXN0aW5nXG4gKiBgY2RrLW5leHRqcy1pbml0LWNhY2hlYCBjb252ZW50aW9uLlxuICovXG5leHBvcnQgY29uc3QgQURBUFRFUl9ESVJfTkFNRSA9IFwiY2RrLW5leHRqcy1hZGFwdGVyXCI7XG5cbi8qKlxuICogRGVwbG95bWVudCByb290IGluc2lkZSB7QGxpbmsgQURBUFRFUl9ESVJfTkFNRX06IHRoZSBzdGFnZWQgdW5pb24gb2YgZXZlcnlcbiAqIHNoaXBwZWQgb3V0cHV0J3MgdHJhY2VkIGBhc3NldHNgLCBrZXllZCBieSByZXBvLXJvb3QtcmVsYXRpdmUgcGF0aC4gVGhpcyBpc1xuICogd2hhdCByZXBsYWNlcyBgb3V0cHV0OiBcInN0YW5kYWxvbmVcImAuXG4gKi9cbmV4cG9ydCBjb25zdCBTVEFHSU5HX0RJUl9OQU1FID0gXCJhcHBcIjtcblxuLyoqXG4gKiBQYXJlbnQgb2YgdGhlIHBlci1ncm91cCBkZXBsb3ltZW50IHJvb3RzLCB1c2VkIGluc3RlYWQgb2ZcbiAqIHtAbGluayBTVEFHSU5HX0RJUl9OQU1FfSB3aGVuIGBmdW5jdGlvbkdyb3Vwc2Agc3BsaXRzIHRoZSBhcHA6IGVhY2ggZ3JvdXAgaXNcbiAqIHN0YWdlZCBhdCBgPGRpc3REaXI+L2Nkay1uZXh0anMtYWRhcHRlci9ncm91cHMvPG5hbWU+L2AsIGluY2x1ZGluZyB0aGUgaW1wbGljaXRcbiAqIGBkZWZhdWx0YCBvbmUuXG4gKlxuICogU3BsaXR0aW5nIGdldHMgaXRzIG93biBzdWJ0cmVlIHJhdGhlciB0aGFuIHJldXNpbmcgYGFwcC9gIGZvciB0aGUgZGVmYXVsdCBncm91cFxuICogc28gdGhhdCBhIHRyZWUgbGVmdCBvdmVyIGZyb20gYSBidWlsZCB3aXRoIGRpZmZlcmVudCBncm91cGluZyBjYW4gbmV2ZXIgYmVcbiAqIG1pc3Rha2VuIGZvciB0aGlzIGJ1aWxkJ3MsIGFuZCBzbyBgZHVgIG9uIGVpdGhlciBkaXJlY3RvcnkgYW5zd2VycyBcImhvdyBiaWcgaXNcbiAqIHRoZSB0aGluZyBJIGRlcGxveVwiIHdpdGhvdXQgcXVhbGlmaWNhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEdST1VQU19ESVJfTkFNRSA9IFwiZ3JvdXBzXCI7XG5cbi8qKlxuICogV2hpY2ggZ3JvdXAgdGhlIHJ1bm5pbmcgZnVuY3Rpb24gKmlzKi4gU2V0IHBlciBMYW1iZGEgYXQgc3ludGgsIHJlYWQgYnkgdGhlXG4gKiBydW50aW1lIG9ubHkgdG8gbWFrZSBhIG1pc3JvdXRlIHNheSBzbzsgc2VlIGBvd25lZFJvdXRlRXJyb3JgLlxuICovXG5leHBvcnQgY29uc3QgRlVOQ1RJT05fR1JPVVBfRU5WX1ZBUiA9IFwiQ0RLX05FWFRKU19GVU5DVElPTl9HUk9VUFwiO1xuXG4vKipcbiAqIFRoZSBnbG9iYWwgdGhlIGNhY2hlIGhhbmRsZXIgKGBzcmMvYWRhcHRlci9zMy1jYWNoZS1oYW5kbGVyLnRzYCkgcmVnaXN0ZXJzIGl0c1xuICogQ2xvdWRGcm9udCBpbnZhbGlkYXRpb24gaG9vayB1bmRlciwgYW5kIHRoZSBydW50aW1lIChgY29yZS50c2ApIGNhbGxzLiBBIGdsb2JhbFxuICogcmF0aGVyIHRoYW4gYW4gaW1wb3J0LCBiZWNhdXNlIHRoZSBjYWNoZSBoYW5kbGVyIGlzIGEgc2VwYXJhdGUgYnVuZGxlIHRoYXRcbiAqIE5leHQuanMgbG9hZHMgaXRzZWxmOiB0aGUgdHdvIHNoYXJlIGEgcHJvY2Vzcywgbm90IGEgbW9kdWxlIGdyYXBoLlxuICovXG5leHBvcnQgY29uc3QgUkVWQUxJREFURURfUEFHRV9IT09LID0gU3ltYm9sLmZvcihcbiAgXCJjZGstbmV4dGpzLmludmFsaWRhdGVSZXZhbGlkYXRlZFBhZ2VcIixcbik7XG5cbi8qKlxuICogRGlyZWN0b3J5IGluc2lkZSB7QGxpbmsgQURBUFRFUl9ESVJfTkFNRX0gaG9sZGluZyBvbmUgZGVwbG95bWVudCByb290LCByZWxhdGl2ZVxuICogYW5kIFBPU0lYLiBgdW5kZWZpbmVkYCBtZWFucyBcIm5vdCBzcGxpdHRpbmdcIiwgd2hpY2ggaXMgaXRzIG93biBsYXlvdXQgcmF0aGVyXG4gKiB0aGFuIGEgZ3JvdXAgbmFtZWQgYGRlZmF1bHRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBTdGFnaW5nRGlyTmFtZShncm91cD86IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBncm91cCA9PT0gdW5kZWZpbmVkID8gU1RBR0lOR19ESVJfTkFNRSA6IGAke0dST1VQU19ESVJfTkFNRX0vJHtncm91cH1gO1xufVxuXG4vKioge0BsaW5rIEFkYXB0ZXJNYW5pZmVzdH0sIHdyaXR0ZW4gaW5zaWRlIHtAbGluayBBREFQVEVSX0RJUl9OQU1FfS4gKi9cbmV4cG9ydCBjb25zdCBNQU5JRkVTVF9GSUxFX05BTUUgPSBcIm1hbmlmZXN0Lmpzb25cIjtcblxuLyoqXG4gKiBUaGUgZW50cnlwb2ludHMgdGhlIHJ1bnRpbWUgcmVuZGVycyBhIDQwNCBvciBhIDUwMCB3aXRoLCBpbiB0aGUgb3JkZXIgaXRcbiAqIHRyaWVzIHRoZW0sIGFuZCBgL19lcnJvcmAsIHRoZSBsYXN0IHJlc29ydCBmb3IgYm90aC4gQmVmb3JlIGJhc2VQYXRoLlxuICovXG5leHBvcnQgY29uc3QgU1RBVFVTX1BBR0VfU1VGRklYRVMgPSB7XG4gIDQwNDogW1wiL19ub3QtZm91bmRcIiwgXCIvNDA0XCJdLFxuICA1MDA6IFtcIi81MDBcIl0sXG4gIGZhbGxiYWNrOiBcIi9fZXJyb3JcIixcbn07XG5cbi8qKlxuICogRXZlcnkge0BsaW5rIFNUQVRVU19QQUdFX1NVRkZJWEVTfSBwYWdlOiBBcHAgUm91dGVyJ3MgYC9fbm90LWZvdW5kYCwgUGFnZXNcbiAqIFJvdXRlcidzIGAvNDA0YCBhbmQgYC81MDBgLCBhbmQgYC9fZXJyb3JgLiBUaGUgcnVudGltZSBtYXkgcmVuZGVyIGFueSByZXF1ZXN0XG4gKiB3aXRoIHRoZW0sIHdoZXJldmVyIGl0IGxhbmRlZCwgc28gZXZlcnkgZnVuY3Rpb24gZ3JvdXAgc3RhZ2VzIHRoZW1cbiAqIChgY29sbGVjdEdyb3VwU3RhZ2luZ1BsYW5gKSBhbmQgbm8gVVJMIGhhcyB0byBiZSByb3V0ZWQgdG8gdGhlbS5cbiAqL1xuZXhwb3J0IGNvbnN0IEVSUk9SX1BBR0VfU1VGRklYRVMgPSBbXG4gIC4uLlNUQVRVU19QQUdFX1NVRkZJWEVTWzQwNF0sXG4gIC4uLlNUQVRVU19QQUdFX1NVRkZJWEVTWzUwMF0sXG4gIFNUQVRVU19QQUdFX1NVRkZJWEVTLmZhbGxiYWNrLFxuXTtcblxuLyoqXG4gKiBSZXNlcnZlZCBrZXkgaW5zaWRlIHRoZSBzdGFnaW5nIHRyZWUgdGhhdCBjZGstbmV4dGpzJ3Mgb3duIGJ1bmRsZWQgcnVudGltZVxuICogZmlsZXMgYXJlIGNvcGllZCB0byBhdCBzeW50aCAoTGFtYmRhIGhhbmRsZXJcbiAqIGBjZGstbmV4dGpzLXJ1bnRpbWUvbGFtYmRhLmhhbmRsZXJgKS4gUmVzZXJ2ZWQgYmVjYXVzZSBhIHJlcG8tcm9vdC1yZWxhdGl2ZVxuICogYXNzZXQga2V5IGNvdWxkIG90aGVyd2lzZSBjb2xsaWRlIHdpdGggaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBSVU5USU1FX0RJUl9OQU1FID0gXCJjZGstbmV4dGpzLXJ1bnRpbWVcIjtcblxuLyoqXG4gKiBUaGUgZmlsZSwgbmV4dCB0byB0aGUgbWFuaWZlc3QgaW4ge0BsaW5rIFJVTlRJTUVfRElSX05BTUV9LCB0aGF0IGxpc3RzXG4gKiBgcHVibGljL2Agb24gZXZlcnkgdHlwZSBidXQgYE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc2A6IGEgSlNPTiBhcnJheSBvZlxuICogYC9gLXNlcGFyYXRlZCBwYXRocyByZWxhdGl2ZSB0byBgcHVibGljL2AsIGFzIGByZWFkUHVibGljRmlsZXNgIHJldHVybnMgdGhlbS5cbiAqIFN5bnRoIHdyaXRlcyBpdCBhZnRlciB0aGUgYnVpbGQgY29tbWFuZCAoc28gYHBvc3RidWlsZGAgb3V0cHV0IGlzIGxpc3RlZClcbiAqIGJlY2F1c2UgdGhvc2UgZGVwbG95bWVudCBwYWNrYWdlcyBkbyBub3QgY2FycnkgYHB1YmxpYy9gIGl0c2VsZjsgdGhlIHJ1bnRpbWVcbiAqIHNlcnZlcyBhIGxpc3RlZCBmaWxlIGZyb20gUzMuIFRoZSBSZWdpb25hbENvbnRhaW5lcnMgaW1hZ2UgY29waWVzIGBwdWJsaWMvYFxuICogaW4gYW5kIGhhcyBubyBzdWNoIGZpbGUuXG4gKi9cbmV4cG9ydCBjb25zdCBQVUJMSUNfRklMRVNfRklMRV9OQU1FID0gXCJwdWJsaWMtZmlsZXMuanNvblwiO1xuXG4vKipcbiAqIFdoZXJlIHRoZSBydW50aW1lIHJlYWRzIHtAbGluayBBZGFwdGVyTWFuaWZlc3R9IGZyb20sIGdpdmVuIHRoZSBkZXBsb3ltZW50XG4gKiByb290LiBTeW50aCBjb3BpZXMgYG1hbmlmZXN0Lmpzb25gIGluIG5leHQgdG8gdGhlIGJ1bmRsZWQgc2hlbGxzIHJhdGhlciB0aGFuXG4gKiBsZWF2aW5nIGl0IGF0IGl0cyBidWlsZC10aW1lIGxvY2F0aW9uIChgPGRpc3REaXI+L2Nkay1uZXh0anMtYWRhcHRlci9gLCBvbmVcbiAqIGxldmVsICphYm92ZSogdGhlIHN0YWdpbmcgdHJlZSkgc28gdGhhdCBhIHNpbmdsZSBhc3NldCBpcyBzZWxmLWRlc2NyaWJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXBsb3llZE1hbmlmZXN0UGF0aChkZXBsb3ltZW50Um9vdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oZGVwbG95bWVudFJvb3QsIFJVTlRJTUVfRElSX05BTUUsIE1BTklGRVNUX0ZJTEVfTkFNRSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlck1hbmlmZXN0IHtcbiAgcmVhZG9ubHkgdmVyc2lvbjogMTtcbiAgcmVhZG9ubHkgYnVpbGRJZDogc3RyaW5nO1xuICAvKipcbiAgICogRnJvbSB0aGUgZGVwbG95bWVudCByb290IHRvIHRoZSBOZXh0LmpzIHByb2plY3QgZGlyLiBcIlwiIHdoZW4gdGhlIGFwcCBpcyBhdFxuICAgKiB0aGUgcmVwbyByb290LlxuICAgKlxuICAgKiAqKlRoZSBydW50aW1lIGBjaGRpcmBzIGhlcmUgYXQgY29sZCBzdGFydCwgYW5kIHRoYXQgaXMgbG9hZC1iZWFyaW5nLioqIE5leHRcbiAgICogaW5saW5lcyBgX19ORVhUX1JFTEFUSVZFX1BST0pFQ1RfRElSID0gcmVsYXRpdmUoYnVpbGRDd2QsIHByb2plY3REaXIpYCBpbnRvXG4gICAqIGV2ZXJ5IGVudHJ5cG9pbnQgYXQgYnVpbGQgdGltZSAoYG5leHQvZGlzdC9idWlsZC9kZWZpbmUtZW52LmpzYCksIGFuZCB0aGVcbiAgICogYnVpbHQgY29kZSByZXNvbHZlcyBpdCBhcyBgam9pbihwcm9jZXNzLmN3ZCgpLCByZWxhdGl2ZVByb2plY3REaXIpYCB0byBmaW5kXG4gICAqIGByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAsIHRoZSBwcmVyZW5kZXIgbWFuaWZlc3QsIGFuZCB0aGUgYXBwJ3Mgb3duXG4gICAqIGZpbGVzLiBgcmVxdWVzdE1ldGEucmVsYXRpdmVQcm9qZWN0RGlyYCBvdmVycmlkZXMgaXQgaW5cbiAgICogYG5leHQvZGlzdC9zZXJ2ZXIvcm91dGUtbW9kdWxlcy9yb3V0ZS1tb2R1bGUuanNgIGJ1dCAqKm5vdCoqIGluXG4gICAqIGBhcHAtcGFnZS1ydW50aW1lLmpzYCwgd2hpY2ggcGFzc2VzIHRoZSBpbmxpbmVkIHZhbHVlIHRocm91Z2ggYXMgdGhlIHJlbmRlclxuICAgKiBgZGlyYCDigJQgc28gYHByb2Nlc3MuY3dkKClgIGlzIHRoZSBvbmx5IG1lY2hhbmlzbSB0aGF0IGNvdmVycyBldmVyeVxuICAgKiBlbnRyeXBvaW50IHR5cGUuIGBidWlsZC1vdXRwdXRzLnRzYCBhc3NlcnRzIGBidWlsZEN3ZCA9PT0gcHJvamVjdERpcmAgdG9cbiAgICoga2VlcCB0aGUgaW5saW5lZCB2YWx1ZSBgXCJcImAgYW5kIHRoaXMgZmllbGQgdGhlIHdob2xlIGFuc3dlci5cbiAgICovXG4gIHJlYWRvbmx5IHJlbGF0aXZlUHJvamVjdERpcjogc3RyaW5nO1xuICByZWFkb25seSBjb25maWc6IEFkYXB0ZXJNYW5pZmVzdENvbmZpZztcbiAgLyoqIGBjdHgucm91dGluZ2AgdmVyYmF0aW0sIGluY2x1ZGluZyBgbWlkZGxld2FyZU1hdGNoZXJzYC4gKi9cbiAgcmVhZG9ubHkgcm91dGluZzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEV2ZXJ5IHBhdGhuYW1lIGByZXNvbHZlUm91dGVzYCBpcyBhbGxvd2VkIHRvIG1hdGNoOiB0aGUge0BsaW5rIGVudHJ5cG9pbnRzfVxuICAgKiBrZXlzIHBsdXMge0BsaW5rIHN0YXRpY0ZpbGVzfS4gU29ydGVkIGFuZCBkZWR1cGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aG5hbWVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFJvdXRlICp0ZW1wbGF0ZSogKGAvYmxvZy9bc2x1Z11gKSDihpIgZW50cnlwb2ludC4gS2V5cyBhcmUgYmFzZVBhdGgtIGFuZFxuICAgKiBsb2NhbGUtcHJlZml4ZWQgZXhhY3RseSBhcyBgcmVzb2x2ZVJvdXRlc2AgcmVwb3J0cyBgcmVzb2x2ZWRQYXRobmFtZWAsIHNvXG4gICAqIHRoZSBsb29rdXAgaXMgYSBwbGFpbiBpbmRleCB3aXRoIG5vIG5vcm1hbGl6YXRpb24uXG4gICAqXG4gICAqIEluY2x1ZGVzIGR5bmFtaWMgKnByZXJlbmRlciogdGVtcGxhdGVzIChub3RhYmx5IFBhZ2VzIFJvdXRlclxuICAgKiBgL19uZXh0L2RhdGEvPGJ1aWxkSWQ+Lzxsb2NhbGU+L2Jsb2cvW3NsdWddLmpzb25gKSBtYXBwZWQgdG8gdGhlIGVudHJ5cG9pbnRcbiAgICogb2YgdGhlIHJvdXRlIHRoYXQgb3ducyB0aGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgZW50cnlwb2ludHM6IFJlY29yZDxzdHJpbmcsIEFkYXB0ZXJFbnRyeXBvaW50PjtcbiAgcmVhZG9ubHkgbWlkZGxld2FyZTogQWRhcHRlck1pZGRsZXdhcmUgfCBudWxsO1xuICAvKipcbiAgICogUGF0aG5hbWUg4oaSIHJlcG8tcm9vdC1yZWxhdGl2ZSBQT1NJWCBrZXkgb2YgdGhlIGZpbGUgdG8gc2VydmUuXG4gICAqXG4gICAqIEEgbWFwIHJhdGhlciB0aGFuIGEgbGlzdCBvZiBwYXRobmFtZXMgYmVjYXVzZSB0aGUgdHdvIGFyZSBub3QgZGVyaXZhYmxlIGZyb21cbiAgICogZWFjaCBvdGhlcjogYC9mYXZpY29uLmljb2AgaXMgYDxkaXN0RGlyPi9zZXJ2ZXIvYXBwL2Zhdmljb24uaWNvLmJvZHlgLCBgLzQwNGBcbiAgICogaXMgYDxkaXN0RGlyPi9zZXJ2ZXIvcGFnZXMvNDA0Lmh0bWxgLCBhbmQgYSBmdWxseS1zdGF0aWMgUGFnZXMgUm91dGVyIHJvdXRlXG4gICAqIGlzIGA8ZGlzdERpcj4vc2VydmVyL3BhZ2VzLzxyb3V0ZT4uaHRtbGAuIFRoZSBydW50aW1lIHNlcnZlcyB0aGVzZSBpdHNlbGYg4oCUXG4gICAqIGBOZXh0anNTdGF0aWNBc3NldHNgIG9ubHkgdXBsb2FkcyBgPGRpc3REaXI+L3N0YXRpY2AgYW5kIGBwdWJsaWNgLCBzbyBub3RoaW5nXG4gICAqIGluIGZyb250IG9mIHRoZSBjb21wdXRlIGNhbiBhbnN3ZXIgdGhlbS5cbiAgICpcbiAgICogV2hldGhlciB0aGUgZmlsZSBpcyBwcmVzZW50IGluIHRoZSBkZXBsb3ltZW50IHBhY2thZ2UgZGVwZW5kcyBvbiB0aGVcbiAgICogZGVwbG95bWVudCB0eXBlOyBzZWUgYHN0YWdlU2VydmVkU3RhdGljRmlsZXNgIGluIGBidWlsZC1vdXRwdXRzLnRzYC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRpY0ZpbGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKipcbiAgICogR3JvdXAgbmFtZSDihpIgdGhlIHJvdXRlIHRlbXBsYXRlcyB0aGF0IGdyb3VwJ3MgZGVwbG95bWVudCBwYWNrYWdlIGhvbGRzLFxuICAgKiBpbmNsdWRpbmcgdGhlIGltcGxpY2l0IGBkZWZhdWx0YC4gQWJzZW50IHdoZW4gYGZ1bmN0aW9uR3JvdXBzYCBpcyBub3QgdXNlZC5cbiAgICpcbiAgICogRXZlcnkgZ3JvdXAgZ2V0cyB0aGUgKnNhbWUqIG1hbmlmZXN0LCBiZWNhdXNlIHJvdXRpbmcgaXMgaWRlbnRpY2FsIGluIGFsbCBvZlxuICAgKiB0aGVtOiBtaWRkbGV3YXJlLCByZWRpcmVjdHMgYW5kIHJld3JpdGVzIGFyZSBkdXBsaWNhdGVkIGJ5IGRlc2lnbiwgYW5kIGFcbiAgICogZ3JvdXAgaGFzIHRvIGJlIGFibGUgdG8gcmVzb2x2ZSBhIHBhdGhuYW1lIGl0IGRvZXMgbm90IG93biBpbiBvcmRlciB0byBzYXkgc29cbiAgICogcmF0aGVyIHRoYW4gY3Jhc2ggb24gYSBtaXNzaW5nIGZpbGUuIFRoaXMgZmllbGQgaXMgd2hhdCBsZXRzIGl0IHNheSBzby5cbiAgICovXG4gIHJlYWRvbmx5IGdyb3Vwcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqXG4gICAqIEV2ZXJ5IGJlaGF2aW9yIHRoZSBlZGdlIHJvdXRlcyBhIG5vbi1kZWZhdWx0IGdyb3VwIG9uLCBtb3N0IHNwZWNpZmljIGZpcnN0XG4gICAqIChgR3JvdXBCZWhhdmlvcmAgaW4gYGZ1bmN0aW9uLWdyb3Vwcy50c2ApLiBQcmVzZW50IGV4YWN0bHkgd2hlblxuICAgKiB7QGxpbmsgZ3JvdXBzfSBpcy4gUmVjb3JkZWQgYnkgdGhlIGFzc2lnbm1lbnQgcmF0aGVyIHRoYW4gcmVjb21wdXRlZCBhdFxuICAgKiBzeW50aCwgc28gdGhlIGJlaGF2aW9ycyBkZXBsb3llZCBhcmUgdGhlIG9uZXMgaXQgY2hlY2tlZC5cbiAgICovXG4gIHJlYWRvbmx5IGJlaGF2aW9ycz86IHsgZ3JvdXA6IHN0cmluZzsgcm91dGU6IHN0cmluZzsgcGF0dGVybjogc3RyaW5nIH1bXTtcbiAgLyoqXG4gICAqIFRoZSBgZnVuY3Rpb25Hcm91cHNgIHRoZSBidWlsZCB3YXMgc3BsaXQgYnkgKG5hbWUgYW5kIHJvdXRlcywgYXMgcGFzc2VkIGluXG4gICAqIGBDREtfTkVYVEpTX0ZVTkNUSU9OX0dST1VQU2ApLCBwcmVzZW50IGV4YWN0bHkgd2hlbiB7QGxpbmsgZ3JvdXBzfSBpcy4gU3ludGhcbiAgICogY29tcGFyZXMgaXQgd2l0aCBpdHMgb3duIHByb3BzIHRvIGNhdGNoIGEgc3RhbGUgb3IgaGFuZC1ydW4gYnVpbGQuXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkdyb3Vwcz86IHsgbmFtZTogc3RyaW5nOyByb3V0ZXM6IHN0cmluZ1tdIH1bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVyTWFuaWZlc3RDb25maWcge1xuICByZWFkb25seSBiYXNlUGF0aDogc3RyaW5nO1xuICByZWFkb25seSB0cmFpbGluZ1NsYXNoOiBib29sZWFuO1xuICByZWFkb25seSBhc3NldFByZWZpeDogc3RyaW5nO1xuICAvKipcbiAgICogYGRpc3REaXJgIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IGRpciDigJQgYC5uZXh0YCB1bmxlc3MgY29uZmlndXJlZC4gUE9TSVguXG4gICAqIFRoZSBydW50aW1lIHJlYWRzIGByZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvbmAgZnJvbSBoZXJlIGZvciB0aGUgaW1hZ2VcbiAgICogb3B0aW1pemVyJ3MgY29uZmlnLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzdERpcjogc3RyaW5nO1xuICAvKipcbiAgICogYG5leHQuY29uZmlnYCBgY29tcHJlc3NgLiBUaGUgcnVudGltZSBnemlwcyBzdHJlYW1lZCByZXNwb25zZXMgaXRzZWxmXG4gICAqIChuZWl0aGVyIEFQSSBHYXRld2F5IGluIFNUUkVBTSBtb2RlIG5vciBDbG91ZEZyb250IGNhbiksIHNvIGhvbm9yaW5nIHRoaXNcbiAgICogaXMgb24gdXMuXG4gICAqL1xuICByZWFkb25seSBjb21wcmVzczogYm9vbGVhbjtcbiAgLyoqXG4gICAqIGBuZXh0LmNvbmZpZ2AgYGdlbmVyYXRlRXRhZ3NgLiBIb25vcmVkIGZvciB0aGUgZmlsZXMgdGhlIHJ1bnRpbWUgc2VydmVzXG4gICAqIGl0c2VsZiwgYXMgYG5leHQgc3RhcnRgIGRvZXMgKGBzZXJ2ZVN0YXRpY2AncyBgZXRhZ2Agb3B0aW9uKS5cbiAgICovXG4gIHJlYWRvbmx5IGdlbmVyYXRlRXRhZ3M6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBgUmVzb2x2ZVJvdXRlc1BhcmFtc1tcImkxOG5cIl1gLXNoYXBlZCwgbmFycm93ZXIgdGhhbiBOZXh0Q29uZmlnQ29tcGxldGUuXG4gICAqIGBudWxsYCB3aGVuIHRoZSBhcHAgY29uZmlndXJlcyBubyBgaTE4bmAuXG4gICAqL1xuICByZWFkb25seSBpMThuOiB1bmtub3duIHwgbnVsbDtcbiAgLyoqXG4gICAqIGBuZXh0LmNvbmZpZ2AgYGRlcGxveW1lbnRJZGAgKG9yIGBORVhUX0RFUExPWU1FTlRfSURgKSwgcmVkdWNlZCB0byB0aGVcbiAgICogY2hhcmFjdGVycyBzYWZlIGluIGFuIFMzIGtleSBwcmVmaXggYW5kIGEgRHluYW1vREIgcGFydGl0aW9uIGtleSDigJQgYC9gIGluXG4gICAqIHBhcnRpY3VsYXIgd291bGQgc3BsaXQgdGhlIHByZWZpeCBgcHJ1bmUtY2FjaGUtYnVja2V0LnRzYCBtYXRjaGVzIG9uLiBgXCJcImBcbiAgICogd2hlbiB0aGUgYXBwIHNldHMgbm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGxveW1lbnRJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBBZGFwdGVyRW50cnlwb2ludFR5cGUgPVxuICBcImFwcC1wYWdlXCIgfCBcImFwcC1yb3V0ZVwiIHwgXCJwYWdlXCIgfCBcInBhZ2UtYXBpXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRhcHRlckVudHJ5cG9pbnQge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKiogUmVwby1yb290LXJlbGF0aXZlIFBPU0lYIGtleSBpbnNpZGUgdGhlIHN0YWdpbmcgdHJlZS4gTmV2ZXIgYWJzb2x1dGUuICovXG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHR5cGU6IEFkYXB0ZXJFbnRyeXBvaW50VHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBZGFwdGVyTWlkZGxld2FyZSB7XG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG4gIC8qKiBSZXBvLXJvb3QtcmVsYXRpdmUgUE9TSVgga2V5IGluc2lkZSB0aGUgc3RhZ2luZyB0cmVlLiBOZXZlciBhYnNvbHV0ZS4gKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcbn1cbiJdfQ==
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { MiddlewareInvoker } from "./dispatch";
|
|
2
|
+
import { AdapterMiddleware } from "./manifest";
|
|
3
|
+
/**
|
|
4
|
+
* The adapter-facing export of `.next/server/middleware.js`.
|
|
5
|
+
*
|
|
6
|
+
* Web-style (`Request` in, `Response` out) even for `runtime: "nodejs"` — see
|
|
7
|
+
* `next/dist/build/templates/middleware.js`. Next's own `next-server` reaches
|
|
8
|
+
* the same module through its *default* export with an internal
|
|
9
|
+
* `{ handler, request, page }` options object; that path is not ours.
|
|
10
|
+
*/
|
|
11
|
+
export type MiddlewareHandler = (request: Request, ctx: MiddlewarePerRequest) => Promise<Response>;
|
|
12
|
+
/** Per-request context handed to {@link MiddlewareHandler}. */
|
|
13
|
+
export interface MiddlewarePerRequest {
|
|
14
|
+
readonly waitUntil?: (promise: Promise<unknown>) => void;
|
|
15
|
+
readonly signal?: AbortSignal;
|
|
16
|
+
}
|
|
17
|
+
export interface MiddlewareRunnerOptions {
|
|
18
|
+
readonly middleware: AdapterMiddleware;
|
|
19
|
+
/**
|
|
20
|
+
* Absolute path the manifest's repo-root-relative `filePath`s resolve against
|
|
21
|
+
* — the staging tree root, which is `process.cwd()` at runtime.
|
|
22
|
+
*/
|
|
23
|
+
readonly root: string;
|
|
24
|
+
/** Test seam, and step 4's hook for a preloaded handler. */
|
|
25
|
+
readonly loadHandler?: () => Promise<MiddlewareHandler>;
|
|
26
|
+
}
|
|
27
|
+
export declare class MiddlewareRunner {
|
|
28
|
+
private readonly options;
|
|
29
|
+
/**
|
|
30
|
+
* Memoized across requests: loading `.next/server/middleware.js` pulls in the
|
|
31
|
+
* app's whole middleware closure, which is cold-start-expensive and must not
|
|
32
|
+
* be repeated. Held as the promise so concurrent first requests share it.
|
|
33
|
+
*/
|
|
34
|
+
private handler?;
|
|
35
|
+
constructor(options: MiddlewareRunnerOptions);
|
|
36
|
+
/**
|
|
37
|
+
* The `invokeMiddleware` callback for one request. Created per request because
|
|
38
|
+
* `waitUntil` / `signal` are per-request while the loaded
|
|
39
|
+
* handler is not.
|
|
40
|
+
*/
|
|
41
|
+
invokerFor(perRequest?: MiddlewarePerRequest): MiddlewareInvoker;
|
|
42
|
+
private load;
|
|
43
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MiddlewareRunner = void 0;
|
|
4
|
+
/* eslint-disable import/no-extraneous-dependencies */
|
|
5
|
+
/**
|
|
6
|
+
* The middleware runner: the `invokeMiddleware` callback `resolveRoutes` calls,
|
|
7
|
+
* and nothing more.
|
|
8
|
+
*
|
|
9
|
+
* Deliberately small. A middleware runner would normally own two more jobs,
|
|
10
|
+
* deciding whether middleware runs and interpreting what it returned, but
|
|
11
|
+
* neither is done here:
|
|
12
|
+
*
|
|
13
|
+
* - **Matcher evaluation** (does this path run middleware?). `resolveRoutes`
|
|
14
|
+
* already checks `routes.middlewareMatchers` before calling us, and Next
|
|
15
|
+
* builds those matchers with the `x-prerender-revalidate` `missing` rule
|
|
16
|
+
* injected, so ISR revalidation requests skip user middleware too.
|
|
17
|
+
* Re-checking here would duplicate that and risk disagreeing with it.
|
|
18
|
+
* - **The `x-middleware-*` header protocol** (what did middleware ask for?).
|
|
19
|
+
* `@next/routing` exports `responseToMiddlewareResult`, which translates
|
|
20
|
+
* `x-middleware-override-headers` / `x-middleware-request-*` /
|
|
21
|
+
* `x-middleware-rewrite` / `location` / `x-middleware-refresh` into a
|
|
22
|
+
* `MiddlewareResult`. The previous implementation parsed these headers by
|
|
23
|
+
* hand and drifted from `next start`.
|
|
24
|
+
*/
|
|
25
|
+
const node_path_1 = require("node:path");
|
|
26
|
+
const routing_1 = require("@next/routing");
|
|
27
|
+
const load_module_1 = require("./load-module");
|
|
28
|
+
/**
|
|
29
|
+
* Methods that cannot carry a body. `new Request(url, { body })` throws for
|
|
30
|
+
* these, so the stream is simply not attached.
|
|
31
|
+
*/
|
|
32
|
+
const BODYLESS_METHODS = new Set(["GET", "HEAD"]);
|
|
33
|
+
class MiddlewareRunner {
|
|
34
|
+
options;
|
|
35
|
+
/**
|
|
36
|
+
* Memoized across requests: loading `.next/server/middleware.js` pulls in the
|
|
37
|
+
* app's whole middleware closure, which is cold-start-expensive and must not
|
|
38
|
+
* be repeated. Held as the promise so concurrent first requests share it.
|
|
39
|
+
*/
|
|
40
|
+
handler;
|
|
41
|
+
constructor(options) {
|
|
42
|
+
this.options = options;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* The `invokeMiddleware` callback for one request. Created per request because
|
|
46
|
+
* `waitUntil` / `signal` are per-request while the loaded
|
|
47
|
+
* handler is not.
|
|
48
|
+
*/
|
|
49
|
+
invokerFor(perRequest = {}) {
|
|
50
|
+
return async ({ url, headers, requestBody, method }) => {
|
|
51
|
+
const handler = await this.load();
|
|
52
|
+
const hasBody = !BODYLESS_METHODS.has(method.toUpperCase());
|
|
53
|
+
const request = new Request(url, {
|
|
54
|
+
method,
|
|
55
|
+
headers,
|
|
56
|
+
body: hasBody ? requestBody : undefined,
|
|
57
|
+
// Required by undici whenever the body is a stream, and absent from
|
|
58
|
+
// TypeScript's `RequestInit`.
|
|
59
|
+
...(hasBody ? { duplex: "half" } : {}),
|
|
60
|
+
});
|
|
61
|
+
let response;
|
|
62
|
+
try {
|
|
63
|
+
response = await handler(request, perRequest);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
// Middleware runs on every request, so an unattributed stack here is
|
|
67
|
+
// expensive to debug. Rethrown, not swallowed: the caller turns it into
|
|
68
|
+
// a 500, the same as `next start`.
|
|
69
|
+
throw new Error(`Middleware (${this.options.middleware.filePath}) threw while ` +
|
|
70
|
+
`handling ${method} ${url.pathname}`, { cause: error });
|
|
71
|
+
}
|
|
72
|
+
// Mutates `headers` in place as well as returning the result, which is
|
|
73
|
+
// why dispatch hands it a copy it owns.
|
|
74
|
+
return {
|
|
75
|
+
...(0, routing_1.responseToMiddlewareResult)(response, headers, url),
|
|
76
|
+
response,
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
load() {
|
|
81
|
+
if (!this.handler) {
|
|
82
|
+
const handler = this.options.loadHandler
|
|
83
|
+
? this.options.loadHandler()
|
|
84
|
+
: loadMiddlewareHandler(this.options.root, this.options.middleware);
|
|
85
|
+
this.handler = handler;
|
|
86
|
+
// Forgotten on failure: middleware runs on every request, so a cached
|
|
87
|
+
// rejection is the whole app answering 500 for the life of the sandbox over
|
|
88
|
+
// a load failure that may have nothing to do with the module (EMFILE under
|
|
89
|
+
// a cold-start burst, an allocation near the memory limit).
|
|
90
|
+
handler.catch(() => {
|
|
91
|
+
if (this.handler === handler) {
|
|
92
|
+
this.handler = undefined;
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return this.handler;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.MiddlewareRunner = MiddlewareRunner;
|
|
100
|
+
/** `require` the built middleware module and pull `handler` off it. */
|
|
101
|
+
async function loadMiddlewareHandler(root, middleware) {
|
|
102
|
+
const absolute = (0, node_path_1.join)(root, middleware.filePath);
|
|
103
|
+
let exports;
|
|
104
|
+
try {
|
|
105
|
+
exports = await (0, load_module_1.loadBuiltModule)(absolute);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
throw new Error(`Could not load middleware from "${absolute}" (manifest filePath ` +
|
|
109
|
+
`"${middleware.filePath}"). The deployment package is incomplete.`, { cause: error });
|
|
110
|
+
}
|
|
111
|
+
return (0, load_module_1.requireFunctionExport)(exports, "handler", () => `Middleware at "${absolute}"`);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL21pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0RBQXNEO0FBQ3REOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gseUNBQWlDO0FBQ2pDLDJDQUEyRDtBQUUzRCwrQ0FBdUU7QUFpQ3ZFOzs7R0FHRztBQUNILE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUVsRCxNQUFhLGdCQUFnQjtJQVFTO0lBUHBDOzs7O09BSUc7SUFDSyxPQUFPLENBQThCO0lBRTdDLFlBQW9DLE9BQWdDO1FBQWhDLFlBQU8sR0FBUCxPQUFPLENBQXlCO0lBQUcsQ0FBQztJQUV4RTs7OztPQUlHO0lBQ0ksVUFBVSxDQUFDLGFBQW1DLEVBQUU7UUFDckQsT0FBTyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1lBQ3JELE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xDLE1BQU0sT0FBTyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQzVELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDL0IsTUFBTTtnQkFDTixPQUFPO2dCQUNQLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUztnQkFDdkMsb0VBQW9FO2dCQUNwRSw4QkFBOEI7Z0JBQzlCLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDeEIsQ0FBQyxDQUFDO1lBRWxCLElBQUksUUFBa0IsQ0FBQztZQUN2QixJQUFJLENBQUM7Z0JBQ0gsUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixxRUFBcUU7Z0JBQ3JFLHdFQUF3RTtnQkFDeEUsbUNBQW1DO2dCQUNuQyxNQUFNLElBQUksS0FBSyxDQUNiLGVBQWUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxnQkFBZ0I7b0JBQzdELFlBQVksTUFBTSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEVBQUUsRUFDdEMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQ2pCLENBQUM7WUFDSixDQUFDO1lBRUQsdUVBQXVFO1lBQ3ZFLHdDQUF3QztZQUN4QyxPQUFPO2dCQUNMLEdBQUcsSUFBQSxvQ0FBMEIsRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQztnQkFDckQsUUFBUTthQUNULENBQUM7UUFDSixDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sSUFBSTtRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXO2dCQUN0QyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUU7Z0JBQzVCLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3ZCLHNFQUFzRTtZQUN0RSw0RUFBNEU7WUFDNUUsMkVBQTJFO1lBQzNFLDREQUE0RDtZQUM1RCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDakIsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRSxDQUFDO29CQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztnQkFDM0IsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUFyRUQsNENBcUVDO0FBRUQsdUVBQXVFO0FBQ3ZFLEtBQUssVUFBVSxxQkFBcUIsQ0FDbEMsSUFBWSxFQUNaLFVBQTZCO0lBRTdCLE1BQU0sUUFBUSxHQUFHLElBQUEsZ0JBQUksRUFBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pELElBQUksT0FBZ0IsQ0FBQztJQUNyQixJQUFJLENBQUM7UUFDSCxPQUFPLEdBQUcsTUFBTSxJQUFBLDZCQUFlLEVBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksS0FBSyxDQUNiLG1DQUFtQyxRQUFRLHVCQUF1QjtZQUNoRSxJQUFJLFVBQVUsQ0FBQyxRQUFRLDJDQUEyQyxFQUNwRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FDakIsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLElBQUEsbUNBQXFCLEVBQzFCLE9BQU8sRUFDUCxTQUFTLEVBQ1QsR0FBRyxFQUFFLENBQUMsa0JBQWtCLFFBQVEsR0FBRyxDQUNwQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuLyoqXG4gKiBUaGUgbWlkZGxld2FyZSBydW5uZXI6IHRoZSBgaW52b2tlTWlkZGxld2FyZWAgY2FsbGJhY2sgYHJlc29sdmVSb3V0ZXNgIGNhbGxzLFxuICogYW5kIG5vdGhpbmcgbW9yZS5cbiAqXG4gKiBEZWxpYmVyYXRlbHkgc21hbGwuIEEgbWlkZGxld2FyZSBydW5uZXIgd291bGQgbm9ybWFsbHkgb3duIHR3byBtb3JlIGpvYnMsXG4gKiBkZWNpZGluZyB3aGV0aGVyIG1pZGRsZXdhcmUgcnVucyBhbmQgaW50ZXJwcmV0aW5nIHdoYXQgaXQgcmV0dXJuZWQsIGJ1dFxuICogbmVpdGhlciBpcyBkb25lIGhlcmU6XG4gKlxuICogLSAqKk1hdGNoZXIgZXZhbHVhdGlvbioqIChkb2VzIHRoaXMgcGF0aCBydW4gbWlkZGxld2FyZT8pLiBgcmVzb2x2ZVJvdXRlc2BcbiAqICAgYWxyZWFkeSBjaGVja3MgYHJvdXRlcy5taWRkbGV3YXJlTWF0Y2hlcnNgIGJlZm9yZSBjYWxsaW5nIHVzLCBhbmQgTmV4dFxuICogICBidWlsZHMgdGhvc2UgbWF0Y2hlcnMgd2l0aCB0aGUgYHgtcHJlcmVuZGVyLXJldmFsaWRhdGVgIGBtaXNzaW5nYCBydWxlXG4gKiAgIGluamVjdGVkLCBzbyBJU1IgcmV2YWxpZGF0aW9uIHJlcXVlc3RzIHNraXAgdXNlciBtaWRkbGV3YXJlIHRvby5cbiAqICAgUmUtY2hlY2tpbmcgaGVyZSB3b3VsZCBkdXBsaWNhdGUgdGhhdCBhbmQgcmlzayBkaXNhZ3JlZWluZyB3aXRoIGl0LlxuICogLSAqKlRoZSBgeC1taWRkbGV3YXJlLSpgIGhlYWRlciBwcm90b2NvbCoqICh3aGF0IGRpZCBtaWRkbGV3YXJlIGFzayBmb3I/KS5cbiAqICAgYEBuZXh0L3JvdXRpbmdgIGV4cG9ydHMgYHJlc3BvbnNlVG9NaWRkbGV3YXJlUmVzdWx0YCwgd2hpY2ggdHJhbnNsYXRlc1xuICogICBgeC1taWRkbGV3YXJlLW92ZXJyaWRlLWhlYWRlcnNgIC8gYHgtbWlkZGxld2FyZS1yZXF1ZXN0LSpgIC9cbiAqICAgYHgtbWlkZGxld2FyZS1yZXdyaXRlYCAvIGBsb2NhdGlvbmAgLyBgeC1taWRkbGV3YXJlLXJlZnJlc2hgIGludG8gYVxuICogICBgTWlkZGxld2FyZVJlc3VsdGAuIFRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBwYXJzZWQgdGhlc2UgaGVhZGVycyBieVxuICogICBoYW5kIGFuZCBkcmlmdGVkIGZyb20gYG5leHQgc3RhcnRgLlxuICovXG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgcmVzcG9uc2VUb01pZGRsZXdhcmVSZXN1bHQgfSBmcm9tIFwiQG5leHQvcm91dGluZ1wiO1xuaW1wb3J0IHsgTWlkZGxld2FyZUludm9rZXIgfSBmcm9tIFwiLi9kaXNwYXRjaFwiO1xuaW1wb3J0IHsgbG9hZEJ1aWx0TW9kdWxlLCByZXF1aXJlRnVuY3Rpb25FeHBvcnQgfSBmcm9tIFwiLi9sb2FkLW1vZHVsZVwiO1xuaW1wb3J0IHsgQWRhcHRlck1pZGRsZXdhcmUgfSBmcm9tIFwiLi9tYW5pZmVzdFwiO1xuXG4vKipcbiAqIFRoZSBhZGFwdGVyLWZhY2luZyBleHBvcnQgb2YgYC5uZXh0L3NlcnZlci9taWRkbGV3YXJlLmpzYC5cbiAqXG4gKiBXZWItc3R5bGUgKGBSZXF1ZXN0YCBpbiwgYFJlc3BvbnNlYCBvdXQpIGV2ZW4gZm9yIGBydW50aW1lOiBcIm5vZGVqc1wiYCDigJQgc2VlXG4gKiBgbmV4dC9kaXN0L2J1aWxkL3RlbXBsYXRlcy9taWRkbGV3YXJlLmpzYC4gTmV4dCdzIG93biBgbmV4dC1zZXJ2ZXJgIHJlYWNoZXNcbiAqIHRoZSBzYW1lIG1vZHVsZSB0aHJvdWdoIGl0cyAqZGVmYXVsdCogZXhwb3J0IHdpdGggYW4gaW50ZXJuYWxcbiAqIGB7IGhhbmRsZXIsIHJlcXVlc3QsIHBhZ2UgfWAgb3B0aW9ucyBvYmplY3Q7IHRoYXQgcGF0aCBpcyBub3Qgb3Vycy5cbiAqL1xuZXhwb3J0IHR5cGUgTWlkZGxld2FyZUhhbmRsZXIgPSAoXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4gIGN0eDogTWlkZGxld2FyZVBlclJlcXVlc3QsXG4pID0+IFByb21pc2U8UmVzcG9uc2U+O1xuXG4vKiogUGVyLXJlcXVlc3QgY29udGV4dCBoYW5kZWQgdG8ge0BsaW5rIE1pZGRsZXdhcmVIYW5kbGVyfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWlkZGxld2FyZVBlclJlcXVlc3Qge1xuICByZWFkb25seSB3YWl0VW50aWw/OiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZDtcbiAgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlkZGxld2FyZVJ1bm5lck9wdGlvbnMge1xuICByZWFkb25seSBtaWRkbGV3YXJlOiBBZGFwdGVyTWlkZGxld2FyZTtcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdGhlIG1hbmlmZXN0J3MgcmVwby1yb290LXJlbGF0aXZlIGBmaWxlUGF0aGBzIHJlc29sdmUgYWdhaW5zdFxuICAgKiDigJQgdGhlIHN0YWdpbmcgdHJlZSByb290LCB3aGljaCBpcyBgcHJvY2Vzcy5jd2QoKWAgYXQgcnVudGltZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3Q6IHN0cmluZztcbiAgLyoqIFRlc3Qgc2VhbSwgYW5kIHN0ZXAgNCdzIGhvb2sgZm9yIGEgcHJlbG9hZGVkIGhhbmRsZXIuICovXG4gIHJlYWRvbmx5IGxvYWRIYW5kbGVyPzogKCkgPT4gUHJvbWlzZTxNaWRkbGV3YXJlSGFuZGxlcj47XG59XG5cbi8qKlxuICogTWV0aG9kcyB0aGF0IGNhbm5vdCBjYXJyeSBhIGJvZHkuIGBuZXcgUmVxdWVzdCh1cmwsIHsgYm9keSB9KWAgdGhyb3dzIGZvclxuICogdGhlc2UsIHNvIHRoZSBzdHJlYW0gaXMgc2ltcGx5IG5vdCBhdHRhY2hlZC5cbiAqL1xuY29uc3QgQk9EWUxFU1NfTUVUSE9EUyA9IG5ldyBTZXQoW1wiR0VUXCIsIFwiSEVBRFwiXSk7XG5cbmV4cG9ydCBjbGFzcyBNaWRkbGV3YXJlUnVubmVyIHtcbiAgLyoqXG4gICAqIE1lbW9pemVkIGFjcm9zcyByZXF1ZXN0czogbG9hZGluZyBgLm5leHQvc2VydmVyL21pZGRsZXdhcmUuanNgIHB1bGxzIGluIHRoZVxuICAgKiBhcHAncyB3aG9sZSBtaWRkbGV3YXJlIGNsb3N1cmUsIHdoaWNoIGlzIGNvbGQtc3RhcnQtZXhwZW5zaXZlIGFuZCBtdXN0IG5vdFxuICAgKiBiZSByZXBlYXRlZC4gSGVsZCBhcyB0aGUgcHJvbWlzZSBzbyBjb25jdXJyZW50IGZpcnN0IHJlcXVlc3RzIHNoYXJlIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVyPzogUHJvbWlzZTxNaWRkbGV3YXJlSGFuZGxlcj47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogTWlkZGxld2FyZVJ1bm5lck9wdGlvbnMpIHt9XG5cbiAgLyoqXG4gICAqIFRoZSBgaW52b2tlTWlkZGxld2FyZWAgY2FsbGJhY2sgZm9yIG9uZSByZXF1ZXN0LiBDcmVhdGVkIHBlciByZXF1ZXN0IGJlY2F1c2VcbiAgICogYHdhaXRVbnRpbGAgLyBgc2lnbmFsYCBhcmUgcGVyLXJlcXVlc3Qgd2hpbGUgdGhlIGxvYWRlZFxuICAgKiBoYW5kbGVyIGlzIG5vdC5cbiAgICovXG4gIHB1YmxpYyBpbnZva2VyRm9yKHBlclJlcXVlc3Q6IE1pZGRsZXdhcmVQZXJSZXF1ZXN0ID0ge30pOiBNaWRkbGV3YXJlSW52b2tlciB7XG4gICAgcmV0dXJuIGFzeW5jICh7IHVybCwgaGVhZGVycywgcmVxdWVzdEJvZHksIG1ldGhvZCB9KSA9PiB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgdGhpcy5sb2FkKCk7XG4gICAgICBjb25zdCBoYXNCb2R5ID0gIUJPRFlMRVNTX01FVEhPRFMuaGFzKG1ldGhvZC50b1VwcGVyQ2FzZSgpKTtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1cmwsIHtcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBib2R5OiBoYXNCb2R5ID8gcmVxdWVzdEJvZHkgOiB1bmRlZmluZWQsXG4gICAgICAgIC8vIFJlcXVpcmVkIGJ5IHVuZGljaSB3aGVuZXZlciB0aGUgYm9keSBpcyBhIHN0cmVhbSwgYW5kIGFic2VudCBmcm9tXG4gICAgICAgIC8vIFR5cGVTY3JpcHQncyBgUmVxdWVzdEluaXRgLlxuICAgICAgICAuLi4oaGFzQm9keSA/IHsgZHVwbGV4OiBcImhhbGZcIiB9IDoge30pLFxuICAgICAgfSBhcyBSZXF1ZXN0SW5pdCk7XG5cbiAgICAgIGxldCByZXNwb25zZTogUmVzcG9uc2U7XG4gICAgICB0cnkge1xuICAgICAgICByZXNwb25zZSA9IGF3YWl0IGhhbmRsZXIocmVxdWVzdCwgcGVyUmVxdWVzdCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBNaWRkbGV3YXJlIHJ1bnMgb24gZXZlcnkgcmVxdWVzdCwgc28gYW4gdW5hdHRyaWJ1dGVkIHN0YWNrIGhlcmUgaXNcbiAgICAgICAgLy8gZXhwZW5zaXZlIHRvIGRlYnVnLiBSZXRocm93biwgbm90IHN3YWxsb3dlZDogdGhlIGNhbGxlciB0dXJucyBpdCBpbnRvXG4gICAgICAgIC8vIGEgNTAwLCB0aGUgc2FtZSBhcyBgbmV4dCBzdGFydGAuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTWlkZGxld2FyZSAoJHt0aGlzLm9wdGlvbnMubWlkZGxld2FyZS5maWxlUGF0aH0pIHRocmV3IHdoaWxlIGAgK1xuICAgICAgICAgICAgYGhhbmRsaW5nICR7bWV0aG9kfSAke3VybC5wYXRobmFtZX1gLFxuICAgICAgICAgIHsgY2F1c2U6IGVycm9yIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIE11dGF0ZXMgYGhlYWRlcnNgIGluIHBsYWNlIGFzIHdlbGwgYXMgcmV0dXJuaW5nIHRoZSByZXN1bHQsIHdoaWNoIGlzXG4gICAgICAvLyB3aHkgZGlzcGF0Y2ggaGFuZHMgaXQgYSBjb3B5IGl0IG93bnMuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5yZXNwb25zZVRvTWlkZGxld2FyZVJlc3VsdChyZXNwb25zZSwgaGVhZGVycywgdXJsKSxcbiAgICAgICAgcmVzcG9uc2UsXG4gICAgICB9O1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGxvYWQoKTogUHJvbWlzZTxNaWRkbGV3YXJlSGFuZGxlcj4ge1xuICAgIGlmICghdGhpcy5oYW5kbGVyKSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5vcHRpb25zLmxvYWRIYW5kbGVyXG4gICAgICAgID8gdGhpcy5vcHRpb25zLmxvYWRIYW5kbGVyKClcbiAgICAgICAgOiBsb2FkTWlkZGxld2FyZUhhbmRsZXIodGhpcy5vcHRpb25zLnJvb3QsIHRoaXMub3B0aW9ucy5taWRkbGV3YXJlKTtcbiAgICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAvLyBGb3Jnb3R0ZW4gb24gZmFpbHVyZTogbWlkZGxld2FyZSBydW5zIG9uIGV2ZXJ5IHJlcXVlc3QsIHNvIGEgY2FjaGVkXG4gICAgICAvLyByZWplY3Rpb24gaXMgdGhlIHdob2xlIGFwcCBhbnN3ZXJpbmcgNTAwIGZvciB0aGUgbGlmZSBvZiB0aGUgc2FuZGJveCBvdmVyXG4gICAgICAvLyBhIGxvYWQgZmFpbHVyZSB0aGF0IG1heSBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgbW9kdWxlIChFTUZJTEUgdW5kZXJcbiAgICAgIC8vIGEgY29sZC1zdGFydCBidXJzdCwgYW4gYWxsb2NhdGlvbiBuZWFyIHRoZSBtZW1vcnkgbGltaXQpLlxuICAgICAgaGFuZGxlci5jYXRjaCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhbmRsZXIgPT09IGhhbmRsZXIpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyO1xuICB9XG59XG5cbi8qKiBgcmVxdWlyZWAgdGhlIGJ1aWx0IG1pZGRsZXdhcmUgbW9kdWxlIGFuZCBwdWxsIGBoYW5kbGVyYCBvZmYgaXQuICovXG5hc3luYyBmdW5jdGlvbiBsb2FkTWlkZGxld2FyZUhhbmRsZXIoXG4gIHJvb3Q6IHN0cmluZyxcbiAgbWlkZGxld2FyZTogQWRhcHRlck1pZGRsZXdhcmUsXG4pOiBQcm9taXNlPE1pZGRsZXdhcmVIYW5kbGVyPiB7XG4gIGNvbnN0IGFic29sdXRlID0gam9pbihyb290LCBtaWRkbGV3YXJlLmZpbGVQYXRoKTtcbiAgbGV0IGV4cG9ydHM6IHVua25vd247XG4gIHRyeSB7XG4gICAgZXhwb3J0cyA9IGF3YWl0IGxvYWRCdWlsdE1vZHVsZShhYnNvbHV0ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENvdWxkIG5vdCBsb2FkIG1pZGRsZXdhcmUgZnJvbSBcIiR7YWJzb2x1dGV9XCIgKG1hbmlmZXN0IGZpbGVQYXRoIGAgK1xuICAgICAgICBgXCIke21pZGRsZXdhcmUuZmlsZVBhdGh9XCIpLiBUaGUgZGVwbG95bWVudCBwYWNrYWdlIGlzIGluY29tcGxldGUuYCxcbiAgICAgIHsgY2F1c2U6IGVycm9yIH0sXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVxdWlyZUZ1bmN0aW9uRXhwb3J0PE1pZGRsZXdhcmVIYW5kbGVyPihcbiAgICBleHBvcnRzLFxuICAgIFwiaGFuZGxlclwiLFxuICAgICgpID0+IGBNaWRkbGV3YXJlIGF0IFwiJHthYnNvbHV0ZX1cImAsXG4gICk7XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|