cdk-nextjs 0.6.2 → 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.
Files changed (263) hide show
  1. package/.jsii +2404 -2723
  2. package/.jsii.tabl.json +1 -1
  3. package/API.md +1681 -1930
  4. package/CLAUDE.md +2 -1
  5. package/README.md +429 -130
  6. package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +148 -169
  7. package/assets/lambdas/redeploy-stage/redeploy-stage.lambda/index.js +875 -0
  8. package/docs/adapter-runtime.md +185 -0
  9. package/docs/breaking-changes.md +667 -4
  10. package/docs/caching-guide.md +156 -112
  11. package/docs/cdk-nextjs-cfn-exec-policy.json +2 -1
  12. package/docs/development-guide.md +1 -1
  13. package/docs/harness-coverage.md +598 -0
  14. package/docs/init-cache-deployment.md +32 -1
  15. package/docs/next-build-output-guide.md +30 -20
  16. package/examples/README.md +5 -1
  17. package/lib/adapter/__fixtures__/app-playground-base-path.json +4926 -0
  18. package/lib/adapter/__fixtures__/app-playground.json +4917 -0
  19. package/lib/adapter/__fixtures__/pages-i18n.json +1728 -0
  20. package/lib/adapter/adapter.mjs +1548 -185
  21. package/lib/adapter/adapter.test.js +106 -0
  22. package/lib/adapter/aws-cache-store.d.ts +489 -0
  23. package/lib/adapter/aws-cache-store.js +1004 -0
  24. package/lib/adapter/aws-cache-store.test.d.ts +1 -0
  25. package/lib/adapter/aws-cache-store.test.js +361 -0
  26. package/lib/adapter/build-outputs.d.ts +80 -0
  27. package/lib/adapter/build-outputs.js +852 -0
  28. package/lib/adapter/build-outputs.test.d.ts +1 -0
  29. package/lib/adapter/build-outputs.test.js +861 -0
  30. package/lib/adapter/cache-handler.d.ts +9 -2
  31. package/lib/adapter/cache-handler.js +72 -96
  32. package/lib/adapter/cache-handler.mjs +18956 -17774
  33. package/lib/adapter/cache-handler.test.js +263 -31
  34. package/lib/adapter/cache-kinds.d.ts +32 -0
  35. package/lib/adapter/cache-kinds.js +35 -0
  36. package/lib/adapter/cache-kinds.test.d.ts +1 -0
  37. package/lib/adapter/cache-kinds.test.js +69 -0
  38. package/lib/adapter/cache-utils.d.ts +90 -0
  39. package/lib/adapter/cache-utils.js +199 -4
  40. package/lib/adapter/cache-utils.test.d.ts +1 -0
  41. package/lib/adapter/cache-utils.test.js +179 -0
  42. package/lib/adapter/function-groups.d.ts +215 -0
  43. package/lib/adapter/function-groups.js +1099 -0
  44. package/lib/adapter/function-groups.test.d.ts +1 -0
  45. package/lib/adapter/function-groups.test.js +743 -0
  46. package/lib/adapter/init-cache.d.ts +6 -0
  47. package/lib/adapter/init-cache.js +245 -0
  48. package/lib/adapter/init-cache.test.d.ts +1 -0
  49. package/lib/adapter/init-cache.test.js +137 -0
  50. package/lib/adapter/local-file-cache-handler.d.ts +23 -0
  51. package/lib/adapter/local-file-cache-handler.js +52 -1
  52. package/lib/adapter/memory-cache-handler.d.ts +26 -17
  53. package/lib/adapter/memory-cache-handler.js +32 -50
  54. package/lib/adapter/memory-cache-handler.test.js +105 -85
  55. package/lib/adapter/s3-cache-handler.d.ts +179 -40
  56. package/lib/adapter/s3-cache-handler.js +807 -277
  57. package/lib/adapter/s3-cache-handler.test.js +1186 -31
  58. package/lib/adapter/use-cache-common.d.ts +90 -0
  59. package/lib/adapter/use-cache-common.js +250 -0
  60. package/lib/adapter/use-cache-common.test.d.ts +1 -0
  61. package/lib/adapter/use-cache-common.test.js +646 -0
  62. package/lib/adapter/use-cache-default-handler.d.ts +24 -0
  63. package/lib/adapter/use-cache-default-handler.js +90 -0
  64. package/lib/adapter/use-cache-default-handler.mjs +38645 -0
  65. package/lib/adapter/use-cache-handlers.test.d.ts +1 -0
  66. package/lib/adapter/use-cache-handlers.test.js +349 -0
  67. package/lib/adapter/use-cache-remote-handler.d.ts +26 -0
  68. package/lib/adapter/use-cache-remote-handler.js +186 -0
  69. package/lib/{image-optimization/handler.mjs → adapter/use-cache-remote-handler.mjs} +33572 -38798
  70. package/lib/generated-structs/OptionalNextjsApiProps.d.ts +59 -0
  71. package/lib/generated-structs/OptionalNextjsApiProps.js +3 -0
  72. package/lib/generated-structs/OptionalNextjsCacheProps.d.ts +15 -6
  73. package/lib/generated-structs/OptionalNextjsCacheProps.js +1 -1
  74. package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +25 -11
  75. package/lib/generated-structs/OptionalNextjsContainersProps.js +1 -1
  76. package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +31 -9
  77. package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
  78. package/lib/generated-structs/OptionalNextjsPostDeployProps.d.ts +8 -0
  79. package/lib/generated-structs/OptionalNextjsPostDeployProps.js +1 -1
  80. package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +6 -4
  81. package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.js +1 -1
  82. package/lib/index.d.ts +6 -7
  83. package/lib/index.js +2 -4
  84. package/lib/lambdas/post-deploy/prune-cache-bucket.d.ts +7 -3
  85. package/lib/lambdas/post-deploy/prune-cache-bucket.js +57 -71
  86. package/lib/lambdas/post-deploy/prune-cache-bucket.test.d.ts +1 -0
  87. package/lib/lambdas/post-deploy/prune-cache-bucket.test.js +114 -0
  88. package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +1 -0
  89. package/lib/lambdas/post-deploy/prune-revalidation-table.js +23 -31
  90. package/lib/lambdas/post-deploy/prune-revalidation-table.test.d.ts +1 -0
  91. package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +71 -0
  92. package/lib/lambdas/post-deploy/prune-s3.d.ts +14 -5
  93. package/lib/lambdas/post-deploy/prune-s3.js +41 -12
  94. package/lib/lambdas/post-deploy/prune-s3.test.js +97 -18
  95. package/lib/lambdas/redeploy-stage/redeploy-stage-function.d.ts +13 -0
  96. package/lib/lambdas/redeploy-stage/redeploy-stage-function.js +55 -0
  97. package/lib/lambdas/redeploy-stage/redeploy-stage.d.ts +24 -0
  98. package/lib/lambdas/redeploy-stage/redeploy-stage.js +68 -0
  99. package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.d.ts +20 -0
  100. package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.js +24 -0
  101. package/lib/lambdas/redeploy-stage/redeploy-stage.test.d.ts +1 -0
  102. package/lib/lambdas/redeploy-stage/redeploy-stage.test.js +93 -0
  103. package/lib/nextjs-api.d.ts +102 -18
  104. package/lib/nextjs-api.js +338 -38
  105. package/lib/nextjs-api.test.js +537 -1
  106. package/lib/nextjs-build/global-containers.Dockerfile +15 -10
  107. package/lib/nextjs-build/nextjs-build.d.ts +339 -63
  108. package/lib/nextjs-build/nextjs-build.js +684 -327
  109. package/lib/nextjs-build/nextjs-build.test.d.ts +1 -0
  110. package/lib/nextjs-build/nextjs-build.test.js +412 -0
  111. package/lib/nextjs-build/patch-fetch.js +1 -1
  112. package/lib/nextjs-build/patch-fetch.test.js +166 -11
  113. package/lib/nextjs-build/regional-containers.Dockerfile +17 -10
  114. package/lib/nextjs-cache.d.ts +82 -4
  115. package/lib/nextjs-cache.js +186 -10
  116. package/lib/nextjs-cache.test.js +176 -1
  117. package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +21 -8
  118. package/lib/nextjs-compute/nextjs-compute-base-props.js +41 -1
  119. package/lib/nextjs-compute/nextjs-compute-base-props.test.d.ts +1 -0
  120. package/lib/nextjs-compute/nextjs-compute-base-props.test.js +44 -0
  121. package/lib/nextjs-compute/nextjs-containers.d.ts +19 -0
  122. package/lib/nextjs-compute/nextjs-containers.js +57 -20
  123. package/lib/nextjs-compute/nextjs-functions.d.ts +122 -7
  124. package/lib/nextjs-compute/nextjs-functions.js +113 -67
  125. package/lib/nextjs-compute/nextjs-functions.test.d.ts +1 -0
  126. package/lib/nextjs-compute/nextjs-functions.test.js +99 -0
  127. package/lib/nextjs-distribution.d.ts +194 -23
  128. package/lib/nextjs-distribution.js +535 -62
  129. package/lib/nextjs-distribution.test.d.ts +1 -0
  130. package/lib/nextjs-distribution.test.js +697 -0
  131. package/lib/nextjs-post-deploy.d.ts +13 -5
  132. package/lib/nextjs-post-deploy.js +13 -10
  133. package/lib/nextjs-post-deploy.test.d.ts +1 -0
  134. package/lib/nextjs-post-deploy.test.js +34 -0
  135. package/lib/nextjs-static-assets.d.ts +17 -4
  136. package/lib/nextjs-static-assets.js +22 -5
  137. package/lib/root-constructs/nextjs-base-construct.d.ts +102 -58
  138. package/lib/root-constructs/nextjs-base-construct.js +139 -47
  139. package/lib/root-constructs/nextjs-global-containers.d.ts +18 -20
  140. package/lib/root-constructs/nextjs-global-containers.js +20 -71
  141. package/lib/root-constructs/nextjs-global-functions.d.ts +26 -28
  142. package/lib/root-constructs/nextjs-global-functions.js +52 -70
  143. package/lib/root-constructs/nextjs-regional-containers.d.ts +18 -5
  144. package/lib/root-constructs/nextjs-regional-containers.js +8 -15
  145. package/lib/root-constructs/nextjs-regional-functions.d.ts +22 -18
  146. package/lib/root-constructs/nextjs-regional-functions.js +8 -26
  147. package/lib/runtime/api-gateway-path.d.ts +34 -0
  148. package/lib/runtime/api-gateway-path.js +71 -0
  149. package/lib/runtime/api-gateway-path.test.d.ts +1 -0
  150. package/lib/runtime/api-gateway-path.test.js +65 -0
  151. package/lib/runtime/case-redirect.d.ts +22 -0
  152. package/lib/runtime/case-redirect.js +63 -0
  153. package/lib/runtime/case-redirect.test.d.ts +1 -0
  154. package/lib/runtime/case-redirect.test.js +32 -0
  155. package/lib/runtime/core.d.ts +234 -0
  156. package/lib/runtime/core.js +1213 -0
  157. package/lib/runtime/core.test.d.ts +1 -0
  158. package/lib/runtime/core.test.js +1678 -0
  159. package/lib/runtime/deployment-root.d.ts +13 -0
  160. package/lib/runtime/deployment-root.js +29 -0
  161. package/lib/runtime/dispatch.d.ts +331 -0
  162. package/lib/runtime/dispatch.js +751 -0
  163. package/lib/runtime/dispatch.test.d.ts +1 -0
  164. package/lib/runtime/dispatch.test.js +853 -0
  165. package/lib/runtime/entrypoints.d.ts +57 -0
  166. package/lib/runtime/entrypoints.js +115 -0
  167. package/lib/runtime/http/abort-signal.d.ts +6 -0
  168. package/lib/runtime/http/abort-signal.js +19 -0
  169. package/lib/runtime/http/abort-signal.test.d.ts +1 -0
  170. package/lib/runtime/http/abort-signal.test.js +49 -0
  171. package/lib/runtime/http/node-server.d.ts +38 -0
  172. package/lib/runtime/http/node-server.js +99 -0
  173. package/lib/runtime/http/node-server.test.d.ts +1 -0
  174. package/lib/runtime/http/node-server.test.js +96 -0
  175. package/lib/runtime/http/node-sink.d.ts +16 -0
  176. package/lib/runtime/http/node-sink.js +48 -0
  177. package/lib/runtime/http/node-sink.test.d.ts +1 -0
  178. package/lib/runtime/http/node-sink.test.js +66 -0
  179. package/lib/runtime/http/request.d.ts +62 -0
  180. package/lib/runtime/http/request.js +134 -0
  181. package/lib/runtime/http/request.test.d.ts +1 -0
  182. package/lib/runtime/http/request.test.js +103 -0
  183. package/lib/runtime/http/response.d.ts +77 -0
  184. package/lib/runtime/http/response.js +229 -0
  185. package/lib/runtime/http/response.test.d.ts +1 -0
  186. package/lib/runtime/http/response.test.js +178 -0
  187. package/lib/runtime/http/sink.d.ts +73 -0
  188. package/lib/runtime/http/sink.js +188 -0
  189. package/lib/runtime/http/sink.test.d.ts +1 -0
  190. package/lib/runtime/http/sink.test.js +257 -0
  191. package/lib/runtime/image-utils.d.ts +78 -0
  192. package/lib/runtime/image-utils.js +129 -0
  193. package/lib/runtime/image-utils.test.d.ts +1 -0
  194. package/lib/runtime/image-utils.test.js +237 -0
  195. package/lib/runtime/image.d.ts +76 -0
  196. package/lib/runtime/image.js +296 -0
  197. package/lib/runtime/image.test.d.ts +1 -0
  198. package/lib/runtime/image.test.js +405 -0
  199. package/lib/runtime/lambda-event.d.ts +4 -0
  200. package/lib/runtime/lambda-event.js +113 -0
  201. package/lib/runtime/lambda-event.test.d.ts +1 -0
  202. package/lib/runtime/lambda-event.test.js +119 -0
  203. package/lib/runtime/lambda.mjs +41595 -0
  204. package/lib/runtime/load-module.d.ts +8 -0
  205. package/lib/runtime/load-module.js +35 -0
  206. package/lib/runtime/manifest.d.ts +215 -0
  207. package/lib/runtime/manifest.js +118 -0
  208. package/lib/runtime/middleware.d.ts +43 -0
  209. package/lib/runtime/middleware.js +113 -0
  210. package/lib/runtime/middleware.test.d.ts +1 -0
  211. package/lib/runtime/middleware.test.js +259 -0
  212. package/lib/runtime/next-modules.d.ts +55 -0
  213. package/lib/runtime/next-modules.js +124 -0
  214. package/lib/runtime/next-modules.test.d.ts +1 -0
  215. package/lib/runtime/next-modules.test.js +34 -0
  216. package/lib/runtime/public-files.d.ts +32 -0
  217. package/lib/runtime/public-files.js +117 -0
  218. package/lib/runtime/public-files.test.d.ts +1 -0
  219. package/lib/runtime/public-files.test.js +97 -0
  220. package/lib/runtime/server.mjs +41588 -0
  221. package/lib/runtime/static-files.d.ts +50 -0
  222. package/lib/runtime/static-files.js +266 -0
  223. package/lib/runtime/static-files.test.d.ts +1 -0
  224. package/lib/runtime/static-files.test.js +118 -0
  225. package/lib/runtime/util.d.ts +28 -0
  226. package/lib/runtime/util.js +79 -0
  227. package/lib/utils/base-path.d.ts +106 -13
  228. package/lib/utils/base-path.js +254 -41
  229. package/lib/utils/base-path.test.js +219 -51
  230. package/lib/utils/get-architecture.d.ts +7 -8
  231. package/lib/utils/get-architecture.js +12 -13
  232. package/lib/utils/zip-directory.d.ts +14 -0
  233. package/lib/utils/zip-directory.js +121 -0
  234. package/lib/utils/zip-directory.test.d.ts +1 -0
  235. package/lib/utils/zip-directory.test.js +99 -0
  236. package/package.json +22 -3
  237. package/scripts/capture-adapter-fixture.mjs +325 -0
  238. package/scripts/e2e-deploy.sh +398 -0
  239. package/scripts/e2e-harness/README.md +707 -0
  240. package/scripts/e2e-harness/app.js +370 -0
  241. package/scripts/e2e-harness/common.sh +249 -0
  242. package/scripts/e2e-harness/screen.mjs +302 -0
  243. package/scripts/e2e-harness/stage-proxy.mjs +145 -0
  244. package/scripts/e2e-harness/type-filters.mjs +47 -0
  245. package/scripts/e2e-logs.sh +75 -0
  246. package/scripts/e2e-offline.sh +91 -0
  247. package/scripts/e2e-sweep.sh +370 -0
  248. package/scripts/e2e-warm.sh +114 -0
  249. package/scripts/zero-config-build.mjs +418 -0
  250. package/docs/1k-concurrent-users-executions.png +0 -0
  251. package/docs/plans/adapter-runtime-release.md +0 -362
  252. package/docs/plans/phase-0-image-function-opt-in.md +0 -295
  253. package/lib/generated-structs/OptionalDockerImageFunctionProps.d.ts +0 -425
  254. package/lib/generated-structs/OptionalDockerImageFunctionProps.js +0 -3
  255. package/lib/image-optimization/handler-utils.d.ts +0 -34
  256. package/lib/image-optimization/handler-utils.js +0 -83
  257. package/lib/image-optimization/handler-utils.test.js +0 -178
  258. package/lib/nextjs-build/functions.Dockerfile +0 -31
  259. package/lib/nextjs-compute/nextjs-image-function.d.ts +0 -53
  260. package/lib/nextjs-compute/nextjs-image-function.js +0 -59
  261. package/lib/utils/experimental-flags.d.ts +0 -24
  262. package/lib/utils/experimental-flags.js +0 -30
  263. /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.6.2" };
16
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsRegionalContainers", version: "0.7.0" };
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: this.baseProps.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLXJlZ2lvbmFsLWNvbnRhaW5lcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1yZWdpb25hbC1jb250YWluZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFHQSw0Q0FBMEM7QUFDMUMsbUVBS2lDO0FBR2pDLDJFQUc2QztBQUM3Qyw4REFHK0I7QUFDL0Isa0RBQThDO0FBcUM5Qzs7Ozs7R0FLRztBQUNILE1BQWEsd0JBQXlCLFNBQVEsMkNBQW1COztJQUMvRCxnQkFBZ0IsQ0FBbUI7SUFDbkMsZ0JBQWdCLENBQW1CO0lBQ25DOzs7Ozs7T0FNRztJQUNILElBQUksR0FBRztRQUNMLE9BQU8sSUFBQSxvQkFBUSxFQUNiLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQ3BDLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFnQztJQUU3QyxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUFvQztRQUVwQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsc0JBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRW5CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsa0NBQWtDLEVBQUUsQ0FBQztRQUNsRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUVPLGtDQUFrQztRQUN4Qyw0Q0FBNEM7UUFDNUMsT0FBTyxJQUFJLG9DQUFnQixDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUNwRCxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUMxQixHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVU7WUFDakMsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0I7WUFDakUsU0FBUyxFQUFFO2dCQUNULEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCO2dCQUN6QyxlQUFlLEVBQUU7b0JBQ2YsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlO29CQUMxRCxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHO2lCQUN4QjthQUNGO1lBQ0QsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSx3QkFBd0IsRUFBRSxvQkFBb0I7U0FDeEUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixPQUFPLElBQUkscUNBQWdCLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQ3BELE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU87WUFDakMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVztZQUN6QyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQjtZQUNyRCxrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTTtZQUNsRCxxQkFBcUIsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUztZQUN4RCxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCO1lBQ2pELEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsd0JBQXdCLEVBQUUscUJBQXFCO1NBQ3pFLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBM0RILDREQTREQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElDbHVzdGVyIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lY3NcIjtcbmltcG9ydCB7IElBcHBsaWNhdGlvbkxvYWRCYWxhbmNlciB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2MlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IE5leHRqc1R5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBOZXh0anNCYXNlQ29uc3RydWN0T3ZlcnJpZGVzLFxuICBOZXh0anNCYXNlT3ZlcnJpZGVzLFxuICBOZXh0anNCYXNlQ29uc3RydWN0LFxuICBOZXh0anNCYXNlUHJvcHMsXG59IGZyb20gXCIuL25leHRqcy1iYXNlLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHsgT3B0aW9uYWxOZXh0anNDb250YWluZXJzUHJvcHMgfSBmcm9tIFwiLi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNDb250YWluZXJzUHJvcHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsTmV4dGpzUG9zdERlcGxveVByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzUG9zdERlcGxveVByb3BzXCI7XG5pbXBvcnQge1xuICBOZXh0anNDb250YWluZXJzLFxuICBOZXh0anNDb250YWluZXJzT3ZlcnJpZGVzLFxufSBmcm9tIFwiLi4vbmV4dGpzLWNvbXB1dGUvbmV4dGpzLWNvbnRhaW5lcnNcIjtcbmltcG9ydCB7XG4gIE5leHRqc1Bvc3REZXBsb3ksXG4gIE5leHRqc1Bvc3REZXBsb3lPdmVycmlkZXMsXG59IGZyb20gXCIuLi9uZXh0anMtcG9zdC1kZXBsb3lcIjtcbmltcG9ydCB7IGpvaW5QYXRoIH0gZnJvbSBcIi4uL3V0aWxzL2Jhc2UtcGF0aFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc0NvbnN0cnVjdE92ZXJyaWRlcyBleHRlbmRzIE5leHRqc0Jhc2VDb25zdHJ1Y3RPdmVycmlkZXMge1xuICByZWFkb25seSBuZXh0anNDb250YWluZXJQcm9wcz86IE9wdGlvbmFsTmV4dGpzQ29udGFpbmVyc1Byb3BzO1xuICByZWFkb25seSBuZXh0anNQb3N0RGVwbG95UHJvcHM/OiBPcHRpb25hbE5leHRqc1Bvc3REZXBsb3lQcm9wcztcbn1cblxuLyoqXG4gKiBPdmVycmlkZXMgZm9yIGBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNgLiBPdmVycmlkZXMgYXJlIGxvd2VyIGxldmVsIHRoYW5cbiAqIHByb3BzIGFuZCBhcmUgcGFzc2VkIGRpcmVjdGx5IHRvIENESyBDb25zdHJ1Y3RzIGdpdmluZyB5b3UgbW9yZSBjb250cm9sLiBJdCdzXG4gKiByZWNvbW1lbmRlZCB0byB1c2UgY2F1dGlvbiBhbmQgcmV2aWV3IHNvdXJjZSBjb2RlIHNvIHlvdSBrbm93IGhvdyB0aGV5J3JlIHVzZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzT3ZlcnJpZGVzIGV4dGVuZHMgTmV4dGpzQmFzZU92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IG5leHRqc1JlZ2lvbmFsQ29udGFpbmVycz86IE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc0NvbnN0cnVjdE92ZXJyaWRlcztcbiAgcmVhZG9ubHkgbmV4dGpzQ29udGFpbmVycz86IE5leHRqc0NvbnRhaW5lcnNPdmVycmlkZXM7XG4gIHJlYWRvbmx5IG5leHRqc1Bvc3REZXBsb3k/OiBOZXh0anNQb3N0RGVwbG95T3ZlcnJpZGVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc1Byb3BzIGV4dGVuZHMgTmV4dGpzQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIEJyaW5nIHlvdXIgb3duIEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXIuIFdoZW4gcHJvdmlkZWQsIGl0IGlzIHBhc3NlZFxuICAgKiBkaXJlY3RseSB0byBgQXBwbGljYXRpb25Mb2FkQmFsYW5jZWRGYXJnYXRlU2VydmljZWAuIElmIHRoZSBBTEIgYWxyZWFkeVxuICAgKiBoYXMgYSBsaXN0ZW5lciBvbiBwb3J0IDgwLCBjYWxsIGByZW1vdmVBdXRvQ3JlYXRlZExpc3RlbmVyKClgIGFmdGVyXG4gICAqIGNvbnN0cnVjdGlvbiB0byBhdm9pZCBkZXBsb3ltZW50IGZhaWx1cmVzLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxiPzogSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyO1xuICAvKipcbiAgICogQnJpbmcgeW91ciBvd24gRUNTIGNsdXN0ZXIuIFdoZW4gcHJvdmlkZWQsIGNkay1uZXh0anMgd2lsbCBza2lwIGNyZWF0aW5nXG4gICAqIGEgbmV3IGNsdXN0ZXIgYW5kIFZQQyBnYXRld2F5IGVuZHBvaW50cy5cbiAgICovXG4gIHJlYWRvbmx5IGVjc0NsdXN0ZXI/OiBJQ2x1c3RlcjtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHByb3BzIG9mIGFueSBjb25zdHJ1Y3QuXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZXM/OiBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNPdmVycmlkZXM7XG59XG5cbi8qKlxuICogRGVwbG95IE5leHQuanMgbG9hZCBiYWxhbmNlZCB3aXRoIGNvbnRhaW5lcnMuIFVzZXMgW0FwcGxpY2F0aW9uIExvYWRcbiAqIEJhbGFuY2VyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWxhc3RpY2xvYWRiYWxhbmNpbmcvbGF0ZXN0L2FwcGxpY2F0aW9uL2ludHJvZHVjdGlvbi5odG1sKVxuICogZm9yIGxvYWQgYmFsYW5jaW5nIGFuZCBbQVdTIEZhcmdhdGVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL0FXU19GYXJnYXRlLmh0bWwpXG4gKiBmb3IgY29udGFpbmVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5leHRqc1JlZ2lvbmFsQ29udGFpbmVycyBleHRlbmRzIE5leHRqc0Jhc2VDb25zdHJ1Y3Qge1xuICBuZXh0anNDb250YWluZXJzOiBOZXh0anNDb250YWluZXJzO1xuICBuZXh0anNQb3N0RGVwbG95OiBOZXh0anNQb3N0RGVwbG95O1xuICAvKipcbiAgICogVGhlIEFMQiBmb3J3YXJkcyBldmVyeSBwYXRoIHRvIHRoZSBjb250YWluZXIgdW5jaGFuZ2VkLCBzbyB0aGUgYXBwIG9ubHlcbiAgICogYW5zd2VycyB1bmRlciBpdHMgb3duIGBiYXNlUGF0aGAuIGByZXNvbHZlZEJhc2VQYXRoYCBpcyBkZWxpYmVyYXRlbHkgbm90XG4gICAqIHVzZWQgaGVyZTogZm9yIHRoaXMgYE5leHRqc1R5cGVgIGl0IG9ubHkgbmFtZXNwYWNlcyB0aGUgUzMgYnVja2V0IGFuZCBoYXMgbm9cbiAgICogcm91dGluZyBtZWFuaW5nLCB3aGVyZWFzIHRoZSBhcHAncyBvd24gYGJhc2VQYXRoYCBpcyB3aGF0IHRoZSBjb250YWluZXJcbiAgICogc2VydmVzIGZyb20uXG4gICAqL1xuICBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGpvaW5QYXRoKFxuICAgICAgdGhpcy5uZXh0anNDb250YWluZXJzLnVybCxcbiAgICAgIHRoaXMubmV4dGpzQnVpbGQubmV4dENvbmZpZ0Jhc2VQYXRoLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNQcm9wcztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc1Byb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzLCBOZXh0anNUeXBlLlJFR0lPTkFMX0NPTlRBSU5FUlMpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIHRoaXMubmV4dGpzQ29udGFpbmVycyA9IHRoaXMuY3JlYXRlTmV4dGpzTG9hZEJhbGFuY2VkQ29udGFpbmVycygpO1xuICAgIHRoaXMubmV4dGpzUG9zdERlcGxveSA9IHRoaXMuY3JlYXRlTmV4dGpzUG9zdERlcGxveSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNMb2FkQmFsYW5jZWRDb250YWluZXJzKCk6IE5leHRqc0NvbnRhaW5lcnMge1xuICAgIC8vIENyZWF0ZSBjb250YWluZXJzIHdpdGggbG9jYWwgYnVpbGQgb3V0cHV0XG4gICAgcmV0dXJuIG5ldyBOZXh0anNDb250YWluZXJzKHRoaXMsIFwiTmV4dGpzQ29udGFpbmVyc1wiLCB7XG4gICAgICAuLi50aGlzLmNvbXB1dGVCYXNlUHJvcHMoKSxcbiAgICAgIGFsYjogdGhpcy5wcm9wcy5hbGIsXG4gICAgICBlY3NDbHVzdGVyOiB0aGlzLnByb3BzLmVjc0NsdXN0ZXIsXG4gICAgICByZWxhdGl2ZUVudHJ5cG9pbnRQYXRoOiB0aGlzLm5leHRqc0J1aWxkLnJlbGF0aXZlUGF0aFRvRW50cnlwb2ludCxcbiAgICAgIG92ZXJyaWRlczoge1xuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzQ29udGFpbmVycyxcbiAgICAgICAgZWNzQ2x1c3RlclByb3BzOiB7XG4gICAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0NvbnRhaW5lcnM/LmVjc0NsdXN0ZXJQcm9wcyxcbiAgICAgICAgICB2cGM6IHRoaXMuYmFzZVByb3BzLnZwYyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzUmVnaW9uYWxDb250YWluZXJzPy5uZXh0anNDb250YWluZXJQcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTmV4dGpzUG9zdERlcGxveSgpOiBOZXh0anNQb3N0RGVwbG95IHtcbiAgICByZXR1cm4gbmV3IE5leHRqc1Bvc3REZXBsb3kodGhpcywgXCJOZXh0anNQb3N0RGVwbG95XCIsIHtcbiAgICAgIGJ1aWxkSWQ6IHRoaXMubmV4dGpzQnVpbGQuYnVpbGRJZCxcbiAgICAgIGNhY2hlQnVja2V0OiB0aGlzLm5leHRqc0NhY2hlLmNhY2hlQnVja2V0LFxuICAgICAgcmV2YWxpZGF0aW9uVGFibGU6IHRoaXMubmV4dGpzQ2FjaGUucmV2YWxpZGF0aW9uVGFibGUsXG4gICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IHRoaXMubmV4dGpzU3RhdGljQXNzZXRzLmJ1Y2tldCxcbiAgICAgIHN0YXRpY0Fzc2V0c0tleVByZWZpeDogdGhpcy5uZXh0anNTdGF0aWNBc3NldHMua2V5UHJlZml4LFxuICAgICAgb3ZlcnJpZGVzOiB0aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzUG9zdERlcGxveSxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNSZWdpb25hbENvbnRhaW5lcnM/Lm5leHRqc1Bvc3REZXBsb3lQcm9wcyxcbiAgICB9KTtcbiAgfVxufVxuIl19
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLXJlZ2lvbmFsLWNvbnRhaW5lcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1yZWdpb25hbC1jb250YWluZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFHQSw0Q0FBMEM7QUFDMUMsbUVBS2lDO0FBRWpDLDJFQUc2QztBQUU3QyxrREFBOEM7QUFvRDlDOzs7OztHQUtHO0FBQ0gsTUFBYSx3QkFBeUIsU0FBUSwyQ0FBbUI7O0lBQy9ELGdCQUFnQixDQUFtQjtJQUNuQyxnQkFBZ0IsQ0FBbUI7SUFDbkM7Ozs7OztPQU1HO0lBQ0gsSUFBSSxHQUFHO1FBQ0wsT0FBTyxJQUFBLG9CQUFRLEVBQ2IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FDcEMsQ0FBQztJQUNKLENBQUM7SUFFTyxLQUFLLENBQWdDO0lBRTdDLFlBQ0UsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQW9DO1FBRXBDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxzQkFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFbkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxrQ0FBa0MsRUFBRSxDQUFDO1FBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBRU8sa0NBQWtDO1FBQ3hDLDRDQUE0QztRQUM1QyxPQUFPLElBQUksb0NBQWdCLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQ3BELEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQzFCLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUc7WUFDbkIsY0FBYyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYztZQUN6QyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVO1lBQ2pDLGVBQWUsRUFBRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUM7WUFDekUsc0JBQXNCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyx3QkFBd0I7WUFDakUsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0I7WUFDdkQsU0FBUyxFQUFFO2dCQUNULEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCO2dCQUN6QyxlQUFlLEVBQUU7b0JBQ2YsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlO29CQUMxRCxvRUFBb0U7b0JBQ3BFLG1FQUFtRTtvQkFDbkUsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQzNEO2FBQ0Y7WUFDRCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLHdCQUF3QixFQUFFLG9CQUFvQjtTQUN4RSxDQUFDLENBQUM7SUFDTCxDQUFDOztBQXBESCw0REFxREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQ2x1c3RlciB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCI7XG5pbXBvcnQgeyBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgTmV4dGpzQmFzZUNvbnN0cnVjdE92ZXJyaWRlcyxcbiAgTmV4dGpzQmFzZU92ZXJyaWRlcyxcbiAgTmV4dGpzQmFzZUNvbnN0cnVjdCxcbiAgTmV4dGpzQmFzZVByb3BzLFxufSBmcm9tIFwiLi9uZXh0anMtYmFzZS1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IE9wdGlvbmFsTmV4dGpzQ29udGFpbmVyc1Byb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzQ29udGFpbmVyc1Byb3BzXCI7XG5pbXBvcnQge1xuICBOZXh0anNDb250YWluZXJzLFxuICBOZXh0anNDb250YWluZXJzT3ZlcnJpZGVzLFxufSBmcm9tIFwiLi4vbmV4dGpzLWNvbXB1dGUvbmV4dGpzLWNvbnRhaW5lcnNcIjtcbmltcG9ydCB7IE5leHRqc1Bvc3REZXBsb3kgfSBmcm9tIFwiLi4vbmV4dGpzLXBvc3QtZGVwbG95XCI7XG5pbXBvcnQgeyBqb2luUGF0aCB9IGZyb20gXCIuLi91dGlscy9iYXNlLXBhdGhcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNDb25zdHJ1Y3RPdmVycmlkZXMgZXh0ZW5kcyBOZXh0anNCYXNlQ29uc3RydWN0T3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgbmV4dGpzQ29udGFpbmVyUHJvcHM/OiBPcHRpb25hbE5leHRqc0NvbnRhaW5lcnNQcm9wcztcbn1cblxuLyoqXG4gKiBPdmVycmlkZXMgZm9yIGBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNgLiBPdmVycmlkZXMgYXJlIGxvd2VyIGxldmVsIHRoYW5cbiAqIHByb3BzIGFuZCBhcmUgcGFzc2VkIGRpcmVjdGx5IHRvIENESyBDb25zdHJ1Y3RzIGdpdmluZyB5b3UgbW9yZSBjb250cm9sLiBJdCdzXG4gKiByZWNvbW1lbmRlZCB0byB1c2UgY2F1dGlvbiBhbmQgcmV2aWV3IHNvdXJjZSBjb2RlIHNvIHlvdSBrbm93IGhvdyB0aGV5J3JlIHVzZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzT3ZlcnJpZGVzIGV4dGVuZHMgTmV4dGpzQmFzZU92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IG5leHRqc1JlZ2lvbmFsQ29udGFpbmVycz86IE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc0NvbnN0cnVjdE92ZXJyaWRlcztcbiAgcmVhZG9ubHkgbmV4dGpzQ29udGFpbmVycz86IE5leHRqc0NvbnRhaW5lcnNPdmVycmlkZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzUHJvcHMgZXh0ZW5kcyBOZXh0anNCYXNlUHJvcHMge1xuICAvKipcbiAgICogQnJpbmcgeW91ciBvd24gQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlci4gV2hlbiBwcm92aWRlZCwgaXQgaXMgcGFzc2VkXG4gICAqIGRpcmVjdGx5IHRvIGBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZEZhcmdhdGVTZXJ2aWNlYC4gSWYgdGhlIEFMQiBhbHJlYWR5XG4gICAqIGhhcyBhIGxpc3RlbmVyIG9uIHBvcnQgODAsIGNhbGwgYHJlbW92ZUF1dG9DcmVhdGVkTGlzdGVuZXIoKWAgYWZ0ZXJcbiAgICogY29uc3RydWN0aW9uIHRvIGF2b2lkIGRlcGxveW1lbnQgZmFpbHVyZXMuXG4gICAqL1xuICByZWFkb25seSBhbGI/OiBJQXBwbGljYXRpb25Mb2FkQmFsYW5jZXI7XG4gIC8qKlxuICAgKiBCcmluZyB5b3VyIG93biBFQ1MgY2x1c3Rlci4gV2hlbiBwcm92aWRlZCwgY2RrLW5leHRqcyB3aWxsIHNraXAgY3JlYXRpbmdcbiAgICogYSBuZXcgY2x1c3RlciBhbmQgVlBDIGdhdGV3YXkgZW5kcG9pbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgZWNzQ2x1c3Rlcj86IElDbHVzdGVyO1xuICAvKipcbiAgICogUGF0aCB0byBBUEkgUm91dGUgSGFuZGxlciB0aGF0IHJldHVybnMgSFRUUCAyMDAgdG8gZW5zdXJlIGNvbXB1dGUgaGVhbHRoLlxuICAgKiBVc2VkIGJ5IHRoZSBBTEIgdGFyZ2V0IGdyb3VwIGFuZCB0aGUgRUNTIGNvbnRhaW5lciBoZWFsdGggY2hlY2ssIGJvdGggb2ZcbiAgICogd2hpY2ggaGF2ZSB0byBiZSBhYmxlIHRvIHRlbGwgYSBydW5uaW5nIHRhc2sgZnJvbSBhIHdlZGdlZCBvbmUuXG4gICAqXG4gICAqIEdpdmUgdGhlIHBhdGggYXMgeW91ciBhcHAgcm91dGVzIGl0LCB3aXRob3V0IHlvdXIgYXBwJ3MgYGJhc2VQYXRoYCDigJRcbiAgICogY2RrLW5leHRqcyBhZGRzIHRoYXQgcHJlZml4LCBzaW5jZSBib3RoIGNoZWNrcyBoaXQgdGhlIGFwcCBkaXJlY3RseS5cbiAgICogQGV4YW1wbGUgXCIvYXBpL2hlYWx0aFwiXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIGFwaS9oZWFsdGgvcm91dGUudHNcbiAgICogaW1wb3J0IHsgTmV4dFJlc3BvbnNlIH0gZnJvbSBcIm5leHQvc2VydmVyXCI7XG4gICAqXG4gICAqIGV4cG9ydCBmdW5jdGlvbiBHRVQoKSB7XG4gICAqICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKFwiXCIpO1xuICAgKiB9XG4gICAqL1xuICByZWFkb25seSBoZWFsdGhDaGVja1BhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHByb3BzIG9mIGFueSBjb25zdHJ1Y3QuXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZXM/OiBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNPdmVycmlkZXM7XG59XG5cbi8qKlxuICogRGVwbG95IE5leHQuanMgbG9hZCBiYWxhbmNlZCB3aXRoIGNvbnRhaW5lcnMuIFVzZXMgW0FwcGxpY2F0aW9uIExvYWRcbiAqIEJhbGFuY2VyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWxhc3RpY2xvYWRiYWxhbmNpbmcvbGF0ZXN0L2FwcGxpY2F0aW9uL2ludHJvZHVjdGlvbi5odG1sKVxuICogZm9yIGxvYWQgYmFsYW5jaW5nIGFuZCBbQVdTIEZhcmdhdGVdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2RldmVsb3Blcmd1aWRlL0FXU19GYXJnYXRlLmh0bWwpXG4gKiBmb3IgY29udGFpbmVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5leHRqc1JlZ2lvbmFsQ29udGFpbmVycyBleHRlbmRzIE5leHRqc0Jhc2VDb25zdHJ1Y3Qge1xuICBuZXh0anNDb250YWluZXJzOiBOZXh0anNDb250YWluZXJzO1xuICBuZXh0anNQb3N0RGVwbG95OiBOZXh0anNQb3N0RGVwbG95O1xuICAvKipcbiAgICogVGhlIEFMQiBmb3J3YXJkcyBldmVyeSBwYXRoIHRvIHRoZSBjb250YWluZXIgdW5jaGFuZ2VkLCBzbyB0aGUgYXBwIG9ubHlcbiAgICogYW5zd2VycyB1bmRlciBpdHMgb3duIGBiYXNlUGF0aGAuIGByZXNvbHZlZEJhc2VQYXRoYCBpcyBkZWxpYmVyYXRlbHkgbm90XG4gICAqIHVzZWQgaGVyZTogZm9yIHRoaXMgYE5leHRqc1R5cGVgIGl0IG9ubHkgbmFtZXNwYWNlcyB0aGUgUzMgYnVja2V0IGFuZCBoYXMgbm9cbiAgICogcm91dGluZyBtZWFuaW5nLCB3aGVyZWFzIHRoZSBhcHAncyBvd24gYGJhc2VQYXRoYCBpcyB3aGF0IHRoZSBjb250YWluZXJcbiAgICogc2VydmVzIGZyb20uXG4gICAqL1xuICBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGpvaW5QYXRoKFxuICAgICAgdGhpcy5uZXh0anNDb250YWluZXJzLnVybCxcbiAgICAgIHRoaXMubmV4dGpzQnVpbGQubmV4dENvbmZpZ0Jhc2VQYXRoLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNQcm9wcztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc1Byb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzLCBOZXh0anNUeXBlLlJFR0lPTkFMX0NPTlRBSU5FUlMpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIHRoaXMubmV4dGpzQ29udGFpbmVycyA9IHRoaXMuY3JlYXRlTmV4dGpzTG9hZEJhbGFuY2VkQ29udGFpbmVycygpO1xuICAgIHRoaXMubmV4dGpzUG9zdERlcGxveSA9IHRoaXMuY3JlYXRlTmV4dGpzUG9zdERlcGxveSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNMb2FkQmFsYW5jZWRDb250YWluZXJzKCk6IE5leHRqc0NvbnRhaW5lcnMge1xuICAgIC8vIENyZWF0ZSBjb250YWluZXJzIHdpdGggbG9jYWwgYnVpbGQgb3V0cHV0XG4gICAgcmV0dXJuIG5ldyBOZXh0anNDb250YWluZXJzKHRoaXMsIFwiTmV4dGpzQ29udGFpbmVyc1wiLCB7XG4gICAgICAuLi50aGlzLmNvbXB1dGVCYXNlUHJvcHMoKSxcbiAgICAgIGFsYjogdGhpcy5wcm9wcy5hbGIsXG4gICAgICBidWlsZERpcmVjdG9yeTogdGhpcy5wcm9wcy5idWlsZERpcmVjdG9yeSxcbiAgICAgIGVjc0NsdXN0ZXI6IHRoaXMucHJvcHMuZWNzQ2x1c3RlcixcbiAgICAgIGhlYWx0aENoZWNrUGF0aDogdGhpcy5yZXNvbHZlZEhlYWx0aENoZWNrUGF0aCh0aGlzLnByb3BzLmhlYWx0aENoZWNrUGF0aCksXG4gICAgICByZWxhdGl2ZUVudHJ5cG9pbnRQYXRoOiB0aGlzLm5leHRqc0J1aWxkLnJlbGF0aXZlUGF0aFRvRW50cnlwb2ludCxcbiAgICAgIHJlbGF0aXZlUHJvamVjdERpcjogdGhpcy5uZXh0anNCdWlsZC5yZWxhdGl2ZVByb2plY3REaXIsXG4gICAgICBvdmVycmlkZXM6IHtcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0NvbnRhaW5lcnMsXG4gICAgICAgIGVjc0NsdXN0ZXJQcm9wczoge1xuICAgICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNDb250YWluZXJzPy5lY3NDbHVzdGVyUHJvcHMsXG4gICAgICAgICAgLy8gQ29uZGl0aW9uYWwgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyB0aGUgRnVuY3Rpb25zJyBgdnBjYDogYXNzaWduZWRcbiAgICAgICAgICAvLyB1bmNvbmRpdGlvbmFsbHksIGFuIHVuc2V0IGB2cGNgIHByb3Agd291bGQgZXJhc2UgdGhlIG92ZXJyaWRlJ3MuXG4gICAgICAgICAgLi4uKHRoaXMuYmFzZVByb3BzLnZwYyA/IHsgdnBjOiB0aGlzLmJhc2VQcm9wcy52cGMgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzUmVnaW9uYWxDb250YWluZXJzPy5uZXh0anNDb250YWluZXJQcm9wcyxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -1,13 +1,11 @@
1
1
  import { Construct } from "constructs";
2
- import { NextjsApi, NextjsApiOverrides, NextjsApiProps } from "../nextjs-api";
3
- import { NextjsBaseConstruct, NextjsBaseProps, NextjsFunctionsConstructOverrides, NextjsBaseOverrides } from "./nextjs-base-construct";
4
- import { OptionalNextjsPostDeployProps } from "../generated-structs/OptionalNextjsPostDeployProps";
5
- import { NextjsFunctions, NextjsFunctionsOverrides } from "../nextjs-compute/nextjs-functions";
6
- import { NextjsImageFunction, NextjsImageFunctionOverrides } from "../nextjs-compute/nextjs-image-function";
7
- import { NextjsPostDeploy, NextjsPostDeployOverrides } from "../nextjs-post-deploy";
8
- export interface NextjsRegionalFunctionsConstructOverrides extends NextjsFunctionsConstructOverrides {
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.6.2" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsRegionalFunctions", version: "0.7.0" };
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(this.props.overrides?.nextjsFunctions);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLXJlZ2lvbmFsLWZ1bmN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yb290LWNvbnN0cnVjdHMvbmV4dGpzLXJlZ2lvbmFsLWZ1bmN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsNENBQTBDO0FBQzFDLDhDQUE4RTtBQUM5RSxtRUFLaUM7QUFVakMsOERBRytCO0FBQy9CLG9FQUF3RTtBQTJCeEU7OztHQUdHO0FBQ0gsTUFBYSx1QkFBd0IsU0FBUSwyQ0FBbUI7O0lBQzlELGVBQWUsQ0FBa0I7SUFDakM7Ozs7T0FJRztJQUNILG1CQUFtQixDQUF1QjtJQUMxQyxTQUFTLENBQVk7SUFDckIsZ0JBQWdCLENBQW1CO0lBQ25DLElBQUksR0FBRztRQUNMLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7SUFDNUIsQ0FBQztJQUVPLEtBQUssQ0FBK0I7SUFFNUMsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBbUM7UUFFbkMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLHNCQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVuQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsZUFBZSxDQUN0QyxDQUFDO1FBQ0YsSUFBSSxJQUFBLDhDQUF5QixHQUFFLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUN2RCxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxtQkFBbUIsQ0FDMUMsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUVPLGVBQWU7UUFDckIsT0FBTyxJQUFJLHNCQUFTLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUN0QyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTTtZQUNsRCxxQkFBcUIsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUztZQUN4RCxjQUFjLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRO1lBQzdDLGFBQWEsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsUUFBUTtZQUNqRCxRQUFRLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUMvQixTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsU0FBUztZQUMxQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQjtZQUNuRCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLHVCQUF1QixFQUFFLGNBQWM7U0FDakUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixPQUFPLElBQUkscUNBQWdCLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQ3BELE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU87WUFDakMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVztZQUN6QyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQjtZQUNyRCxrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTTtZQUNsRCxxQkFBcUIsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUztZQUN4RCxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCO1lBQ2pELEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsdUJBQXVCLEVBQUUscUJBQXFCO1NBQ3hFLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBM0RILDBEQTREQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTmV4dGpzQXBpLCBOZXh0anNBcGlPdmVycmlkZXMsIE5leHRqc0FwaVByb3BzIH0gZnJvbSBcIi4uL25leHRqcy1hcGlcIjtcbmltcG9ydCB7XG4gIE5leHRqc0Jhc2VDb25zdHJ1Y3QsXG4gIE5leHRqc0Jhc2VQcm9wcyxcbiAgTmV4dGpzRnVuY3Rpb25zQ29uc3RydWN0T3ZlcnJpZGVzLFxuICBOZXh0anNCYXNlT3ZlcnJpZGVzLFxufSBmcm9tIFwiLi9uZXh0anMtYmFzZS1jb25zdHJ1Y3RcIjtcbmltcG9ydCB7IE9wdGlvbmFsTmV4dGpzUG9zdERlcGxveVByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzUG9zdERlcGxveVByb3BzXCI7XG5pbXBvcnQge1xuICBOZXh0anNGdW5jdGlvbnMsXG4gIE5leHRqc0Z1bmN0aW9uc092ZXJyaWRlcyxcbn0gZnJvbSBcIi4uL25leHRqcy1jb21wdXRlL25leHRqcy1mdW5jdGlvbnNcIjtcbmltcG9ydCB7XG4gIE5leHRqc0ltYWdlRnVuY3Rpb24sXG4gIE5leHRqc0ltYWdlRnVuY3Rpb25PdmVycmlkZXMsXG59IGZyb20gXCIuLi9uZXh0anMtY29tcHV0ZS9uZXh0anMtaW1hZ2UtZnVuY3Rpb25cIjtcbmltcG9ydCB7XG4gIE5leHRqc1Bvc3REZXBsb3ksXG4gIE5leHRqc1Bvc3REZXBsb3lPdmVycmlkZXMsXG59IGZyb20gXCIuLi9uZXh0anMtcG9zdC1kZXBsb3lcIjtcbmltcG9ydCB7IHVzZURlZGljYXRlZEltYWdlRnVuY3Rpb24gfSBmcm9tIFwiLi4vdXRpbHMvZXhwZXJpbWVudGFsLWZsYWdzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzUmVnaW9uYWxGdW5jdGlvbnNDb25zdHJ1Y3RPdmVycmlkZXMgZXh0ZW5kcyBOZXh0anNGdW5jdGlvbnNDb25zdHJ1Y3RPdmVycmlkZXMge1xuICByZWFkb25seSBuZXh0anNBcGlQcm9wcz86IE5leHRqc0FwaVByb3BzO1xuICByZWFkb25seSBuZXh0anNQb3N0RGVwbG95UHJvcHM/OiBPcHRpb25hbE5leHRqc1Bvc3REZXBsb3lQcm9wcztcbn1cblxuLyoqXG4gKiBPdmVycmlkZXMgZm9yIGBOZXh0anNSZWdpb25hbEZ1bmN0aW9uc2AuIE92ZXJyaWRlcyBhcmUgbG93ZXIgbGV2ZWwgdGhhblxuICogcHJvcHMgYW5kIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gQ0RLIENvbnN0cnVjdHMgZ2l2aW5nIHlvdSBtb3JlIGNvbnRyb2wuIEl0J3NcbiAqIHJlY29tbWVuZGVkIHRvIHVzZSBjYXV0aW9uIGFuZCByZXZpZXcgc291cmNlIGNvZGUgc28geW91IGtub3cgaG93IHRoZXkncmUgdXNlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh0anNSZWdpb25hbEZ1bmN0aW9uc092ZXJyaWRlcyBleHRlbmRzIE5leHRqc0Jhc2VPdmVycmlkZXMge1xuICByZWFkb25seSBuZXh0anNSZWdpb25hbEZ1bmN0aW9ucz86IE5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zQ29uc3RydWN0T3ZlcnJpZGVzO1xuICByZWFkb25seSBuZXh0anNGdW5jdGlvbnM/OiBOZXh0anNGdW5jdGlvbnNPdmVycmlkZXM7XG4gIHJlYWRvbmx5IG5leHRqc0ltYWdlRnVuY3Rpb24/OiBOZXh0anNJbWFnZUZ1bmN0aW9uT3ZlcnJpZGVzO1xuICByZWFkb25seSBuZXh0anNBcGk/OiBOZXh0anNBcGlPdmVycmlkZXM7XG4gIHJlYWRvbmx5IG5leHRqc1Bvc3REZXBsb3k/OiBOZXh0anNQb3N0RGVwbG95T3ZlcnJpZGVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zUHJvcHMgZXh0ZW5kcyBOZXh0anNCYXNlUHJvcHMge1xuICAvKipcbiAgICogT3ZlcnJpZGUgcHJvcHMgb2YgYW55IGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zT3ZlcnJpZGVzO1xufVxuXG4vKipcbiAqIERlcGxveSBOZXh0LmpzIHJlZ2lvbmFsbHkgd2l0aCBmdW5jdGlvbnMuIFVzZXMgQVBJIEdhdGV3YXkgUkVTVCBBUElcbiAqIGZvciByb3V0aW5nIHJlcXVlc3RzIGFuZCBBV1MgTGFtYmRhIEZ1bmN0aW9ucyBmb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nLlxuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzUmVnaW9uYWxGdW5jdGlvbnMgZXh0ZW5kcyBOZXh0anNCYXNlQ29uc3RydWN0IHtcbiAgbmV4dGpzRnVuY3Rpb25zOiBOZXh0anNGdW5jdGlvbnM7XG4gIC8qKlxuICAgKiBPbmx5IGNyZWF0ZWQgd2hlbiB0aGUgKGV4cGVyaW1lbnRhbCwgdW5zdXBwb3J0ZWQpIGRlZGljYXRlZCBpbWFnZVxuICAgKiBvcHRpbWl6YXRpb24gTGFtYmRhIGlzIGVuYWJsZWQuIGBfbmV4dC9pbWFnZWAgaXMgb3RoZXJ3aXNlIHNlcnZlZCBieVxuICAgKiB7QGxpbmsgbmV4dGpzRnVuY3Rpb25zfS5cbiAgICovXG4gIG5leHRqc0ltYWdlRnVuY3Rpb24/OiBOZXh0anNJbWFnZUZ1bmN0aW9uO1xuICBuZXh0anNBcGk6IE5leHRqc0FwaTtcbiAgbmV4dGpzUG9zdERlcGxveTogTmV4dGpzUG9zdERlcGxveTtcbiAgZ2V0IHVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5leHRqc0FwaS51cmw7XG4gIH1cblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNSZWdpb25hbEZ1bmN0aW9uc1Byb3BzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogTmV4dGpzUmVnaW9uYWxGdW5jdGlvbnNQcm9wcyxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcywgTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIHRoaXMubmV4dGpzRnVuY3Rpb25zID0gdGhpcy5jcmVhdGVOZXh0anNGdW5jdGlvbnMoXG4gICAgICB0aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzRnVuY3Rpb25zLFxuICAgICk7XG4gICAgaWYgKHVzZURlZGljYXRlZEltYWdlRnVuY3Rpb24oKSkge1xuICAgICAgdGhpcy5uZXh0anNJbWFnZUZ1bmN0aW9uID0gdGhpcy5jcmVhdGVOZXh0anNJbWFnZUZ1bmN0aW9uKFxuICAgICAgICB0aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzSW1hZ2VGdW5jdGlvbixcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMubmV4dGpzQXBpID0gdGhpcy5jcmVhdGVOZXh0anNBcGkoKTtcbiAgICB0aGlzLm5leHRqc1Bvc3REZXBsb3kgPSB0aGlzLmNyZWF0ZU5leHRqc1Bvc3REZXBsb3koKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTmV4dGpzQXBpKCkge1xuICAgIHJldHVybiBuZXcgTmV4dGpzQXBpKHRoaXMsIFwiTmV4dGpzQXBpXCIsIHtcbiAgICAgIHN0YXRpY0Fzc2V0c0J1Y2tldDogdGhpcy5uZXh0anNTdGF0aWNBc3NldHMuYnVja2V0LFxuICAgICAgc3RhdGljQXNzZXRzS2V5UHJlZml4OiB0aGlzLm5leHRqc1N0YXRpY0Fzc2V0cy5rZXlQcmVmaXgsXG4gICAgICBzZXJ2ZXJGdW5jdGlvbjogdGhpcy5uZXh0anNGdW5jdGlvbnMuZnVuY3Rpb24sXG4gICAgICBpbWFnZUZ1bmN0aW9uOiB0aGlzLm5leHRqc0ltYWdlRnVuY3Rpb24/LmZ1bmN0aW9uLFxuICAgICAgYmFzZVBhdGg6IHRoaXMucmVzb2x2ZWRCYXNlUGF0aCxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0FwaSxcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IHRoaXMubmV4dGpzQnVpbGQucHVibGljRGlyRW50cmllcyxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNSZWdpb25hbEZ1bmN0aW9ucz8ubmV4dGpzQXBpUHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU5leHRqc1Bvc3REZXBsb3koKTogTmV4dGpzUG9zdERlcGxveSB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNQb3N0RGVwbG95KHRoaXMsIFwiTmV4dGpzUG9zdERlcGxveVwiLCB7XG4gICAgICBidWlsZElkOiB0aGlzLm5leHRqc0J1aWxkLmJ1aWxkSWQsXG4gICAgICBjYWNoZUJ1Y2tldDogdGhpcy5uZXh0anNDYWNoZS5jYWNoZUJ1Y2tldCxcbiAgICAgIHJldmFsaWRhdGlvblRhYmxlOiB0aGlzLm5leHRqc0NhY2hlLnJldmFsaWRhdGlvblRhYmxlLFxuICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiB0aGlzLm5leHRqc1N0YXRpY0Fzc2V0cy5idWNrZXQsXG4gICAgICBzdGF0aWNBc3NldHNLZXlQcmVmaXg6IHRoaXMubmV4dGpzU3RhdGljQXNzZXRzLmtleVByZWZpeCxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc1Bvc3REZXBsb3ksXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzUmVnaW9uYWxGdW5jdGlvbnM/Lm5leHRqc1Bvc3REZXBsb3lQcm9wcyxcbiAgICB9KTtcbiAgfVxufVxuIl19
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==