cdk-nextjs 0.6.2 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +2404 -2723
- package/.jsii.tabl.json +1 -1
- package/API.md +1681 -1930
- package/CLAUDE.md +2 -1
- package/README.md +429 -130
- package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +148 -169
- package/assets/lambdas/redeploy-stage/redeploy-stage.lambda/index.js +875 -0
- package/docs/adapter-runtime.md +185 -0
- package/docs/breaking-changes.md +667 -4
- package/docs/caching-guide.md +156 -112
- package/docs/cdk-nextjs-cfn-exec-policy.json +2 -1
- package/docs/development-guide.md +1 -1
- package/docs/harness-coverage.md +598 -0
- package/docs/init-cache-deployment.md +32 -1
- package/docs/next-build-output-guide.md +30 -20
- package/examples/README.md +5 -1
- package/lib/adapter/__fixtures__/app-playground-base-path.json +4926 -0
- package/lib/adapter/__fixtures__/app-playground.json +4917 -0
- package/lib/adapter/__fixtures__/pages-i18n.json +1728 -0
- package/lib/adapter/adapter.mjs +1551 -185
- package/lib/adapter/adapter.test.js +106 -0
- package/lib/adapter/aws-cache-store.d.ts +489 -0
- package/lib/adapter/aws-cache-store.js +1004 -0
- package/lib/adapter/aws-cache-store.test.d.ts +1 -0
- package/lib/adapter/aws-cache-store.test.js +361 -0
- package/lib/adapter/build-outputs.d.ts +80 -0
- package/lib/adapter/build-outputs.js +857 -0
- package/lib/adapter/build-outputs.test.d.ts +1 -0
- package/lib/adapter/build-outputs.test.js +863 -0
- package/lib/adapter/cache-handler.d.ts +9 -2
- package/lib/adapter/cache-handler.js +72 -96
- package/lib/adapter/cache-handler.mjs +18956 -17774
- package/lib/adapter/cache-handler.test.js +263 -31
- package/lib/adapter/cache-kinds.d.ts +32 -0
- package/lib/adapter/cache-kinds.js +35 -0
- package/lib/adapter/cache-kinds.test.d.ts +1 -0
- package/lib/adapter/cache-kinds.test.js +69 -0
- package/lib/adapter/cache-utils.d.ts +90 -0
- package/lib/adapter/cache-utils.js +199 -4
- package/lib/adapter/cache-utils.test.d.ts +1 -0
- package/lib/adapter/cache-utils.test.js +179 -0
- package/lib/adapter/function-groups.d.ts +215 -0
- package/lib/adapter/function-groups.js +1099 -0
- package/lib/adapter/function-groups.test.d.ts +1 -0
- package/lib/adapter/function-groups.test.js +743 -0
- package/lib/adapter/init-cache.d.ts +6 -0
- package/lib/adapter/init-cache.js +245 -0
- package/lib/adapter/init-cache.test.d.ts +1 -0
- package/lib/adapter/init-cache.test.js +137 -0
- package/lib/adapter/local-file-cache-handler.d.ts +23 -0
- package/lib/adapter/local-file-cache-handler.js +52 -1
- package/lib/adapter/memory-cache-handler.d.ts +26 -17
- package/lib/adapter/memory-cache-handler.js +32 -50
- package/lib/adapter/memory-cache-handler.test.js +105 -85
- package/lib/adapter/s3-cache-handler.d.ts +179 -40
- package/lib/adapter/s3-cache-handler.js +807 -277
- package/lib/adapter/s3-cache-handler.test.js +1186 -31
- package/lib/adapter/use-cache-common.d.ts +90 -0
- package/lib/adapter/use-cache-common.js +250 -0
- package/lib/adapter/use-cache-common.test.d.ts +1 -0
- package/lib/adapter/use-cache-common.test.js +646 -0
- package/lib/adapter/use-cache-default-handler.d.ts +24 -0
- package/lib/adapter/use-cache-default-handler.js +90 -0
- package/lib/adapter/use-cache-default-handler.mjs +38645 -0
- package/lib/adapter/use-cache-handlers.test.d.ts +1 -0
- package/lib/adapter/use-cache-handlers.test.js +349 -0
- package/lib/adapter/use-cache-remote-handler.d.ts +26 -0
- package/lib/adapter/use-cache-remote-handler.js +186 -0
- package/lib/{image-optimization/handler.mjs → adapter/use-cache-remote-handler.mjs} +33572 -38798
- package/lib/generated-structs/OptionalNextjsApiProps.d.ts +59 -0
- package/lib/generated-structs/OptionalNextjsApiProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsCacheProps.d.ts +15 -6
- package/lib/generated-structs/OptionalNextjsCacheProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +25 -11
- package/lib/generated-structs/OptionalNextjsContainersProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +31 -9
- package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsPostDeployProps.d.ts +8 -0
- package/lib/generated-structs/OptionalNextjsPostDeployProps.js +1 -1
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +6 -4
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.js +1 -1
- package/lib/index.d.ts +6 -7
- package/lib/index.js +2 -4
- package/lib/lambdas/post-deploy/prune-cache-bucket.d.ts +7 -3
- package/lib/lambdas/post-deploy/prune-cache-bucket.js +57 -71
- package/lib/lambdas/post-deploy/prune-cache-bucket.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-cache-bucket.test.js +114 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.js +23 -31
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +71 -0
- package/lib/lambdas/post-deploy/prune-s3.d.ts +14 -5
- package/lib/lambdas/post-deploy/prune-s3.js +41 -12
- package/lib/lambdas/post-deploy/prune-s3.test.js +97 -18
- package/lib/lambdas/redeploy-stage/redeploy-stage-function.d.ts +13 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage-function.js +55 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.d.ts +24 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.js +68 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.d.ts +20 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.js +24 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.test.d.ts +1 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.test.js +93 -0
- package/lib/nextjs-api.d.ts +102 -18
- package/lib/nextjs-api.js +338 -38
- package/lib/nextjs-api.test.js +537 -1
- package/lib/nextjs-build/global-containers.Dockerfile +15 -10
- package/lib/nextjs-build/nextjs-build.d.ts +339 -63
- package/lib/nextjs-build/nextjs-build.js +684 -327
- package/lib/nextjs-build/nextjs-build.test.d.ts +1 -0
- package/lib/nextjs-build/nextjs-build.test.js +412 -0
- package/lib/nextjs-build/patch-fetch.js +1 -1
- package/lib/nextjs-build/patch-fetch.test.js +166 -11
- package/lib/nextjs-build/regional-containers.Dockerfile +17 -10
- package/lib/nextjs-cache.d.ts +82 -4
- package/lib/nextjs-cache.js +186 -10
- package/lib/nextjs-cache.test.js +176 -1
- package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +21 -8
- package/lib/nextjs-compute/nextjs-compute-base-props.js +41 -1
- package/lib/nextjs-compute/nextjs-compute-base-props.test.d.ts +1 -0
- package/lib/nextjs-compute/nextjs-compute-base-props.test.js +44 -0
- package/lib/nextjs-compute/nextjs-containers.d.ts +19 -0
- package/lib/nextjs-compute/nextjs-containers.js +57 -20
- package/lib/nextjs-compute/nextjs-functions.d.ts +122 -7
- package/lib/nextjs-compute/nextjs-functions.js +113 -67
- package/lib/nextjs-compute/nextjs-functions.test.d.ts +1 -0
- package/lib/nextjs-compute/nextjs-functions.test.js +99 -0
- package/lib/nextjs-distribution.d.ts +194 -23
- package/lib/nextjs-distribution.js +535 -62
- package/lib/nextjs-distribution.test.d.ts +1 -0
- package/lib/nextjs-distribution.test.js +697 -0
- package/lib/nextjs-post-deploy.d.ts +13 -5
- package/lib/nextjs-post-deploy.js +13 -10
- package/lib/nextjs-post-deploy.test.d.ts +1 -0
- package/lib/nextjs-post-deploy.test.js +34 -0
- package/lib/nextjs-static-assets.d.ts +17 -4
- package/lib/nextjs-static-assets.js +22 -5
- package/lib/root-constructs/nextjs-base-construct.d.ts +102 -58
- package/lib/root-constructs/nextjs-base-construct.js +139 -47
- package/lib/root-constructs/nextjs-global-containers.d.ts +18 -20
- package/lib/root-constructs/nextjs-global-containers.js +20 -71
- package/lib/root-constructs/nextjs-global-functions.d.ts +26 -28
- package/lib/root-constructs/nextjs-global-functions.js +52 -70
- package/lib/root-constructs/nextjs-regional-containers.d.ts +18 -5
- package/lib/root-constructs/nextjs-regional-containers.js +8 -15
- package/lib/root-constructs/nextjs-regional-functions.d.ts +22 -18
- package/lib/root-constructs/nextjs-regional-functions.js +8 -26
- package/lib/runtime/api-gateway-path.d.ts +34 -0
- package/lib/runtime/api-gateway-path.js +71 -0
- package/lib/runtime/api-gateway-path.test.d.ts +1 -0
- package/lib/runtime/api-gateway-path.test.js +65 -0
- package/lib/runtime/case-redirect.d.ts +22 -0
- package/lib/runtime/case-redirect.js +63 -0
- package/lib/runtime/case-redirect.test.d.ts +1 -0
- package/lib/runtime/case-redirect.test.js +32 -0
- package/lib/runtime/core.d.ts +234 -0
- package/lib/runtime/core.js +1216 -0
- package/lib/runtime/core.test.d.ts +1 -0
- package/lib/runtime/core.test.js +1686 -0
- package/lib/runtime/deployment-root.d.ts +13 -0
- package/lib/runtime/deployment-root.js +29 -0
- package/lib/runtime/dispatch.d.ts +331 -0
- package/lib/runtime/dispatch.js +751 -0
- package/lib/runtime/dispatch.test.d.ts +1 -0
- package/lib/runtime/dispatch.test.js +853 -0
- package/lib/runtime/entrypoints.d.ts +57 -0
- package/lib/runtime/entrypoints.js +115 -0
- package/lib/runtime/http/abort-signal.d.ts +6 -0
- package/lib/runtime/http/abort-signal.js +19 -0
- package/lib/runtime/http/abort-signal.test.d.ts +1 -0
- package/lib/runtime/http/abort-signal.test.js +49 -0
- package/lib/runtime/http/node-server.d.ts +38 -0
- package/lib/runtime/http/node-server.js +99 -0
- package/lib/runtime/http/node-server.test.d.ts +1 -0
- package/lib/runtime/http/node-server.test.js +96 -0
- package/lib/runtime/http/node-sink.d.ts +16 -0
- package/lib/runtime/http/node-sink.js +48 -0
- package/lib/runtime/http/node-sink.test.d.ts +1 -0
- package/lib/runtime/http/node-sink.test.js +66 -0
- package/lib/runtime/http/request.d.ts +62 -0
- package/lib/runtime/http/request.js +134 -0
- package/lib/runtime/http/request.test.d.ts +1 -0
- package/lib/runtime/http/request.test.js +103 -0
- package/lib/runtime/http/response.d.ts +77 -0
- package/lib/runtime/http/response.js +229 -0
- package/lib/runtime/http/response.test.d.ts +1 -0
- package/lib/runtime/http/response.test.js +178 -0
- package/lib/runtime/http/sink.d.ts +73 -0
- package/lib/runtime/http/sink.js +188 -0
- package/lib/runtime/http/sink.test.d.ts +1 -0
- package/lib/runtime/http/sink.test.js +257 -0
- package/lib/runtime/image-utils.d.ts +78 -0
- package/lib/runtime/image-utils.js +129 -0
- package/lib/runtime/image-utils.test.d.ts +1 -0
- package/lib/runtime/image-utils.test.js +237 -0
- package/lib/runtime/image.d.ts +76 -0
- package/lib/runtime/image.js +296 -0
- package/lib/runtime/image.test.d.ts +1 -0
- package/lib/runtime/image.test.js +405 -0
- package/lib/runtime/lambda-event.d.ts +4 -0
- package/lib/runtime/lambda-event.js +113 -0
- package/lib/runtime/lambda-event.test.d.ts +1 -0
- package/lib/runtime/lambda-event.test.js +119 -0
- package/lib/runtime/lambda.mjs +41600 -0
- package/lib/runtime/load-module.d.ts +8 -0
- package/lib/runtime/load-module.js +35 -0
- package/lib/runtime/manifest.d.ts +215 -0
- package/lib/runtime/manifest.js +118 -0
- package/lib/runtime/middleware.d.ts +43 -0
- package/lib/runtime/middleware.js +113 -0
- package/lib/runtime/middleware.test.d.ts +1 -0
- package/lib/runtime/middleware.test.js +259 -0
- package/lib/runtime/next-modules.d.ts +71 -0
- package/lib/runtime/next-modules.js +144 -0
- package/lib/runtime/next-modules.test.d.ts +1 -0
- package/lib/runtime/next-modules.test.js +34 -0
- package/lib/runtime/public-files.d.ts +32 -0
- package/lib/runtime/public-files.js +117 -0
- package/lib/runtime/public-files.test.d.ts +1 -0
- package/lib/runtime/public-files.test.js +97 -0
- package/lib/runtime/server.mjs +41593 -0
- package/lib/runtime/static-files.d.ts +50 -0
- package/lib/runtime/static-files.js +266 -0
- package/lib/runtime/static-files.test.d.ts +1 -0
- package/lib/runtime/static-files.test.js +118 -0
- package/lib/runtime/util.d.ts +28 -0
- package/lib/runtime/util.js +79 -0
- package/lib/utils/base-path.d.ts +106 -13
- package/lib/utils/base-path.js +254 -41
- package/lib/utils/base-path.test.js +219 -51
- package/lib/utils/get-architecture.d.ts +7 -8
- package/lib/utils/get-architecture.js +12 -13
- package/lib/utils/zip-directory.d.ts +14 -0
- package/lib/utils/zip-directory.js +121 -0
- package/lib/utils/zip-directory.test.d.ts +1 -0
- package/lib/utils/zip-directory.test.js +99 -0
- package/package.json +22 -3
- package/scripts/capture-adapter-fixture.mjs +325 -0
- package/scripts/e2e-deploy.sh +398 -0
- package/scripts/e2e-harness/README.md +707 -0
- package/scripts/e2e-harness/app.js +370 -0
- package/scripts/e2e-harness/common.sh +249 -0
- package/scripts/e2e-harness/screen.mjs +302 -0
- package/scripts/e2e-harness/stage-proxy.mjs +145 -0
- package/scripts/e2e-harness/type-filters.mjs +47 -0
- package/scripts/e2e-logs.sh +75 -0
- package/scripts/e2e-offline.sh +91 -0
- package/scripts/e2e-sweep.sh +370 -0
- package/scripts/e2e-warm.sh +114 -0
- package/scripts/zero-config-build.mjs +418 -0
- package/docs/1k-concurrent-users-executions.png +0 -0
- package/docs/plans/adapter-runtime-release.md +0 -362
- package/docs/plans/phase-0-image-function-opt-in.md +0 -295
- package/lib/generated-structs/OptionalDockerImageFunctionProps.d.ts +0 -425
- package/lib/generated-structs/OptionalDockerImageFunctionProps.js +0 -3
- package/lib/image-optimization/handler-utils.d.ts +0 -34
- package/lib/image-optimization/handler-utils.js +0 -83
- package/lib/image-optimization/handler-utils.test.js +0 -178
- package/lib/nextjs-build/functions.Dockerfile +0 -31
- package/lib/nextjs-compute/nextjs-image-function.d.ts +0 -53
- package/lib/nextjs-compute/nextjs-image-function.js +0 -59
- package/lib/utils/experimental-flags.d.ts +0 -24
- package/lib/utils/experimental-flags.js +0 -30
- /package/lib/{image-optimization/handler-utils.test.d.ts → adapter/adapter.test.d.ts} +0 -0
|
@@ -5,7 +5,6 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
|
5
5
|
const constants_1 = require("../constants");
|
|
6
6
|
const nextjs_base_construct_1 = require("./nextjs-base-construct");
|
|
7
7
|
const nextjs_containers_1 = require("../nextjs-compute/nextjs-containers");
|
|
8
|
-
const nextjs_post_deploy_1 = require("../nextjs-post-deploy");
|
|
9
8
|
const base_path_1 = require("../utils/base-path");
|
|
10
9
|
/**
|
|
11
10
|
* Deploy Next.js load balanced with containers. Uses [Application Load
|
|
@@ -14,7 +13,7 @@ const base_path_1 = require("../utils/base-path");
|
|
|
14
13
|
* for containers.
|
|
15
14
|
*/
|
|
16
15
|
class NextjsRegionalContainers extends nextjs_base_construct_1.NextjsBaseConstruct {
|
|
17
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsRegionalContainers", version: "0.
|
|
16
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsRegionalContainers", version: "0.7.1" };
|
|
18
17
|
nextjsContainers;
|
|
19
18
|
nextjsPostDeploy;
|
|
20
19
|
/**
|
|
@@ -39,29 +38,23 @@ class NextjsRegionalContainers extends nextjs_base_construct_1.NextjsBaseConstru
|
|
|
39
38
|
return new nextjs_containers_1.NextjsContainers(this, "NextjsContainers", {
|
|
40
39
|
...this.computeBaseProps(),
|
|
41
40
|
alb: this.props.alb,
|
|
41
|
+
buildDirectory: this.props.buildDirectory,
|
|
42
42
|
ecsCluster: this.props.ecsCluster,
|
|
43
|
+
healthCheckPath: this.resolvedHealthCheckPath(this.props.healthCheckPath),
|
|
43
44
|
relativeEntrypointPath: this.nextjsBuild.relativePathToEntrypoint,
|
|
45
|
+
relativeProjectDir: this.nextjsBuild.relativeProjectDir,
|
|
44
46
|
overrides: {
|
|
45
47
|
...this.props.overrides?.nextjsContainers,
|
|
46
48
|
ecsClusterProps: {
|
|
47
49
|
...this.props.overrides?.nextjsContainers?.ecsClusterProps,
|
|
48
|
-
vpc
|
|
50
|
+
// Conditional for the same reason as the Functions' `vpc`: assigned
|
|
51
|
+
// unconditionally, an unset `vpc` prop would erase the override's.
|
|
52
|
+
...(this.baseProps.vpc ? { vpc: this.baseProps.vpc } : {}),
|
|
49
53
|
},
|
|
50
54
|
},
|
|
51
55
|
...this.props.overrides?.nextjsRegionalContainers?.nextjsContainerProps,
|
|
52
56
|
});
|
|
53
57
|
}
|
|
54
|
-
createNextjsPostDeploy() {
|
|
55
|
-
return new nextjs_post_deploy_1.NextjsPostDeploy(this, "NextjsPostDeploy", {
|
|
56
|
-
buildId: this.nextjsBuild.buildId,
|
|
57
|
-
cacheBucket: this.nextjsCache.cacheBucket,
|
|
58
|
-
revalidationTable: this.nextjsCache.revalidationTable,
|
|
59
|
-
staticAssetsBucket: this.nextjsStaticAssets.bucket,
|
|
60
|
-
staticAssetsKeyPrefix: this.nextjsStaticAssets.keyPrefix,
|
|
61
|
-
overrides: this.props.overrides?.nextjsPostDeploy,
|
|
62
|
-
...this.props.overrides?.nextjsRegionalContainers?.nextjsPostDeployProps,
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
58
|
}
|
|
66
59
|
exports.NextjsRegionalContainers = NextjsRegionalContainers;
|
|
67
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLXJlZ2lvbmFsLWNvbnRhaW5lcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1yZWdpb25hbC1jb250YWluZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFHQSw0Q0FBMEM7QUFDMUMsbUVBS2lDO0FBRWpDLDJFQUc2QztBQUU3QyxrREFBOEM7QUFvRDlDOzs7OztHQUtHO0FBQ0gsTUFBYSx3QkFBeUIsU0FBUSwyQ0FBbUI7O0lBQy9ELGdCQUFnQixDQUFtQjtJQUNuQyxnQkFBZ0IsQ0FBbUI7SUFDbkM7Ozs7OztPQU1HO0lBQ0gsSUFBSSxHQUFHO1FBQ0wsT0FBTyxJQUFBLG9CQUFRLEVBQ2IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FDcEMsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQWdDO0lBRTdDLFlBQ0UsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQW9DO1FBRXBDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxzQkFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFbkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxrQ0FBa0MsRUFBRSxDQUFDO1FBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBRU8sa0NBQWtDO1FBQ3hDLDRDQUE0QztRQUM1QyxPQUFPLElBQUksb0NBQWdCLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQ3BELEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQzFCLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUc7WUFDbkIsY0FBYyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYztZQUN6QyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO1lBQ2pDLGVBQWUsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUM7WUFDekUsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0I7WUFDakUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0I7WUFDdkQsU0FBUyxFQUFFO2dCQUNULEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCO2dCQUN6QyxlQUFlLEVBQUU7b0JBQ2YsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlO29CQUMxRCxvRUFBb0U7b0JBQ3BFLG1FQUFtRTtvQkFDbkUsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQzNEO2FBQ0Y7WUFDRCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLHdCQUF3QixFQUFFLG9CQUFvQjtTQUN4RSxDQUFDLENBQUM7SUFDTCxDQUFDOztBQXBESCw0REFxREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQ2x1c3RlciB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCI7XG5pbXBvcnQgeyBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgTmV4dGpzQmFzZUNvbnN0cnVjdE92ZXJyaWRlcyxcbiAgTmV4dGpzQmFzZU92ZXJyaWRlcyxcbiAgTmV4dGpzQmFzZUNvbnN0cnVjdCxcbiAgTmV4dGpzQmFzZVByb3BzLFxufSBmcm9tIFwiLi9uZXh0anMtYmFzZS1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IE9wdGlvbmFsTmV4dGpzQ29udGFpbmVyc1Byb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzQ29udGFpbmVyc1Byb3BzXCI7XG5pbXBvcnQge1xuICBOZXh0anNDb250YWluZXJzLFxuICBOZXh0anNDb250YWluZXJzT3ZlcnJpZGVzLFxufSBmcm9tIFwiLi4vbmV4dGpzLWNvbXB1dGUvbmV4dGpzLWNvbnRhaW5lcnNcIjtcbmltcG9ydCB7IE5leHRqc1Bvc3REZXBsb3kgfSBmcm9tIFwiLi4vbmV4dGpzLXBvc3QtZGVwbG95XCI7XG5pbXBvcnQgeyBqb2luUGF0aCB9IGZyb20gXCIuLi91dGlscy9iYXNlLXBhdGhcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNDb25zdHJ1Y3RPdmVycmlkZXMgZXh0ZW5kcyBOZXh0anNCYXNlQ29uc3RydWN0T3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgbmV4dGpzQ29udGFpbmVyUHJvcHM/OiBPcHRpb25hbE5leHRqc0NvbnRhaW5lcnNQcm9wcztcbn1cblxuLyoqXG4gKiBPdmVycmlkZXMgZm9yIGBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNgLiBPdmVycmlkZXMgYXJlIGxvd2VyIGxldmVsIHRoYW5cbiAqIHByb3BzIGFuZCBhcmUgcGFzc2VkIGRpcmVjdGx5IHRvIENESyBDb25zdHJ1Y3RzIGdpdmluZyB5b3UgbW9yZSBjb250cm9sLiBJdCdzXG4gKiByZWNvbW1lbmRlZCB0byB1c2UgY2F1dGlvbiBhbmQgcmV2aWV3IHNvdXJjZSBjb2RlIHNvIHlvdSBrbm93IGhvdyB0aGV5J3JlIHVzZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzT3ZlcnJpZGVzIGV4dGVuZHMgTmV4dGpzQmFzZU92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IG5leHRqc1JlZ2lvbmFsQ29udGFpbmVycz86IE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc0NvbnN0cnVjdE92ZXJyaWRlcztcbiAgcmVhZG9ubHkgbmV4dGpzQ29udGFpbmVycz86IE5leHRqc0NvbnRhaW5lcnNPdmVycmlkZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzUHJvcHMgZXh0ZW5kcyBOZXh0anNCYXNlUHJvcHMge1xuICAvKipcbiAgICogQnJpbmcgeW91ciBvd24gQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlci4gV2hlbiBwcm92aWRlZCwgaXQgaXMgcGFzc2VkXG4gICAqIGRpcmVjdGx5IHRvIGBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZEZhcmdhdGVTZXJ2aWNlYC4gSWYgdGhlIEFMQiBhbHJlYWR5XG4gICAqIGhhcyBhIGxpc3RlbmVyIG9uIHBvcnQgODAsIGNhbGwgYHJlbW92ZUF1dG9DcmVhdGVkTGlzdGVuZXIoKWAgYWZ0ZXJcbiAgICogY29uc3RydWN0aW9uIHRvIGF2b2lkIGRlcGxveW1lbnQgZmFpbHVyZXMuXG4gICAqL1xuICByZWFkb25seSBhbGI/OiBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXI7XG4gIC8qKlxuICAgKiBCcmluZyB5b3VyIG93biBFQ1MgY2x1c3Rlci4gV2hlbiBwcm92aWRlZCwgY2RrLW5leHRqcyB3aWxsIHNraXAgY3JlYXRpbmdcbiAgICogYSBuZXcgY2x1c3RlciBhbmQgVlBDIGdhdGV3YXkgZW5kcG9pbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgZWNzQ2x1c3Rlcj86IElDbHVzdGVyO1xuICAvKipcbiAgICogUGF0aCB0byBBUEkgUm91dGUgSGFuZGxlciB0aGF0IHJldHVybnMgSFRUUCAyMDAgdG8gZW5zdXJlIGNvbXB1dGUgaGVhbHRoLlxuICAgKiBVc2VkIGJ5IHRoZSBBTEIgdGFyZ2V0IGdyb3VwIGFuZCB0aGUgRUNTIGNvbnRhaW5lciBoZWFsdGggY2hlY2ssIGJvdGggb2ZcbiAgICogd2hpY2ggaGF2ZSB0byBiZSBhYmxlIHRvIHRlbGwgYSBydW5uaW5nIHRhc2sgZnJvbSBhIHdlZGdlZCBvbmUuXG4gICAqXG4gICAqIEdpdmUgdGhlIHBhdGggYXMgeW91ciBhcHAgcm91dGVzIGl0LCB3aXRob3V0IHlvdXIgYXBwJ3MgYGJhc2VQYXRoYCDigJRcbiAgICogY2RrLW5leHRqcyBhZGRzIHRoYXQgcHJlZml4LCBzaW5jZSBib3RoIGNoZWNrcyBoaXQgdGhlIGFwcCBkaXJlY3RseS5cbiAgICogQGV4YW1wbGUgXCIvYXBpL2hlYWx0aFwiXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIGFwaS9oZWFsdGgvcm91dGUudHNcbiAgICogaW1wb3J0IHsgTmV4dFJlc3BvbnNlIH0gZnJvbSBcIm5leHQvc2VydmVyXCI7XG4gICAqXG4gICAqIGV4cG9ydCBmdW5jdGlvbiBHRVQoKSB7XG4gICAqICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKFwiXCIpO1xuICAgKiB9XG4gICAqL1xuICByZWFkb25seSBoZWFsdGhDaGVja1BhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHByb3BzIG9mIGFueSBjb25zdHJ1Y3QuXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZXM/OiBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNPdmVycmlkZXM7XG59XG5cbi8qKlxuICogRGVwbG95IE5leHQuanMgbG9hZCBiYWxhbmNlZCB3aXRoIGNvbnRhaW5lcnMuIFVzZXMgW0FwcGxpY2F0aW9uIExvYWRcbiAqIEJhbGFuY2VyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWxhc3RpY2xvYWRiYWxhbmNpbmcvbGF0ZXN0L2FwcGxpY2F0aW9uL2ludHJvZHVjdGlvbi5odG1sKVxuICogZm9yIGxvYWQgYmFsYW5jaW5nIGFuZCBbQVdTIEZhcmdhdGVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL0FXU19GYXJnYXRlLmh0bWwpXG4gKiBmb3IgY29udGFpbmVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5leHRqc1JlZ2lvbmFsQ29udGFpbmVycyBleHRlbmRzIE5leHRqc0Jhc2VDb25zdHJ1Y3Qge1xuICBuZXh0anNDb250YWluZXJzOiBOZXh0anNDb250YWluZXJzO1xuICBuZXh0anNQb3N0RGVwbG95OiBOZXh0anNQb3N0RGVwbG95O1xuICAvKipcbiAgICogVGhlIEFMQiBmb3J3YXJkcyBldmVyeSBwYXRoIHRvIHRoZSBjb250YWluZXIgdW5jaGFuZ2VkLCBzbyB0aGUgYXBwIG9ubHlcbiAgICogYW5zd2VycyB1bmRlciBpdHMgb3duIGBiYXNlUGF0aGAuIGByZXNvbHZlZEJhc2VQYXRoYCBpcyBkZWxpYmVyYXRlbHkgbm90XG4gICAqIHVzZWQgaGVyZTogZm9yIHRoaXMgYE5leHRqc1R5cGVgIGl0IG9ubHkgbmFtZXNwYWNlcyB0aGUgUzMgYnVja2V0IGFuZCBoYXMgbm9cbiAgICogcm91dGluZyBtZWFuaW5nLCB3aGVyZWFzIHRoZSBhcHAncyBvd24gYGJhc2VQYXRoYCBpcyB3aGF0IHRoZSBjb250YWluZXJcbiAgICogc2VydmVzIGZyb20uXG4gICAqL1xuICBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGpvaW5QYXRoKFxuICAgICAgdGhpcy5uZXh0anNDb250YWluZXJzLnVybCxcbiAgICAgIHRoaXMubmV4dGpzQnVpbGQubmV4dENvbmZpZ0Jhc2VQYXRoLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNQcm9wcztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc1Byb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzLCBOZXh0anNUeXBlLlJFR0lPTkFMX0NPTlRBSU5FUlMpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIHRoaXMubmV4dGpzQ29udGFpbmVycyA9IHRoaXMuY3JlYXRlTmV4dGpzTG9hZEJhbGFuY2VkQ29udGFpbmVycygpO1xuICAgIHRoaXMubmV4dGpzUG9zdERlcGxveSA9IHRoaXMuY3JlYXRlTmV4dGpzUG9zdERlcGxveSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNMb2FkQmFsYW5jZWRDb250YWluZXJzKCk6IE5leHRqc0NvbnRhaW5lcnMge1xuICAgIC8vIENyZWF0ZSBjb250YWluZXJzIHdpdGggbG9jYWwgYnVpbGQgb3V0cHV0XG4gICAgcmV0dXJuIG5ldyBOZXh0anNDb250YWluZXJzKHRoaXMsIFwiTmV4dGpzQ29udGFpbmVyc1wiLCB7XG4gICAgICAuLi50aGlzLmNvbXB1dGVCYXNlUHJvcHMoKSxcbiAgICAgIGFsYjogdGhpcy5wcm9wcy5hbGIsXG4gICAgICBidWlsZERpcmVjdG9yeTogdGhpcy5wcm9wcy5idWlsZERpcmVjdG9yeSxcbiAgICAgIGVjc0NsdXN0ZXI6IHRoaXMucHJvcHMuZWNzQ2x1c3RlcixcbiAgICAgIGhlYWx0aENoZWNrUGF0aDogdGhpcy5yZXNvbHZlZEhlYWx0aENoZWNrUGF0aCh0aGlzLnByb3BzLmhlYWx0aENoZWNrUGF0aCksXG4gICAgICByZWxhdGl2ZUVudHJ5cG9pbnRQYXRoOiB0aGlzLm5leHRqc0J1aWxkLnJlbGF0aXZlUGF0aFRvRW50cnlwb2ludCxcbiAgICAgIHJlbGF0aXZlUHJvamVjdERpcjogdGhpcy5uZXh0anNCdWlsZC5yZWxhdGl2ZVByb2plY3REaXIsXG4gICAgICBvdmVycmlkZXM6IHtcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0NvbnRhaW5lcnMsXG4gICAgICAgIGVjc0NsdXN0ZXJQcm9wczoge1xuICAgICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNDb250YWluZXJzPy5lY3NDbHVzdGVyUHJvcHMsXG4gICAgICAgICAgLy8gQ29uZGl0aW9uYWwgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyB0aGUgRnVuY3Rpb25zJyBgdnBjYDogYXNzaWduZWRcbiAgICAgICAgICAvLyB1bmNvbmRpdGlvbmFsbHksIGFuIHVuc2V0IGB2cGNgIHByb3Agd291bGQgZXJhc2UgdGhlIG92ZXJyaWRlJ3MuXG4gICAgICAgICAgLi4uKHRoaXMuYmFzZVByb3BzLnZwYyA/IHsgdnBjOiB0aGlzLmJhc2VQcm9wcy52cGMgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzUmVnaW9uYWxDb250YWluZXJzPy5uZXh0anNDb250YWluZXJQcm9wcyxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { Construct } from "constructs";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { NextjsFunctions, NextjsFunctionsOverrides } from "../nextjs-compute/nextjs-functions";
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
readonly nextjsApiProps?: NextjsApiProps;
|
|
10
|
-
readonly nextjsPostDeployProps?: OptionalNextjsPostDeployProps;
|
|
2
|
+
import { OptionalNextjsApiProps } from "../generated-structs/OptionalNextjsApiProps";
|
|
3
|
+
import { NextjsApi, NextjsApiOverrides } from "../nextjs-api";
|
|
4
|
+
import { NextjsBaseConstruct, NextjsBaseProps, NextjsBaseConstructOverrides, NextjsBaseOverrides } from "./nextjs-base-construct";
|
|
5
|
+
import { NextjsFunctionGroup, NextjsFunctions, NextjsFunctionsOverrides } from "../nextjs-compute/nextjs-functions";
|
|
6
|
+
import { NextjsPostDeploy } from "../nextjs-post-deploy";
|
|
7
|
+
export interface NextjsRegionalFunctionsConstructOverrides extends NextjsBaseConstructOverrides {
|
|
8
|
+
readonly nextjsApiProps?: OptionalNextjsApiProps;
|
|
11
9
|
}
|
|
12
10
|
/**
|
|
13
11
|
* Overrides for `NextjsRegionalFunctions`. Overrides are lower level than
|
|
@@ -17,11 +15,24 @@ export interface NextjsRegionalFunctionsConstructOverrides extends NextjsFunctio
|
|
|
17
15
|
export interface NextjsRegionalFunctionsOverrides extends NextjsBaseOverrides {
|
|
18
16
|
readonly nextjsRegionalFunctions?: NextjsRegionalFunctionsConstructOverrides;
|
|
19
17
|
readonly nextjsFunctions?: NextjsFunctionsOverrides;
|
|
20
|
-
readonly nextjsImageFunction?: NextjsImageFunctionOverrides;
|
|
21
18
|
readonly nextjsApi?: NextjsApiOverrides;
|
|
22
|
-
readonly nextjsPostDeploy?: NextjsPostDeployOverrides;
|
|
23
19
|
}
|
|
24
20
|
export interface NextjsRegionalFunctionsProps extends NextjsBaseProps {
|
|
21
|
+
/**
|
|
22
|
+
* Package sets of routes into separate Lambda functions, each fronted by its
|
|
23
|
+
* own API Gateway resources.
|
|
24
|
+
*
|
|
25
|
+
* Reach for this when a single function exceeds Lambda's 250 MB unzipped
|
|
26
|
+
* limit — cdk-nextjs throws at synth with the measured size when it does. It is
|
|
27
|
+
* not a performance or isolation feature: every group ships the same Next.js
|
|
28
|
+
* runtime, so splitting only moves route-local code.
|
|
29
|
+
*
|
|
30
|
+
* @see NextjsFunctionGroup for the pattern grammar and its limits. API Gateway
|
|
31
|
+
* could express more than CloudFront can, but the grammar is deliberately the
|
|
32
|
+
* same in both so switching deployment type never regroups routes.
|
|
33
|
+
* @default - one function serves every route
|
|
34
|
+
*/
|
|
35
|
+
readonly functionGroups?: NextjsFunctionGroup[];
|
|
25
36
|
/**
|
|
26
37
|
* Override props of any construct.
|
|
27
38
|
*/
|
|
@@ -33,17 +44,10 @@ export interface NextjsRegionalFunctionsProps extends NextjsBaseProps {
|
|
|
33
44
|
*/
|
|
34
45
|
export declare class NextjsRegionalFunctions extends NextjsBaseConstruct {
|
|
35
46
|
nextjsFunctions: NextjsFunctions;
|
|
36
|
-
/**
|
|
37
|
-
* Only created when the (experimental, unsupported) dedicated image
|
|
38
|
-
* optimization Lambda is enabled. `_next/image` is otherwise served by
|
|
39
|
-
* {@link nextjsFunctions}.
|
|
40
|
-
*/
|
|
41
|
-
nextjsImageFunction?: NextjsImageFunction;
|
|
42
47
|
nextjsApi: NextjsApi;
|
|
43
48
|
nextjsPostDeploy: NextjsPostDeploy;
|
|
44
49
|
get url(): string;
|
|
45
50
|
private props;
|
|
46
51
|
constructor(scope: Construct, id: string, props: NextjsRegionalFunctionsProps);
|
|
47
52
|
private createNextjsApi;
|
|
48
|
-
private createNextjsPostDeploy;
|
|
49
53
|
}
|
|
@@ -2,24 +2,17 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.NextjsRegionalFunctions = void 0;
|
|
4
4
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
5
|
+
const function_groups_1 = require("../adapter/function-groups");
|
|
5
6
|
const constants_1 = require("../constants");
|
|
6
7
|
const nextjs_api_1 = require("../nextjs-api");
|
|
7
8
|
const nextjs_base_construct_1 = require("./nextjs-base-construct");
|
|
8
|
-
const nextjs_post_deploy_1 = require("../nextjs-post-deploy");
|
|
9
|
-
const experimental_flags_1 = require("../utils/experimental-flags");
|
|
10
9
|
/**
|
|
11
10
|
* Deploy Next.js regionally with functions. Uses API Gateway REST API
|
|
12
11
|
* for routing requests and AWS Lambda Functions for server-side rendering.
|
|
13
12
|
*/
|
|
14
13
|
class NextjsRegionalFunctions extends nextjs_base_construct_1.NextjsBaseConstruct {
|
|
15
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsRegionalFunctions", version: "0.
|
|
14
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsRegionalFunctions", version: "0.7.1" };
|
|
16
15
|
nextjsFunctions;
|
|
17
|
-
/**
|
|
18
|
-
* Only created when the (experimental, unsupported) dedicated image
|
|
19
|
-
* optimization Lambda is enabled. `_next/image` is otherwise served by
|
|
20
|
-
* {@link nextjsFunctions}.
|
|
21
|
-
*/
|
|
22
|
-
nextjsImageFunction;
|
|
23
16
|
nextjsApi;
|
|
24
17
|
nextjsPostDeploy;
|
|
25
18
|
get url() {
|
|
@@ -29,10 +22,7 @@ class NextjsRegionalFunctions extends nextjs_base_construct_1.NextjsBaseConstruc
|
|
|
29
22
|
constructor(scope, id, props) {
|
|
30
23
|
super(scope, id, props, constants_1.NextjsType.REGIONAL_FUNCTIONS);
|
|
31
24
|
this.props = props;
|
|
32
|
-
this.nextjsFunctions = this.createNextjsFunctions(
|
|
33
|
-
if ((0, experimental_flags_1.useDedicatedImageFunction)()) {
|
|
34
|
-
this.nextjsImageFunction = this.createNextjsImageFunction(this.props.overrides?.nextjsImageFunction);
|
|
35
|
-
}
|
|
25
|
+
this.nextjsFunctions = this.createNextjsFunctions();
|
|
36
26
|
this.nextjsApi = this.createNextjsApi();
|
|
37
27
|
this.nextjsPostDeploy = this.createNextjsPostDeploy();
|
|
38
28
|
}
|
|
@@ -41,24 +31,16 @@ class NextjsRegionalFunctions extends nextjs_base_construct_1.NextjsBaseConstruc
|
|
|
41
31
|
staticAssetsBucket: this.nextjsStaticAssets.bucket,
|
|
42
32
|
staticAssetsKeyPrefix: this.nextjsStaticAssets.keyPrefix,
|
|
43
33
|
serverFunction: this.nextjsFunctions.function,
|
|
44
|
-
imageFunction: this.nextjsImageFunction?.function,
|
|
45
34
|
basePath: this.resolvedBasePath,
|
|
46
35
|
overrides: this.props.overrides?.nextjsApi,
|
|
47
36
|
publicDirEntries: this.nextjsBuild.publicDirEntries,
|
|
37
|
+
// `serverFunction` above is the default group's, which the `{proxy+}`
|
|
38
|
+
// catch-all reaches; the rest get resources of their own.
|
|
39
|
+
functionGroups: this.nextjsFunctions.functionGroups.filter((group) => group.name !== function_groups_1.DEFAULT_FUNCTION_GROUP),
|
|
40
|
+
functionGroupBehaviors: this.nextjsBuild.functionGroupBehaviors,
|
|
48
41
|
...this.props.overrides?.nextjsRegionalFunctions?.nextjsApiProps,
|
|
49
42
|
});
|
|
50
43
|
}
|
|
51
|
-
createNextjsPostDeploy() {
|
|
52
|
-
return new nextjs_post_deploy_1.NextjsPostDeploy(this, "NextjsPostDeploy", {
|
|
53
|
-
buildId: this.nextjsBuild.buildId,
|
|
54
|
-
cacheBucket: this.nextjsCache.cacheBucket,
|
|
55
|
-
revalidationTable: this.nextjsCache.revalidationTable,
|
|
56
|
-
staticAssetsBucket: this.nextjsStaticAssets.bucket,
|
|
57
|
-
staticAssetsKeyPrefix: this.nextjsStaticAssets.keyPrefix,
|
|
58
|
-
overrides: this.props.overrides?.nextjsPostDeploy,
|
|
59
|
-
...this.props.overrides?.nextjsRegionalFunctions?.nextjsPostDeployProps,
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
44
|
}
|
|
63
45
|
exports.NextjsRegionalFunctions = NextjsRegionalFunctions;
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLXJlZ2lvbmFsLWZ1bmN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yb290LWNvbnN0cnVjdHMvbmV4dGpzLXJlZ2lvbmFsLWZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsZ0VBQW9FO0FBQ3BFLDRDQUEwQztBQUUxQyw4Q0FBOEQ7QUFDOUQsbUVBS2lDO0FBNkNqQzs7O0dBR0c7QUFDSCxNQUFhLHVCQUF3QixTQUFRLDJDQUFtQjs7SUFDOUQsZUFBZSxDQUFrQjtJQUNqQyxTQUFTLENBQVk7SUFDckIsZ0JBQWdCLENBQW1CO0lBQ25DLElBQUksR0FBRztRQUNMLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7SUFDNUIsQ0FBQztJQUVPLEtBQUssQ0FBK0I7SUFFNUMsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBbUM7UUFFbkMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLHNCQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVuQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBRU8sZUFBZTtRQUNyQixPQUFPLElBQUksc0JBQVMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFO1lBQ3RDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNO1lBQ2xELHFCQUFxQixFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTO1lBQ3hELGNBQWMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVE7WUFDN0MsUUFBUSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDL0IsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLFNBQVM7WUFDMUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0I7WUFDbkQsc0VBQXNFO1lBQ3RFLDBEQUEwRDtZQUMxRCxjQUFjLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUN4RCxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyx3Q0FBc0IsQ0FDakQ7WUFDRCxzQkFBc0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQjtZQUMvRCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLHVCQUF1QixFQUFFLGNBQWM7U0FDakUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF2Q0gsMERBd0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IERFRkFVTFRfRlVOQ1RJT05fR1JPVVAgfSBmcm9tIFwiLi4vYWRhcHRlci9mdW5jdGlvbi1ncm91cHNcIjtcbmltcG9ydCB7IE5leHRqc1R5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPcHRpb25hbE5leHRqc0FwaVByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzQXBpUHJvcHNcIjtcbmltcG9ydCB7IE5leHRqc0FwaSwgTmV4dGpzQXBpT3ZlcnJpZGVzIH0gZnJvbSBcIi4uL25leHRqcy1hcGlcIjtcbmltcG9ydCB7XG4gIE5leHRqc0Jhc2VDb25zdHJ1Y3QsXG4gIE5leHRqc0Jhc2VQcm9wcyxcbiAgTmV4dGpzQmFzZUNvbnN0cnVjdE92ZXJyaWRlcyxcbiAgTmV4dGpzQmFzZU92ZXJyaWRlcyxcbn0gZnJvbSBcIi4vbmV4dGpzLWJhc2UtY29uc3RydWN0XCI7XG5pbXBvcnQge1xuICBOZXh0anNGdW5jdGlvbkdyb3VwLFxuICBOZXh0anNGdW5jdGlvbnMsXG4gIE5leHRqc0Z1bmN0aW9uc092ZXJyaWRlcyxcbn0gZnJvbSBcIi4uL25leHRqcy1jb21wdXRlL25leHRqcy1mdW5jdGlvbnNcIjtcbmltcG9ydCB7IE5leHRqc1Bvc3REZXBsb3kgfSBmcm9tIFwiLi4vbmV4dGpzLXBvc3QtZGVwbG95XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzUmVnaW9uYWxGdW5jdGlvbnNDb25zdHJ1Y3RPdmVycmlkZXMgZXh0ZW5kcyBOZXh0anNCYXNlQ29uc3RydWN0T3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgbmV4dGpzQXBpUHJvcHM/OiBPcHRpb25hbE5leHRqc0FwaVByb3BzO1xufVxuXG4vKipcbiAqIE92ZXJyaWRlcyBmb3IgYE5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zYC4gT3ZlcnJpZGVzIGFyZSBsb3dlciBsZXZlbCB0aGFuXG4gKiBwcm9wcyBhbmQgYXJlIHBhc3NlZCBkaXJlY3RseSB0byBDREsgQ29uc3RydWN0cyBnaXZpbmcgeW91IG1vcmUgY29udHJvbC4gSXQnc1xuICogcmVjb21tZW5kZWQgdG8gdXNlIGNhdXRpb24gYW5kIHJldmlldyBzb3VyY2UgY29kZSBzbyB5b3Uga25vdyBob3cgdGhleSdyZSB1c2VkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zT3ZlcnJpZGVzIGV4dGVuZHMgTmV4dGpzQmFzZU92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IG5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zPzogTmV4dGpzUmVnaW9uYWxGdW5jdGlvbnNDb25zdHJ1Y3RPdmVycmlkZXM7XG4gIHJlYWRvbmx5IG5leHRqc0Z1bmN0aW9ucz86IE5leHRqc0Z1bmN0aW9uc092ZXJyaWRlcztcbiAgcmVhZG9ubHkgbmV4dGpzQXBpPzogTmV4dGpzQXBpT3ZlcnJpZGVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zUHJvcHMgZXh0ZW5kcyBOZXh0anNCYXNlUHJvcHMge1xuICAvKipcbiAgICogUGFja2FnZSBzZXRzIG9mIHJvdXRlcyBpbnRvIHNlcGFyYXRlIExhbWJkYSBmdW5jdGlvbnMsIGVhY2ggZnJvbnRlZCBieSBpdHNcbiAgICogb3duIEFQSSBHYXRld2F5IHJlc291cmNlcy5cbiAgICpcbiAgICogUmVhY2ggZm9yIHRoaXMgd2hlbiBhIHNpbmdsZSBmdW5jdGlvbiBleGNlZWRzIExhbWJkYSdzIDI1MCBNQiB1bnppcHBlZFxuICAgKiBsaW1pdCDigJQgY2RrLW5leHRqcyB0aHJvd3MgYXQgc3ludGggd2l0aCB0aGUgbWVhc3VyZWQgc2l6ZSB3aGVuIGl0IGRvZXMuIEl0IGlzXG4gICAqIG5vdCBhIHBlcmZvcm1hbmNlIG9yIGlzb2xhdGlvbiBmZWF0dXJlOiBldmVyeSBncm91cCBzaGlwcyB0aGUgc2FtZSBOZXh0LmpzXG4gICAqIHJ1bnRpbWUsIHNvIHNwbGl0dGluZyBvbmx5IG1vdmVzIHJvdXRlLWxvY2FsIGNvZGUuXG4gICAqXG4gICAqIEBzZWUgTmV4dGpzRnVuY3Rpb25Hcm91cCBmb3IgdGhlIHBhdHRlcm4gZ3JhbW1hciBhbmQgaXRzIGxpbWl0cy4gQVBJIEdhdGV3YXlcbiAgICogY291bGQgZXhwcmVzcyBtb3JlIHRoYW4gQ2xvdWRGcm9udCBjYW4sIGJ1dCB0aGUgZ3JhbW1hciBpcyBkZWxpYmVyYXRlbHkgdGhlXG4gICAqIHNhbWUgaW4gYm90aCBzbyBzd2l0Y2hpbmcgZGVwbG95bWVudCB0eXBlIG5ldmVyIHJlZ3JvdXBzIHJvdXRlcy5cbiAgICogQGRlZmF1bHQgLSBvbmUgZnVuY3Rpb24gc2VydmVzIGV2ZXJ5IHJvdXRlXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbkdyb3Vwcz86IE5leHRqc0Z1bmN0aW9uR3JvdXBbXTtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHByb3BzIG9mIGFueSBjb25zdHJ1Y3QuXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZXM/OiBOZXh0anNSZWdpb25hbEZ1bmN0aW9uc092ZXJyaWRlcztcbn1cblxuLyoqXG4gKiBEZXBsb3kgTmV4dC5qcyByZWdpb25hbGx5IHdpdGggZnVuY3Rpb25zLiBVc2VzIEFQSSBHYXRld2F5IFJFU1QgQVBJXG4gKiBmb3Igcm91dGluZyByZXF1ZXN0cyBhbmQgQVdTIExhbWJkYSBGdW5jdGlvbnMgZm9yIHNlcnZlci1zaWRlIHJlbmRlcmluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zIGV4dGVuZHMgTmV4dGpzQmFzZUNvbnN0cnVjdCB7XG4gIG5leHRqc0Z1bmN0aW9uczogTmV4dGpzRnVuY3Rpb25zO1xuICBuZXh0anNBcGk6IE5leHRqc0FwaTtcbiAgbmV4dGpzUG9zdERlcGxveTogTmV4dGpzUG9zdERlcGxveTtcbiAgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5leHRqc0FwaS51cmw7XG4gIH1cblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNSZWdpb25hbEZ1bmN0aW9uc1Byb3BzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogTmV4dGpzUmVnaW9uYWxGdW5jdGlvbnNQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcywgTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIHRoaXMubmV4dGpzRnVuY3Rpb25zID0gdGhpcy5jcmVhdGVOZXh0anNGdW5jdGlvbnMoKTtcbiAgICB0aGlzLm5leHRqc0FwaSA9IHRoaXMuY3JlYXRlTmV4dGpzQXBpKCk7XG4gICAgdGhpcy5uZXh0anNQb3N0RGVwbG95ID0gdGhpcy5jcmVhdGVOZXh0anNQb3N0RGVwbG95KCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU5leHRqc0FwaSgpIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc0FwaSh0aGlzLCBcIk5leHRqc0FwaVwiLCB7XG4gICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IHRoaXMubmV4dGpzU3RhdGljQXNzZXRzLmJ1Y2tldCxcbiAgICAgIHN0YXRpY0Fzc2V0c0tleVByZWZpeDogdGhpcy5uZXh0anNTdGF0aWNBc3NldHMua2V5UHJlZml4LFxuICAgICAgc2VydmVyRnVuY3Rpb246IHRoaXMubmV4dGpzRnVuY3Rpb25zLmZ1bmN0aW9uLFxuICAgICAgYmFzZVBhdGg6IHRoaXMucmVzb2x2ZWRCYXNlUGF0aCxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0FwaSxcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IHRoaXMubmV4dGpzQnVpbGQucHVibGljRGlyRW50cmllcyxcbiAgICAgIC8vIGBzZXJ2ZXJGdW5jdGlvbmAgYWJvdmUgaXMgdGhlIGRlZmF1bHQgZ3JvdXAncywgd2hpY2ggdGhlIGB7cHJveHkrfWBcbiAgICAgIC8vIGNhdGNoLWFsbCByZWFjaGVzOyB0aGUgcmVzdCBnZXQgcmVzb3VyY2VzIG9mIHRoZWlyIG93bi5cbiAgICAgIGZ1bmN0aW9uR3JvdXBzOiB0aGlzLm5leHRqc0Z1bmN0aW9ucy5mdW5jdGlvbkdyb3Vwcy5maWx0ZXIoXG4gICAgICAgIChncm91cCkgPT4gZ3JvdXAubmFtZSAhPT0gREVGQVVMVF9GVU5DVElPTl9HUk9VUCxcbiAgICAgICksXG4gICAgICBmdW5jdGlvbkdyb3VwQmVoYXZpb3JzOiB0aGlzLm5leHRqc0J1aWxkLmZ1bmN0aW9uR3JvdXBCZWhhdmlvcnMsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzUmVnaW9uYWxGdW5jdGlvbnM/Lm5leHRqc0FwaVByb3BzLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The path to hand Next.js for an API Gateway REST event.
|
|
3
|
+
*
|
|
4
|
+
* API Gateway strips the prefix it routed on before invoking Lambda: the stage on
|
|
5
|
+
* the execute-api endpoint (`/prod/foo` arrives as `event.path = "/foo"`), or the
|
|
6
|
+
* base path mapping on a custom domain. `requestContext.path` keeps it. Which of
|
|
7
|
+
* the two is right depends on the app:
|
|
8
|
+
*
|
|
9
|
+
* - An app built with a `basePath` that *includes* the stripped prefix — the
|
|
10
|
+
* usual execute-api setup, `basePath: "/prod"` so its links carry the stage —
|
|
11
|
+
* only routes the unstripped path. Handing it `event.path` 404'd every request,
|
|
12
|
+
* which is why `examples/app-playground` used to carry a `proxy.ts` that
|
|
13
|
+
* prepended the stage from an environment variable.
|
|
14
|
+
* - Every other app — no `basePath`, or one API Gateway does not strip (a custom
|
|
15
|
+
* domain mapped at the root) — routes `event.path`, and `requestContext.path`
|
|
16
|
+
* would carry a stage it never heard of.
|
|
17
|
+
*
|
|
18
|
+
* So `requestContext.path` is used exactly when it starts with the app's
|
|
19
|
+
* `basePath` on a segment boundary, and nothing has to be configured: a stage
|
|
20
|
+
* named `test`, a renamed stage and a base path mapping are all read off the
|
|
21
|
+
* event. Measured against a deployed REST API: the two fields share an encoding
|
|
22
|
+
* (`/a%20b` in both), and only `event.path` is normalized — `/prod` arrives as
|
|
23
|
+
* `"/"` and `/prod//foo` as `"/foo"` — so reconstructing the prefix from their
|
|
24
|
+
* difference is not reliable, and taking `requestContext.path` whole is.
|
|
25
|
+
*
|
|
26
|
+
* @param basePath the app's own `basePath`, as the adapter manifest records it:
|
|
27
|
+
* `""` or a leading-slash path with no trailing slash.
|
|
28
|
+
*/
|
|
29
|
+
export declare function apiGatewayRequestPath(event: {
|
|
30
|
+
path: string;
|
|
31
|
+
requestContext: {
|
|
32
|
+
path?: string;
|
|
33
|
+
};
|
|
34
|
+
}, basePath: string): string;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.apiGatewayRequestPath = apiGatewayRequestPath;
|
|
4
|
+
const base_path_1 = require("../utils/base-path");
|
|
5
|
+
/**
|
|
6
|
+
* The path to hand Next.js for an API Gateway REST event.
|
|
7
|
+
*
|
|
8
|
+
* API Gateway strips the prefix it routed on before invoking Lambda: the stage on
|
|
9
|
+
* the execute-api endpoint (`/prod/foo` arrives as `event.path = "/foo"`), or the
|
|
10
|
+
* base path mapping on a custom domain. `requestContext.path` keeps it. Which of
|
|
11
|
+
* the two is right depends on the app:
|
|
12
|
+
*
|
|
13
|
+
* - An app built with a `basePath` that *includes* the stripped prefix — the
|
|
14
|
+
* usual execute-api setup, `basePath: "/prod"` so its links carry the stage —
|
|
15
|
+
* only routes the unstripped path. Handing it `event.path` 404'd every request,
|
|
16
|
+
* which is why `examples/app-playground` used to carry a `proxy.ts` that
|
|
17
|
+
* prepended the stage from an environment variable.
|
|
18
|
+
* - Every other app — no `basePath`, or one API Gateway does not strip (a custom
|
|
19
|
+
* domain mapped at the root) — routes `event.path`, and `requestContext.path`
|
|
20
|
+
* would carry a stage it never heard of.
|
|
21
|
+
*
|
|
22
|
+
* So `requestContext.path` is used exactly when it starts with the app's
|
|
23
|
+
* `basePath` on a segment boundary, and nothing has to be configured: a stage
|
|
24
|
+
* named `test`, a renamed stage and a base path mapping are all read off the
|
|
25
|
+
* event. Measured against a deployed REST API: the two fields share an encoding
|
|
26
|
+
* (`/a%20b` in both), and only `event.path` is normalized — `/prod` arrives as
|
|
27
|
+
* `"/"` and `/prod//foo` as `"/foo"` — so reconstructing the prefix from their
|
|
28
|
+
* difference is not reliable, and taking `requestContext.path` whole is.
|
|
29
|
+
*
|
|
30
|
+
* @param basePath the app's own `basePath`, as the adapter manifest records it:
|
|
31
|
+
* `""` or a leading-slash path with no trailing slash.
|
|
32
|
+
*/
|
|
33
|
+
function apiGatewayRequestPath(event, basePath) {
|
|
34
|
+
const unstripped = event.requestContext.path;
|
|
35
|
+
if (unstripped && (0, base_path_1.hasPathPrefix)(unstripped, basePath)) {
|
|
36
|
+
return unstripped;
|
|
37
|
+
}
|
|
38
|
+
return ((unstripped && withRepeatedSlashes(unstripped, event.path)) ?? event.path);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* `event.path` with the repeated slashes API Gateway collapsed put back, or
|
|
42
|
+
* `undefined` when there are none to restore.
|
|
43
|
+
*
|
|
44
|
+
* `//` arrives as `event.path = "/"`, so Next.js never sees the repeated slash it
|
|
45
|
+
* redirects away (`normalizeRepeatedSlashes`), and the page is served at `//`
|
|
46
|
+
* itself - where the Pages Router's client throws `Invalid URL` building a URL
|
|
47
|
+
* from a protocol-relative path, and the page never hydrates. Found by next.js's
|
|
48
|
+
* `test/e2e/hydration` on Regional Functions.
|
|
49
|
+
*
|
|
50
|
+
* The prefix API Gateway stripped (the stage, or a base path mapping) is not
|
|
51
|
+
* recoverable by subtracting one field from the other, for the reason above.
|
|
52
|
+
* So whole leading segments are dropped from `requestContext.path` until what is
|
|
53
|
+
* left, collapsed, is `event.path`: the first such suffix is the unstripped path
|
|
54
|
+
* below the prefix. If none matches, `event.path` stands.
|
|
55
|
+
*/
|
|
56
|
+
function withRepeatedSlashes(unstripped, stripped) {
|
|
57
|
+
if (!unstripped.includes("//")) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
for (let rest = unstripped;;) {
|
|
61
|
+
if (rest.replace(/\/{2,}/g, "/") === stripped) {
|
|
62
|
+
return rest === stripped ? undefined : rest;
|
|
63
|
+
}
|
|
64
|
+
const next = rest.replace(/^\/[^/]+/, "");
|
|
65
|
+
if (next === rest) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
rest = next;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWdhdGV3YXktcGF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2FwaS1nYXRld2F5LXBhdGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE4QkEsc0RBV0M7QUF6Q0Qsa0RBQW1EO0FBRW5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7QUFDSCxTQUFnQixxQkFBcUIsQ0FDbkMsS0FBMEQsRUFDMUQsUUFBZ0I7SUFFaEIsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7SUFDN0MsSUFBSSxVQUFVLElBQUksSUFBQSx5QkFBYSxFQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3RELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFDRCxPQUFPLENBQ0wsQ0FBQyxVQUFVLElBQUksbUJBQW1CLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQzFFLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FDMUIsVUFBa0IsRUFDbEIsUUFBZ0I7SUFFaEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUMvQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsS0FBSyxJQUFJLElBQUksR0FBRyxVQUFVLElBQUssQ0FBQztRQUM5QixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzlDLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDOUMsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ2xCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBoYXNQYXRoUHJlZml4IH0gZnJvbSBcIi4uL3V0aWxzL2Jhc2UtcGF0aFwiO1xuXG4vKipcbiAqIFRoZSBwYXRoIHRvIGhhbmQgTmV4dC5qcyBmb3IgYW4gQVBJIEdhdGV3YXkgUkVTVCBldmVudC5cbiAqXG4gKiBBUEkgR2F0ZXdheSBzdHJpcHMgdGhlIHByZWZpeCBpdCByb3V0ZWQgb24gYmVmb3JlIGludm9raW5nIExhbWJkYTogdGhlIHN0YWdlIG9uXG4gKiB0aGUgZXhlY3V0ZS1hcGkgZW5kcG9pbnQgKGAvcHJvZC9mb29gIGFycml2ZXMgYXMgYGV2ZW50LnBhdGggPSBcIi9mb29cImApLCBvciB0aGVcbiAqIGJhc2UgcGF0aCBtYXBwaW5nIG9uIGEgY3VzdG9tIGRvbWFpbi4gYHJlcXVlc3RDb250ZXh0LnBhdGhgIGtlZXBzIGl0LiBXaGljaCBvZlxuICogdGhlIHR3byBpcyByaWdodCBkZXBlbmRzIG9uIHRoZSBhcHA6XG4gKlxuICogLSBBbiBhcHAgYnVpbHQgd2l0aCBhIGBiYXNlUGF0aGAgdGhhdCAqaW5jbHVkZXMqIHRoZSBzdHJpcHBlZCBwcmVmaXgg4oCUIHRoZVxuICogICB1c3VhbCBleGVjdXRlLWFwaSBzZXR1cCwgYGJhc2VQYXRoOiBcIi9wcm9kXCJgIHNvIGl0cyBsaW5rcyBjYXJyeSB0aGUgc3RhZ2Ug4oCUXG4gKiAgIG9ubHkgcm91dGVzIHRoZSB1bnN0cmlwcGVkIHBhdGguIEhhbmRpbmcgaXQgYGV2ZW50LnBhdGhgIDQwNCdkIGV2ZXJ5IHJlcXVlc3QsXG4gKiAgIHdoaWNoIGlzIHdoeSBgZXhhbXBsZXMvYXBwLXBsYXlncm91bmRgIHVzZWQgdG8gY2FycnkgYSBgcHJveHkudHNgIHRoYXRcbiAqICAgcHJlcGVuZGVkIHRoZSBzdGFnZSBmcm9tIGFuIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICogLSBFdmVyeSBvdGhlciBhcHAg4oCUIG5vIGBiYXNlUGF0aGAsIG9yIG9uZSBBUEkgR2F0ZXdheSBkb2VzIG5vdCBzdHJpcCAoYSBjdXN0b21cbiAqICAgZG9tYWluIG1hcHBlZCBhdCB0aGUgcm9vdCkg4oCUIHJvdXRlcyBgZXZlbnQucGF0aGAsIGFuZCBgcmVxdWVzdENvbnRleHQucGF0aGBcbiAqICAgd291bGQgY2FycnkgYSBzdGFnZSBpdCBuZXZlciBoZWFyZCBvZi5cbiAqXG4gKiBTbyBgcmVxdWVzdENvbnRleHQucGF0aGAgaXMgdXNlZCBleGFjdGx5IHdoZW4gaXQgc3RhcnRzIHdpdGggdGhlIGFwcCdzXG4gKiBgYmFzZVBhdGhgIG9uIGEgc2VnbWVudCBib3VuZGFyeSwgYW5kIG5vdGhpbmcgaGFzIHRvIGJlIGNvbmZpZ3VyZWQ6IGEgc3RhZ2VcbiAqIG5hbWVkIGB0ZXN0YCwgYSByZW5hbWVkIHN0YWdlIGFuZCBhIGJhc2UgcGF0aCBtYXBwaW5nIGFyZSBhbGwgcmVhZCBvZmYgdGhlXG4gKiBldmVudC4gTWVhc3VyZWQgYWdhaW5zdCBhIGRlcGxveWVkIFJFU1QgQVBJOiB0aGUgdHdvIGZpZWxkcyBzaGFyZSBhbiBlbmNvZGluZ1xuICogKGAvYSUyMGJgIGluIGJvdGgpLCBhbmQgb25seSBgZXZlbnQucGF0aGAgaXMgbm9ybWFsaXplZCDigJQgYC9wcm9kYCBhcnJpdmVzIGFzXG4gKiBgXCIvXCJgIGFuZCBgL3Byb2QvL2Zvb2AgYXMgYFwiL2Zvb1wiYCDigJQgc28gcmVjb25zdHJ1Y3RpbmcgdGhlIHByZWZpeCBmcm9tIHRoZWlyXG4gKiBkaWZmZXJlbmNlIGlzIG5vdCByZWxpYWJsZSwgYW5kIHRha2luZyBgcmVxdWVzdENvbnRleHQucGF0aGAgd2hvbGUgaXMuXG4gKlxuICogQHBhcmFtIGJhc2VQYXRoIHRoZSBhcHAncyBvd24gYGJhc2VQYXRoYCwgYXMgdGhlIGFkYXB0ZXIgbWFuaWZlc3QgcmVjb3JkcyBpdDpcbiAqIGBcIlwiYCBvciBhIGxlYWRpbmctc2xhc2ggcGF0aCB3aXRoIG5vIHRyYWlsaW5nIHNsYXNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBpR2F0ZXdheVJlcXVlc3RQYXRoKFxuICBldmVudDogeyBwYXRoOiBzdHJpbmc7IHJlcXVlc3RDb250ZXh0OiB7IHBhdGg/OiBzdHJpbmcgfSB9LFxuICBiYXNlUGF0aDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgdW5zdHJpcHBlZCA9IGV2ZW50LnJlcXVlc3RDb250ZXh0LnBhdGg7XG4gIGlmICh1bnN0cmlwcGVkICYmIGhhc1BhdGhQcmVmaXgodW5zdHJpcHBlZCwgYmFzZVBhdGgpKSB7XG4gICAgcmV0dXJuIHVuc3RyaXBwZWQ7XG4gIH1cbiAgcmV0dXJuIChcbiAgICAodW5zdHJpcHBlZCAmJiB3aXRoUmVwZWF0ZWRTbGFzaGVzKHVuc3RyaXBwZWQsIGV2ZW50LnBhdGgpKSA/PyBldmVudC5wYXRoXG4gICk7XG59XG5cbi8qKlxuICogYGV2ZW50LnBhdGhgIHdpdGggdGhlIHJlcGVhdGVkIHNsYXNoZXMgQVBJIEdhdGV3YXkgY29sbGFwc2VkIHB1dCBiYWNrLCBvclxuICogYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBhcmUgbm9uZSB0byByZXN0b3JlLlxuICpcbiAqIGAvL2AgYXJyaXZlcyBhcyBgZXZlbnQucGF0aCA9IFwiL1wiYCwgc28gTmV4dC5qcyBuZXZlciBzZWVzIHRoZSByZXBlYXRlZCBzbGFzaCBpdFxuICogcmVkaXJlY3RzIGF3YXkgKGBub3JtYWxpemVSZXBlYXRlZFNsYXNoZXNgKSwgYW5kIHRoZSBwYWdlIGlzIHNlcnZlZCBhdCBgLy9gXG4gKiBpdHNlbGYgLSB3aGVyZSB0aGUgUGFnZXMgUm91dGVyJ3MgY2xpZW50IHRocm93cyBgSW52YWxpZCBVUkxgIGJ1aWxkaW5nIGEgVVJMXG4gKiBmcm9tIGEgcHJvdG9jb2wtcmVsYXRpdmUgcGF0aCwgYW5kIHRoZSBwYWdlIG5ldmVyIGh5ZHJhdGVzLiBGb3VuZCBieSBuZXh0LmpzJ3NcbiAqIGB0ZXN0L2UyZS9oeWRyYXRpb25gIG9uIFJlZ2lvbmFsIEZ1bmN0aW9ucy5cbiAqXG4gKiBUaGUgcHJlZml4IEFQSSBHYXRld2F5IHN0cmlwcGVkICh0aGUgc3RhZ2UsIG9yIGEgYmFzZSBwYXRoIG1hcHBpbmcpIGlzIG5vdFxuICogcmVjb3ZlcmFibGUgYnkgc3VidHJhY3Rpbmcgb25lIGZpZWxkIGZyb20gdGhlIG90aGVyLCBmb3IgdGhlIHJlYXNvbiBhYm92ZS5cbiAqIFNvIHdob2xlIGxlYWRpbmcgc2VnbWVudHMgYXJlIGRyb3BwZWQgZnJvbSBgcmVxdWVzdENvbnRleHQucGF0aGAgdW50aWwgd2hhdCBpc1xuICogbGVmdCwgY29sbGFwc2VkLCBpcyBgZXZlbnQucGF0aGA6IHRoZSBmaXJzdCBzdWNoIHN1ZmZpeCBpcyB0aGUgdW5zdHJpcHBlZCBwYXRoXG4gKiBiZWxvdyB0aGUgcHJlZml4LiBJZiBub25lIG1hdGNoZXMsIGBldmVudC5wYXRoYCBzdGFuZHMuXG4gKi9cbmZ1bmN0aW9uIHdpdGhSZXBlYXRlZFNsYXNoZXMoXG4gIHVuc3RyaXBwZWQ6IHN0cmluZyxcbiAgc3RyaXBwZWQ6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghdW5zdHJpcHBlZC5pbmNsdWRlcyhcIi8vXCIpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBmb3IgKGxldCByZXN0ID0gdW5zdHJpcHBlZDsgOykge1xuICAgIGlmIChyZXN0LnJlcGxhY2UoL1xcL3syLH0vZywgXCIvXCIpID09PSBzdHJpcHBlZCkge1xuICAgICAgcmV0dXJuIHJlc3QgPT09IHN0cmlwcGVkID8gdW5kZWZpbmVkIDogcmVzdDtcbiAgICB9XG4gICAgY29uc3QgbmV4dCA9IHJlc3QucmVwbGFjZSgvXlxcL1teL10rLywgXCJcIik7XG4gICAgaWYgKG5leHQgPT09IHJlc3QpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJlc3QgPSBuZXh0O1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const api_gateway_path_1 = require("./api-gateway-path");
|
|
4
|
+
/** The two fields as a deployed REST API reported them for the same request. */
|
|
5
|
+
const event = (path, contextPath) => ({
|
|
6
|
+
path,
|
|
7
|
+
requestContext: { path: contextPath },
|
|
8
|
+
});
|
|
9
|
+
describe("apiGatewayRequestPath", () => {
|
|
10
|
+
it("keeps the stage for an app whose basePath is the stage", () => {
|
|
11
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)(event("/foo", "/prod/foo"), "/prod")).toBe("/prod/foo");
|
|
12
|
+
});
|
|
13
|
+
it("reads whatever the stage is called, not a fixed name", () => {
|
|
14
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)(event("/foo", "/test/foo"), "/test")).toBe("/test/foo");
|
|
15
|
+
});
|
|
16
|
+
it("serves the app's root at the bare stage URL", () => {
|
|
17
|
+
// `event.path` is normalized to "/" here, which is why the prefix cannot be
|
|
18
|
+
// recovered by subtracting one field from the other.
|
|
19
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)(event("/", "/prod"), "/prod")).toBe("/prod");
|
|
20
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)(event("/", "/prod/"), "/prod")).toBe("/prod/");
|
|
21
|
+
});
|
|
22
|
+
it("keeps a basePath nested below the stage", () => {
|
|
23
|
+
// `basePath: "/prod/base"` with the construct's `basePath` prop "base": the
|
|
24
|
+
// resources sit under /base, and only the stage is stripped.
|
|
25
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)(event("/base/foo", "/prod/base/foo"), "/prod/base")).toBe("/prod/base/foo");
|
|
26
|
+
});
|
|
27
|
+
it("passes the percent-encoding through untouched", () => {
|
|
28
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)(event("/a%20b/c", "/prod/a%20b/c"), "/prod")).toBe("/prod/a%20b/c");
|
|
29
|
+
});
|
|
30
|
+
it("leaves an app without a basePath on the stripped path", () => {
|
|
31
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)(event("/foo", "/prod/foo"), "")).toBe("/foo");
|
|
32
|
+
});
|
|
33
|
+
it("leaves an app whose basePath API Gateway does not strip alone", () => {
|
|
34
|
+
// A custom domain mapped at the root: nothing is stripped, so both fields
|
|
35
|
+
// agree and either would do.
|
|
36
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)(event("/docs/foo", "/docs/foo"), "/docs")).toBe("/docs/foo");
|
|
37
|
+
// And a basePath that is not the stage: the stage-carrying path would 404.
|
|
38
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)(event("/foo", "/prod/foo"), "/docs")).toBe("/foo");
|
|
39
|
+
});
|
|
40
|
+
it("matches the basePath on a segment boundary", () => {
|
|
41
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)(event("/foo", "/production/foo"), "/prod")).toBe("/foo");
|
|
42
|
+
});
|
|
43
|
+
it("keeps repeated slashes API Gateway collapsed out of event.path", () => {
|
|
44
|
+
// Below the stage, so Next.js can redirect `//` away itself.
|
|
45
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)(event("/", "/prod//"), "")).toBe("//");
|
|
46
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)(event("/foo", "/prod//foo"), "")).toBe("//foo");
|
|
47
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)(event("/a/b", "/prod/a//b"), "")).toBe("/a//b");
|
|
48
|
+
// A base path mapping of more than one segment strips as many.
|
|
49
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)(event("/foo", "/v1/api//foo"), "")).toBe("//foo");
|
|
50
|
+
// A custom domain mapped at the root strips nothing.
|
|
51
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)(event("/", "//"), "")).toBe("//");
|
|
52
|
+
// And with a basePath API Gateway does not strip.
|
|
53
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)(event("/docs/", "/docs//"), "/docs")).toBe("/docs//");
|
|
54
|
+
});
|
|
55
|
+
it("keeps event.path when the repeated slashes cannot be placed", () => {
|
|
56
|
+
// No suffix of the context path collapses to event.path.
|
|
57
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)(event("/bar", "/prod//foo"), "")).toBe("/bar");
|
|
58
|
+
// Repeated slashes only inside the stripped prefix.
|
|
59
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)(event("/foo", "//prod/foo"), "")).toBe("/foo");
|
|
60
|
+
});
|
|
61
|
+
it("falls back to event.path when the context has no path", () => {
|
|
62
|
+
expect((0, api_gateway_path_1.apiGatewayRequestPath)({ path: "/foo", requestContext: {} }, "/prod")).toBe("/foo");
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWdhdGV3YXktcGF0aC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvYXBpLWdhdGV3YXktcGF0aC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseURBQTJEO0FBRTNELGdGQUFnRjtBQUNoRixNQUFNLEtBQUssR0FBRyxDQUFDLElBQVksRUFBRSxXQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELElBQUk7SUFDSixjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO0NBQ3RDLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLEVBQUU7SUFDckMsRUFBRSxDQUFDLHdEQUF3RCxFQUFFLEdBQUcsRUFBRTtRQUNoRSxNQUFNLENBQUMsSUFBQSx3Q0FBcUIsRUFBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNyRSxXQUFXLENBQ1osQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHNEQUFzRCxFQUFFLEdBQUcsRUFBRTtRQUM5RCxNQUFNLENBQUMsSUFBQSx3Q0FBcUIsRUFBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNyRSxXQUFXLENBQ1osQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDZDQUE2QyxFQUFFLEdBQUcsRUFBRTtRQUNyRCw0RUFBNEU7UUFDNUUscURBQXFEO1FBQ3JELE1BQU0sQ0FBQyxJQUFBLHdDQUFxQixFQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUUsTUFBTSxDQUFDLElBQUEsd0NBQXFCLEVBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5RSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRSxHQUFHLEVBQUU7UUFDakQsNEVBQTRFO1FBQzVFLDZEQUE2RDtRQUM3RCxNQUFNLENBQ0osSUFBQSx3Q0FBcUIsRUFBQyxLQUFLLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLEVBQUUsWUFBWSxDQUFDLENBQzFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsK0NBQStDLEVBQUUsR0FBRyxFQUFFO1FBQ3ZELE1BQU0sQ0FDSixJQUFBLHdDQUFxQixFQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsZUFBZSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQ25FLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzFCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHVEQUF1RCxFQUFFLEdBQUcsRUFBRTtRQUMvRCxNQUFNLENBQUMsSUFBQSx3Q0FBcUIsRUFBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLCtEQUErRCxFQUFFLEdBQUcsRUFBRTtRQUN2RSwwRUFBMEU7UUFDMUUsNkJBQTZCO1FBQzdCLE1BQU0sQ0FDSixJQUFBLHdDQUFxQixFQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQ2hFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BCLDJFQUEyRTtRQUMzRSxNQUFNLENBQUMsSUFBQSx3Q0FBcUIsRUFBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNyRSxNQUFNLENBQ1AsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEdBQUcsRUFBRTtRQUNwRCxNQUFNLENBQ0osSUFBQSx3Q0FBcUIsRUFBQyxLQUFLLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLEVBQUUsT0FBTyxDQUFDLENBQ2pFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGdFQUFnRSxFQUFFLEdBQUcsRUFBRTtRQUN4RSw2REFBNkQ7UUFDN0QsTUFBTSxDQUFDLElBQUEsd0NBQXFCLEVBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRSxNQUFNLENBQUMsSUFBQSx3Q0FBcUIsRUFBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNqRSxPQUFPLENBQ1IsQ0FBQztRQUNGLE1BQU0sQ0FBQyxJQUFBLHdDQUFxQixFQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ2pFLE9BQU8sQ0FDUixDQUFDO1FBQ0YsK0RBQStEO1FBQy9ELE1BQU0sQ0FBQyxJQUFBLHdDQUFxQixFQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ25FLE9BQU8sQ0FDUixDQUFDO1FBQ0YscURBQXFEO1FBQ3JELE1BQU0sQ0FBQyxJQUFBLHdDQUFxQixFQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0Qsa0RBQWtEO1FBQ2xELE1BQU0sQ0FBQyxJQUFBLHdDQUFxQixFQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3JFLFNBQVMsQ0FDVixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkRBQTZELEVBQUUsR0FBRyxFQUFFO1FBQ3JFLHlEQUF5RDtRQUN6RCxNQUFNLENBQUMsSUFBQSx3Q0FBcUIsRUFBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVFLG9EQUFvRDtRQUNwRCxNQUFNLENBQUMsSUFBQSx3Q0FBcUIsRUFBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHVEQUF1RCxFQUFFLEdBQUcsRUFBRTtRQUMvRCxNQUFNLENBQ0osSUFBQSx3Q0FBcUIsRUFBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUNyRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXBpR2F0ZXdheVJlcXVlc3RQYXRoIH0gZnJvbSBcIi4vYXBpLWdhdGV3YXktcGF0aFwiO1xuXG4vKiogVGhlIHR3byBmaWVsZHMgYXMgYSBkZXBsb3llZCBSRVNUIEFQSSByZXBvcnRlZCB0aGVtIGZvciB0aGUgc2FtZSByZXF1ZXN0LiAqL1xuY29uc3QgZXZlbnQgPSAocGF0aDogc3RyaW5nLCBjb250ZXh0UGF0aDogc3RyaW5nKSA9PiAoe1xuICBwYXRoLFxuICByZXF1ZXN0Q29udGV4dDogeyBwYXRoOiBjb250ZXh0UGF0aCB9LFxufSk7XG5cbmRlc2NyaWJlKFwiYXBpR2F0ZXdheVJlcXVlc3RQYXRoXCIsICgpID0+IHtcbiAgaXQoXCJrZWVwcyB0aGUgc3RhZ2UgZm9yIGFuIGFwcCB3aG9zZSBiYXNlUGF0aCBpcyB0aGUgc3RhZ2VcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChhcGlHYXRld2F5UmVxdWVzdFBhdGgoZXZlbnQoXCIvZm9vXCIsIFwiL3Byb2QvZm9vXCIpLCBcIi9wcm9kXCIpKS50b0JlKFxuICAgICAgXCIvcHJvZC9mb29cIixcbiAgICApO1xuICB9KTtcblxuICBpdChcInJlYWRzIHdoYXRldmVyIHRoZSBzdGFnZSBpcyBjYWxsZWQsIG5vdCBhIGZpeGVkIG5hbWVcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChhcGlHYXRld2F5UmVxdWVzdFBhdGgoZXZlbnQoXCIvZm9vXCIsIFwiL3Rlc3QvZm9vXCIpLCBcIi90ZXN0XCIpKS50b0JlKFxuICAgICAgXCIvdGVzdC9mb29cIixcbiAgICApO1xuICB9KTtcblxuICBpdChcInNlcnZlcyB0aGUgYXBwJ3Mgcm9vdCBhdCB0aGUgYmFyZSBzdGFnZSBVUkxcIiwgKCkgPT4ge1xuICAgIC8vIGBldmVudC5wYXRoYCBpcyBub3JtYWxpemVkIHRvIFwiL1wiIGhlcmUsIHdoaWNoIGlzIHdoeSB0aGUgcHJlZml4IGNhbm5vdCBiZVxuICAgIC8vIHJlY292ZXJlZCBieSBzdWJ0cmFjdGluZyBvbmUgZmllbGQgZnJvbSB0aGUgb3RoZXIuXG4gICAgZXhwZWN0KGFwaUdhdGV3YXlSZXF1ZXN0UGF0aChldmVudChcIi9cIiwgXCIvcHJvZFwiKSwgXCIvcHJvZFwiKSkudG9CZShcIi9wcm9kXCIpO1xuICAgIGV4cGVjdChhcGlHYXRld2F5UmVxdWVzdFBhdGgoZXZlbnQoXCIvXCIsIFwiL3Byb2QvXCIpLCBcIi9wcm9kXCIpKS50b0JlKFwiL3Byb2QvXCIpO1xuICB9KTtcblxuICBpdChcImtlZXBzIGEgYmFzZVBhdGggbmVzdGVkIGJlbG93IHRoZSBzdGFnZVwiLCAoKSA9PiB7XG4gICAgLy8gYGJhc2VQYXRoOiBcIi9wcm9kL2Jhc2VcImAgd2l0aCB0aGUgY29uc3RydWN0J3MgYGJhc2VQYXRoYCBwcm9wIFwiYmFzZVwiOiB0aGVcbiAgICAvLyByZXNvdXJjZXMgc2l0IHVuZGVyIC9iYXNlLCBhbmQgb25seSB0aGUgc3RhZ2UgaXMgc3RyaXBwZWQuXG4gICAgZXhwZWN0KFxuICAgICAgYXBpR2F0ZXdheVJlcXVlc3RQYXRoKGV2ZW50KFwiL2Jhc2UvZm9vXCIsIFwiL3Byb2QvYmFzZS9mb29cIiksIFwiL3Byb2QvYmFzZVwiKSxcbiAgICApLnRvQmUoXCIvcHJvZC9iYXNlL2Zvb1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJwYXNzZXMgdGhlIHBlcmNlbnQtZW5jb2RpbmcgdGhyb3VnaCB1bnRvdWNoZWRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGFwaUdhdGV3YXlSZXF1ZXN0UGF0aChldmVudChcIi9hJTIwYi9jXCIsIFwiL3Byb2QvYSUyMGIvY1wiKSwgXCIvcHJvZFwiKSxcbiAgICApLnRvQmUoXCIvcHJvZC9hJTIwYi9jXCIpO1xuICB9KTtcblxuICBpdChcImxlYXZlcyBhbiBhcHAgd2l0aG91dCBhIGJhc2VQYXRoIG9uIHRoZSBzdHJpcHBlZCBwYXRoXCIsICgpID0+IHtcbiAgICBleHBlY3QoYXBpR2F0ZXdheVJlcXVlc3RQYXRoKGV2ZW50KFwiL2Zvb1wiLCBcIi9wcm9kL2Zvb1wiKSwgXCJcIikpLnRvQmUoXCIvZm9vXCIpO1xuICB9KTtcblxuICBpdChcImxlYXZlcyBhbiBhcHAgd2hvc2UgYmFzZVBhdGggQVBJIEdhdGV3YXkgZG9lcyBub3Qgc3RyaXAgYWxvbmVcIiwgKCkgPT4ge1xuICAgIC8vIEEgY3VzdG9tIGRvbWFpbiBtYXBwZWQgYXQgdGhlIHJvb3Q6IG5vdGhpbmcgaXMgc3RyaXBwZWQsIHNvIGJvdGggZmllbGRzXG4gICAgLy8gYWdyZWUgYW5kIGVpdGhlciB3b3VsZCBkby5cbiAgICBleHBlY3QoXG4gICAgICBhcGlHYXRld2F5UmVxdWVzdFBhdGgoZXZlbnQoXCIvZG9jcy9mb29cIiwgXCIvZG9jcy9mb29cIiksIFwiL2RvY3NcIiksXG4gICAgKS50b0JlKFwiL2RvY3MvZm9vXCIpO1xuICAgIC8vIEFuZCBhIGJhc2VQYXRoIHRoYXQgaXMgbm90IHRoZSBzdGFnZTogdGhlIHN0YWdlLWNhcnJ5aW5nIHBhdGggd291bGQgNDA0LlxuICAgIGV4cGVjdChhcGlHYXRld2F5UmVxdWVzdFBhdGgoZXZlbnQoXCIvZm9vXCIsIFwiL3Byb2QvZm9vXCIpLCBcIi9kb2NzXCIpKS50b0JlKFxuICAgICAgXCIvZm9vXCIsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJtYXRjaGVzIHRoZSBiYXNlUGF0aCBvbiBhIHNlZ21lbnQgYm91bmRhcnlcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGFwaUdhdGV3YXlSZXF1ZXN0UGF0aChldmVudChcIi9mb29cIiwgXCIvcHJvZHVjdGlvbi9mb29cIiksIFwiL3Byb2RcIiksXG4gICAgKS50b0JlKFwiL2Zvb1wiKTtcbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyByZXBlYXRlZCBzbGFzaGVzIEFQSSBHYXRld2F5IGNvbGxhcHNlZCBvdXQgb2YgZXZlbnQucGF0aFwiLCAoKSA9PiB7XG4gICAgLy8gQmVsb3cgdGhlIHN0YWdlLCBzbyBOZXh0LmpzIGNhbiByZWRpcmVjdCBgLy9gIGF3YXkgaXRzZWxmLlxuICAgIGV4cGVjdChhcGlHYXRld2F5UmVxdWVzdFBhdGgoZXZlbnQoXCIvXCIsIFwiL3Byb2QvL1wiKSwgXCJcIikpLnRvQmUoXCIvL1wiKTtcbiAgICBleHBlY3QoYXBpR2F0ZXdheVJlcXVlc3RQYXRoKGV2ZW50KFwiL2Zvb1wiLCBcIi9wcm9kLy9mb29cIiksIFwiXCIpKS50b0JlKFxuICAgICAgXCIvL2Zvb1wiLFxuICAgICk7XG4gICAgZXhwZWN0KGFwaUdhdGV3YXlSZXF1ZXN0UGF0aChldmVudChcIi9hL2JcIiwgXCIvcHJvZC9hLy9iXCIpLCBcIlwiKSkudG9CZShcbiAgICAgIFwiL2EvL2JcIixcbiAgICApO1xuICAgIC8vIEEgYmFzZSBwYXRoIG1hcHBpbmcgb2YgbW9yZSB0aGFuIG9uZSBzZWdtZW50IHN0cmlwcyBhcyBtYW55LlxuICAgIGV4cGVjdChhcGlHYXRld2F5UmVxdWVzdFBhdGgoZXZlbnQoXCIvZm9vXCIsIFwiL3YxL2FwaS8vZm9vXCIpLCBcIlwiKSkudG9CZShcbiAgICAgIFwiLy9mb29cIixcbiAgICApO1xuICAgIC8vIEEgY3VzdG9tIGRvbWFpbiBtYXBwZWQgYXQgdGhlIHJvb3Qgc3RyaXBzIG5vdGhpbmcuXG4gICAgZXhwZWN0KGFwaUdhdGV3YXlSZXF1ZXN0UGF0aChldmVudChcIi9cIiwgXCIvL1wiKSwgXCJcIikpLnRvQmUoXCIvL1wiKTtcbiAgICAvLyBBbmQgd2l0aCBhIGJhc2VQYXRoIEFQSSBHYXRld2F5IGRvZXMgbm90IHN0cmlwLlxuICAgIGV4cGVjdChhcGlHYXRld2F5UmVxdWVzdFBhdGgoZXZlbnQoXCIvZG9jcy9cIiwgXCIvZG9jcy8vXCIpLCBcIi9kb2NzXCIpKS50b0JlKFxuICAgICAgXCIvZG9jcy8vXCIsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJrZWVwcyBldmVudC5wYXRoIHdoZW4gdGhlIHJlcGVhdGVkIHNsYXNoZXMgY2Fubm90IGJlIHBsYWNlZFwiLCAoKSA9PiB7XG4gICAgLy8gTm8gc3VmZml4IG9mIHRoZSBjb250ZXh0IHBhdGggY29sbGFwc2VzIHRvIGV2ZW50LnBhdGguXG4gICAgZXhwZWN0KGFwaUdhdGV3YXlSZXF1ZXN0UGF0aChldmVudChcIi9iYXJcIiwgXCIvcHJvZC8vZm9vXCIpLCBcIlwiKSkudG9CZShcIi9iYXJcIik7XG4gICAgLy8gUmVwZWF0ZWQgc2xhc2hlcyBvbmx5IGluc2lkZSB0aGUgc3RyaXBwZWQgcHJlZml4LlxuICAgIGV4cGVjdChhcGlHYXRld2F5UmVxdWVzdFBhdGgoZXZlbnQoXCIvZm9vXCIsIFwiLy9wcm9kL2Zvb1wiKSwgXCJcIikpLnRvQmUoXCIvZm9vXCIpO1xuICB9KTtcblxuICBpdChcImZhbGxzIGJhY2sgdG8gZXZlbnQucGF0aCB3aGVuIHRoZSBjb250ZXh0IGhhcyBubyBwYXRoXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBhcGlHYXRld2F5UmVxdWVzdFBhdGgoeyBwYXRoOiBcIi9mb29cIiwgcmVxdWVzdENvbnRleHQ6IHt9IH0sIFwiL3Byb2RcIiksXG4gICAgKS50b0JlKFwiL2Zvb1wiKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The canonical spelling of a URL that reached the wrong function group only
|
|
3
|
+
* because of its case.
|
|
4
|
+
*
|
|
5
|
+
* CloudFront behaviors and API Gateway resources match paths case-sensitively,
|
|
6
|
+
* and Next.js's route matching does not, so `/API/reports/1` misses the
|
|
7
|
+
* `api/reports/*` behavior, reaches the default group, and matches
|
|
8
|
+
* `/api/reports/[id]` there, whose code another group carries. Redirecting it
|
|
9
|
+
* to `/api/reports/1` gets it to the group that has the route, where a 404
|
|
10
|
+
* would have told the client a URL `next start` serves does not exist.
|
|
11
|
+
*/
|
|
12
|
+
import { AdapterManifest } from "./manifest";
|
|
13
|
+
/**
|
|
14
|
+
* `pathname` (as requested, percent-encoded) respelled with the static segments
|
|
15
|
+
* of `template` (the matched `manifest.entrypoints` key), keeping the request's
|
|
16
|
+
* own dynamic segment values and basePath, which the manifest key carries too.
|
|
17
|
+
* `undefined` when the two differ in anything but case — a rewrite, a
|
|
18
|
+
* mismatched shape — or not at all, since then a redirect would not change
|
|
19
|
+
* where the request goes. No locale handling: `functionGroups` cannot be
|
|
20
|
+
* combined with i18n (`assertNoI18nSplitting`).
|
|
21
|
+
*/
|
|
22
|
+
export declare function caseCanonicalPath(pathname: string, template: string, manifest: Pick<AdapterManifest, "config">): string | undefined;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.caseCanonicalPath = caseCanonicalPath;
|
|
4
|
+
const util_1 = require("./util");
|
|
5
|
+
const base_path_1 = require("../utils/base-path");
|
|
6
|
+
/**
|
|
7
|
+
* `pathname` (as requested, percent-encoded) respelled with the static segments
|
|
8
|
+
* of `template` (the matched `manifest.entrypoints` key), keeping the request's
|
|
9
|
+
* own dynamic segment values and basePath, which the manifest key carries too.
|
|
10
|
+
* `undefined` when the two differ in anything but case — a rewrite, a
|
|
11
|
+
* mismatched shape — or not at all, since then a redirect would not change
|
|
12
|
+
* where the request goes. No locale handling: `functionGroups` cannot be
|
|
13
|
+
* combined with i18n (`assertNoI18nSplitting`).
|
|
14
|
+
*/
|
|
15
|
+
function caseCanonicalPath(pathname, template, manifest) {
|
|
16
|
+
const basePath = manifest.config.basePath ?? "";
|
|
17
|
+
let rest = pathname;
|
|
18
|
+
let prefix = "";
|
|
19
|
+
if (basePath) {
|
|
20
|
+
if (!(0, base_path_1.hasPathPrefix)(rest.toLowerCase(), basePath.toLowerCase())) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
prefix = basePath;
|
|
24
|
+
rest = rest.slice(basePath.length) || "/";
|
|
25
|
+
}
|
|
26
|
+
const trailingSlash = rest.length > 1 && rest.endsWith("/");
|
|
27
|
+
const requested = segments(rest);
|
|
28
|
+
const expected = segments((0, util_1.withoutPathPrefix)(template, basePath));
|
|
29
|
+
const canonical = [];
|
|
30
|
+
for (let i = 0; i < expected.length; i++) {
|
|
31
|
+
const part = expected[i];
|
|
32
|
+
if (/^\[\[?\.\.\./.test(part)) {
|
|
33
|
+
// A catch-all takes everything left, as requested.
|
|
34
|
+
canonical.push(...requested.slice(i));
|
|
35
|
+
return finish(prefix, canonical, trailingSlash, pathname);
|
|
36
|
+
}
|
|
37
|
+
const value = requested[i];
|
|
38
|
+
if (value === undefined) {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
if (part.startsWith("[")) {
|
|
42
|
+
canonical.push(value);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if ((0, util_1.safeDecode)(value).toLowerCase() !== part.toLowerCase()) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
canonical.push(encodeURIComponent(part));
|
|
49
|
+
}
|
|
50
|
+
if (requested.length !== expected.length) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
return finish(prefix, canonical, trailingSlash, pathname);
|
|
54
|
+
}
|
|
55
|
+
function finish(prefix, canonical, trailingSlash, pathname) {
|
|
56
|
+
const path = `${prefix}/${canonical.join("/")}`.replace(/\/+$/, "") || "/";
|
|
57
|
+
const result = trailingSlash && path !== "/" ? `${path}/` : path;
|
|
58
|
+
return result === pathname ? undefined : result;
|
|
59
|
+
}
|
|
60
|
+
function segments(path) {
|
|
61
|
+
return path.split("/").filter(Boolean);
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzZS1yZWRpcmVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2Nhc2UtcmVkaXJlY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUF3QkEsOENBMkNDO0FBdkRELGlDQUF1RDtBQUN2RCxrREFBbUQ7QUFFbkQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixpQkFBaUIsQ0FDL0IsUUFBZ0IsRUFDaEIsUUFBZ0IsRUFDaEIsUUFBeUM7SUFFekMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO0lBQ2hELElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQztJQUNwQixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDaEIsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxJQUFBLHlCQUFhLEVBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDL0QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE1BQU0sR0FBRyxRQUFRLENBQUM7UUFDbEIsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1RCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUEsd0JBQWlCLEVBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDakUsTUFBTSxTQUFTLEdBQWEsRUFBRSxDQUFDO0lBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDekMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzlCLG1EQUFtRDtZQUNuRCxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pCLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEIsU0FBUztRQUNYLENBQUM7UUFDRCxJQUFJLElBQUEsaUJBQVUsRUFBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztZQUMzRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsU0FBUyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM1RCxDQUFDO0FBRUQsU0FBUyxNQUFNLENBQ2IsTUFBYyxFQUNkLFNBQTRCLEVBQzVCLGFBQXNCLEVBQ3RCLFFBQWdCO0lBRWhCLE1BQU0sSUFBSSxHQUFHLEdBQUcsTUFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQztJQUMzRSxNQUFNLE1BQU0sR0FBRyxhQUFhLElBQUksSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2pFLE9BQU8sTUFBTSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDbEQsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLElBQVk7SUFDNUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgY2Fub25pY2FsIHNwZWxsaW5nIG9mIGEgVVJMIHRoYXQgcmVhY2hlZCB0aGUgd3JvbmcgZnVuY3Rpb24gZ3JvdXAgb25seVxuICogYmVjYXVzZSBvZiBpdHMgY2FzZS5cbiAqXG4gKiBDbG91ZEZyb250IGJlaGF2aW9ycyBhbmQgQVBJIEdhdGV3YXkgcmVzb3VyY2VzIG1hdGNoIHBhdGhzIGNhc2Utc2Vuc2l0aXZlbHksXG4gKiBhbmQgTmV4dC5qcydzIHJvdXRlIG1hdGNoaW5nIGRvZXMgbm90LCBzbyBgL0FQSS9yZXBvcnRzLzFgIG1pc3NlcyB0aGVcbiAqIGBhcGkvcmVwb3J0cy8qYCBiZWhhdmlvciwgcmVhY2hlcyB0aGUgZGVmYXVsdCBncm91cCwgYW5kIG1hdGNoZXNcbiAqIGAvYXBpL3JlcG9ydHMvW2lkXWAgdGhlcmUsIHdob3NlIGNvZGUgYW5vdGhlciBncm91cCBjYXJyaWVzLiBSZWRpcmVjdGluZyBpdFxuICogdG8gYC9hcGkvcmVwb3J0cy8xYCBnZXRzIGl0IHRvIHRoZSBncm91cCB0aGF0IGhhcyB0aGUgcm91dGUsIHdoZXJlIGEgNDA0XG4gKiB3b3VsZCBoYXZlIHRvbGQgdGhlIGNsaWVudCBhIFVSTCBgbmV4dCBzdGFydGAgc2VydmVzIGRvZXMgbm90IGV4aXN0LlxuICovXG5pbXBvcnQgeyBBZGFwdGVyTWFuaWZlc3QgfSBmcm9tIFwiLi9tYW5pZmVzdFwiO1xuaW1wb3J0IHsgc2FmZURlY29kZSwgd2l0aG91dFBhdGhQcmVmaXggfSBmcm9tIFwiLi91dGlsXCI7XG5pbXBvcnQgeyBoYXNQYXRoUHJlZml4IH0gZnJvbSBcIi4uL3V0aWxzL2Jhc2UtcGF0aFwiO1xuXG4vKipcbiAqIGBwYXRobmFtZWAgKGFzIHJlcXVlc3RlZCwgcGVyY2VudC1lbmNvZGVkKSByZXNwZWxsZWQgd2l0aCB0aGUgc3RhdGljIHNlZ21lbnRzXG4gKiBvZiBgdGVtcGxhdGVgICh0aGUgbWF0Y2hlZCBgbWFuaWZlc3QuZW50cnlwb2ludHNgIGtleSksIGtlZXBpbmcgdGhlIHJlcXVlc3Qnc1xuICogb3duIGR5bmFtaWMgc2VnbWVudCB2YWx1ZXMgYW5kIGJhc2VQYXRoLCB3aGljaCB0aGUgbWFuaWZlc3Qga2V5IGNhcnJpZXMgdG9vLlxuICogYHVuZGVmaW5lZGAgd2hlbiB0aGUgdHdvIGRpZmZlciBpbiBhbnl0aGluZyBidXQgY2FzZSDigJQgYSByZXdyaXRlLCBhXG4gKiBtaXNtYXRjaGVkIHNoYXBlIOKAlCBvciBub3QgYXQgYWxsLCBzaW5jZSB0aGVuIGEgcmVkaXJlY3Qgd291bGQgbm90IGNoYW5nZVxuICogd2hlcmUgdGhlIHJlcXVlc3QgZ29lcy4gTm8gbG9jYWxlIGhhbmRsaW5nOiBgZnVuY3Rpb25Hcm91cHNgIGNhbm5vdCBiZVxuICogY29tYmluZWQgd2l0aCBpMThuIChgYXNzZXJ0Tm9JMThuU3BsaXR0aW5nYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXNlQ2Fub25pY2FsUGF0aChcbiAgcGF0aG5hbWU6IHN0cmluZyxcbiAgdGVtcGxhdGU6IHN0cmluZyxcbiAgbWFuaWZlc3Q6IFBpY2s8QWRhcHRlck1hbmlmZXN0LCBcImNvbmZpZ1wiPixcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGJhc2VQYXRoID0gbWFuaWZlc3QuY29uZmlnLmJhc2VQYXRoID8/IFwiXCI7XG4gIGxldCByZXN0ID0gcGF0aG5hbWU7XG4gIGxldCBwcmVmaXggPSBcIlwiO1xuICBpZiAoYmFzZVBhdGgpIHtcbiAgICBpZiAoIWhhc1BhdGhQcmVmaXgocmVzdC50b0xvd2VyQ2FzZSgpLCBiYXNlUGF0aC50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcHJlZml4ID0gYmFzZVBhdGg7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoYmFzZVBhdGgubGVuZ3RoKSB8fCBcIi9cIjtcbiAgfVxuICBjb25zdCB0cmFpbGluZ1NsYXNoID0gcmVzdC5sZW5ndGggPiAxICYmIHJlc3QuZW5kc1dpdGgoXCIvXCIpO1xuICBjb25zdCByZXF1ZXN0ZWQgPSBzZWdtZW50cyhyZXN0KTtcbiAgY29uc3QgZXhwZWN0ZWQgPSBzZWdtZW50cyh3aXRob3V0UGF0aFByZWZpeCh0ZW1wbGF0ZSwgYmFzZVBhdGgpKTtcbiAgY29uc3QgY2Fub25pY2FsOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcGFydCA9IGV4cGVjdGVkW2ldO1xuICAgIGlmICgvXlxcW1xcWz9cXC5cXC5cXC4vLnRlc3QocGFydCkpIHtcbiAgICAgIC8vIEEgY2F0Y2gtYWxsIHRha2VzIGV2ZXJ5dGhpbmcgbGVmdCwgYXMgcmVxdWVzdGVkLlxuICAgICAgY2Fub25pY2FsLnB1c2goLi4ucmVxdWVzdGVkLnNsaWNlKGkpKTtcbiAgICAgIHJldHVybiBmaW5pc2gocHJlZml4LCBjYW5vbmljYWwsIHRyYWlsaW5nU2xhc2gsIHBhdGhuYW1lKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSByZXF1ZXN0ZWRbaV07XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChwYXJ0LnN0YXJ0c1dpdGgoXCJbXCIpKSB7XG4gICAgICBjYW5vbmljYWwucHVzaCh2YWx1ZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHNhZmVEZWNvZGUodmFsdWUpLnRvTG93ZXJDYXNlKCkgIT09IHBhcnQudG9Mb3dlckNhc2UoKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY2Fub25pY2FsLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHBhcnQpKTtcbiAgfVxuICBpZiAocmVxdWVzdGVkLmxlbmd0aCAhPT0gZXhwZWN0ZWQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gZmluaXNoKHByZWZpeCwgY2Fub25pY2FsLCB0cmFpbGluZ1NsYXNoLCBwYXRobmFtZSk7XG59XG5cbmZ1bmN0aW9uIGZpbmlzaChcbiAgcHJlZml4OiBzdHJpbmcsXG4gIGNhbm9uaWNhbDogcmVhZG9ubHkgc3RyaW5nW10sXG4gIHRyYWlsaW5nU2xhc2g6IGJvb2xlYW4sXG4gIHBhdGhuYW1lOiBzdHJpbmcsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXRoID0gYCR7cHJlZml4fS8ke2Nhbm9uaWNhbC5qb2luKFwiL1wiKX1gLnJlcGxhY2UoL1xcLyskLywgXCJcIikgfHwgXCIvXCI7XG4gIGNvbnN0IHJlc3VsdCA9IHRyYWlsaW5nU2xhc2ggJiYgcGF0aCAhPT0gXCIvXCIgPyBgJHtwYXRofS9gIDogcGF0aDtcbiAgcmV0dXJuIHJlc3VsdCA9PT0gcGF0aG5hbWUgPyB1bmRlZmluZWQgOiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHNlZ21lbnRzKHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const case_redirect_1 = require("./case-redirect");
|
|
4
|
+
const plain = { config: { basePath: "", i18n: null } };
|
|
5
|
+
describe("caseCanonicalPath", () => {
|
|
6
|
+
it("respells static segments and keeps dynamic values", () => {
|
|
7
|
+
expect((0, case_redirect_1.caseCanonicalPath)("/API/reports/1", "/api/reports/[id]", plain)).toBe("/api/reports/1");
|
|
8
|
+
expect((0, case_redirect_1.caseCanonicalPath)("/API/Reports/AbC", "/api/reports/[id]", plain)).toBe("/api/reports/AbC");
|
|
9
|
+
});
|
|
10
|
+
it("is undefined when nothing would change", () => {
|
|
11
|
+
expect((0, case_redirect_1.caseCanonicalPath)("/api/reports/1", "/api/reports/[id]", plain)).toBeUndefined();
|
|
12
|
+
});
|
|
13
|
+
// A rewrite onto the route, or any other shape the template doesn't have.
|
|
14
|
+
it("is undefined when the path is not the template's shape", () => {
|
|
15
|
+
expect((0, case_redirect_1.caseCanonicalPath)("/feed/1", "/api/reports/[id]", plain)).toBeUndefined();
|
|
16
|
+
expect((0, case_redirect_1.caseCanonicalPath)("/API/reports/1/2", "/api/reports/[id]", plain)).toBeUndefined();
|
|
17
|
+
});
|
|
18
|
+
it("gives a catch-all everything left", () => {
|
|
19
|
+
expect((0, case_redirect_1.caseCanonicalPath)("/DOCS/A/b", "/docs/[...slug]", plain)).toBe("/docs/A/b");
|
|
20
|
+
expect((0, case_redirect_1.caseCanonicalPath)("/DOCS", "/docs/[[...slug]]", plain)).toBe("/docs");
|
|
21
|
+
});
|
|
22
|
+
// What dispatch actually hands over: `resolvedPathname` is a manifest key,
|
|
23
|
+
// which carries the basePath.
|
|
24
|
+
it("matches basePath-prefixed templates, keeping the canonical basePath", () => {
|
|
25
|
+
const manifest = {
|
|
26
|
+
config: { basePath: "/prod", i18n: null },
|
|
27
|
+
};
|
|
28
|
+
expect((0, case_redirect_1.caseCanonicalPath)("/prod/API/reports/1", "/prod/api/reports/[id]", manifest)).toBe("/prod/api/reports/1");
|
|
29
|
+
expect((0, case_redirect_1.caseCanonicalPath)("/PROD/API/reports/1/", "/prod/api/reports/[id]", manifest)).toBe("/prod/api/reports/1/");
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzZS1yZWRpcmVjdC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvY2FzZS1yZWRpcmVjdC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBQW9EO0FBS3BELE1BQU0sS0FBSyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQXVCLENBQUM7QUFFNUUsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxFQUFFLENBQUMsbURBQW1ELEVBQUUsR0FBRyxFQUFFO1FBQzNELE1BQU0sQ0FDSixJQUFBLGlDQUFpQixFQUFDLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUNoRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sQ0FDSixJQUFBLGlDQUFpQixFQUFDLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUNsRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzdCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLEdBQUcsRUFBRTtRQUNoRCxNQUFNLENBQ0osSUFBQSxpQ0FBaUIsRUFBQyxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSxLQUFLLENBQUMsQ0FDaEUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNwQixDQUFDLENBQUMsQ0FBQztJQUVILDBFQUEwRTtJQUMxRSxFQUFFLENBQUMsd0RBQXdELEVBQUUsR0FBRyxFQUFFO1FBQ2hFLE1BQU0sQ0FDSixJQUFBLGlDQUFpQixFQUFDLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxLQUFLLENBQUMsQ0FDekQsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNsQixNQUFNLENBQ0osSUFBQSxpQ0FBaUIsRUFBQyxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxLQUFLLENBQUMsQ0FDbEUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNwQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRSxHQUFHLEVBQUU7UUFDM0MsTUFBTSxDQUFDLElBQUEsaUNBQWlCLEVBQUMsV0FBVyxFQUFFLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNuRSxXQUFXLENBQ1osQ0FBQztRQUNGLE1BQU0sQ0FBQyxJQUFBLGlDQUFpQixFQUFDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDakUsT0FBTyxDQUNSLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUVILDJFQUEyRTtJQUMzRSw4QkFBOEI7SUFDOUIsRUFBRSxDQUFDLHFFQUFxRSxFQUFFLEdBQUcsRUFBRTtRQUM3RSxNQUFNLFFBQVEsR0FBRztZQUNmLE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtTQUNyQixDQUFDO1FBQ3ZCLE1BQU0sQ0FDSixJQUFBLGlDQUFpQixFQUNmLHFCQUFxQixFQUNyQix3QkFBd0IsRUFDeEIsUUFBUSxDQUNULENBQ0YsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUM5QixNQUFNLENBQ0osSUFBQSxpQ0FBaUIsRUFDZixzQkFBc0IsRUFDdEIsd0JBQXdCLEVBQ3hCLFFBQVEsQ0FDVCxDQUNGLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNhc2VDYW5vbmljYWxQYXRoIH0gZnJvbSBcIi4vY2FzZS1yZWRpcmVjdFwiO1xuaW1wb3J0IHR5cGUgeyBBZGFwdGVyTWFuaWZlc3QgfSBmcm9tIFwiLi9tYW5pZmVzdFwiO1xuXG50eXBlIENvbmZpZyA9IFBpY2s8QWRhcHRlck1hbmlmZXN0LCBcImNvbmZpZ1wiPjtcblxuY29uc3QgcGxhaW4gPSB7IGNvbmZpZzogeyBiYXNlUGF0aDogXCJcIiwgaTE4bjogbnVsbCB9IH0gYXMgdW5rbm93biBhcyBDb25maWc7XG5cbmRlc2NyaWJlKFwiY2FzZUNhbm9uaWNhbFBhdGhcIiwgKCkgPT4ge1xuICBpdChcInJlc3BlbGxzIHN0YXRpYyBzZWdtZW50cyBhbmQga2VlcHMgZHluYW1pYyB2YWx1ZXNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGNhc2VDYW5vbmljYWxQYXRoKFwiL0FQSS9yZXBvcnRzLzFcIiwgXCIvYXBpL3JlcG9ydHMvW2lkXVwiLCBwbGFpbiksXG4gICAgKS50b0JlKFwiL2FwaS9yZXBvcnRzLzFcIik7XG4gICAgZXhwZWN0KFxuICAgICAgY2FzZUNhbm9uaWNhbFBhdGgoXCIvQVBJL1JlcG9ydHMvQWJDXCIsIFwiL2FwaS9yZXBvcnRzL1tpZF1cIiwgcGxhaW4pLFxuICAgICkudG9CZShcIi9hcGkvcmVwb3J0cy9BYkNcIik7XG4gIH0pO1xuXG4gIGl0KFwiaXMgdW5kZWZpbmVkIHdoZW4gbm90aGluZyB3b3VsZCBjaGFuZ2VcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChcbiAgICAgIGNhc2VDYW5vbmljYWxQYXRoKFwiL2FwaS9yZXBvcnRzLzFcIiwgXCIvYXBpL3JlcG9ydHMvW2lkXVwiLCBwbGFpbiksXG4gICAgKS50b0JlVW5kZWZpbmVkKCk7XG4gIH0pO1xuXG4gIC8vIEEgcmV3cml0ZSBvbnRvIHRoZSByb3V0ZSwgb3IgYW55IG90aGVyIHNoYXBlIHRoZSB0ZW1wbGF0ZSBkb2Vzbid0IGhhdmUuXG4gIGl0KFwiaXMgdW5kZWZpbmVkIHdoZW4gdGhlIHBhdGggaXMgbm90IHRoZSB0ZW1wbGF0ZSdzIHNoYXBlXCIsICgpID0+IHtcbiAgICBleHBlY3QoXG4gICAgICBjYXNlQ2Fub25pY2FsUGF0aChcIi9mZWVkLzFcIiwgXCIvYXBpL3JlcG9ydHMvW2lkXVwiLCBwbGFpbiksXG4gICAgKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KFxuICAgICAgY2FzZUNhbm9uaWNhbFBhdGgoXCIvQVBJL3JlcG9ydHMvMS8yXCIsIFwiL2FwaS9yZXBvcnRzL1tpZF1cIiwgcGxhaW4pLFxuICAgICkudG9CZVVuZGVmaW5lZCgpO1xuICB9KTtcblxuICBpdChcImdpdmVzIGEgY2F0Y2gtYWxsIGV2ZXJ5dGhpbmcgbGVmdFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KGNhc2VDYW5vbmljYWxQYXRoKFwiL0RPQ1MvQS9iXCIsIFwiL2RvY3MvWy4uLnNsdWddXCIsIHBsYWluKSkudG9CZShcbiAgICAgIFwiL2RvY3MvQS9iXCIsXG4gICAgKTtcbiAgICBleHBlY3QoY2FzZUNhbm9uaWNhbFBhdGgoXCIvRE9DU1wiLCBcIi9kb2NzL1tbLi4uc2x1Z11dXCIsIHBsYWluKSkudG9CZShcbiAgICAgIFwiL2RvY3NcIixcbiAgICApO1xuICB9KTtcblxuICAvLyBXaGF0IGRpc3BhdGNoIGFjdHVhbGx5IGhhbmRzIG92ZXI6IGByZXNvbHZlZFBhdGhuYW1lYCBpcyBhIG1hbmlmZXN0IGtleSxcbiAgLy8gd2hpY2ggY2FycmllcyB0aGUgYmFzZVBhdGguXG4gIGl0KFwibWF0Y2hlcyBiYXNlUGF0aC1wcmVmaXhlZCB0ZW1wbGF0ZXMsIGtlZXBpbmcgdGhlIGNhbm9uaWNhbCBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB7XG4gICAgICBjb25maWc6IHsgYmFzZVBhdGg6IFwiL3Byb2RcIiwgaTE4bjogbnVsbCB9LFxuICAgIH0gYXMgdW5rbm93biBhcyBDb25maWc7XG4gICAgZXhwZWN0KFxuICAgICAgY2FzZUNhbm9uaWNhbFBhdGgoXG4gICAgICAgIFwiL3Byb2QvQVBJL3JlcG9ydHMvMVwiLFxuICAgICAgICBcIi9wcm9kL2FwaS9yZXBvcnRzL1tpZF1cIixcbiAgICAgICAgbWFuaWZlc3QsXG4gICAgICApLFxuICAgICkudG9CZShcIi9wcm9kL2FwaS9yZXBvcnRzLzFcIik7XG4gICAgZXhwZWN0KFxuICAgICAgY2FzZUNhbm9uaWNhbFBhdGgoXG4gICAgICAgIFwiL1BST0QvQVBJL3JlcG9ydHMvMS9cIixcbiAgICAgICAgXCIvcHJvZC9hcGkvcmVwb3J0cy9baWRdXCIsXG4gICAgICAgIG1hbmlmZXN0LFxuICAgICAgKSxcbiAgICApLnRvQmUoXCIvcHJvZC9hcGkvcmVwb3J0cy8xL1wiKTtcbiAgfSk7XG59KTtcbiJdfQ==
|