cdk-nextjs 0.0.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 (125) hide show
  1. package/.jsii +13811 -0
  2. package/.prettierrc +0 -0
  3. package/API.md +9694 -0
  4. package/LICENSE +202 -0
  5. package/README.md +137 -0
  6. package/THIRD-PARTY-LICENSES.md +31 -0
  7. package/assets/lambdas/assets-deployment/assets-deployment.lambda/assets-deployment.Dockerfile +18 -0
  8. package/assets/lambdas/assets-deployment/assets-deployment.lambda/index.js +8831 -0
  9. package/assets/lambdas/revalidate/revalidate.lambda/index.js +67 -0
  10. package/assets/lambdas/sign-fn-url/sign-fn-url.lambda/index.js +2002 -0
  11. package/examples/README.md +14 -0
  12. package/lib/common.d.ts +23 -0
  13. package/lib/common.js +28 -0
  14. package/lib/generated-structs/OptionalApplicationLoadBalancedTaskImageOptions.d.ts +106 -0
  15. package/lib/generated-structs/OptionalApplicationLoadBalancedTaskImageOptions.js +3 -0
  16. package/lib/generated-structs/OptionalCloudFrontFunctionProps.d.ts +43 -0
  17. package/lib/generated-structs/OptionalCloudFrontFunctionProps.js +3 -0
  18. package/lib/generated-structs/OptionalClusterProps.d.ts +49 -0
  19. package/lib/generated-structs/OptionalClusterProps.js +3 -0
  20. package/lib/generated-structs/OptionalDistributionProps.d.ts +155 -0
  21. package/lib/generated-structs/OptionalDistributionProps.js +3 -0
  22. package/lib/generated-structs/OptionalDockerImageAssetProps.d.ts +124 -0
  23. package/lib/generated-structs/OptionalDockerImageAssetProps.js +3 -0
  24. package/lib/generated-structs/OptionalDockerImageFunctionProps.d.ts +399 -0
  25. package/lib/generated-structs/OptionalDockerImageFunctionProps.js +3 -0
  26. package/lib/generated-structs/OptionalEdgeFunctionProps.d.ts +428 -0
  27. package/lib/generated-structs/OptionalEdgeFunctionProps.js +3 -0
  28. package/lib/generated-structs/OptionalFunctionProps.d.ts +422 -0
  29. package/lib/generated-structs/OptionalFunctionProps.js +3 -0
  30. package/lib/generated-structs/OptionalFunctionUrlProps.d.ts +30 -0
  31. package/lib/generated-structs/OptionalFunctionUrlProps.js +3 -0
  32. package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.d.ts +45 -0
  33. package/lib/generated-structs/OptionalNextjsAssetsDeploymentProps.js +3 -0
  34. package/lib/generated-structs/OptionalNextjsBuildProps.d.ts +30 -0
  35. package/lib/generated-structs/OptionalNextjsBuildProps.js +3 -0
  36. package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +43 -0
  37. package/lib/generated-structs/OptionalNextjsContainersProps.js +3 -0
  38. package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +50 -0
  39. package/lib/generated-structs/OptionalNextjsDistributionProps.js +3 -0
  40. package/lib/generated-structs/OptionalNextjsFileSystemProps.d.ts +15 -0
  41. package/lib/generated-structs/OptionalNextjsFileSystemProps.js +3 -0
  42. package/lib/generated-structs/OptionalNextjsInvalidationProps.d.ts +17 -0
  43. package/lib/generated-structs/OptionalNextjsInvalidationProps.js +3 -0
  44. package/lib/generated-structs/OptionalNextjsVpcProps.d.ts +21 -0
  45. package/lib/generated-structs/OptionalNextjsVpcProps.js +3 -0
  46. package/lib/generated-structs/OptionalS3OriginProps.d.ts +64 -0
  47. package/lib/generated-structs/OptionalS3OriginProps.js +3 -0
  48. package/lib/generated-structs/OptionalVpcProps.d.ts +224 -0
  49. package/lib/generated-structs/OptionalVpcProps.js +3 -0
  50. package/lib/index.d.ts +35 -0
  51. package/lib/index.js +32 -0
  52. package/lib/lambdas/assets-deployment/assets-deployment-function.d.ts +13 -0
  53. package/lib/lambdas/assets-deployment/assets-deployment-function.js +23 -0
  54. package/lib/lambdas/assets-deployment/assets-deployment.lambda.d.ts +2 -0
  55. package/lib/lambdas/assets-deployment/assets-deployment.lambda.js +62 -0
  56. package/lib/lambdas/assets-deployment/common.d.ts +8 -0
  57. package/lib/lambdas/assets-deployment/common.js +32 -0
  58. package/lib/lambdas/assets-deployment/fs-to-fs.d.ts +2 -0
  59. package/lib/lambdas/assets-deployment/fs-to-fs.js +9 -0
  60. package/lib/lambdas/assets-deployment/fs-to-s3.d.ts +2 -0
  61. package/lib/lambdas/assets-deployment/fs-to-s3.js +45 -0
  62. package/lib/lambdas/assets-deployment/prune-s3.d.ts +15 -0
  63. package/lib/lambdas/assets-deployment/prune-s3.js +42 -0
  64. package/lib/lambdas/assets-deployment/s3.d.ts +2 -0
  65. package/lib/lambdas/assets-deployment/s3.js +7 -0
  66. package/lib/lambdas/assets-deployment/utils.d.ts +18 -0
  67. package/lib/lambdas/assets-deployment/utils.js +35 -0
  68. package/lib/lambdas/revalidate/revalidate-function.d.ts +13 -0
  69. package/lib/lambdas/revalidate/revalidate-function.js +23 -0
  70. package/lib/lambdas/revalidate/revalidate.lambda.d.ts +2 -0
  71. package/lib/lambdas/revalidate/revalidate.lambda.js +53 -0
  72. package/lib/lambdas/sign-fn-url/sign-fn-url-function.d.ts +13 -0
  73. package/lib/lambdas/sign-fn-url/sign-fn-url-function.js +23 -0
  74. package/lib/lambdas/sign-fn-url/sign-fn-url.lambda.d.ts +9 -0
  75. package/lib/lambdas/sign-fn-url/sign-fn-url.lambda.js +35 -0
  76. package/lib/lambdas/sign-fn-url/sign-request.d.ts +28 -0
  77. package/lib/lambdas/sign-fn-url/sign-request.js +119 -0
  78. package/lib/lambdas/sign-fn-url/sign-request.test.d.ts +1 -0
  79. package/lib/lambdas/sign-fn-url/sign-request.test.js +129 -0
  80. package/lib/nextjs-assets-deployment.d.ts +116 -0
  81. package/lib/nextjs-assets-deployment.js +93 -0
  82. package/lib/nextjs-build/add-cache-handler.d.ts +1 -0
  83. package/lib/nextjs-build/add-cache-handler.js +23 -0
  84. package/lib/nextjs-build/add-cache-handler.mjs +18 -0
  85. package/lib/nextjs-build/builder.Dockerfile +29 -0
  86. package/lib/nextjs-build/cache-handler.cjs +21513 -0
  87. package/lib/nextjs-build/cache-handler.d.ts +6 -0
  88. package/lib/nextjs-build/cache-handler.js +22 -0
  89. package/lib/nextjs-build/global-containers.Dockerfile +45 -0
  90. package/lib/nextjs-build/global-functions.Dockerfile +46 -0
  91. package/lib/nextjs-build/nextjs-build.d.ts +150 -0
  92. package/lib/nextjs-build/nextjs-build.js +220 -0
  93. package/lib/nextjs-build/regional-containers.Dockerfile +45 -0
  94. package/lib/nextjs-build/symlink-full-route-cache.d.ts +1 -0
  95. package/lib/nextjs-build/symlink-full-route-cache.js +37 -0
  96. package/lib/nextjs-build/symlink-full-route-cache.mjs +23 -0
  97. package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +8 -0
  98. package/lib/nextjs-compute/nextjs-compute-base-props.js +3 -0
  99. package/lib/nextjs-compute/nextjs-containers.d.ts +43 -0
  100. package/lib/nextjs-compute/nextjs-containers.js +149 -0
  101. package/lib/nextjs-compute/nextjs-functions.d.ts +23 -0
  102. package/lib/nextjs-compute/nextjs-functions.js +57 -0
  103. package/lib/nextjs-distribution.d.ts +120 -0
  104. package/lib/nextjs-distribution.js +362 -0
  105. package/lib/nextjs-file-system.d.ts +42 -0
  106. package/lib/nextjs-file-system.js +74 -0
  107. package/lib/nextjs-invalidation.d.ts +19 -0
  108. package/lib/nextjs-invalidation.js +52 -0
  109. package/lib/nextjs-revalidation.d.ts +30 -0
  110. package/lib/nextjs-revalidation.js +65 -0
  111. package/lib/nextjs-static-assets.d.ts +21 -0
  112. package/lib/nextjs-static-assets.js +32 -0
  113. package/lib/nextjs-vpc.d.ts +42 -0
  114. package/lib/nextjs-vpc.js +64 -0
  115. package/lib/root-constructs/nextjs-base-overrides.d.ts +26 -0
  116. package/lib/root-constructs/nextjs-base-overrides.js +3 -0
  117. package/lib/root-constructs/nextjs-base-props.d.ts +56 -0
  118. package/lib/root-constructs/nextjs-base-props.js +3 -0
  119. package/lib/root-constructs/nextjs-global-containers.d.ts +74 -0
  120. package/lib/root-constructs/nextjs-global-containers.js +125 -0
  121. package/lib/root-constructs/nextjs-global-functions.d.ts +76 -0
  122. package/lib/root-constructs/nextjs-global-functions.js +131 -0
  123. package/lib/root-constructs/nextjs-regional-containers.d.ts +43 -0
  124. package/lib/root-constructs/nextjs-regional-containers.js +92 -0
  125. package/package.json +165 -0
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.NextjsGlobalContainers = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const constructs_1 = require("constructs");
7
+ const common_1 = require("../common");
8
+ const nextjs_assets_deployment_1 = require("../nextjs-assets-deployment");
9
+ const nextjs_build_1 = require("../nextjs-build/nextjs-build");
10
+ const nextjs_containers_1 = require("../nextjs-compute/nextjs-containers");
11
+ const nextjs_distribution_1 = require("../nextjs-distribution");
12
+ const nextjs_file_system_1 = require("../nextjs-file-system");
13
+ const nextjs_invalidation_1 = require("../nextjs-invalidation");
14
+ const nextjs_static_assets_1 = require("../nextjs-static-assets");
15
+ const nextjs_vpc_1 = require("../nextjs-vpc");
16
+ /**
17
+ * Deploy Next.js globally distributed with containers. Uses [CloudFront
18
+ * Distribution](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-working-with.html)
19
+ * as Content Delivery Network (CDN) for global distribution and [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS_Fargate.html)
20
+ * for containers.
21
+ */
22
+ class NextjsGlobalContainers extends constructs_1.Construct {
23
+ constructor(scope, id, props) {
24
+ super(scope, id);
25
+ this.nextjsType = common_1.NextjsType.GLOBAL_CONTAINERS;
26
+ this.props = props;
27
+ this.nextjsBuild = this.createNextjsBuild();
28
+ this.nextjsStaticAssets = this.createNextjsStaticAssets();
29
+ this.nextjsVpc = this.createVpc();
30
+ this.nextjsFileSystem = this.createNextjsFileSystem();
31
+ this.nextjsAssetsDeployment = this.createNextjsAssetsDeployment();
32
+ this.nextjsContainers = this.createNextjsContainers();
33
+ this.nextjsFileSystem.allowCompute({
34
+ connections: this.nextjsContainers.albFargateService.service.connections,
35
+ role: this.nextjsContainers.albFargateService.taskDefinition.taskRole,
36
+ });
37
+ this.nextjsDistribution = this.createNextjsDistribution();
38
+ this.nextjsInvalidation = this.createNextjsInvalidation();
39
+ }
40
+ createNextjsBuild() {
41
+ return new nextjs_build_1.NextjsBuild(this, "NextjsBuild", {
42
+ buildCommand: this.props.buildCommand,
43
+ buildContext: this.props.buildContext,
44
+ nextjsType: this.nextjsType,
45
+ relativePathToWorkspace: this.props.relativePathToWorkspace,
46
+ overrides: this.props.overrides?.nextjsBuild,
47
+ ...this.props.overrides?.nextjsGlobalContainers?.nextjsBuildProps,
48
+ });
49
+ }
50
+ createNextjsStaticAssets() {
51
+ return new nextjs_static_assets_1.NextjsStaticAssets(this, "NextjsStaticAssets", {
52
+ overrides: this.props.overrides?.nextjsStaticAssets,
53
+ ...this.props.overrides?.nextjsGlobalContainers?.nextjsStaticAssetsProps,
54
+ });
55
+ }
56
+ createVpc() {
57
+ return new nextjs_vpc_1.NextjsVpc(this, "NextjsVpc", {
58
+ nextjsType: this.nextjsType,
59
+ overrides: this.props.overrides?.nextjsVpc,
60
+ ...this.props.overrides?.nextjsGlobalContainers?.nextjsVpcProps,
61
+ });
62
+ }
63
+ createNextjsFileSystem() {
64
+ return new nextjs_file_system_1.NextjsFileSystem(this, "NextjsFileSystem", {
65
+ vpc: this.nextjsVpc.vpc,
66
+ overrides: this.props.overrides?.nextjsFileSystem,
67
+ ...this.props.overrides?.nextjsGlobalContainers?.nextjsFileSystemProps,
68
+ });
69
+ }
70
+ createNextjsAssetsDeployment() {
71
+ return new nextjs_assets_deployment_1.NextjsAssetsDeployment(this, "NextjsAssetsDeployment", {
72
+ accessPoint: this.nextjsFileSystem.accessPoint,
73
+ buildImageDigest: this.nextjsBuild.buildImageDigest,
74
+ dockerImageCode: this.nextjsBuild.imageForNextjsAssetsDeployment,
75
+ containerMountPathForEfs: this.nextjsBuild.containerMountPathForEfs,
76
+ overrides: this.props.overrides?.nextjsAssetsDeployment,
77
+ relativePathToWorkspace: this.props.relativePathToWorkspace,
78
+ staticAssetsBucket: this.nextjsStaticAssets.bucket,
79
+ vpc: this.nextjsVpc.vpc,
80
+ ...this.props.overrides?.nextjsGlobalContainers
81
+ ?.nextjsAssetsDeploymentProps,
82
+ });
83
+ }
84
+ createNextjsContainers() {
85
+ if (!this.nextjsBuild.imageForNextjsContainers) {
86
+ throw new Error("nextjsBuild.dockerImageAsset is undefined");
87
+ }
88
+ return new nextjs_containers_1.NextjsContainers(this, "NextjsContainers", {
89
+ accessPoint: this.nextjsFileSystem.accessPoint,
90
+ containerMountPathForEfs: this.nextjsBuild.containerMountPathForEfs,
91
+ dockerImageAsset: this.nextjsBuild.imageForNextjsContainers,
92
+ fileSystem: this.nextjsFileSystem.fileSystem,
93
+ healthCheckPath: this.props.healthCheckPath,
94
+ nextjsType: this.nextjsType,
95
+ relativeEntrypointPath: this.nextjsBuild.relativePathToEntrypoint,
96
+ overrides: this.props.overrides?.nextjsContainers,
97
+ vpc: this.nextjsVpc.vpc,
98
+ ...this.props.overrides?.nextjsGlobalContainers?.nextjsContainersProps,
99
+ });
100
+ }
101
+ createNextjsDistribution() {
102
+ return new nextjs_distribution_1.NextjsDistribution(this, "NextjsDistribution", {
103
+ assetsBucket: this.nextjsStaticAssets.bucket,
104
+ basePath: this.props.basePath,
105
+ certificate: this.nextjsContainers.albFargateService.certificate,
106
+ distribution: this.props.distribution,
107
+ dynamicUrl: this.nextjsContainers.url,
108
+ nextjsType: this.nextjsType,
109
+ overrides: this.props.overrides?.nextjsDistribution,
110
+ publicDirEntries: this.nextjsBuild.publicDirEntries,
111
+ ...this.props.overrides?.nextjsGlobalContainers?.nextjsDistributionProps,
112
+ });
113
+ }
114
+ createNextjsInvalidation() {
115
+ return new nextjs_invalidation_1.NextjsInvalidation(this, "NextjsInvalidation", {
116
+ distribution: this.nextjsDistribution.distribution,
117
+ overrides: this.props.overrides?.nextjsInvalidation,
118
+ ...this.props.overrides?.nextjsGlobalContainers?.nextjsInvalidationProps,
119
+ });
120
+ }
121
+ }
122
+ exports.NextjsGlobalContainers = NextjsGlobalContainers;
123
+ _a = JSII_RTTI_SYMBOL_1;
124
+ NextjsGlobalContainers[_a] = { fqn: "cdk-nextjs.NextjsGlobalContainers", version: "0.0.0" };
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWdsb2JhbC1jb250YWluZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtZ2xvYmFsLWNvbnRhaW5lcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSwyQ0FBdUM7QUFNdkMsc0NBQXVDO0FBSXZDLDBFQUFxRTtBQUNyRSwrREFBMkQ7QUFDM0QsMkVBRzZDO0FBQzdDLGdFQUdnQztBQUNoQyw4REFBeUQ7QUFDekQsZ0VBR2dDO0FBRWhDLGtFQUlpQztBQUNqQyw4Q0FBMEM7QUFxQzFDOzs7OztHQUtHO0FBQ0gsTUFBYSxzQkFBdUIsU0FBUSxzQkFBUztJQWFuRCxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUFrQztRQUVsQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBUlgsZUFBVSxHQUFHLG1CQUFVLENBQUMsaUJBQWlCLENBQUM7UUFTaEQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDMUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3RELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUNsRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQztZQUNqQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFD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QUMsVUFBVTtZQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsa0JBQWtCO1lBQ25ELGdCQUFnQixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCO1lBQ25ELEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsdUJBQXVCO1NBQ3pFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDTyx3QkFBd0I7UUFDOUIsT0FBTyxJQUFJLHdDQUFrQixDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtZQUN4RCxZQUFZLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVk7WUFDbEQsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLGtCQUFrQjtZQUNuRCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLHNCQUFzQixFQUFFLHVCQUF1QjtTQUN6RSxDQUFDLENBQUM7SUFDTCxDQUFDOztBQWxISCx3REFtSEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXN0cmlidXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnRcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICBCYXNlTmV4dGpzQ29uc3RydWN0T3ZlcnJpZGVzLFxuICBCYXNlTmV4dGpzT3ZlcnJpZGVzLFxufSBmcm9tIFwiLi9uZXh0anMtYmFzZS1vdmVycmlkZXNcIjtcbmltcG9ydCB7IE5leHRqc0Jhc2VQcm9wcyB9IGZyb20gXCIuL25leHRqcy1iYXNlLXByb3BzXCI7XG5pbXBvcnQgeyBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHsgT3B0aW9uYWxOZXh0anNDb250YWluZXJzUHJvcHMgfSBmcm9tIFwiLi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNDb250YWluZXJzUHJvcHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsTmV4dGpzRGlzdHJpYnV0aW9uUHJvcHMgfSBmcm9tIFwiLi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxOZXh0anNEaXN0cmlidXRpb25Qcm9wc1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxOZXh0anNJbnZhbGlkYXRpb25Qcm9wcyB9IGZyb20gXCIuLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbE5leHRqc0ludmFsaWRhdGlvblByb3BzXCI7XG5pbXBvcnQgeyBOZXh0anNBc3NldHNEZXBsb3ltZW50IH0gZnJvbSBcIi4uL25leHRqcy1hc3NldHMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHsgTmV4dGpzQnVpbGQgfSBmcm9tIFwiLi4vbmV4dGpzLWJ1aWxkL25leHRqcy1idWlsZFwiO1xuaW1wb3J0IHtcbiAgTmV4dGpzQ29udGFpbmVycyxcbiAgTmV4dGpzQ29udGFpbmVyc092ZXJyaWRlcyxcbn0gZnJvbSBcIi4uL25leHRqcy1jb21wdXRlL25leHRqcy1jb250YWluZXJzXCI7XG5pbXBvcnQge1xuICBOZXh0anNEaXN0cmlidXRpb24sXG4gIE5leHRqc0Rpc3RyaWJ1dGlvbk92ZXJyaWRlcyxcbn0gZnJvbSBcIi4uL25leHRqcy1kaXN0cmlidXRpb25cIjtcbmltcG9ydCB7IE5leHRqc0ZpbGVTeXN0ZW0gfSBmcm9tIFwiLi4vbmV4dGpzLWZpbGUtc3lzdGVtXCI7XG5pbXBvcnQge1xuICBOZXh0anNJbnZhbGlkYXRpb24sXG4gIE5leHRqc0ludmFsaWRhdGlvbk92ZXJyaWRlcyxcbn0gZnJvbSBcIi4uL25leHRqcy1pbnZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE5leHRqc1JldmFsaWRhdGlvblByb3BzIH0gZnJvbSBcIi4uL25leHRqcy1yZXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIE5leHRqc1N0YXRpY0Fzc2V0cyxcbiAgTmV4dGpzU3RhdGljQXNzZXRzT3ZlcnJpZGVzLFxuICBOZXh0anNTdGF0aWNBc3NldHNQcm9wcyxcbn0gZnJvbSBcIi4uL25leHRqcy1zdGF0aWMtYXNzZXRzXCI7XG5pbXBvcnQgeyBOZXh0anNWcGMgfSBmcm9tIFwiLi4vbmV4dGpzLXZwY1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0dsb2JhbENvbnRhaW5lcnNDb25zdHJ1Y3RPdmVycmlkZXNcbiAgZXh0ZW5kcyBCYXNlTmV4dGpzQ29uc3RydWN0T3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgbmV4dGpzQ29udGFpbmVyc1Byb3BzPzogT3B0aW9uYWxOZXh0anNDb250YWluZXJzUHJvcHM7XG4gIHJlYWRvbmx5IG5leHRqc0Rpc3RyaWJ1dGlvblByb3BzPzogT3B0aW9uYWxOZXh0anNEaXN0cmlidXRpb25Qcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzUmV2YWxpZGF0aW9uUHJvcHM/OiBOZXh0anNSZXZhbGlkYXRpb25Qcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzU3RhdGljQXNzZXRzUHJvcHM/OiBOZXh0anNTdGF0aWNBc3NldHNQcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzSW52YWxpZGF0aW9uUHJvcHM/OiBPcHRpb25hbE5leHRqc0ludmFsaWRhdGlvblByb3BzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0dsb2JhbENvbnRhaW5lcnNPdmVycmlkZXMgZXh0ZW5kcyBCYXNlTmV4dGpzT3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgbmV4dGpzR2xvYmFsQ29udGFpbmVycz86IE5leHRqc0dsb2JhbENvbnRhaW5lcnNDb25zdHJ1Y3RPdmVycmlkZXM7XG4gIHJlYWRvbmx5IG5leHRqc0NvbnRhaW5lcnM/OiBOZXh0anNDb250YWluZXJzT3ZlcnJpZGVzO1xuICByZWFkb25seSBuZXh0anNEaXN0cmlidXRpb24/OiBOZXh0anNEaXN0cmlidXRpb25PdmVycmlkZXM7XG4gIHJlYWRvbmx5IG5leHRqc0ludmFsaWRhdGlvbj86IE5leHRqc0ludmFsaWRhdGlvbk92ZXJyaWRlcztcbiAgcmVhZG9ubHkgbmV4dGpzU3RhdGljQXNzZXRzPzogTmV4dGpzU3RhdGljQXNzZXRzT3ZlcnJpZGVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0dsb2JhbENvbnRhaW5lcnNQcm9wcyBleHRlbmRzIE5leHRqc0Jhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBQcmVmaXggdG8gdGhlIFVSSSBwYXRoIHRoZSBhcHAgd2lsbCBiZSBzZXJ2ZWQgYXQuIEVzcGVjaWFsbHkgdXNlZnVsIHdoZW5cbiAgICogcGFzc2luZyBpbiB5b3VyIG93biBgZGlzdHJpYnV0aW9uYC5cbiAgICogQGV4YW1wbGUgXCIvbXktYmFzZS1wYXRoXCJcbiAgICovXG4gIHJlYWRvbmx5IGJhc2VQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogQnJpbmcgeW91ciBvd24gZGlzdHJpYnV0aW9uLiBDYW4gYmUgdXNlZCB3aXRoIGBiYXNlUGF0aGAgdG8gaG9zdCBtdWx0aXBsZVxuICAgKiBhcHBzIG9uIHRoZSBzYW1lIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzdHJpYnV0aW9uPzogRGlzdHJpYnV0aW9uO1xuICAvKipcbiAgICogT3ZlcnJpZGUgcHJvcHMgb2YgYW55IGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc0dsb2JhbENvbnRhaW5lcnNPdmVycmlkZXM7XG59XG5cbi8qKlxuICogRGVwbG95IE5leHQuanMgZ2xvYmFsbHkgZGlzdHJpYnV0ZWQgd2l0aCBjb250YWluZXJzLiBVc2VzIFtDbG91ZEZyb250XG4gKiBEaXN0cmlidXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZEZyb250L2xhdGVzdC9EZXZlbG9wZXJHdWlkZS9kaXN0cmlidXRpb24td29ya2luZy13aXRoLmh0bWwpXG4gKiBhcyBDb250ZW50IERlbGl2ZXJ5IE5ldHdvcmsgKENETikgZm9yIGdsb2JhbCBkaXN0cmlidXRpb24gYW5kIFtBV1MgRmFyZ2F0ZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvQVdTX0ZhcmdhdGUuaHRtbClcbiAqIGZvciBjb250YWluZXJzLlxuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzR2xvYmFsQ29udGFpbmVycyBleHRlbmRzIENvbnN0cnVjdCB7XG4gIG5leHRqc0J1aWxkOiBOZXh0anNCdWlsZDtcbiAgbmV4dGpzU3RhdGljQXNzZXRzOiBOZXh0anNTdGF0aWNBc3NldHM7XG4gIG5leHRqc1ZwYzogTmV4dGpzVnBjO1xuICBuZXh0anNGaWxlU3lzdGVtOiBOZXh0anNGaWxlU3lzdGVtO1xuICBuZXh0anNBc3NldHNEZXBsb3ltZW50OiBOZXh0anNBc3NldHNEZXBsb3ltZW50O1xuICBuZXh0anNDb250YWluZXJzOiBOZXh0anNDb250YWluZXJzO1xuICBuZXh0anNEaXN0cmlidXRpb246IE5leHRqc0Rpc3RyaWJ1dGlvbjtcbiAgbmV4dGpzSW52YWxpZGF0aW9uOiBOZXh0anNJbnZhbGlkYXRpb247XG5cbiAgcHJpdmF0ZSBuZXh0anNUeXBlID0gTmV4dGpzVHlwZS5HTE9CQUxfQ09OVEFJTkVSUztcbiAgcHJpdmF0ZSBwcm9wczogTmV4dGpzR2xvYmFsQ29udGFpbmVyc1Byb3BzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogTmV4dGpzR2xvYmFsQ29udGFpbmVyc1Byb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLm5leHRqc0J1aWxkID0gdGhpcy5jcmVhdGVOZXh0anNCdWlsZCgpO1xuICAgIHRoaXMubmV4dGpzU3RhdGljQXNzZXRzID0gdGhpcy5jcmVhdGVOZXh0anNTdGF0aWNBc3NldHMoKTtcbiAgICB0aGlzLm5leHRqc1ZwYyA9IHRoaXMuY3JlYXRlVnBjKCk7XG4gICAgdGhpcy5uZXh0anNGaWxlU3lzdGVtID0gdGhpcy5jcmVhdGVOZXh0anNGaWxlU3lzdGVtKCk7XG4gICAgdGhpcy5uZXh0anNBc3NldHNEZXBsb3ltZW50ID0gdGhpcy5jcmVhdGVOZXh0anNBc3NldHNEZXBsb3ltZW50KCk7XG4gICAgdGhpcy5uZXh0anNDb250YWluZXJzID0gdGhpcy5jcmVhdGVOZXh0anNDb250YWluZXJzKCk7XG4gICAgdGhpcy5uZXh0anNGaWxlU3lzdGVtLmFsbG93Q29tcHV0ZSh7XG4gICAgICBjb25uZWN0aW9uczogdGhpcy5uZXh0anNDb250YWluZXJzLmFsYkZhcmdhdGVTZXJ2aWNlLnNlcnZpY2UuY29ubmVjdGlvbnMsXG4gICAgICByb2xlOiB0aGlzLm5leHRqc0NvbnRhaW5lcnMuYWxiRmFyZ2F0ZVNlcnZpY2UudGFza0RlZmluaXRpb24udGFza1JvbGUsXG4gICAgfSk7XG4gICAgdGhpcy5uZXh0anNEaXN0cmlidXRpb24gPSB0aGlzLmNyZWF0ZU5leHRqc0Rpc3RyaWJ1dGlvbigpO1xuICAgIHRoaXMubmV4dGpzSW52YWxpZGF0aW9uID0gdGhpcy5jcmVhdGVOZXh0anNJbnZhbGlkYXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTmV4dGpzQnVpbGQoKSB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNCdWlsZCh0aGlzLCBcIk5leHRqc0J1aWxkXCIsIHtcbiAgICAgIGJ1aWxkQ29tbWFuZDogdGhpcy5wcm9wcy5idWlsZENvbW1hbmQsXG4gICAgICBidWlsZENvbnRleHQ6IHRoaXMucHJvcHMuYnVpbGRDb250ZXh0LFxuICAgICAgbmV4dGpzVHlwZTogdGhpcy5uZXh0anNUeXBlLFxuICAgICAgcmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2U6IHRoaXMucHJvcHMucmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2UsXG4gICAgICBvdmVycmlkZXM6IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNCdWlsZCxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNHbG9iYWxDb250YWluZXJzPy5uZXh0anNCdWlsZFByb3BzLFxuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlTmV4dGpzU3RhdGljQXNzZXRzKCkge1xuICAgIHJldHVybiBuZXcgTmV4dGpzU3RhdGljQXNzZXRzKHRoaXMsIFwiTmV4dGpzU3RhdGljQXNzZXRzXCIsIHtcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc1N0YXRpY0Fzc2V0cyxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNHbG9iYWxDb250YWluZXJzPy5uZXh0anNTdGF0aWNBc3NldHNQcm9wcyxcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZVZwYygpIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc1ZwYyh0aGlzLCBcIk5leHRqc1ZwY1wiLCB7XG4gICAgICBuZXh0anNUeXBlOiB0aGlzLm5leHRqc1R5cGUsXG4gICAgICBvdmVycmlkZXM6IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNWcGMsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzR2xvYmFsQ29udGFpbmVycz8ubmV4dGpzVnBjUHJvcHMsXG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNGaWxlU3lzdGVtKCkge1xuICAgIHJldHVybiBuZXcgTmV4dGpzRmlsZVN5c3RlbSh0aGlzLCBcIk5leHRqc0ZpbGVTeXN0ZW1cIiwge1xuICAgICAgdnBjOiB0aGlzLm5leHRqc1ZwYy52cGMsXG4gICAgICBvdmVycmlkZXM6IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNGaWxlU3lzdGVtLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0dsb2JhbENvbnRhaW5lcnM/Lm5leHRqc0ZpbGVTeXN0ZW1Qcm9wcyxcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZU5leHRqc0Fzc2V0c0RlcGxveW1lbnQoKSB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNBc3NldHNEZXBsb3ltZW50KHRoaXMsIFwiTmV4dGpzQXNzZXRzRGVwbG95bWVudFwiLCB7XG4gICAgICBhY2Nlc3NQb2ludDogdGhpcy5uZXh0anNGaWxlU3lzdGVtLmFjY2Vzc1BvaW50LFxuICAgICAgYnVpbGRJbWFnZURpZ2VzdDogdGhpcy5uZXh0anNCdWlsZC5idWlsZEltYWdlRGlnZXN0LFxuICAgICAgZG9ja2VySW1hZ2VDb2RlOiB0aGlzLm5leHRqc0J1aWxkLmltYWdlRm9yTmV4dGpzQXNzZXRzRGVwbG95bWVudCxcbiAgICAgIGNvbnRhaW5lck1vdW50UGF0aEZvckVmczogdGhpcy5uZXh0anNCdWlsZC5jb250YWluZXJNb3VudFBhdGhGb3JFZnMsXG4gICAgICBvdmVycmlkZXM6IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNBc3NldHNEZXBsb3ltZW50LFxuICAgICAgcmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2U6IHRoaXMucHJvcHMucmVsYXRpdmVQYXRoVG9Xb3Jrc3BhY2UsXG4gICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IHRoaXMubmV4dGpzU3RhdGljQXNzZXRzLmJ1Y2tldCxcbiAgICAgIHZwYzogdGhpcy5uZXh0anNWcGMudnBjLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0dsb2JhbENvbnRhaW5lcnNcbiAgICAgICAgPy5uZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHMsXG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNDb250YWluZXJzKCkge1xuICAgIGlmICghdGhpcy5uZXh0anNCdWlsZC5pbWFnZUZvck5leHRqc0NvbnRhaW5lcnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5leHRqc0J1aWxkLmRvY2tlckltYWdlQXNzZXQgaXMgdW5kZWZpbmVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE5leHRqc0NvbnRhaW5lcnModGhpcywgXCJOZXh0anNDb250YWluZXJzXCIsIHtcbiAgICAgIGFjY2Vzc1BvaW50OiB0aGlzLm5leHRqc0ZpbGVTeXN0ZW0uYWNjZXNzUG9pbnQsXG4gICAgICBjb250YWluZXJNb3VudFBhdGhGb3JFZnM6IHRoaXMubmV4dGpzQnVpbGQuY29udGFpbmVyTW91bnRQYXRoRm9yRWZzLFxuICAgICAgZG9ja2VySW1hZ2VBc3NldDogdGhpcy5uZXh0anNCdWlsZC5pbWFnZUZvck5leHRqc0NvbnRhaW5lcnMsXG4gICAgICBmaWxlU3lzdGVtOiB0aGlzLm5leHRqc0ZpbGVTeXN0ZW0uZmlsZVN5c3RlbSxcbiAgICAgIGhlYWx0aENoZWNrUGF0aDogdGhpcy5wcm9wcy5oZWFsdGhDaGVja1BhdGgsXG4gICAgICBuZXh0anNUeXBlOiB0aGlzLm5leHRqc1R5cGUsXG4gICAgICByZWxhdGl2ZUVudHJ5cG9pbnRQYXRoOiB0aGlzLm5leHRqc0J1aWxkLnJlbGF0aXZlUGF0aFRvRW50cnlwb2ludCxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0NvbnRhaW5lcnMsXG4gICAgICB2cGM6IHRoaXMubmV4dGpzVnBjLnZwYyxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNHbG9iYWxDb250YWluZXJzPy5uZXh0anNDb250YWluZXJzUHJvcHMsXG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNEaXN0cmlidXRpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNEaXN0cmlidXRpb24odGhpcywgXCJOZXh0anNEaXN0cmlidXRpb25cIiwge1xuICAgICAgYXNzZXRzQnVja2V0OiB0aGlzLm5leHRqc1N0YXRpY0Fzc2V0cy5idWNrZXQsXG4gICAgICBiYXNlUGF0aDogdGhpcy5wcm9wcy5iYXNlUGF0aCxcbiAgICAgIGNlcnRpZmljYXRlOiB0aGlzLm5leHRqc0NvbnRhaW5lcnMuYWxiRmFyZ2F0ZVNlcnZpY2UuY2VydGlmaWNhdGUsXG4gICAgICBkaXN0cmlidXRpb246IHRoaXMucHJvcHMuZGlzdHJpYnV0aW9uLFxuICAgICAgZHluYW1pY1VybDogdGhpcy5uZXh0anNDb250YWluZXJzLnVybCxcbiAgICAgIG5leHRqc1R5cGU6IHRoaXMubmV4dGpzVHlwZSxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0Rpc3RyaWJ1dGlvbixcbiAgICAgIHB1YmxpY0RpckVudHJpZXM6IHRoaXMubmV4dGpzQnVpbGQucHVibGljRGlyRW50cmllcyxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNHbG9iYWxDb250YWluZXJzPy5uZXh0anNEaXN0cmlidXRpb25Qcm9wcyxcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZU5leHRqc0ludmFsaWRhdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc0ludmFsaWRhdGlvbih0aGlzLCBcIk5leHRqc0ludmFsaWRhdGlvblwiLCB7XG4gICAgICBkaXN0cmlidXRpb246IHRoaXMubmV4dGpzRGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbixcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0ludmFsaWRhdGlvbixcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNHbG9iYWxDb250YWluZXJzPy5uZXh0anNJbnZhbGlkYXRpb25Qcm9wcyxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1,76 @@
1
+ import { Distribution } from "aws-cdk-lib/aws-cloudfront";
2
+ import { Construct } from "constructs";
3
+ import { BaseNextjsConstructOverrides, BaseNextjsOverrides } from "./nextjs-base-overrides";
4
+ import { NextjsBaseProps } from "./nextjs-base-props";
5
+ import { OptionalNextjsDistributionProps } from "../generated-structs/OptionalNextjsDistributionProps";
6
+ import { OptionalNextjsInvalidationProps } from "../generated-structs/OptionalNextjsInvalidationProps";
7
+ import { NextjsAssetsDeployment } from "../nextjs-assets-deployment";
8
+ import { NextjsBuild } from "../nextjs-build/nextjs-build";
9
+ import { NextjsFunctions, NextjsFunctionsOverrides, NextjsFunctionsProps } from "../nextjs-compute/nextjs-functions";
10
+ import { NextjsDistribution, NextjsDistributionOverrides } from "../nextjs-distribution";
11
+ import { NextjsFileSystem } from "../nextjs-file-system";
12
+ import { NextjsInvalidation, NextjsInvalidationOverrides } from "../nextjs-invalidation";
13
+ import { NextjsRevalidation, NextjsRevalidationOverrides, NextjsRevalidationProps } from "../nextjs-revalidation";
14
+ import { NextjsStaticAssets, NextjsStaticAssetsOverrides, NextjsStaticAssetsProps } from "../nextjs-static-assets";
15
+ import { NextjsVpc } from "../nextjs-vpc";
16
+ export interface NextjsGlobalFunctionsConstructOverrides extends BaseNextjsConstructOverrides {
17
+ readonly nextjsFunctionProps?: NextjsFunctionsProps;
18
+ readonly nextjsDistributionProps?: OptionalNextjsDistributionProps;
19
+ readonly nextjsInvalidationProps?: OptionalNextjsInvalidationProps;
20
+ readonly nextjsRevalidationProps?: NextjsRevalidationProps;
21
+ readonly nextjsStaticAssetsProps?: NextjsStaticAssetsProps;
22
+ }
23
+ export interface NextjsGlobalFunctionsOverrides extends BaseNextjsOverrides {
24
+ readonly nextjsGlobalFunctions?: NextjsGlobalFunctionsConstructOverrides;
25
+ readonly nextjsFunction?: NextjsFunctionsOverrides;
26
+ readonly nextjsDistribution?: NextjsDistributionOverrides;
27
+ readonly nextjsRevalidation?: NextjsRevalidationOverrides;
28
+ readonly nextjsInvalidation?: NextjsInvalidationOverrides;
29
+ readonly nextjsStaticAssets?: NextjsStaticAssetsOverrides;
30
+ }
31
+ export interface NextjsGlobalFunctionsProps extends NextjsBaseProps {
32
+ /**
33
+ * Prefix to the URI path the app will be served at. Especially useful when
34
+ * passing in your own `distribution`.
35
+ * @example "/my-base-path"
36
+ */
37
+ readonly basePath?: string;
38
+ /**
39
+ * Bring your own distribution. Can be used with `basePath` to host multiple
40
+ * apps on the same CloudFront distribution.
41
+ */
42
+ readonly distribution?: Distribution;
43
+ /**
44
+ * Override props of any construct.
45
+ */
46
+ readonly overrides?: NextjsGlobalFunctionsOverrides;
47
+ }
48
+ /**
49
+ * Deploy Next.js globally distributed with functions. Uses [CloudFront
50
+ * Distribution](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-working-with.html)
51
+ * as Content Delivery Network (CDN) for global distribution and [AWS Lambda Functions](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)
52
+ * for functions.
53
+ */
54
+ export declare class NextjsGlobalFunctions extends Construct {
55
+ nextjsBuild: NextjsBuild;
56
+ nextjsStaticAssets: NextjsStaticAssets;
57
+ nextjsVpc: NextjsVpc;
58
+ nextjsFileSystem: NextjsFileSystem;
59
+ nextjsAssetsDeployment: NextjsAssetsDeployment;
60
+ nextjsFunctions: NextjsFunctions;
61
+ nextjsDistribution: NextjsDistribution;
62
+ nextjsRevalidation: NextjsRevalidation;
63
+ nextjsInvalidation: NextjsInvalidation;
64
+ private nextjsType;
65
+ private props;
66
+ constructor(scope: Construct, id: string, props: NextjsGlobalFunctionsProps);
67
+ private createNextjsBuild;
68
+ private createNextjsStaticAssets;
69
+ private createVpc;
70
+ private createNextjsFileSystem;
71
+ private createNextjsAssetsDeployment;
72
+ private createNextjsFunctions;
73
+ private createNextjsDistribution;
74
+ private createNextjsRevalidation;
75
+ private createNextjsInvalidation;
76
+ }
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.NextjsGlobalFunctions = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const constructs_1 = require("constructs");
7
+ const common_1 = require("../common");
8
+ const nextjs_assets_deployment_1 = require("../nextjs-assets-deployment");
9
+ const nextjs_build_1 = require("../nextjs-build/nextjs-build");
10
+ const nextjs_functions_1 = require("../nextjs-compute/nextjs-functions");
11
+ const nextjs_distribution_1 = require("../nextjs-distribution");
12
+ const nextjs_file_system_1 = require("../nextjs-file-system");
13
+ const nextjs_invalidation_1 = require("../nextjs-invalidation");
14
+ const nextjs_revalidation_1 = require("../nextjs-revalidation");
15
+ const nextjs_static_assets_1 = require("../nextjs-static-assets");
16
+ const nextjs_vpc_1 = require("../nextjs-vpc");
17
+ /**
18
+ * Deploy Next.js globally distributed with functions. Uses [CloudFront
19
+ * Distribution](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-working-with.html)
20
+ * as Content Delivery Network (CDN) for global distribution and [AWS Lambda Functions](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)
21
+ * for functions.
22
+ */
23
+ class NextjsGlobalFunctions extends constructs_1.Construct {
24
+ constructor(scope, id, props) {
25
+ super(scope, id);
26
+ this.nextjsType = common_1.NextjsType.GLOBAL_FUNCTIONS;
27
+ this.props = props;
28
+ this.nextjsBuild = this.createNextjsBuild();
29
+ this.nextjsStaticAssets = this.createNextjsStaticAssets();
30
+ this.nextjsVpc = this.createVpc();
31
+ this.nextjsFileSystem = this.createNextjsFileSystem();
32
+ this.nextjsAssetsDeployment = this.createNextjsAssetsDeployment();
33
+ this.nextjsFunctions = this.createNextjsFunctions();
34
+ this.nextjsFileSystem.allowCompute({
35
+ connections: this.nextjsFunctions.function.connections,
36
+ role: this.nextjsFunctions.function.role,
37
+ });
38
+ this.nextjsDistribution = this.createNextjsDistribution();
39
+ this.nextjsRevalidation = this.createNextjsRevalidation();
40
+ this.nextjsInvalidation = this.createNextjsInvalidation();
41
+ }
42
+ createNextjsBuild() {
43
+ return new nextjs_build_1.NextjsBuild(this, "NextjsBuild", {
44
+ buildCommand: this.props.buildCommand,
45
+ buildContext: this.props.buildContext,
46
+ nextjsType: this.nextjsType,
47
+ relativePathToWorkspace: this.props.relativePathToWorkspace,
48
+ overrides: this.props.overrides?.nextjsBuild,
49
+ ...this.props.overrides?.nextjsGlobalFunctions?.nextjsBuildProps,
50
+ });
51
+ }
52
+ createNextjsStaticAssets() {
53
+ return new nextjs_static_assets_1.NextjsStaticAssets(this, "NextjsStaticAssets", {
54
+ overrides: this.props.overrides?.nextjsStaticAssets,
55
+ ...this.props.overrides?.nextjsGlobalFunctions?.nextjsStaticAssetsProps,
56
+ });
57
+ }
58
+ createVpc() {
59
+ return new nextjs_vpc_1.NextjsVpc(this, "NextjsVpc", {
60
+ nextjsType: this.nextjsType,
61
+ overrides: this.props.overrides?.nextjsVpc,
62
+ ...this.props.overrides?.nextjsGlobalFunctions?.nextjsVpcProps,
63
+ });
64
+ }
65
+ createNextjsFileSystem() {
66
+ return new nextjs_file_system_1.NextjsFileSystem(this, "NextjsFileSystem", {
67
+ vpc: this.nextjsVpc.vpc,
68
+ overrides: this.props.overrides?.nextjsFileSystem,
69
+ ...this.props.overrides?.nextjsGlobalFunctions?.nextjsFileSystemProps,
70
+ });
71
+ }
72
+ createNextjsAssetsDeployment() {
73
+ return new nextjs_assets_deployment_1.NextjsAssetsDeployment(this, "NextjsAssetsDeployment", {
74
+ accessPoint: this.nextjsFileSystem.accessPoint,
75
+ buildImageDigest: this.nextjsBuild.buildImageDigest,
76
+ containerMountPathForEfs: this.nextjsBuild.containerMountPathForEfs,
77
+ dockerImageCode: this.nextjsBuild.imageForNextjsAssetsDeployment,
78
+ overrides: this.props.overrides?.nextjsAssetsDeployment,
79
+ relativePathToWorkspace: this.props.relativePathToWorkspace,
80
+ staticAssetsBucket: this.nextjsStaticAssets.bucket,
81
+ vpc: this.nextjsVpc.vpc,
82
+ ...this.props.overrides?.nextjsGlobalFunctions
83
+ ?.nextjsAssetsDeploymentProps,
84
+ });
85
+ }
86
+ createNextjsFunctions() {
87
+ if (!this.nextjsBuild.imageForNextjsFunctions) {
88
+ throw new Error("nextjsBuild.dockerImageCode is undefined");
89
+ }
90
+ return new nextjs_functions_1.NextjsFunctions(this, "NextjsFunctions", {
91
+ accessPoint: this.nextjsFileSystem.accessPoint,
92
+ containerMountPathForEfs: this.nextjsBuild.containerMountPathForEfs,
93
+ dockerImageCode: this.nextjsBuild.imageForNextjsFunctions,
94
+ healthCheckPath: this.props.healthCheckPath,
95
+ vpc: this.nextjsVpc.vpc,
96
+ overrides: this.props.overrides?.nextjsFunction,
97
+ ...this.props.overrides?.nextjsGlobalFunctions?.nextjsFunctionProps,
98
+ });
99
+ }
100
+ createNextjsDistribution() {
101
+ return new nextjs_distribution_1.NextjsDistribution(this, "NextjsDistribution", {
102
+ assetsBucket: this.nextjsStaticAssets.bucket,
103
+ basePath: this.props.basePath,
104
+ dynamicUrl: this.nextjsFunctions.functionUrl.url,
105
+ functionArn: this.nextjsFunctions.function.functionArn,
106
+ nextjsType: this.nextjsType,
107
+ overrides: this.props.overrides?.nextjsDistribution,
108
+ publicDirEntries: this.nextjsBuild.publicDirEntries,
109
+ ...this.props.overrides?.nextjsGlobalFunctions?.nextjsDistributionProps,
110
+ });
111
+ }
112
+ createNextjsRevalidation() {
113
+ return new nextjs_revalidation_1.NextjsRevalidation(this, "NextjsRevalidation", {
114
+ fn: this.nextjsFunctions.function,
115
+ overrides: this.props.overrides?.nextjsRevalidation,
116
+ previewModeId: this.nextjsAssetsDeployment.previewModeId,
117
+ ...this.props.overrides?.nextjsGlobalFunctions?.nextjsRevalidationProps,
118
+ });
119
+ }
120
+ createNextjsInvalidation() {
121
+ return new nextjs_invalidation_1.NextjsInvalidation(this, "NextjsInvalidation", {
122
+ distribution: this.nextjsDistribution.distribution,
123
+ overrides: this.props.overrides?.nextjsInvalidation,
124
+ ...this.props.overrides?.nextjsGlobalFunctions?.nextjsInvalidationProps,
125
+ });
126
+ }
127
+ }
128
+ exports.NextjsGlobalFunctions = NextjsGlobalFunctions;
129
+ _a = JSII_RTTI_SYMBOL_1;
130
+ NextjsGlobalFunctions[_a] = { fqn: "cdk-nextjs.NextjsGlobalFunctions", version: "0.0.0" };
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWdsb2JhbC1mdW5jdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1nbG9iYWwtZnVuY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsMkNBQXVDO0FBTXZDLHNDQUF1QztBQUd2QywwRUFBcUU7QUFDckUsK0RBQTJEO0FBQzNELHlFQUk0QztBQUM1QyxnRUFHZ0M7QUFDaEMsOERBQXlEO0FBQ3pELGdFQUdnQztBQUNoQyxnRUFJZ0M7QUFDaEMsa0VBSWlDO0FBQ2pDLDhDQUEwQztBQXNDMUM7Ozs7O0dBS0c7QUFDSCxNQUFhLHFCQUFzQixTQUFRLHNCQUFTO0lBY2xELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBaUM7UUFDekUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUpYLGVBQVUsR0FBRyxtQkFBVSxDQUFDLGdCQUFnQixDQUFDO1FBSy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQzFELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDbEUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUNwRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDO1lBQ2pDLFdBQVcsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEs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LEtBQUssQ0FBQyxTQUFTLEVBQUUscUJBQXFCLEVBQUUsdUJBQXVCO1NBQ3hFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDTyx3QkFBd0I7UUFDOUIsT0FBTyxJQUFJLHdDQUFrQixDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtZQUN4RCxFQUFFLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRO1lBQ2pDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxrQkFBa0I7WUFDbkQsYUFBYSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhO1lBQ3hELEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUscUJBQXFCLEVBQUUsdUJBQXVCO1NBQ3hFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDTyx3QkFBd0I7UUFDOUIsT0FBTyxJQUFJLHdDQUFrQixDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtZQUN4RCxZQUFZLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVk7WUFDbEQsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLGtCQUFrQjtZQUNuRCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLHFCQUFxQixFQUFFLHVCQUF1QjtTQUN4RSxDQUFDLENBQUM7SUFDTCxDQUFDOztBQXBISCxzREFxSEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXN0cmlidXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnRcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICBCYXNlTmV4dGpzQ29uc3RydWN0T3ZlcnJpZGVzLFxuICBCYXNlTmV4dGpzT3ZlcnJpZGVzLFxufSBmcm9tIFwiLi9uZXh0anMtYmFzZS1vdmVycmlkZXNcIjtcbmltcG9ydCB7IE5leHRqc0Jhc2VQcm9wcyB9IGZyb20gXCIuL25leHRqcy1iYXNlLXByb3BzXCI7XG5pbXBvcnQgeyBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHsgT3B0aW9uYWxOZXh0anNEaXN0cmlidXRpb25Qcm9wcyB9IGZyb20gXCIuLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbE5leHRqc0Rpc3RyaWJ1dGlvblByb3BzXCI7XG5pbXBvcnQgeyBPcHRpb25hbE5leHRqc0ludmFsaWRhdGlvblByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzSW52YWxpZGF0aW9uUHJvcHNcIjtcbmltcG9ydCB7IE5leHRqc0Fzc2V0c0RlcGxveW1lbnQgfSBmcm9tIFwiLi4vbmV4dGpzLWFzc2V0cy1kZXBsb3ltZW50XCI7XG5pbXBvcnQgeyBOZXh0anNCdWlsZCB9IGZyb20gXCIuLi9uZXh0anMtYnVpbGQvbmV4dGpzLWJ1aWxkXCI7XG5pbXBvcnQge1xuICBOZXh0anNGdW5jdGlvbnMsXG4gIE5leHRqc0Z1bmN0aW9uc092ZXJyaWRlcyxcbiAgTmV4dGpzRnVuY3Rpb25zUHJvcHMsXG59IGZyb20gXCIuLi9uZXh0anMtY29tcHV0ZS9uZXh0anMtZnVuY3Rpb25zXCI7XG5pbXBvcnQge1xuICBOZXh0anNEaXN0cmlidXRpb24sXG4gIE5leHRqc0Rpc3RyaWJ1dGlvbk92ZXJyaWRlcyxcbn0gZnJvbSBcIi4uL25leHRqcy1kaXN0cmlidXRpb25cIjtcbmltcG9ydCB7IE5leHRqc0ZpbGVTeXN0ZW0gfSBmcm9tIFwiLi4vbmV4dGpzLWZpbGUtc3lzdGVtXCI7XG5pbXBvcnQge1xuICBOZXh0anNJbnZhbGlkYXRpb24sXG4gIE5leHRqc0ludmFsaWRhdGlvbk92ZXJyaWRlcyxcbn0gZnJvbSBcIi4uL25leHRqcy1pbnZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIE5leHRqc1JldmFsaWRhdGlvbixcbiAgTmV4dGpzUmV2YWxpZGF0aW9uT3ZlcnJpZGVzLFxuICBOZXh0anNSZXZhbGlkYXRpb25Qcm9wcyxcbn0gZnJvbSBcIi4uL25leHRqcy1yZXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIE5leHRqc1N0YXRpY0Fzc2V0cyxcbiAgTmV4dGpzU3RhdGljQXNzZXRzT3ZlcnJpZGVzLFxuICBOZXh0anNTdGF0aWNBc3NldHNQcm9wcyxcbn0gZnJvbSBcIi4uL25leHRqcy1zdGF0aWMtYXNzZXRzXCI7XG5pbXBvcnQgeyBOZXh0anNWcGMgfSBmcm9tIFwiLi4vbmV4dGpzLXZwY1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0dsb2JhbEZ1bmN0aW9uc0NvbnN0cnVjdE92ZXJyaWRlc1xuICBleHRlbmRzIEJhc2VOZXh0anNDb25zdHJ1Y3RPdmVycmlkZXMge1xuICByZWFkb25seSBuZXh0anNGdW5jdGlvblByb3BzPzogTmV4dGpzRnVuY3Rpb25zUHJvcHM7XG4gIHJlYWRvbmx5IG5leHRqc0Rpc3RyaWJ1dGlvblByb3BzPzogT3B0aW9uYWxOZXh0anNEaXN0cmlidXRpb25Qcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzSW52YWxpZGF0aW9uUHJvcHM/OiBPcHRpb25hbE5leHRqc0ludmFsaWRhdGlvblByb3BzO1xuICByZWFkb25seSBuZXh0anNSZXZhbGlkYXRpb25Qcm9wcz86IE5leHRqc1JldmFsaWRhdGlvblByb3BzO1xuICByZWFkb25seSBuZXh0anNTdGF0aWNBc3NldHNQcm9wcz86IE5leHRqc1N0YXRpY0Fzc2V0c1Byb3BzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0dsb2JhbEZ1bmN0aW9uc092ZXJyaWRlcyBleHRlbmRzIEJhc2VOZXh0anNPdmVycmlkZXMge1xuICByZWFkb25seSBuZXh0anNHbG9iYWxGdW5jdGlvbnM/OiBOZXh0anNHbG9iYWxGdW5jdGlvbnNDb25zdHJ1Y3RPdmVycmlkZXM7XG4gIHJlYWRvbmx5IG5leHRqc0Z1bmN0aW9uPzogTmV4dGpzRnVuY3Rpb25zT3ZlcnJpZGVzO1xuICByZWFkb25seSBuZXh0anNEaXN0cmlidXRpb24/OiBOZXh0anNEaXN0cmlidXRpb25PdmVycmlkZXM7XG4gIHJlYWRvbmx5IG5leHRqc1JldmFsaWRhdGlvbj86IE5leHRqc1JldmFsaWRhdGlvbk92ZXJyaWRlcztcbiAgcmVhZG9ubHkgbmV4dGpzSW52YWxpZGF0aW9uPzogTmV4dGpzSW52YWxpZGF0aW9uT3ZlcnJpZGVzO1xuICByZWFkb25seSBuZXh0anNTdGF0aWNBc3NldHM/OiBOZXh0anNTdGF0aWNBc3NldHNPdmVycmlkZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzR2xvYmFsRnVuY3Rpb25zUHJvcHMgZXh0ZW5kcyBOZXh0anNCYXNlUHJvcHMge1xuICAvKipcbiAgICogUHJlZml4IHRvIHRoZSBVUkkgcGF0aCB0aGUgYXBwIHdpbGwgYmUgc2VydmVkIGF0LiBFc3BlY2lhbGx5IHVzZWZ1bCB3aGVuXG4gICAqIHBhc3NpbmcgaW4geW91ciBvd24gYGRpc3RyaWJ1dGlvbmAuXG4gICAqIEBleGFtcGxlIFwiL215LWJhc2UtcGF0aFwiXG4gICAqL1xuICByZWFkb25seSBiYXNlUGF0aD86IHN0cmluZztcbiAgLyoqXG4gICAqIEJyaW5nIHlvdXIgb3duIGRpc3RyaWJ1dGlvbi4gQ2FuIGJlIHVzZWQgd2l0aCBgYmFzZVBhdGhgIHRvIGhvc3QgbXVsdGlwbGVcbiAgICogYXBwcyBvbiB0aGUgc2FtZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3RyaWJ1dGlvbj86IERpc3RyaWJ1dGlvbjtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIHByb3BzIG9mIGFueSBjb25zdHJ1Y3QuXG4gICAqL1xuICByZWFkb25seSBvdmVycmlkZXM/OiBOZXh0anNHbG9iYWxGdW5jdGlvbnNPdmVycmlkZXM7XG59XG5cbi8qKlxuICogRGVwbG95IE5leHQuanMgZ2xvYmFsbHkgZGlzdHJpYnV0ZWQgd2l0aCBmdW5jdGlvbnMuIFVzZXMgW0Nsb3VkRnJvbnRcbiAqIERpc3RyaWJ1dGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL2Rpc3RyaWJ1dGlvbi13b3JraW5nLXdpdGguaHRtbClcbiAqIGFzIENvbnRlbnQgRGVsaXZlcnkgTmV0d29yayAoQ0ROKSBmb3IgZ2xvYmFsIGRpc3RyaWJ1dGlvbiBhbmQgW0FXUyBMYW1iZGEgRnVuY3Rpb25zXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFtYmRhL2xhdGVzdC9kZy93ZWxjb21lLmh0bWwpXG4gKiBmb3IgZnVuY3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzR2xvYmFsRnVuY3Rpb25zIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgbmV4dGpzQnVpbGQ6IE5leHRqc0J1aWxkO1xuICBuZXh0anNTdGF0aWNBc3NldHM6IE5leHRqc1N0YXRpY0Fzc2V0cztcbiAgbmV4dGpzVnBjOiBOZXh0anNWcGM7XG4gIG5leHRqc0ZpbGVTeXN0ZW06IE5leHRqc0ZpbGVTeXN0ZW07XG4gIG5leHRqc0Fzc2V0c0RlcGxveW1lbnQ6IE5leHRqc0Fzc2V0c0RlcGxveW1lbnQ7XG4gIG5leHRqc0Z1bmN0aW9uczogTmV4dGpzRnVuY3Rpb25zO1xuICBuZXh0anNEaXN0cmlidXRpb246IE5leHRqc0Rpc3RyaWJ1dGlvbjtcbiAgbmV4dGpzUmV2YWxpZGF0aW9uOiBOZXh0anNSZXZhbGlkYXRpb247XG4gIG5leHRqc0ludmFsaWRhdGlvbjogTmV4dGpzSW52YWxpZGF0aW9uO1xuXG4gIHByaXZhdGUgbmV4dGpzVHlwZSA9IE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUztcbiAgcHJpdmF0ZSBwcm9wczogTmV4dGpzR2xvYmFsRnVuY3Rpb25zUHJvcHM7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE5leHRqc0dsb2JhbEZ1bmN0aW9uc1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgdGhpcy5uZXh0anNCdWlsZCA9IHRoaXMuY3JlYXRlTmV4dGpzQnVpbGQoKTtcbiAgICB0aGlzLm5leHRqc1N0YXRpY0Fzc2V0cyA9IHRoaXMuY3JlYXRlTmV4dGpzU3RhdGljQXNzZXRzKCk7XG4gICAgdGhpcy5uZXh0anNWcGMgPSB0aGlzLmNyZWF0ZVZwYygpO1xuICAgIHRoaXMubmV4dGpzRmlsZVN5c3RlbSA9IHRoaXMuY3JlYXRlTmV4dGpzRmlsZVN5c3RlbSgpO1xuICAgIHRoaXMubmV4dGpzQXNzZXRzRGVwbG95bWVudCA9IHRoaXMuY3JlYXRlTmV4dGpzQXNzZXRzRGVwbG95bWVudCgpO1xuICAgIHRoaXMubmV4dGpzRnVuY3Rpb25zID0gdGhpcy5jcmVhdGVOZXh0anNGdW5jdGlvbnMoKTtcbiAgICB0aGlzLm5leHRqc0ZpbGVTeXN0ZW0uYWxsb3dDb21wdXRlKHtcbiAgICAgIGNvbm5lY3Rpb25zOiB0aGlzLm5leHRqc0Z1bmN0aW9ucy5mdW5jdGlvbi5jb25uZWN0aW9ucyxcbiAgICAgIHJvbGU6IHRoaXMubmV4dGpzRnVuY3Rpb25zLmZ1bmN0aW9uLnJvbGUhLFxuICAgIH0pO1xuICAgIHRoaXMubmV4dGpzRGlzdHJpYnV0aW9uID0gdGhpcy5jcmVhdGVOZXh0anNEaXN0cmlidXRpb24oKTtcbiAgICB0aGlzLm5leHRqc1JldmFsaWRhdGlvbiA9IHRoaXMuY3JlYXRlTmV4dGpzUmV2YWxpZGF0aW9uKCk7XG4gICAgdGhpcy5uZXh0anNJbnZhbGlkYXRpb24gPSB0aGlzLmNyZWF0ZU5leHRqc0ludmFsaWRhdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNCdWlsZCgpIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc0J1aWxkKHRoaXMsIFwiTmV4dGpzQnVpbGRcIiwge1xuICAgICAgYnVpbGRDb21tYW5kOiB0aGlzLnByb3BzLmJ1aWxkQ29tbWFuZCxcbiAgICAgIGJ1aWxkQ29udGV4dDogdGhpcy5wcm9wcy5idWlsZENvbnRleHQsXG4gICAgICBuZXh0anNUeXBlOiB0aGlzLm5leHRqc1R5cGUsXG4gICAgICByZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZTogdGhpcy5wcm9wcy5yZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZSxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0J1aWxkLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0dsb2JhbEZ1bmN0aW9ucz8ubmV4dGpzQnVpbGRQcm9wcyxcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZU5leHRqc1N0YXRpY0Fzc2V0cygpIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc1N0YXRpY0Fzc2V0cyh0aGlzLCBcIk5leHRqc1N0YXRpY0Fzc2V0c1wiLCB7XG4gICAgICBvdmVycmlkZXM6IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNTdGF0aWNBc3NldHMsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzR2xvYmFsRnVuY3Rpb25zPy5uZXh0anNTdGF0aWNBc3NldHNQcm9wcyxcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZVZwYygpIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc1ZwYyh0aGlzLCBcIk5leHRqc1ZwY1wiLCB7XG4gICAgICBuZXh0anNUeXBlOiB0aGlzLm5leHRqc1R5cGUsXG4gICAgICBvdmVycmlkZXM6IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNWcGMsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzR2xvYmFsRnVuY3Rpb25zPy5uZXh0anNWcGNQcm9wcyxcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZU5leHRqc0ZpbGVTeXN0ZW0oKSB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNGaWxlU3lzdGVtKHRoaXMsIFwiTmV4dGpzRmlsZVN5c3RlbVwiLCB7XG4gICAgICB2cGM6IHRoaXMubmV4dGpzVnBjLnZwYyxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0ZpbGVTeXN0ZW0sXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzR2xvYmFsRnVuY3Rpb25zPy5uZXh0anNGaWxlU3lzdGVtUHJvcHMsXG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNBc3NldHNEZXBsb3ltZW50KCkge1xuICAgIHJldHVybiBuZXcgTmV4dGpzQXNzZXRzRGVwbG95bWVudCh0aGlzLCBcIk5leHRqc0Fzc2V0c0RlcGxveW1lbnRcIiwge1xuICAgICAgYWNjZXNzUG9pbnQ6IHRoaXMubmV4dGpzRmlsZVN5c3RlbS5hY2Nlc3NQb2ludCxcbiAgICAgIGJ1aWxkSW1hZ2VEaWdlc3Q6IHRoaXMubmV4dGpzQnVpbGQuYnVpbGRJbWFnZURpZ2VzdCxcbiAgICAgIGNvbnRhaW5lck1vdW50UGF0aEZvckVmczogdGhpcy5uZXh0anNCdWlsZC5jb250YWluZXJNb3VudFBhdGhGb3JFZnMsXG4gICAgICBkb2NrZXJJbWFnZUNvZGU6IHRoaXMubmV4dGpzQnVpbGQuaW1hZ2VGb3JOZXh0anNBc3NldHNEZXBsb3ltZW50LFxuICAgICAgb3ZlcnJpZGVzOiB0aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzQXNzZXRzRGVwbG95bWVudCxcbiAgICAgIHJlbGF0aXZlUGF0aFRvV29ya3NwYWNlOiB0aGlzLnByb3BzLnJlbGF0aXZlUGF0aFRvV29ya3NwYWNlLFxuICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiB0aGlzLm5leHRqc1N0YXRpY0Fzc2V0cy5idWNrZXQsXG4gICAgICB2cGM6IHRoaXMubmV4dGpzVnBjLnZwYyxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNHbG9iYWxGdW5jdGlvbnNcbiAgICAgICAgPy5uZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHMsXG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNGdW5jdGlvbnMoKSB7XG4gICAgaWYgKCF0aGlzLm5leHRqc0J1aWxkLmltYWdlRm9yTmV4dGpzRnVuY3Rpb25zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJuZXh0anNCdWlsZC5kb2NrZXJJbWFnZUNvZGUgaXMgdW5kZWZpbmVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE5leHRqc0Z1bmN0aW9ucyh0aGlzLCBcIk5leHRqc0Z1bmN0aW9uc1wiLCB7XG4gICAgICBhY2Nlc3NQb2ludDogdGhpcy5uZXh0anNGaWxlU3lzdGVtLmFjY2Vzc1BvaW50LFxuICAgICAgY29udGFpbmVyTW91bnRQYXRoRm9yRWZzOiB0aGlzLm5leHRqc0J1aWxkLmNvbnRhaW5lck1vdW50UGF0aEZvckVmcyxcbiAgICAgIGRvY2tlckltYWdlQ29kZTogdGhpcy5uZXh0anNCdWlsZC5pbWFnZUZvck5leHRqc0Z1bmN0aW9ucyxcbiAgICAgIGhlYWx0aENoZWNrUGF0aDogdGhpcy5wcm9wcy5oZWFsdGhDaGVja1BhdGgsXG4gICAgICB2cGM6IHRoaXMubmV4dGpzVnBjLnZwYyxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0Z1bmN0aW9uLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0dsb2JhbEZ1bmN0aW9ucz8ubmV4dGpzRnVuY3Rpb25Qcm9wcyxcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZU5leHRqc0Rpc3RyaWJ1dGlvbigpIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc0Rpc3RyaWJ1dGlvbih0aGlzLCBcIk5leHRqc0Rpc3RyaWJ1dGlvblwiLCB7XG4gICAgICBhc3NldHNCdWNrZXQ6IHRoaXMubmV4dGpzU3RhdGljQXNzZXRzLmJ1Y2tldCxcbiAgICAgIGJhc2VQYXRoOiB0aGlzLnByb3BzLmJhc2VQYXRoLFxuICAgICAgZHluYW1pY1VybDogdGhpcy5uZXh0anNGdW5jdGlvbnMuZnVuY3Rpb25VcmwudXJsLFxuICAgICAgZnVuY3Rpb25Bcm46IHRoaXMubmV4dGpzRnVuY3Rpb25zLmZ1bmN0aW9uLmZ1bmN0aW9uQXJuLFxuICAgICAgbmV4dGpzVHlwZTogdGhpcy5uZXh0anNUeXBlLFxuICAgICAgb3ZlcnJpZGVzOiB0aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzRGlzdHJpYnV0aW9uLFxuICAgICAgcHVibGljRGlyRW50cmllczogdGhpcy5uZXh0anNCdWlsZC5wdWJsaWNEaXJFbnRyaWVzLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0dsb2JhbEZ1bmN0aW9ucz8ubmV4dGpzRGlzdHJpYnV0aW9uUHJvcHMsXG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNSZXZhbGlkYXRpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNSZXZhbGlkYXRpb24odGhpcywgXCJOZXh0anNSZXZhbGlkYXRpb25cIiwge1xuICAgICAgZm46IHRoaXMubmV4dGpzRnVuY3Rpb25zLmZ1bmN0aW9uLFxuICAgICAgb3ZlcnJpZGVzOiB0aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzUmV2YWxpZGF0aW9uLFxuICAgICAgcHJldmlld01vZGVJZDogdGhpcy5uZXh0anNBc3NldHNEZXBsb3ltZW50LnByZXZpZXdNb2RlSWQsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzR2xvYmFsRnVuY3Rpb25zPy5uZXh0anNSZXZhbGlkYXRpb25Qcm9wcyxcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZU5leHRqc0ludmFsaWRhdGlvbigpIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc0ludmFsaWRhdGlvbih0aGlzLCBcIk5leHRqc0ludmFsaWRhdGlvblwiLCB7XG4gICAgICBkaXN0cmlidXRpb246IHRoaXMubmV4dGpzRGlzdHJpYnV0aW9uLmRpc3RyaWJ1dGlvbixcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0ludmFsaWRhdGlvbixcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNHbG9iYWxGdW5jdGlvbnM/Lm5leHRqc0ludmFsaWRhdGlvblByb3BzLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,43 @@
1
+ import { Construct } from "constructs";
2
+ import { BaseNextjsConstructOverrides, BaseNextjsOverrides } from "./nextjs-base-overrides";
3
+ import { NextjsBaseProps } from "./nextjs-base-props";
4
+ import { OptionalNextjsContainersProps } from "../generated-structs/OptionalNextjsContainersProps";
5
+ import { NextjsAssetsDeployment } from "../nextjs-assets-deployment";
6
+ import { NextjsBuild } from "../nextjs-build/nextjs-build";
7
+ import { NextjsContainers, NextjsContainersOverrides } from "../nextjs-compute/nextjs-containers";
8
+ import { NextjsFileSystem } from "../nextjs-file-system";
9
+ import { NextjsVpc } from "../nextjs-vpc";
10
+ export interface NextjsRegionalContainersConstructOverrides extends BaseNextjsConstructOverrides {
11
+ readonly nextjsContainerProps?: OptionalNextjsContainersProps;
12
+ }
13
+ export interface NextjsRegionalContainersOverrides extends BaseNextjsOverrides {
14
+ readonly nextjsRegionalContainers?: NextjsRegionalContainersConstructOverrides;
15
+ readonly nextjsContainers?: NextjsContainersOverrides;
16
+ }
17
+ export interface NextjsRegionalContainersProps extends NextjsBaseProps {
18
+ /**
19
+ * Override props of any construct.
20
+ */
21
+ readonly overrides?: NextjsRegionalContainersOverrides;
22
+ }
23
+ /**
24
+ * Deploy Next.js load balanced with containers. Uses [Application Load
25
+ * Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html)
26
+ * for load balancing and [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS_Fargate.html)
27
+ * for containers.
28
+ */
29
+ export declare class NextjsRegionalContainers extends Construct {
30
+ nextjsBuild: NextjsBuild;
31
+ nextjsVpc: NextjsVpc;
32
+ nextjsFileSystem: NextjsFileSystem;
33
+ nextjsAssetsDeployment: NextjsAssetsDeployment;
34
+ nextjsContainers: NextjsContainers;
35
+ private nextjsType;
36
+ private props;
37
+ constructor(scope: Construct, id: string, props: NextjsRegionalContainersProps);
38
+ private createNextjsBuild;
39
+ private createVpc;
40
+ private createNextjsFileSystem;
41
+ private createNextjsAssetsDeployment;
42
+ private createNextjsLoadBalancedContainers;
43
+ }
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.NextjsRegionalContainers = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const constructs_1 = require("constructs");
7
+ const common_1 = require("../common");
8
+ const nextjs_assets_deployment_1 = require("../nextjs-assets-deployment");
9
+ const nextjs_build_1 = require("../nextjs-build/nextjs-build");
10
+ const nextjs_containers_1 = require("../nextjs-compute/nextjs-containers");
11
+ const nextjs_file_system_1 = require("../nextjs-file-system");
12
+ const nextjs_vpc_1 = require("../nextjs-vpc");
13
+ /**
14
+ * Deploy Next.js load balanced with containers. Uses [Application Load
15
+ * Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html)
16
+ * for load balancing and [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/AWS_Fargate.html)
17
+ * for containers.
18
+ */
19
+ class NextjsRegionalContainers extends constructs_1.Construct {
20
+ constructor(scope, id, props) {
21
+ super(scope, id);
22
+ this.nextjsType = common_1.NextjsType.REGIONAL_CONTAINERS;
23
+ this.props = props;
24
+ this.nextjsBuild = this.createNextjsBuild();
25
+ this.nextjsVpc = this.createVpc();
26
+ this.nextjsFileSystem = this.createNextjsFileSystem();
27
+ this.nextjsAssetsDeployment = this.createNextjsAssetsDeployment();
28
+ this.nextjsContainers = this.createNextjsLoadBalancedContainers();
29
+ this.nextjsFileSystem.allowCompute({
30
+ connections: this.nextjsContainers.albFargateService.service.connections,
31
+ role: this.nextjsContainers.albFargateService.taskDefinition.taskRole,
32
+ });
33
+ }
34
+ createNextjsBuild() {
35
+ return new nextjs_build_1.NextjsBuild(this, "NextjsBuild", {
36
+ buildCommand: this.props.buildCommand,
37
+ buildContext: this.props.buildContext,
38
+ nextjsType: this.nextjsType,
39
+ relativePathToWorkspace: this.props.relativePathToWorkspace,
40
+ overrides: this.props.overrides?.nextjsBuild,
41
+ ...this.props.overrides?.nextjsRegionalContainers?.nextjsBuildProps,
42
+ });
43
+ }
44
+ createVpc() {
45
+ return new nextjs_vpc_1.NextjsVpc(this, "NextjsVpc", {
46
+ nextjsType: this.nextjsType,
47
+ overrides: this.props.overrides?.nextjsVpc,
48
+ ...this.props.overrides?.nextjsRegionalContainers?.nextjsVpcProps,
49
+ });
50
+ }
51
+ createNextjsFileSystem() {
52
+ return new nextjs_file_system_1.NextjsFileSystem(this, "NextjsFileSystem", {
53
+ vpc: this.nextjsVpc.vpc,
54
+ overrides: this.props.overrides?.nextjsFileSystem,
55
+ ...this.props.overrides?.nextjsRegionalContainers?.nextjsFileSystemProps,
56
+ });
57
+ }
58
+ createNextjsAssetsDeployment() {
59
+ return new nextjs_assets_deployment_1.NextjsAssetsDeployment(this, "NextjsAssetsDeployment", {
60
+ accessPoint: this.nextjsFileSystem.accessPoint,
61
+ buildImageDigest: this.nextjsBuild.buildImageDigest,
62
+ dockerImageCode: this.nextjsBuild.imageForNextjsAssetsDeployment,
63
+ containerMountPathForEfs: this.nextjsBuild.containerMountPathForEfs,
64
+ overrides: this.props.overrides?.nextjsAssetsDeployment,
65
+ relativePathToWorkspace: this.props.relativePathToWorkspace,
66
+ vpc: this.nextjsVpc.vpc,
67
+ ...this.props.overrides?.nextjsRegionalContainers
68
+ ?.nextjsAssetsDeploymentProps,
69
+ });
70
+ }
71
+ createNextjsLoadBalancedContainers() {
72
+ if (!this.nextjsBuild.imageForNextjsContainers) {
73
+ throw new Error("nextjsBuild.imageForNextjsContainers is undefined");
74
+ }
75
+ return new nextjs_containers_1.NextjsContainers(this, "NextjsContainers", {
76
+ accessPoint: this.nextjsFileSystem.accessPoint,
77
+ containerMountPathForEfs: this.nextjsBuild.containerMountPathForEfs,
78
+ dockerImageAsset: this.nextjsBuild.imageForNextjsContainers,
79
+ fileSystem: this.nextjsFileSystem.fileSystem,
80
+ healthCheckPath: this.props.healthCheckPath,
81
+ nextjsType: this.nextjsType,
82
+ overrides: this.props.overrides?.nextjsContainers,
83
+ relativeEntrypointPath: this.nextjsBuild.relativePathToEntrypoint,
84
+ vpc: this.nextjsVpc.vpc,
85
+ ...this.props.overrides?.nextjsRegionalContainers?.nextjsContainerProps,
86
+ });
87
+ }
88
+ }
89
+ exports.NextjsRegionalContainers = NextjsRegionalContainers;
90
+ _a = JSII_RTTI_SYMBOL_1;
91
+ NextjsRegionalContainers[_a] = { fqn: "cdk-nextjs.NextjsRegionalContainers", version: "0.0.0" };
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLXJlZ2lvbmFsLWNvbnRhaW5lcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1yZWdpb25hbC1jb250YWluZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsMkNBQXVDO0FBTXZDLHNDQUF1QztBQUV2QywwRUFBcUU7QUFDckUsK0RBQTJEO0FBQzNELDJFQUc2QztBQUM3Qyw4REFBeUQ7QUFDekQsOENBQTBDO0FBbUIxQzs7Ozs7R0FLRztBQUNILE1BQWEsd0JBQXlCLFNBQVEsc0JBQVM7SUFVckQsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBb0M7UUFFcEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQVJYLGVBQVUsR0FBRyxtQkFBVSxDQUFDLG1CQUFtQixDQUFDO1FBU2xELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3RELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUNsRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtDQUFrQyxFQUFFLENBQUM7UUFDbEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQztZQUNqQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxXQUFXO1lBQ3hFLElBQUksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLFFBQVE7U0FDdEUsQ0FB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QyxXQUFXLENBQUMsd0JBQXdCO1lBQ2pFLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUc7WUFDdkIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSx3QkFBd0IsRUFBRSxvQkFBb0I7U0FDeEUsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFqRkgsNERBa0ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIEJhc2VOZXh0anNDb25zdHJ1Y3RPdmVycmlkZXMsXG4gIEJhc2VOZXh0anNPdmVycmlkZXMsXG59IGZyb20gXCIuL25leHRqcy1iYXNlLW92ZXJyaWRlc1wiO1xuaW1wb3J0IHsgTmV4dGpzQmFzZVByb3BzIH0gZnJvbSBcIi4vbmV4dGpzLWJhc2UtcHJvcHNcIjtcbmltcG9ydCB7IE5leHRqc1R5cGUgfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQgeyBPcHRpb25hbE5leHRqc0NvbnRhaW5lcnNQcm9wcyB9IGZyb20gXCIuLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbE5leHRqc0NvbnRhaW5lcnNQcm9wc1wiO1xuaW1wb3J0IHsgTmV4dGpzQXNzZXRzRGVwbG95bWVudCB9IGZyb20gXCIuLi9uZXh0anMtYXNzZXRzLWRlcGxveW1lbnRcIjtcbmltcG9ydCB7IE5leHRqc0J1aWxkIH0gZnJvbSBcIi4uL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGRcIjtcbmltcG9ydCB7XG4gIE5leHRqc0NvbnRhaW5lcnMsXG4gIE5leHRqc0NvbnRhaW5lcnNPdmVycmlkZXMsXG59IGZyb20gXCIuLi9uZXh0anMtY29tcHV0ZS9uZXh0anMtY29udGFpbmVyc1wiO1xuaW1wb3J0IHsgTmV4dGpzRmlsZVN5c3RlbSB9IGZyb20gXCIuLi9uZXh0anMtZmlsZS1zeXN0ZW1cIjtcbmltcG9ydCB7IE5leHRqc1ZwYyB9IGZyb20gXCIuLi9uZXh0anMtdnBjXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzQ29uc3RydWN0T3ZlcnJpZGVzXG4gIGV4dGVuZHMgQmFzZU5leHRqc0NvbnN0cnVjdE92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IG5leHRqc0NvbnRhaW5lclByb3BzPzogT3B0aW9uYWxOZXh0anNDb250YWluZXJzUHJvcHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzT3ZlcnJpZGVzIGV4dGVuZHMgQmFzZU5leHRqc092ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IG5leHRqc1JlZ2lvbmFsQ29udGFpbmVycz86IE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc0NvbnN0cnVjdE92ZXJyaWRlcztcbiAgcmVhZG9ubHkgbmV4dGpzQ29udGFpbmVycz86IE5leHRqc0NvbnRhaW5lcnNPdmVycmlkZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzUHJvcHMgZXh0ZW5kcyBOZXh0anNCYXNlUHJvcHMge1xuICAvKipcbiAgICogT3ZlcnJpZGUgcHJvcHMgb2YgYW55IGNvbnN0cnVjdC5cbiAgICovXG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc092ZXJyaWRlcztcbn1cblxuLyoqXG4gKiBEZXBsb3kgTmV4dC5qcyBsb2FkIGJhbGFuY2VkIHdpdGggY29udGFpbmVycy4gVXNlcyBbQXBwbGljYXRpb24gTG9hZFxuICogQmFsYW5jZXJdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lbGFzdGljbG9hZGJhbGFuY2luZy9sYXRlc3QvYXBwbGljYXRpb24vaW50cm9kdWN0aW9uLmh0bWwpXG4gKiBmb3IgbG9hZCBiYWxhbmNpbmcgYW5kIFtBV1MgRmFyZ2F0ZV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvZGV2ZWxvcGVyZ3VpZGUvQVdTX0ZhcmdhdGUuaHRtbClcbiAqIGZvciBjb250YWluZXJzLlxuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgbmV4dGpzQnVpbGQ6IE5leHRqc0J1aWxkO1xuICBuZXh0anNWcGM6IE5leHRqc1ZwYztcbiAgbmV4dGpzRmlsZVN5c3RlbTogTmV4dGpzRmlsZVN5c3RlbTtcbiAgbmV4dGpzQXNzZXRzRGVwbG95bWVudDogTmV4dGpzQXNzZXRzRGVwbG95bWVudDtcbiAgbmV4dGpzQ29udGFpbmVyczogTmV4dGpzQ29udGFpbmVycztcblxuICBwcml2YXRlIG5leHRqc1R5cGUgPSBOZXh0anNUeXBlLlJFR0lPTkFMX0NPTlRBSU5FUlM7XG4gIHByaXZhdGUgcHJvcHM6IE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc1Byb3BzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogTmV4dGpzUmVnaW9uYWxDb250YWluZXJzUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMubmV4dGpzQnVpbGQgPSB0aGlzLmNyZWF0ZU5leHRqc0J1aWxkKCk7XG4gICAgdGhpcy5uZXh0anNWcGMgPSB0aGlzLmNyZWF0ZVZwYygpO1xuICAgIHRoaXMubmV4dGpzRmlsZVN5c3RlbSA9IHRoaXMuY3JlYXRlTmV4dGpzRmlsZVN5c3RlbSgpO1xuICAgIHRoaXMubmV4dGpzQXNzZXRzRGVwbG95bWVudCA9IHRoaXMuY3JlYXRlTmV4dGpzQXNzZXRzRGVwbG95bWVudCgpO1xuICAgIHRoaXMubmV4dGpzQ29udGFpbmVycyA9IHRoaXMuY3JlYXRlTmV4dGpzTG9hZEJhbGFuY2VkQ29udGFpbmVycygpO1xuICAgIHRoaXMubmV4dGpzRmlsZVN5c3RlbS5hbGxvd0NvbXB1dGUoe1xuICAgICAgY29ubmVjdGlvbnM6IHRoaXMubmV4dGpzQ29udGFpbmVycy5hbGJGYXJnYXRlU2VydmljZS5zZXJ2aWNlLmNvbm5lY3Rpb25zLFxuICAgICAgcm9sZTogdGhpcy5uZXh0anNDb250YWluZXJzLmFsYkZhcmdhdGVTZXJ2aWNlLnRhc2tEZWZpbml0aW9uLnRhc2tSb2xlLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNCdWlsZCgpIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc0J1aWxkKHRoaXMsIFwiTmV4dGpzQnVpbGRcIiwge1xuICAgICAgYnVpbGRDb21tYW5kOiB0aGlzLnByb3BzLmJ1aWxkQ29tbWFuZCxcbiAgICAgIGJ1aWxkQ29udGV4dDogdGhpcy5wcm9wcy5idWlsZENvbnRleHQsXG4gICAgICBuZXh0anNUeXBlOiB0aGlzLm5leHRqc1R5cGUsXG4gICAgICByZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZTogdGhpcy5wcm9wcy5yZWxhdGl2ZVBhdGhUb1dvcmtzcGFjZSxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0J1aWxkLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc1JlZ2lvbmFsQ29udGFpbmVycz8ubmV4dGpzQnVpbGRQcm9wcyxcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZVZwYygpIHtcbiAgICByZXR1cm4gbmV3IE5leHRqc1ZwYyh0aGlzLCBcIk5leHRqc1ZwY1wiLCB7XG4gICAgICBuZXh0anNUeXBlOiB0aGlzLm5leHRqc1R5cGUsXG4gICAgICBvdmVycmlkZXM6IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNWcGMsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzUmVnaW9uYWxDb250YWluZXJzPy5uZXh0anNWcGNQcm9wcyxcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGNyZWF0ZU5leHRqc0ZpbGVTeXN0ZW0oKSB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNGaWxlU3lzdGVtKHRoaXMsIFwiTmV4dGpzRmlsZVN5c3RlbVwiLCB7XG4gICAgICB2cGM6IHRoaXMubmV4dGpzVnBjLnZwYyxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5wcm9wcy5vdmVycmlkZXM/Lm5leHRqc0ZpbGVTeXN0ZW0sXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzUmVnaW9uYWxDb250YWluZXJzPy5uZXh0anNGaWxlU3lzdGVtUHJvcHMsXG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNBc3NldHNEZXBsb3ltZW50KCkge1xuICAgIHJldHVybiBuZXcgTmV4dGpzQXNzZXRzRGVwbG95bWVudCh0aGlzLCBcIk5leHRqc0Fzc2V0c0RlcGxveW1lbnRcIiwge1xuICAgICAgYWNjZXNzUG9pbnQ6IHRoaXMubmV4dGpzRmlsZVN5c3RlbS5hY2Nlc3NQb2ludCxcbiAgICAgIGJ1aWxkSW1hZ2VEaWdlc3Q6IHRoaXMubmV4dGpzQnVpbGQuYnVpbGRJbWFnZURpZ2VzdCxcbiAgICAgIGRvY2tlckltYWdlQ29kZTogdGhpcy5uZXh0anNCdWlsZC5pbWFnZUZvck5leHRqc0Fzc2V0c0RlcGxveW1lbnQsXG4gICAgICBjb250YWluZXJNb3VudFBhdGhGb3JFZnM6IHRoaXMubmV4dGpzQnVpbGQuY29udGFpbmVyTW91bnRQYXRoRm9yRWZzLFxuICAgICAgb3ZlcnJpZGVzOiB0aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzQXNzZXRzRGVwbG95bWVudCxcbiAgICAgIHJlbGF0aXZlUGF0aFRvV29ya3NwYWNlOiB0aGlzLnByb3BzLnJlbGF0aXZlUGF0aFRvV29ya3NwYWNlLFxuICAgICAgdnBjOiB0aGlzLm5leHRqc1ZwYy52cGMsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8ubmV4dGpzUmVnaW9uYWxDb250YWluZXJzXG4gICAgICAgID8ubmV4dGpzQXNzZXRzRGVwbG95bWVudFByb3BzLFxuICAgIH0pO1xuICB9XG4gIHByaXZhdGUgY3JlYXRlTmV4dGpzTG9hZEJhbGFuY2VkQ29udGFpbmVycygpIHtcbiAgICBpZiAoIXRoaXMubmV4dGpzQnVpbGQuaW1hZ2VGb3JOZXh0anNDb250YWluZXJzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJuZXh0anNCdWlsZC5pbWFnZUZvck5leHRqc0NvbnRhaW5lcnMgaXMgdW5kZWZpbmVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE5leHRqc0NvbnRhaW5lcnModGhpcywgXCJOZXh0anNDb250YWluZXJzXCIsIHtcbiAgICAgIGFjY2Vzc1BvaW50OiB0aGlzLm5leHRqc0ZpbGVTeXN0ZW0uYWNjZXNzUG9pbnQsXG4gICAgICBjb250YWluZXJNb3VudFBhdGhGb3JFZnM6IHRoaXMubmV4dGpzQnVpbGQuY29udGFpbmVyTW91bnRQYXRoRm9yRWZzLFxuICAgICAgZG9ja2VySW1hZ2VBc3NldDogdGhpcy5uZXh0anNCdWlsZC5pbWFnZUZvck5leHRqc0NvbnRhaW5lcnMsXG4gICAgICBmaWxlU3lzdGVtOiB0aGlzLm5leHRqc0ZpbGVTeXN0ZW0uZmlsZVN5c3RlbSxcbiAgICAgIGhlYWx0aENoZWNrUGF0aDogdGhpcy5wcm9wcy5oZWFsdGhDaGVja1BhdGgsXG4gICAgICBuZXh0anNUeXBlOiB0aGlzLm5leHRqc1R5cGUsXG4gICAgICBvdmVycmlkZXM6IHRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNDb250YWluZXJzLFxuICAgICAgcmVsYXRpdmVFbnRyeXBvaW50UGF0aDogdGhpcy5uZXh0anNCdWlsZC5yZWxhdGl2ZVBhdGhUb0VudHJ5cG9pbnQsXG4gICAgICB2cGM6IHRoaXMubmV4dGpzVnBjLnZwYyxcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5uZXh0anNSZWdpb25hbENvbnRhaW5lcnM/Lm5leHRqc0NvbnRhaW5lclByb3BzLFxuICAgIH0pO1xuICB9XG59XG4iXX0=