@microsoft/terraform-cdk-constructs 0.0.3-pre.11 → 0.0.3-pre.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/.jsii +334 -211
  2. package/API.md +166 -76
  3. package/README.md +4 -5
  4. package/docs/testing.md +39 -137
  5. package/lib/azure-actiongroup/test/AzureActionGroup.integ.js +66 -0
  6. package/lib/azure-actiongroup/test/AzureActionGroup.spec.js +5 -22
  7. package/lib/azure-applicationgateway/lib/gateway.js +1 -1
  8. package/lib/azure-applicationgateway/test/AzureApplicationGateway.integ.d.ts +1 -0
  9. package/lib/azure-applicationgateway/test/AzureApplicationGateway.integ.js +272 -0
  10. package/lib/azure-applicationgateway/test/AzureApplicationGateway.spec.js +3 -20
  11. package/lib/azure-applicationinsights/lib/appinsights.js +1 -1
  12. package/lib/azure-applicationinsights/test/AzureAppInsights.integ.d.ts +1 -0
  13. package/lib/azure-applicationinsights/test/AzureAppInsights.integ.js +101 -0
  14. package/lib/azure-applicationinsights/test/AzureAppInsights.spec.js +4 -21
  15. package/lib/azure-containerregistry/lib/registry.js +1 -1
  16. package/lib/azure-containerregistry/test/AzureContainerRegistry.integ.d.ts +1 -0
  17. package/lib/azure-containerregistry/test/AzureContainerRegistry.integ.js +68 -0
  18. package/lib/azure-containerregistry/test/AzureContainerRegistry.spec.js +4 -17
  19. package/lib/azure-datalake/lib/datalake.d.ts +1 -0
  20. package/lib/azure-datalake/lib/datalake.js +2 -1
  21. package/lib/azure-datalake/test/AzureDatalake.spec.d.ts +1 -0
  22. package/lib/azure-datalake/test/AzureDatalake.spec.js +32 -0
  23. package/lib/azure-datalake/test/AzureStorageAccount.integ.d.ts +1 -0
  24. package/lib/azure-datalake/test/AzureStorageAccount.integ.js +60 -0
  25. package/lib/azure-eventhub/lib/authorization.js +1 -1
  26. package/lib/azure-eventhub/lib/consumer.js +1 -1
  27. package/lib/azure-eventhub/lib/eventhubcluster.js +1 -1
  28. package/lib/azure-eventhub/lib/instance.d.ts +1 -0
  29. package/lib/azure-eventhub/lib/instance.js +5 -4
  30. package/lib/azure-eventhub/lib/kusto-connection.js +1 -1
  31. package/lib/azure-eventhub/lib/namespace.js +8 -8
  32. package/lib/azure-eventhub/test/AzureEventhub.integ.d.ts +1 -0
  33. package/lib/azure-eventhub/test/AzureEventhub.integ.js +72 -0
  34. package/lib/azure-eventhub/test/AzureEventhub.spec.js +4 -21
  35. package/lib/azure-functionapp/lib/functionapplinux.js +1 -1
  36. package/lib/azure-functionapp/test/AzureLinuxFunctionApp.integ.d.ts +1 -0
  37. package/lib/azure-functionapp/test/AzureLinuxFunctionApp.integ.js +117 -0
  38. package/lib/azure-functionapp/test/AzureLinuxFunctionApp.spec.js +4 -21
  39. package/lib/azure-keyvault/lib/certificate.js +2 -2
  40. package/lib/azure-keyvault/lib/key.js +1 -1
  41. package/lib/azure-keyvault/lib/policy.js +1 -1
  42. package/lib/azure-keyvault/lib/secret.js +1 -1
  43. package/lib/azure-keyvault/lib/vault.js +1 -1
  44. package/lib/azure-keyvault/test/AzureKeyVault.integ.d.ts +1 -0
  45. package/lib/azure-keyvault/test/AzureKeyVault.integ.js +119 -0
  46. package/lib/azure-keyvault/test/AzureKeyVault.spec.js +4 -29
  47. package/lib/azure-kubernetes/lib/cluster.js +1 -1
  48. package/lib/azure-kubernetes/test/AzureKubernetesCluster.integ.d.ts +1 -0
  49. package/lib/azure-kubernetes/test/AzureKubernetesCluster.integ.js +75 -0
  50. package/lib/azure-kubernetes/test/AzureKubernetesCluster.spec.js +4 -21
  51. package/lib/azure-kusto/lib/cluster.d.ts +3 -0
  52. package/lib/azure-kusto/lib/cluster.js +45 -21
  53. package/lib/azure-kusto/lib/compute-specification.js +1 -1
  54. package/lib/azure-kusto/lib/database.d.ts +7 -8
  55. package/lib/azure-kusto/lib/database.js +23 -25
  56. package/lib/azure-kusto/test/AzureKusto.integ.d.ts +1 -0
  57. package/lib/azure-kusto/test/AzureKusto.integ.js +74 -0
  58. package/lib/azure-kusto/test/AzureKusto.spec.js +3 -16
  59. package/lib/azure-loganalytics/lib/workspace.d.ts +2 -0
  60. package/lib/azure-loganalytics/lib/workspace.js +3 -2
  61. package/lib/azure-loganalytics/test/AzureLogAnalytics.integ.d.ts +1 -0
  62. package/lib/azure-loganalytics/test/AzureLogAnalytics.integ.js +117 -0
  63. package/lib/azure-loganalytics/test/AzureLogAnalytics.spec.js +4 -17
  64. package/lib/azure-metricalert/lib/metric-alert.js +1 -1
  65. package/lib/azure-metricalert/test/AzureMetricAlert.integ.d.ts +1 -0
  66. package/lib/azure-metricalert/test/AzureMetricAlert.integ.js +85 -0
  67. package/lib/azure-metricalert/test/AzureMetricAlert.spec.js +4 -21
  68. package/lib/azure-networksecuritygroup/lib/preconfigured-rules.js +1 -1
  69. package/lib/azure-networksecuritygroup/lib/securitygroup.js +2 -2
  70. package/lib/azure-networksecuritygroup/test/AzureNetworkSecurityGroup.integ.d.ts +1 -0
  71. package/lib/azure-networksecuritygroup/test/AzureNetworkSecurityGroup.integ.js +85 -0
  72. package/lib/azure-networksecuritygroup/test/AzureNetworkSecurityGroup.spec.js +4 -17
  73. package/lib/azure-queryrulealert/lib/query-rule-alert.js +1 -1
  74. package/lib/azure-queryrulealert/test/AzureQueryRuleAlert.integ.d.ts +1 -0
  75. package/lib/azure-queryrulealert/test/AzureQueryRuleAlert.integ.js +63 -0
  76. package/lib/azure-queryrulealert/test/AzureQueryRuleAlert.spec.js +4 -21
  77. package/lib/azure-resourcegroup/lib/resource-group.js +1 -1
  78. package/lib/azure-resourcegroup/test/AzureResourceGroup.integ.d.ts +1 -0
  79. package/lib/azure-resourcegroup/test/AzureResourceGroup.integ.js +41 -0
  80. package/lib/azure-resourcegroup/test/AzureResourceGroup.spec.js +4 -17
  81. package/lib/azure-storageaccount/lib/account.d.ts +5 -0
  82. package/lib/azure-storageaccount/lib/account.js +3 -2
  83. package/lib/azure-storageaccount/lib/container.js +2 -2
  84. package/lib/azure-storageaccount/lib/fileshare.js +2 -2
  85. package/lib/azure-storageaccount/lib/queue.js +1 -1
  86. package/lib/azure-storageaccount/lib/table.js +1 -1
  87. package/lib/azure-storageaccount/test/AzureStorageAccount.integ.d.ts +1 -0
  88. package/lib/azure-storageaccount/test/AzureStorageAccount.integ.js +84 -0
  89. package/lib/azure-storageaccount/test/AzureStorageAccount.spec.js +4 -17
  90. package/lib/azure-virtualmachine/lib/image-references.js +2 -2
  91. package/lib/azure-virtualmachine/lib/vm.d.ts +21 -0
  92. package/lib/azure-virtualmachine/lib/vm.js +5 -3
  93. package/lib/azure-virtualmachine/test/AzureLinuxVirtualMachine.integ.d.ts +1 -0
  94. package/lib/azure-virtualmachine/test/AzureLinuxVirtualMachine.integ.js +109 -0
  95. package/lib/azure-virtualmachine/test/AzureLinuxVirtualMachine.spec.js +4 -17
  96. package/lib/azure-virtualmachine/test/AzureWindowsVirtualMachine.integ.d.ts +1 -0
  97. package/lib/azure-virtualmachine/test/AzureWindowsVirtualMachine.integ.js +105 -0
  98. package/lib/azure-virtualmachine/test/AzureWindowsVirtualMachine.spec.js +4 -17
  99. package/lib/azure-virtualmachinescaleset/lib/cluster.d.ts +20 -0
  100. package/lib/azure-virtualmachinescaleset/lib/cluster.js +5 -3
  101. package/lib/azure-virtualmachinescaleset/test/AzureLinuxVirtualMachineScaleSet.integ.d.ts +1 -0
  102. package/lib/azure-virtualmachinescaleset/test/AzureLinuxVirtualMachineScaleSet.integ.js +113 -0
  103. package/lib/azure-virtualmachinescaleset/test/AzureLinuxVirtualMachineScaleSet.spec.js +4 -17
  104. package/lib/azure-virtualmachinescaleset/test/AzureWindowsVirtualMachineScaleSet.integ.d.ts +1 -0
  105. package/lib/azure-virtualmachinescaleset/test/AzureWindowsVirtualMachineScaleSet.integ.js +109 -0
  106. package/lib/azure-virtualmachinescaleset/test/AzureWindowsVirtualMachineScaleSet.spec.js +4 -17
  107. package/lib/azure-virtualnetwork/lib/network.js +1 -1
  108. package/lib/azure-virtualnetwork/lib/peering.js +1 -1
  109. package/lib/azure-virtualnetwork/test/AzureVirtualNetwork.integ.d.ts +1 -0
  110. package/lib/azure-virtualnetwork/test/AzureVirtualNetwork.integ.js +92 -0
  111. package/lib/azure-virtualnetwork/test/AzureVirtualNetwork.spec.js +4 -17
  112. package/lib/core-azure/lib/diagsettings.d.ts +3 -2
  113. package/lib/core-azure/lib/diagsettings.js +15 -21
  114. package/lib/core-azure/lib/rbac.js +1 -1
  115. package/lib/core-azure/lib/resource.js +5 -3
  116. package/lib/core-azure/test/AzureResource.integ.d.ts +1 -0
  117. package/lib/core-azure/test/AzureResource.integ.js +75 -0
  118. package/lib/testing/index.d.ts +34 -0
  119. package/lib/testing/index.js +235 -2
  120. package/package.json +6 -4
  121. package/cdktf.out/manifest.json +0 -13
  122. package/cdktf.out/stacks/testAzureActionGroup/cdk.tf.json +0 -111
  123. package/cdktf.out/stacks/testAzureApplicationGateway/cdk.tf.json +0 -588
  124. package/cdktf.out/stacks/testAzureApplicationInsights/cdk.tf.json +0 -245
  125. package/cdktf.out/stacks/testAzureContainerRegistry/cdk.tf.json +0 -179
  126. package/cdktf.out/stacks/testAzureEventhub/cdk.tf.json +0 -236
  127. package/cdktf.out/stacks/testAzureKeyVault/cdk.tf.json +0 -436
  128. package/cdktf.out/stacks/testAzureKubernetesCluster/cdk.tf.json +0 -152
  129. package/cdktf.out/stacks/testAzureKusto/cdk.tf.json +0 -209
  130. package/cdktf.out/stacks/testAzureLinuxFunctionApp/cdk.tf.json +0 -439
  131. package/cdktf.out/stacks/testAzureLinuxVirtualMachineExample/cdk.tf.json +0 -283
  132. package/cdktf.out/stacks/testAzureLinuxVirtualMachineScaleSetExample/cdk.tf.json +0 -261
  133. package/cdktf.out/stacks/testAzureLogAnalytics/cdk.tf.json +0 -309
  134. package/cdktf.out/stacks/testAzureMetricAlert/cdk.tf.json +0 -161
  135. package/cdktf.out/stacks/testAzureNetworkSecurityGroup/cdk.tf.json +0 -271
  136. package/cdktf.out/stacks/testAzureQueryRuleAlert/cdk.tf.json +0 -122
  137. package/cdktf.out/stacks/testAzureResourceGroup/cdk.tf.json +0 -88
  138. package/cdktf.out/stacks/testAzureStorageAccount/cdk.tf.json +0 -339
  139. package/cdktf.out/stacks/testAzureVirtualNetwork/cdk.tf.json +0 -264
  140. package/cdktf.out/stacks/testAzureWindowVirtualMachineScaleSetExample/cdk.tf.json +0 -261
  141. package/cdktf.out/stacks/testAzureWindowsVirtualMachineExample/cdk.tf.json +0 -280
  142. package/cdktf.out/stacks/testExampleAzureResource/cdk.tf.json +0 -167
  143. package/lib/azure-actiongroup/test/ExampleAzureActionGroup.d.ts +0 -5
  144. package/lib/azure-actiongroup/test/ExampleAzureActionGroup.js +0 -66
  145. package/lib/azure-applicationgateway/test/ExampleAzureApplicationGateway.d.ts +0 -5
  146. package/lib/azure-applicationgateway/test/ExampleAzureApplicationGateway.js +0 -267
  147. package/lib/azure-applicationinsights/test/ExampleAzureApplicationInsights.d.ts +0 -5
  148. package/lib/azure-applicationinsights/test/ExampleAzureApplicationInsights.js +0 -87
  149. package/lib/azure-containerregistry/test/ExampleAzureContainerRegistry.d.ts +0 -5
  150. package/lib/azure-containerregistry/test/ExampleAzureContainerRegistry.js +0 -57
  151. package/lib/azure-eventhub/test/ExampleAzureEventhub.d.ts +0 -5
  152. package/lib/azure-eventhub/test/ExampleAzureEventhub.js +0 -72
  153. package/lib/azure-functionapp/test/ExampleAzureLinuxFunctionApp.d.ts +0 -5
  154. package/lib/azure-functionapp/test/ExampleAzureLinuxFunctionApp.js +0 -123
  155. package/lib/azure-keyvault/test/ExampleAzureKeyVault.d.ts +0 -5
  156. package/lib/azure-keyvault/test/ExampleAzureKeyVault.js +0 -112
  157. package/lib/azure-kubernetes/test/ExampleAzureKubernetesCluster.d.ts +0 -5
  158. package/lib/azure-kubernetes/test/ExampleAzureKubernetesCluster.js +0 -65
  159. package/lib/azure-kusto/test/ExampleAzureKusto.d.ts +0 -5
  160. package/lib/azure-kusto/test/ExampleAzureKusto.js +0 -71
  161. package/lib/azure-loganalytics/test/ExampleAzureLogAnalytics.d.ts +0 -5
  162. package/lib/azure-loganalytics/test/ExampleAzureLogAnalytics.js +0 -115
  163. package/lib/azure-metricalert/test/ExampleAzureMetricAlert.d.ts +0 -5
  164. package/lib/azure-metricalert/test/ExampleAzureMetricAlert.js +0 -81
  165. package/lib/azure-networksecuritygroup/test/ExampleAzureNetworkSecurityGroup.d.ts +0 -5
  166. package/lib/azure-networksecuritygroup/test/ExampleAzureNetworkSecurityGroup.js +0 -97
  167. package/lib/azure-queryrulealert/test/ExampleAzureQueryRuleAlert.d.ts +0 -5
  168. package/lib/azure-queryrulealert/test/ExampleAzureQueryRuleAlert.js +0 -67
  169. package/lib/azure-resourcegroup/test/ExampleAzureResourceGroup.d.ts +0 -5
  170. package/lib/azure-resourcegroup/test/ExampleAzureResourceGroup.js +0 -29
  171. package/lib/azure-storageaccount/test/ExampleAzureStorageAccount.d.ts +0 -5
  172. package/lib/azure-storageaccount/test/ExampleAzureStorageAccount.js +0 -102
  173. package/lib/azure-virtualmachine/test/ExampleAzureLinuxVirtualMachine.d.ts +0 -5
  174. package/lib/azure-virtualmachine/test/ExampleAzureLinuxVirtualMachine.js +0 -106
  175. package/lib/azure-virtualmachine/test/ExampleAzureWindowsVirtualMachine.d.ts +0 -5
  176. package/lib/azure-virtualmachine/test/ExampleAzureWindowsVirtualMachine.js +0 -102
  177. package/lib/azure-virtualmachinescaleset/test/ExampleAzureLinuxVirtualMachineScaleSet.d.ts +0 -5
  178. package/lib/azure-virtualmachinescaleset/test/ExampleAzureLinuxVirtualMachineScaleSet.js +0 -107
  179. package/lib/azure-virtualmachinescaleset/test/ExampleAzureWindowsVirtualMachineScaleSet.d.ts +0 -5
  180. package/lib/azure-virtualmachinescaleset/test/ExampleAzureWindowsVirtualMachineScaleSet.js +0 -103
  181. package/lib/azure-virtualnetwork/test/ExampleAzureVirtualNetwork.d.ts +0 -5
  182. package/lib/azure-virtualnetwork/test/ExampleAzureVirtualNetwork.js +0 -88
  183. package/lib/core-azure/test/AzureResource.spec.js +0 -19
  184. package/lib/core-azure/test/ExampleAzureResource.d.ts +0 -5
  185. package/lib/core-azure/test/ExampleAzureResource.js +0 -67
  186. package/tfsec.json +0 -4
  187. /package/lib/{core-azure/test/AzureResource.spec.d.ts → azure-actiongroup/test/AzureActionGroup.integ.d.ts} +0 -0
@@ -1,6 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BaseTestStack = void 0;
3
+ exports.cleanupCdkTfOutDirs = exports.AssertionReturn = exports.TerraformPlan = exports.TerraformApplyCheckAndDestroy = exports.TerraformApplyAndCheckIdempotency = exports.TerraformDestroy = exports.TerraformIdempotentCheck = exports.TerraformPlanExitCode = exports.TerraformApply = exports.execTerraformCommand = exports.BaseTestStack = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const fs = require("fs");
6
+ const path = require("path");
4
7
  const cdktf = require("cdktf");
5
8
  const cdktf_1 = require("cdktf");
6
9
  class BaseTestStack extends cdktf_1.TerraformStack {
@@ -15,4 +18,234 @@ class BaseTestStack extends cdktf_1.TerraformStack {
15
18
  }
16
19
  }
17
20
  exports.BaseTestStack = BaseTestStack;
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBK0I7QUFDL0IsaUNBQXVDO0FBR3ZDLE1BQWEsYUFBYyxTQUFRLHNCQUFjO0lBRy9DLFlBQVksS0FBZ0IsRUFBRSxFQUFVO1FBQ3RDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtZQUNyRCxJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxNQUFNO1lBQ2YsV0FBVyxFQUFFLDZDQUE2QztTQUMzRCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDekIsQ0FBQztDQUNGO0FBZEQsc0NBY0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjZGt0ZiBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IFRlcnJhZm9ybVN0YWNrIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5leHBvcnQgY2xhc3MgQmFzZVRlc3RTdGFjayBleHRlbmRzIFRlcnJhZm9ybVN0YWNrIHtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IG5hbWUgPSBuZXcgY2RrdGYuVGVycmFmb3JtVmFyaWFibGUodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZWZhdWx0OiBcInRlc3RcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlN5c3RlbSBuYW1lIHVzZWQgdG8gcmFuZG9taXplIHRoZSByZXNvdXJjZXNcIixcbiAgICB9KTtcblxuICAgIHRoaXMubmFtZSA9IG5hbWUudmFsdWU7XG4gIH1cbn1cbiJdfQ==
21
+ function execTerraformCommand(command, opts, streamOutput) {
22
+ try {
23
+ if (streamOutput) {
24
+ (0, child_process_1.execSync)(command, { ...opts, stdio: "inherit" });
25
+ return { stdout: "", stderr: "", exitCode: 0 };
26
+ }
27
+ else {
28
+ const stdout = (0, child_process_1.execSync)(command, { ...opts, stdio: "pipe" }).toString();
29
+ return { stdout, stderr: "", exitCode: 0 };
30
+ }
31
+ }
32
+ catch (error) {
33
+ const stdout = error.stdout ? error.stdout.toString() : "";
34
+ const stderr = error.stderr ? error.stderr.toString() : "";
35
+ return { stdout, stderr, exitCode: error.status || 1 };
36
+ }
37
+ }
38
+ exports.execTerraformCommand = execTerraformCommand;
39
+ function TerraformApply(stack, streamOutput = false) {
40
+ try {
41
+ const manifest = JSON.parse(fs.readFileSync(path.resolve(stack, "manifest.json"), "utf8"));
42
+ const stacks = Object.entries(manifest.stacks);
43
+ for (const [, stackDetails] of stacks) {
44
+ const opts = {
45
+ cwd: path.resolve(stack, stackDetails.workingDirectory),
46
+ env: process.env,
47
+ encoding: "utf-8",
48
+ };
49
+ const initResult = execTerraformCommand(`terraform init`, opts, streamOutput);
50
+ if (initResult.exitCode !== 0)
51
+ throw new Error(`Terraform init failed: ${initResult.stdout} ${initResult.stderr}`);
52
+ const applyResult = execTerraformCommand(`terraform apply -auto-approve`, opts, streamOutput);
53
+ if (applyResult.exitCode !== 0) {
54
+ return {
55
+ stdout: applyResult.stdout,
56
+ stderr: applyResult.stderr,
57
+ error: new Error(`Terraform apply failed: ${applyResult.stdout} ${applyResult.stderr}`),
58
+ };
59
+ }
60
+ }
61
+ return { stdout: "Terraform apply succeeded", stderr: "", error: null };
62
+ }
63
+ catch (error) {
64
+ console.error("Error during Terraform init or apply:", error);
65
+ return { stdout: "", stderr: "", error };
66
+ }
67
+ }
68
+ exports.TerraformApply = TerraformApply;
69
+ function TerraformPlanExitCode(stack, streamOutput = false) {
70
+ try {
71
+ const manifest = JSON.parse(fs.readFileSync(path.resolve(stack, "manifest.json"), "utf8"));
72
+ const stacks = Object.entries(manifest.stacks);
73
+ for (const [, stackDetails] of stacks) {
74
+ const opts = {
75
+ cwd: path.resolve(stack, stackDetails.workingDirectory),
76
+ env: process.env,
77
+ encoding: "utf-8",
78
+ };
79
+ const initResult = execTerraformCommand(`terraform init`, opts, streamOutput);
80
+ if (initResult.exitCode !== 0)
81
+ throw new Error(`Terraform init failed: ${initResult.stdout} ${initResult.stderr}`);
82
+ const planResult = execTerraformCommand(`terraform plan -input=false -lock=false -detailed-exitcode`, opts, streamOutput);
83
+ return {
84
+ stdout: planResult.stdout,
85
+ stderr: planResult.stderr,
86
+ exitCode: planResult.exitCode,
87
+ error: null,
88
+ };
89
+ }
90
+ return {
91
+ stdout: "Terraform plan succeeded",
92
+ stderr: "",
93
+ exitCode: 0,
94
+ error: null,
95
+ };
96
+ }
97
+ catch (error) {
98
+ console.error("Error during Terraform init or plan:", error);
99
+ return { stdout: "", stderr: "", exitCode: 1, error };
100
+ }
101
+ }
102
+ exports.TerraformPlanExitCode = TerraformPlanExitCode;
103
+ function TerraformIdempotentCheck(stack) {
104
+ try {
105
+ const manifest = JSON.parse(fs.readFileSync(path.resolve(stack, "manifest.json"), "utf8"));
106
+ const stacks = Object.entries(manifest.stacks);
107
+ for (const [, stackDetails] of stacks) {
108
+ const opts = {
109
+ cwd: path.resolve(stack, stackDetails.workingDirectory),
110
+ env: process.env,
111
+ stdio: "pipe",
112
+ };
113
+ (0, child_process_1.execSync)(`terraform init`, opts);
114
+ let planOutput;
115
+ try {
116
+ planOutput = (0, child_process_1.execSync)(`terraform plan -input=false -detailed-exitcode`, opts).toString();
117
+ }
118
+ catch (error) {
119
+ planOutput = error.stdout ? error.stdout.toString() : "";
120
+ }
121
+ if (planOutput.includes("No changes. Your infrastructure matches the configuration.")) {
122
+ return new AssertionReturn(`Expected subject to be idempotent with no changes`, true);
123
+ }
124
+ else {
125
+ throw new Error(`Plan resulted in changes:\n${planOutput}`);
126
+ }
127
+ }
128
+ return new AssertionReturn(`Expected subject to be idempotent with no changes`, true);
129
+ }
130
+ catch (error) {
131
+ console.error("Error during Terraform init or plan:", error);
132
+ throw error;
133
+ }
134
+ }
135
+ exports.TerraformIdempotentCheck = TerraformIdempotentCheck;
136
+ function TerraformDestroy(stack, streamOutput = false) {
137
+ try {
138
+ const manifest = JSON.parse(fs.readFileSync(path.resolve(stack, "manifest.json"), "utf8"));
139
+ const stacks = Object.entries(manifest.stacks);
140
+ for (const [, stackDetails] of stacks) {
141
+ const opts = {
142
+ cwd: path.resolve(stack, stackDetails.workingDirectory),
143
+ env: process.env,
144
+ encoding: "utf-8",
145
+ };
146
+ const initResult = execTerraformCommand(`terraform init`, opts, streamOutput);
147
+ if (initResult.exitCode !== 0)
148
+ throw new Error(`Terraform init failed: ${initResult.stdout} ${initResult.stderr}`);
149
+ const destroyResult = execTerraformCommand(`terraform destroy -auto-approve`, opts, streamOutput);
150
+ if (destroyResult.exitCode !== 0)
151
+ throw new Error(`Terraform destroy failed: ${destroyResult.stdout} ${destroyResult.stderr}`);
152
+ }
153
+ return new AssertionReturn(`Expected subject to destroy successfully`, true);
154
+ }
155
+ catch (error) {
156
+ console.error("Error during Terraform init or destroy:", error);
157
+ return new AssertionReturn(`Expected subject to destroy successfully`, false);
158
+ }
159
+ }
160
+ exports.TerraformDestroy = TerraformDestroy;
161
+ function TerraformApplyAndCheckIdempotency(stack, streamOutput = false) {
162
+ const applyResult = TerraformApply(stack, streamOutput);
163
+ if (applyResult.error) {
164
+ return new AssertionReturn(applyResult.error.message, false);
165
+ }
166
+ const planResult = TerraformPlanExitCode(stack, streamOutput);
167
+ if (planResult.error) {
168
+ return new AssertionReturn(planResult.error.message, false);
169
+ }
170
+ if (planResult.exitCode !== 0) {
171
+ return new AssertionReturn(`Terraform configuration not idempotent:\n${planResult.stdout}`, false);
172
+ }
173
+ return new AssertionReturn(`Terraform apply and idempotency check completed successfully`, true);
174
+ }
175
+ exports.TerraformApplyAndCheckIdempotency = TerraformApplyAndCheckIdempotency;
176
+ function TerraformApplyCheckAndDestroy(stack) {
177
+ try {
178
+ const applyAndCheckResult = TerraformApplyAndCheckIdempotency(stack);
179
+ if (!applyAndCheckResult.pass) {
180
+ throw new Error(applyAndCheckResult.message);
181
+ }
182
+ }
183
+ catch (error) {
184
+ console.error("Error during Terraform apply and idempotency check:", error);
185
+ throw error; // Re-throw the error to ensure the test fails
186
+ }
187
+ finally {
188
+ try {
189
+ const destroyResult = TerraformDestroy(stack);
190
+ if (!destroyResult.pass) {
191
+ console.error("Error during Terraform destroy:", destroyResult.message);
192
+ }
193
+ }
194
+ catch (destroyError) {
195
+ console.error("Error during Terraform destroy:", destroyError);
196
+ }
197
+ }
198
+ }
199
+ exports.TerraformApplyCheckAndDestroy = TerraformApplyCheckAndDestroy;
200
+ function TerraformPlan(stack) {
201
+ try {
202
+ // Assuming the presence of a received variable pointing to the relevant directory
203
+ const manifest = JSON.parse(fs.readFileSync(path.resolve(stack, "manifest.json"), "utf8"));
204
+ const stacks = Object.entries(manifest.stacks);
205
+ stacks.forEach(([, stackDetails]) => {
206
+ const opts = {
207
+ cwd: path.resolve(stack, stackDetails.workingDirectory),
208
+ env: process.env,
209
+ stdio: "pipe",
210
+ };
211
+ (0, child_process_1.execSync)(`terraform init`, opts);
212
+ (0, child_process_1.execSync)(`terraform plan -input=false -lock=false`, opts);
213
+ });
214
+ return new AssertionReturn(`Expected subject not to plan successfully`, true);
215
+ }
216
+ catch (error) {
217
+ console.error("Error during Terraform init or plan:", error);
218
+ throw error;
219
+ return new AssertionReturn("Expected subject to plan successfully, false", false);
220
+ }
221
+ }
222
+ exports.TerraformPlan = TerraformPlan;
223
+ class AssertionReturn {
224
+ /**
225
+ * Create an AssertionReturn
226
+ * @param message - String message containing information about the result of the assertion
227
+ * @param pass - Boolean pass denoting the success of the assertion
228
+ */
229
+ constructor(message, pass) {
230
+ this.message = message;
231
+ this.pass = pass;
232
+ if (!pass) {
233
+ throw new Error(message);
234
+ }
235
+ }
236
+ }
237
+ exports.AssertionReturn = AssertionReturn;
238
+ // Define a cleanup function that can be exported and used in tests.
239
+ function cleanupCdkTfOutDirs() {
240
+ try {
241
+ (0, child_process_1.execSync)('find /tmp -name "cdktf.outdir.*" -type d -exec rm -rf {} +');
242
+ // console.log(
243
+ // "Cleanup of cdktf.outdir.* directories in /tmp was successful.",
244
+ // );
245
+ }
246
+ catch (error) {
247
+ console.error("Error during cleanup:", error);
248
+ }
249
+ }
250
+ exports.cleanupCdkTfOutDirs = cleanupCdkTfOutDirs;
251
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdGluZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBNEU7QUFDNUUseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QiwrQkFBK0I7QUFDL0IsaUNBQXVDO0FBR3ZDLE1BQWEsYUFBYyxTQUFRLHNCQUFjO0lBRy9DLFlBQVksS0FBZ0IsRUFBRSxFQUFVO1FBQ3RDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRTtZQUNyRCxJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxNQUFNO1lBQ2YsV0FBVyxFQUFFLDZDQUE2QztTQUMzRCxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDekIsQ0FBQztDQUNGO0FBZEQsc0NBY0M7QUFFRCxTQUFnQixvQkFBb0IsQ0FDbEMsT0FBZSxFQUNmLElBQXVDLEVBQ3ZDLFlBQXFCO0lBRXJCLElBQUk7UUFDRixJQUFJLFlBQVksRUFBRTtZQUNoQixJQUFBLHdCQUFRLEVBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7U0FDaEQ7YUFBTTtZQUNMLE1BQU0sTUFBTSxHQUFHLElBQUEsd0JBQVEsRUFBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO1NBQzVDO0tBQ0Y7SUFBQyxPQUFPLEtBQVUsRUFBRTtRQUNuQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDM0QsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO0tBQ3hEO0FBQ0gsQ0FBQztBQWxCRCxvREFrQkM7QUFFRCxTQUFnQixjQUFjLENBQzVCLEtBQVUsRUFDVixlQUF3QixLQUFLO0lBRTdCLElBQUk7UUFDRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUN6QixFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUM5RCxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0MsS0FBSyxNQUFNLENBQUMsRUFBRSxZQUFZLENBQUMsSUFBSSxNQUFNLEVBQUU7WUFDckMsTUFBTSxJQUFJLEdBQXNDO2dCQUM5QyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUcsWUFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDaEUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO2dCQUNoQixRQUFRLEVBQUUsT0FBTzthQUNsQixDQUFDO1lBRUYsTUFBTSxVQUFVLEdBQUcsb0JBQW9CLENBQ3JDLGdCQUFnQixFQUNoQixJQUFJLEVBQ0osWUFBWSxDQUNiLENBQUM7WUFDRixJQUFJLFVBQVUsQ0FBQyxRQUFRLEtBQUssQ0FBQztnQkFDM0IsTUFBTSxJQUFJLEtBQUssQ0FDYiwwQkFBMEIsVUFBVSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLENBQ25FLENBQUM7WUFFSixNQUFNLFdBQVcsR0FBRyxvQkFBb0IsQ0FDdEMsK0JBQStCLEVBQy9CLElBQUksRUFDSixZQUFZLENBQ2IsQ0FBQztZQUNGLElBQUksV0FBVyxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7Z0JBQzlCLE9BQU87b0JBQ0wsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNO29CQUMxQixNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU07b0JBQzFCLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FDZCwyQkFBMkIsV0FBVyxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQ3RFO2lCQUNGLENBQUM7YUFDSDtTQUNGO1FBRUQsT0FBTyxFQUFFLE1BQU0sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztLQUN6RTtJQUFDLE9BQU8sS0FBVSxFQUFFO1FBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQztLQUMxQztBQUNILENBQUM7QUFoREQsd0NBZ0RDO0FBRUQsU0FBZ0IscUJBQXFCLENBQ25DLEtBQVUsRUFDVixlQUF3QixLQUFLO0lBRTdCLElBQUk7UUFDRixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUN6QixFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUM5RCxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0MsS0FBSyxNQUFNLENBQUMsRUFBRSxZQUFZLENBQUMsSUFBSSxNQUFNLEVBQUU7WUFDckMsTUFBTSxJQUFJLEdBQXNDO2dCQUM5QyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUcsWUFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDaEUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO2dCQUNoQixRQUFRLEVBQUUsT0FBTzthQUNsQixDQUFDO1lBRUYsTUFBTSxVQUFVLEdBQUcsb0JBQW9CLENBQ3JDLGdCQUFnQixFQUNoQixJQUFJLEVBQ0osWUFBWSxDQUNiLENBQUM7WUFDRixJQUFJLFVBQVUsQ0FBQyxRQUFRLEtBQUssQ0FBQztnQkFDM0IsTUFBTSxJQUFJLEtBQUssQ0FDYiwwQkFBMEIsVUFBVSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLENBQ25FLENBQUM7WUFFSixNQUFNLFVBQVUsR0FBRyxvQkFBb0IsQ0FDckMsNERBQTRELEVBQzVELElBQUksRUFDSixZQUFZLENBQ2IsQ0FBQztZQUNGLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO2dCQUN6QixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07Z0JBQ3pCLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTtnQkFDN0IsS0FBSyxFQUFFLElBQUk7YUFDWixDQUFDO1NBQ0g7UUFFRCxPQUFPO1lBQ0wsTUFBTSxFQUFFLDBCQUEwQjtZQUNsQyxNQUFNLEVBQUUsRUFBRTtZQUNWLFFBQVEsRUFBRSxDQUFDO1lBQ1gsS0FBSyxFQUFFLElBQUk7U0FDWixDQUFDO0tBQ0g7SUFBQyxPQUFPLEtBQVUsRUFBRTtRQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztLQUN2RDtBQUNILENBQUM7QUFsREQsc0RBa0RDO0FBQ0QsU0FBZ0Isd0JBQXdCLENBQUMsS0FBVTtJQUNqRCxJQUFJO1FBQ0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDekIsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FDOUQsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRS9DLEtBQUssTUFBTSxDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUksTUFBTSxFQUFFO1lBQ3JDLE1BQU0sSUFBSSxHQUFHO2dCQUNYLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRyxZQUFvQixDQUFDLGdCQUFnQixDQUFDO2dCQUNoRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7Z0JBQ2hCLEtBQUssRUFBRSxNQUFNO2FBQ1AsQ0FBQztZQUVULElBQUEsd0JBQVEsRUFBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUVqQyxJQUFJLFVBQWtCLENBQUM7WUFDdkIsSUFBSTtnQkFDRixVQUFVLEdBQUcsSUFBQSx3QkFBUSxFQUNuQixnREFBZ0QsRUFDaEQsSUFBSSxDQUNMLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDZDtZQUFDLE9BQU8sS0FBVSxFQUFFO2dCQUNuQixVQUFVLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQzFEO1lBRUQsSUFDRSxVQUFVLENBQUMsUUFBUSxDQUNqQiw0REFBNEQsQ0FDN0QsRUFDRDtnQkFDQSxPQUFPLElBQUksZUFBZSxDQUN4QixtREFBbUQsRUFDbkQsSUFBSSxDQUNMLENBQUM7YUFDSDtpQkFBTTtnQkFDTCxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixVQUFVLEVBQUUsQ0FBQyxDQUFDO2FBQzdEO1NBQ0Y7UUFFRCxPQUFPLElBQUksZUFBZSxDQUN4QixtREFBbUQsRUFDbkQsSUFBSSxDQUNMLENBQUM7S0FDSDtJQUFDLE9BQU8sS0FBSyxFQUFFO1FBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3RCxNQUFNLEtBQUssQ0FBQztLQUNiO0FBQ0gsQ0FBQztBQWhERCw0REFnREM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FDOUIsS0FBVSxFQUNWLGVBQXdCLEtBQUs7SUFFN0IsSUFBSTtRQUNGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQ3pCLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQzlELENBQUM7UUFDRixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUvQyxLQUFLLE1BQU0sQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLE1BQU0sRUFBRTtZQUNyQyxNQUFNLElBQUksR0FBc0M7Z0JBQzlDLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRyxZQUFvQixDQUFDLGdCQUFnQixDQUFDO2dCQUNoRSxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7Z0JBQ2hCLFFBQVEsRUFBRSxPQUFPO2FBQ2xCLENBQUM7WUFFRixNQUFNLFVBQVUsR0FBRyxvQkFBb0IsQ0FDckMsZ0JBQWdCLEVBQ2hCLElBQUksRUFDSixZQUFZLENBQ2IsQ0FBQztZQUNGLElBQUksVUFBVSxDQUFDLFFBQVEsS0FBSyxDQUFDO2dCQUMzQixNQUFNLElBQUksS0FBSyxDQUNiLDBCQUEwQixVQUFVLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FDbkUsQ0FBQztZQUVKLE1BQU0sYUFBYSxHQUFHLG9CQUFvQixDQUN4QyxpQ0FBaUMsRUFDakMsSUFBSSxFQUNKLFlBQVksQ0FDYixDQUFDO1lBQ0YsSUFBSSxhQUFhLENBQUMsUUFBUSxLQUFLLENBQUM7Z0JBQzlCLE1BQU0sSUFBSSxLQUFLLENBQ2IsNkJBQTZCLGFBQWEsQ0FBQyxNQUFNLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUM1RSxDQUFDO1NBQ0w7UUFFRCxPQUFPLElBQUksZUFBZSxDQUN4QiwwQ0FBMEMsRUFDMUMsSUFBSSxDQUNMLENBQUM7S0FDSDtJQUFDLE9BQU8sS0FBVSxFQUFFO1FBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMseUNBQXlDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEUsT0FBTyxJQUFJLGVBQWUsQ0FDeEIsMENBQTBDLEVBQzFDLEtBQUssQ0FDTixDQUFDO0tBQ0g7QUFDSCxDQUFDO0FBakRELDRDQWlEQztBQUVELFNBQWdCLGlDQUFpQyxDQUMvQyxLQUFVLEVBQ1YsZUFBd0IsS0FBSztJQUU3QixNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3hELElBQUksV0FBVyxDQUFDLEtBQUssRUFBRTtRQUNyQixPQUFPLElBQUksZUFBZSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzlEO0lBRUQsTUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzlELElBQUksVUFBVSxDQUFDLEtBQUssRUFBRTtRQUNwQixPQUFPLElBQUksZUFBZSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzdEO0lBRUQsSUFBSSxVQUFVLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRTtRQUM3QixPQUFPLElBQUksZUFBZSxDQUN4Qiw0Q0FBNEMsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUMvRCxLQUFLLENBQ04sQ0FBQztLQUNIO0lBRUQsT0FBTyxJQUFJLGVBQWUsQ0FDeEIsOERBQThELEVBQzlELElBQUksQ0FDTCxDQUFDO0FBQ0osQ0FBQztBQXpCRCw4RUF5QkM7QUFFRCxTQUFnQiw2QkFBNkIsQ0FBQyxLQUFVO0lBQ3RELElBQUk7UUFDRixNQUFNLG1CQUFtQixHQUFHLGlDQUFpQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUU7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM5QztLQUNGO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHFEQUFxRCxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVFLE1BQU0sS0FBSyxDQUFDLENBQUMsOENBQThDO0tBQzVEO1lBQVM7UUFDUixJQUFJO1lBQ0YsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3ZCLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLEVBQUUsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3pFO1NBQ0Y7UUFBQyxPQUFPLFlBQVksRUFBRTtZQUNyQixPQUFPLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQ2hFO0tBQ0Y7QUFDSCxDQUFDO0FBbkJELHNFQW1CQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxLQUFVO0lBQ3RDLElBQUk7UUFDRixrRkFBa0Y7UUFDbEYsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDekIsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FDOUQsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxNQUFNLElBQUksR0FBRztnQkFDWCxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUcsWUFBb0IsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDaEUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO2dCQUNoQixLQUFLLEVBQUUsTUFBTTthQUNQLENBQUM7WUFDVCxJQUFBLHdCQUFRLEVBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDakMsSUFBQSx3QkFBUSxFQUFDLHlDQUF5QyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLGVBQWUsQ0FDeEIsMkNBQTJDLEVBQzNDLElBQUksQ0FDTCxDQUFDO0tBQ0g7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0QsTUFBTSxLQUFLLENBQUM7UUFDWixPQUFPLElBQUksZUFBZSxDQUN4Qiw4Q0FBOEMsRUFDOUMsS0FBSyxDQUNOLENBQUM7S0FDSDtBQUNILENBQUM7QUE3QkQsc0NBNkJDO0FBRUQsTUFBYSxlQUFlO0lBQzFCOzs7O09BSUc7SUFDSCxZQUNrQixPQUFlLEVBQ2YsSUFBYTtRQURiLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixTQUFJLEdBQUosSUFBSSxDQUFTO1FBRTdCLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzFCO0lBQ0gsQ0FBQztDQUNGO0FBZEQsMENBY0M7QUFFRCxvRUFBb0U7QUFDcEUsU0FBZ0IsbUJBQW1CO0lBQ2pDLElBQUk7UUFDRixJQUFBLHdCQUFRLEVBQUMsNERBQTRELENBQUMsQ0FBQztRQUN2RSxlQUFlO1FBQ2YscUVBQXFFO1FBQ3JFLEtBQUs7S0FDTjtJQUFDLE9BQU8sS0FBSyxFQUFFO1FBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsQ0FBQztLQUMvQztBQUNILENBQUM7QUFURCxrREFTQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNTeW5jLCBFeGVjU3luY09wdGlvbnNXaXRoU3RyaW5nRW5jb2RpbmcgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBjZGt0ZiBmcm9tIFwiY2RrdGZcIjtcbmltcG9ydCB7IFRlcnJhZm9ybVN0YWNrIH0gZnJvbSBcImNka3RmXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5leHBvcnQgY2xhc3MgQmFzZVRlc3RTdGFjayBleHRlbmRzIFRlcnJhZm9ybVN0YWNrIHtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IG5hbWUgPSBuZXcgY2RrdGYuVGVycmFmb3JtVmFyaWFibGUodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZWZhdWx0OiBcInRlc3RcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlN5c3RlbSBuYW1lIHVzZWQgdG8gcmFuZG9taXplIHRoZSByZXNvdXJjZXNcIixcbiAgICB9KTtcblxuICAgIHRoaXMubmFtZSA9IG5hbWUudmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWNUZXJyYWZvcm1Db21tYW5kKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIG9wdHM6IEV4ZWNTeW5jT3B0aW9uc1dpdGhTdHJpbmdFbmNvZGluZyxcbiAgc3RyZWFtT3V0cHV0OiBib29sZWFuLFxuKTogeyBzdGRvdXQ6IHN0cmluZzsgc3RkZXJyOiBzdHJpbmc7IGV4aXRDb2RlOiBudW1iZXIgfSB7XG4gIHRyeSB7XG4gICAgaWYgKHN0cmVhbU91dHB1dCkge1xuICAgICAgZXhlY1N5bmMoY29tbWFuZCwgeyAuLi5vcHRzLCBzdGRpbzogXCJpbmhlcml0XCIgfSk7XG4gICAgICByZXR1cm4geyBzdGRvdXQ6IFwiXCIsIHN0ZGVycjogXCJcIiwgZXhpdENvZGU6IDAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3Rkb3V0ID0gZXhlY1N5bmMoY29tbWFuZCwgeyAuLi5vcHRzLCBzdGRpbzogXCJwaXBlXCIgfSkudG9TdHJpbmcoKTtcbiAgICAgIHJldHVybiB7IHN0ZG91dCwgc3RkZXJyOiBcIlwiLCBleGl0Q29kZTogMCB9O1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIGNvbnN0IHN0ZG91dCA9IGVycm9yLnN0ZG91dCA/IGVycm9yLnN0ZG91dC50b1N0cmluZygpIDogXCJcIjtcbiAgICBjb25zdCBzdGRlcnIgPSBlcnJvci5zdGRlcnIgPyBlcnJvci5zdGRlcnIudG9TdHJpbmcoKSA6IFwiXCI7XG4gICAgcmV0dXJuIHsgc3Rkb3V0LCBzdGRlcnIsIGV4aXRDb2RlOiBlcnJvci5zdGF0dXMgfHwgMSB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUZXJyYWZvcm1BcHBseShcbiAgc3RhY2s6IGFueSxcbiAgc3RyZWFtT3V0cHV0OiBib29sZWFuID0gZmFsc2UsXG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZzsgZXJyb3I6IGFueSB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHN0YWNrLCBcIm1hbmlmZXN0Lmpzb25cIiksIFwidXRmOFwiKSxcbiAgICApO1xuICAgIGNvbnN0IHN0YWNrcyA9IE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0LnN0YWNrcyk7XG5cbiAgICBmb3IgKGNvbnN0IFssIHN0YWNrRGV0YWlsc10gb2Ygc3RhY2tzKSB7XG4gICAgICBjb25zdCBvcHRzOiBFeGVjU3luY09wdGlvbnNXaXRoU3RyaW5nRW5jb2RpbmcgPSB7XG4gICAgICAgIGN3ZDogcGF0aC5yZXNvbHZlKHN0YWNrLCAoc3RhY2tEZXRhaWxzIGFzIGFueSkud29ya2luZ0RpcmVjdG9yeSksXG4gICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBpbml0UmVzdWx0ID0gZXhlY1RlcnJhZm9ybUNvbW1hbmQoXG4gICAgICAgIGB0ZXJyYWZvcm0gaW5pdGAsXG4gICAgICAgIG9wdHMsXG4gICAgICAgIHN0cmVhbU91dHB1dCxcbiAgICAgICk7XG4gICAgICBpZiAoaW5pdFJlc3VsdC5leGl0Q29kZSAhPT0gMClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUZXJyYWZvcm0gaW5pdCBmYWlsZWQ6ICR7aW5pdFJlc3VsdC5zdGRvdXR9ICR7aW5pdFJlc3VsdC5zdGRlcnJ9YCxcbiAgICAgICAgKTtcblxuICAgICAgY29uc3QgYXBwbHlSZXN1bHQgPSBleGVjVGVycmFmb3JtQ29tbWFuZChcbiAgICAgICAgYHRlcnJhZm9ybSBhcHBseSAtYXV0by1hcHByb3ZlYCxcbiAgICAgICAgb3B0cyxcbiAgICAgICAgc3RyZWFtT3V0cHV0LFxuICAgICAgKTtcbiAgICAgIGlmIChhcHBseVJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN0ZG91dDogYXBwbHlSZXN1bHQuc3Rkb3V0LFxuICAgICAgICAgIHN0ZGVycjogYXBwbHlSZXN1bHQuc3RkZXJyLFxuICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVGVycmFmb3JtIGFwcGx5IGZhaWxlZDogJHthcHBseVJlc3VsdC5zdGRvdXR9ICR7YXBwbHlSZXN1bHQuc3RkZXJyfWAsXG4gICAgICAgICAgKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGRvdXQ6IFwiVGVycmFmb3JtIGFwcGx5IHN1Y2NlZWRlZFwiLCBzdGRlcnI6IFwiXCIsIGVycm9yOiBudWxsIH07XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIFRlcnJhZm9ybSBpbml0IG9yIGFwcGx5OlwiLCBlcnJvcik7XG4gICAgcmV0dXJuIHsgc3Rkb3V0OiBcIlwiLCBzdGRlcnI6IFwiXCIsIGVycm9yIH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFRlcnJhZm9ybVBsYW5FeGl0Q29kZShcbiAgc3RhY2s6IGFueSxcbiAgc3RyZWFtT3V0cHV0OiBib29sZWFuID0gZmFsc2UsXG4pOiB7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZzsgZXhpdENvZGU6IG51bWJlcjsgZXJyb3I6IGFueSB9IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UoXG4gICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKHN0YWNrLCBcIm1hbmlmZXN0Lmpzb25cIiksIFwidXRmOFwiKSxcbiAgICApO1xuICAgIGNvbnN0IHN0YWNrcyA9IE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0LnN0YWNrcyk7XG5cbiAgICBmb3IgKGNvbnN0IFssIHN0YWNrRGV0YWlsc10gb2Ygc3RhY2tzKSB7XG4gICAgICBjb25zdCBvcHRzOiBFeGVjU3luY09wdGlvbnNXaXRoU3RyaW5nRW5jb2RpbmcgPSB7XG4gICAgICAgIGN3ZDogcGF0aC5yZXNvbHZlKHN0YWNrLCAoc3RhY2tEZXRhaWxzIGFzIGFueSkud29ya2luZ0RpcmVjdG9yeSksXG4gICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBpbml0UmVzdWx0ID0gZXhlY1RlcnJhZm9ybUNvbW1hbmQoXG4gICAgICAgIGB0ZXJyYWZvcm0gaW5pdGAsXG4gICAgICAgIG9wdHMsXG4gICAgICAgIHN0cmVhbU91dHB1dCxcbiAgICAgICk7XG4gICAgICBpZiAoaW5pdFJlc3VsdC5leGl0Q29kZSAhPT0gMClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUZXJyYWZvcm0gaW5pdCBmYWlsZWQ6ICR7aW5pdFJlc3VsdC5zdGRvdXR9ICR7aW5pdFJlc3VsdC5zdGRlcnJ9YCxcbiAgICAgICAgKTtcblxuICAgICAgY29uc3QgcGxhblJlc3VsdCA9IGV4ZWNUZXJyYWZvcm1Db21tYW5kKFxuICAgICAgICBgdGVycmFmb3JtIHBsYW4gLWlucHV0PWZhbHNlIC1sb2NrPWZhbHNlIC1kZXRhaWxlZC1leGl0Y29kZWAsXG4gICAgICAgIG9wdHMsXG4gICAgICAgIHN0cmVhbU91dHB1dCxcbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGRvdXQ6IHBsYW5SZXN1bHQuc3Rkb3V0LFxuICAgICAgICBzdGRlcnI6IHBsYW5SZXN1bHQuc3RkZXJyLFxuICAgICAgICBleGl0Q29kZTogcGxhblJlc3VsdC5leGl0Q29kZSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdGRvdXQ6IFwiVGVycmFmb3JtIHBsYW4gc3VjY2VlZGVkXCIsXG4gICAgICBzdGRlcnI6IFwiXCIsXG4gICAgICBleGl0Q29kZTogMCxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIFRlcnJhZm9ybSBpbml0IG9yIHBsYW46XCIsIGVycm9yKTtcbiAgICByZXR1cm4geyBzdGRvdXQ6IFwiXCIsIHN0ZGVycjogXCJcIiwgZXhpdENvZGU6IDEsIGVycm9yIH07XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBUZXJyYWZvcm1JZGVtcG90ZW50Q2hlY2soc3RhY2s6IGFueSk6IEFzc2VydGlvblJldHVybiB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShzdGFjaywgXCJtYW5pZmVzdC5qc29uXCIpLCBcInV0ZjhcIiksXG4gICAgKTtcbiAgICBjb25zdCBzdGFja3MgPSBPYmplY3QuZW50cmllcyhtYW5pZmVzdC5zdGFja3MpO1xuXG4gICAgZm9yIChjb25zdCBbLCBzdGFja0RldGFpbHNdIG9mIHN0YWNrcykge1xuICAgICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgICAgY3dkOiBwYXRoLnJlc29sdmUoc3RhY2ssIChzdGFja0RldGFpbHMgYXMgYW55KS53b3JraW5nRGlyZWN0b3J5KSxcbiAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgc3RkaW86IFwicGlwZVwiLFxuICAgICAgfSBhcyBhbnk7XG5cbiAgICAgIGV4ZWNTeW5jKGB0ZXJyYWZvcm0gaW5pdGAsIG9wdHMpO1xuXG4gICAgICBsZXQgcGxhbk91dHB1dDogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGxhbk91dHB1dCA9IGV4ZWNTeW5jKFxuICAgICAgICAgIGB0ZXJyYWZvcm0gcGxhbiAtaW5wdXQ9ZmFsc2UgLWRldGFpbGVkLWV4aXRjb2RlYCxcbiAgICAgICAgICBvcHRzLFxuICAgICAgICApLnRvU3RyaW5nKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIHBsYW5PdXRwdXQgPSBlcnJvci5zdGRvdXQgPyBlcnJvci5zdGRvdXQudG9TdHJpbmcoKSA6IFwiXCI7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgcGxhbk91dHB1dC5pbmNsdWRlcyhcbiAgICAgICAgICBcIk5vIGNoYW5nZXMuIFlvdXIgaW5mcmFzdHJ1Y3R1cmUgbWF0Y2hlcyB0aGUgY29uZmlndXJhdGlvbi5cIixcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uUmV0dXJuKFxuICAgICAgICAgIGBFeHBlY3RlZCBzdWJqZWN0IHRvIGJlIGlkZW1wb3RlbnQgd2l0aCBubyBjaGFuZ2VzYCxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbGFuIHJlc3VsdGVkIGluIGNoYW5nZXM6XFxuJHtwbGFuT3V0cHV0fWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uUmV0dXJuKFxuICAgICAgYEV4cGVjdGVkIHN1YmplY3QgdG8gYmUgaWRlbXBvdGVudCB3aXRoIG5vIGNoYW5nZXNgLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgVGVycmFmb3JtIGluaXQgb3IgcGxhbjpcIiwgZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBUZXJyYWZvcm1EZXN0cm95KFxuICBzdGFjazogYW55LFxuICBzdHJlYW1PdXRwdXQ6IGJvb2xlYW4gPSBmYWxzZSxcbik6IEFzc2VydGlvblJldHVybiB7XG4gIHRyeSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShzdGFjaywgXCJtYW5pZmVzdC5qc29uXCIpLCBcInV0ZjhcIiksXG4gICAgKTtcbiAgICBjb25zdCBzdGFja3MgPSBPYmplY3QuZW50cmllcyhtYW5pZmVzdC5zdGFja3MpO1xuXG4gICAgZm9yIChjb25zdCBbLCBzdGFja0RldGFpbHNdIG9mIHN0YWNrcykge1xuICAgICAgY29uc3Qgb3B0czogRXhlY1N5bmNPcHRpb25zV2l0aFN0cmluZ0VuY29kaW5nID0ge1xuICAgICAgICBjd2Q6IHBhdGgucmVzb2x2ZShzdGFjaywgKHN0YWNrRGV0YWlscyBhcyBhbnkpLndvcmtpbmdEaXJlY3RvcnkpLFxuICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgaW5pdFJlc3VsdCA9IGV4ZWNUZXJyYWZvcm1Db21tYW5kKFxuICAgICAgICBgdGVycmFmb3JtIGluaXRgLFxuICAgICAgICBvcHRzLFxuICAgICAgICBzdHJlYW1PdXRwdXQsXG4gICAgICApO1xuICAgICAgaWYgKGluaXRSZXN1bHQuZXhpdENvZGUgIT09IDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGVycmFmb3JtIGluaXQgZmFpbGVkOiAke2luaXRSZXN1bHQuc3Rkb3V0fSAke2luaXRSZXN1bHQuc3RkZXJyfWAsXG4gICAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRlc3Ryb3lSZXN1bHQgPSBleGVjVGVycmFmb3JtQ29tbWFuZChcbiAgICAgICAgYHRlcnJhZm9ybSBkZXN0cm95IC1hdXRvLWFwcHJvdmVgLFxuICAgICAgICBvcHRzLFxuICAgICAgICBzdHJlYW1PdXRwdXQsXG4gICAgICApO1xuICAgICAgaWYgKGRlc3Ryb3lSZXN1bHQuZXhpdENvZGUgIT09IDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGVycmFmb3JtIGRlc3Ryb3kgZmFpbGVkOiAke2Rlc3Ryb3lSZXN1bHQuc3Rkb3V0fSAke2Rlc3Ryb3lSZXN1bHQuc3RkZXJyfWAsXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBc3NlcnRpb25SZXR1cm4oXG4gICAgICBgRXhwZWN0ZWQgc3ViamVjdCB0byBkZXN0cm95IHN1Y2Nlc3NmdWxseWAsXG4gICAgICB0cnVlLFxuICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIFRlcnJhZm9ybSBpbml0IG9yIGRlc3Ryb3k6XCIsIGVycm9yKTtcbiAgICByZXR1cm4gbmV3IEFzc2VydGlvblJldHVybihcbiAgICAgIGBFeHBlY3RlZCBzdWJqZWN0IHRvIGRlc3Ryb3kgc3VjY2Vzc2Z1bGx5YCxcbiAgICAgIGZhbHNlLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFRlcnJhZm9ybUFwcGx5QW5kQ2hlY2tJZGVtcG90ZW5jeShcbiAgc3RhY2s6IGFueSxcbiAgc3RyZWFtT3V0cHV0OiBib29sZWFuID0gZmFsc2UsXG4pOiBBc3NlcnRpb25SZXR1cm4ge1xuICBjb25zdCBhcHBseVJlc3VsdCA9IFRlcnJhZm9ybUFwcGx5KHN0YWNrLCBzdHJlYW1PdXRwdXQpO1xuICBpZiAoYXBwbHlSZXN1bHQuZXJyb3IpIHtcbiAgICByZXR1cm4gbmV3IEFzc2VydGlvblJldHVybihhcHBseVJlc3VsdC5lcnJvci5tZXNzYWdlLCBmYWxzZSk7XG4gIH1cblxuICBjb25zdCBwbGFuUmVzdWx0ID0gVGVycmFmb3JtUGxhbkV4aXRDb2RlKHN0YWNrLCBzdHJlYW1PdXRwdXQpO1xuICBpZiAocGxhblJlc3VsdC5lcnJvcikge1xuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uUmV0dXJuKHBsYW5SZXN1bHQuZXJyb3IubWVzc2FnZSwgZmFsc2UpO1xuICB9XG5cbiAgaWYgKHBsYW5SZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICByZXR1cm4gbmV3IEFzc2VydGlvblJldHVybihcbiAgICAgIGBUZXJyYWZvcm0gY29uZmlndXJhdGlvbiBub3QgaWRlbXBvdGVudDpcXG4ke3BsYW5SZXN1bHQuc3Rkb3V0fWAsXG4gICAgICBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBBc3NlcnRpb25SZXR1cm4oXG4gICAgYFRlcnJhZm9ybSBhcHBseSBhbmQgaWRlbXBvdGVuY3kgY2hlY2sgY29tcGxldGVkIHN1Y2Nlc3NmdWxseWAsXG4gICAgdHJ1ZSxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFRlcnJhZm9ybUFwcGx5Q2hlY2tBbmREZXN0cm95KHN0YWNrOiBhbnkpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBhcHBseUFuZENoZWNrUmVzdWx0ID0gVGVycmFmb3JtQXBwbHlBbmRDaGVja0lkZW1wb3RlbmN5KHN0YWNrKTtcbiAgICBpZiAoIWFwcGx5QW5kQ2hlY2tSZXN1bHQucGFzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGFwcGx5QW5kQ2hlY2tSZXN1bHQubWVzc2FnZSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgVGVycmFmb3JtIGFwcGx5IGFuZCBpZGVtcG90ZW5jeSBjaGVjazpcIiwgZXJyb3IpO1xuICAgIHRocm93IGVycm9yOyAvLyBSZS10aHJvdyB0aGUgZXJyb3IgdG8gZW5zdXJlIHRoZSB0ZXN0IGZhaWxzXG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlc3Ryb3lSZXN1bHQgPSBUZXJyYWZvcm1EZXN0cm95KHN0YWNrKTtcbiAgICAgIGlmICghZGVzdHJveVJlc3VsdC5wYXNzKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgVGVycmFmb3JtIGRlc3Ryb3k6XCIsIGRlc3Ryb3lSZXN1bHQubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZGVzdHJveUVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZHVyaW5nIFRlcnJhZm9ybSBkZXN0cm95OlwiLCBkZXN0cm95RXJyb3IpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gVGVycmFmb3JtUGxhbihzdGFjazogYW55KTogQXNzZXJ0aW9uUmV0dXJuIHtcbiAgdHJ5IHtcbiAgICAvLyBBc3N1bWluZyB0aGUgcHJlc2VuY2Ugb2YgYSByZWNlaXZlZCB2YXJpYWJsZSBwb2ludGluZyB0byB0aGUgcmVsZXZhbnQgZGlyZWN0b3J5XG4gICAgY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGgucmVzb2x2ZShzdGFjaywgXCJtYW5pZmVzdC5qc29uXCIpLCBcInV0ZjhcIiksXG4gICAgKTtcbiAgICBjb25zdCBzdGFja3MgPSBPYmplY3QuZW50cmllcyhtYW5pZmVzdC5zdGFja3MpO1xuICAgIHN0YWNrcy5mb3JFYWNoKChbLCBzdGFja0RldGFpbHNdKSA9PiB7XG4gICAgICBjb25zdCBvcHRzID0ge1xuICAgICAgICBjd2Q6IHBhdGgucmVzb2x2ZShzdGFjaywgKHN0YWNrRGV0YWlscyBhcyBhbnkpLndvcmtpbmdEaXJlY3RvcnkpLFxuICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICBzdGRpbzogXCJwaXBlXCIsXG4gICAgICB9IGFzIGFueTtcbiAgICAgIGV4ZWNTeW5jKGB0ZXJyYWZvcm0gaW5pdGAsIG9wdHMpO1xuICAgICAgZXhlY1N5bmMoYHRlcnJhZm9ybSBwbGFuIC1pbnB1dD1mYWxzZSAtbG9jaz1mYWxzZWAsIG9wdHMpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBBc3NlcnRpb25SZXR1cm4oXG4gICAgICBgRXhwZWN0ZWQgc3ViamVjdCBub3QgdG8gcGxhbiBzdWNjZXNzZnVsbHlgLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgVGVycmFmb3JtIGluaXQgb3IgcGxhbjpcIiwgZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uUmV0dXJuKFxuICAgICAgXCJFeHBlY3RlZCBzdWJqZWN0IHRvIHBsYW4gc3VjY2Vzc2Z1bGx5LCBmYWxzZVwiLFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXNzZXJ0aW9uUmV0dXJuIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBBc3NlcnRpb25SZXR1cm5cbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBTdHJpbmcgbWVzc2FnZSBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXN1bHQgb2YgdGhlIGFzc2VydGlvblxuICAgKiBAcGFyYW0gcGFzcyAtIEJvb2xlYW4gcGFzcyBkZW5vdGluZyB0aGUgc3VjY2VzcyBvZiB0aGUgYXNzZXJ0aW9uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBwYXNzOiBib29sZWFuLFxuICApIHtcbiAgICBpZiAoIXBhc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gRGVmaW5lIGEgY2xlYW51cCBmdW5jdGlvbiB0aGF0IGNhbiBiZSBleHBvcnRlZCBhbmQgdXNlZCBpbiB0ZXN0cy5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbnVwQ2RrVGZPdXREaXJzKCkge1xuICB0cnkge1xuICAgIGV4ZWNTeW5jKCdmaW5kIC90bXAgLW5hbWUgXCJjZGt0Zi5vdXRkaXIuKlwiIC10eXBlIGQgLWV4ZWMgcm0gLXJmIHt9ICsnKTtcbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgIFwiQ2xlYW51cCBvZiBjZGt0Zi5vdXRkaXIuKiBkaXJlY3RvcmllcyBpbiAvdG1wIHdhcyBzdWNjZXNzZnVsLlwiLFxuICAgIC8vICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGR1cmluZyBjbGVhbnVwOlwiLCBlcnJvcik7XG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -25,13 +25,15 @@
25
25
  "post-upgrade": "npx projen post-upgrade",
26
26
  "pre-compile": "npx projen pre-compile",
27
27
  "release": "npx projen release",
28
- "test": "npx projen test",
28
+ "test": "jest --testMatch '**/*.spec.ts'",
29
29
  "test:update": "npx projen test:update",
30
30
  "test:watch": "npx projen test:watch",
31
31
  "unbump": "npx projen unbump",
32
32
  "upgrade": "npx projen upgrade",
33
33
  "watch": "npx projen watch",
34
34
  "projen": "npx projen",
35
+ "integration": "STREAM_OUTPUT=true jest --testMatch '**/*.integ.ts'",
36
+ "integration:nostream": "STREAM_OUTPUT=false jest --maxWorkers=12 --testMatch '**/*.integ.ts'",
35
37
  "generate-index": "node ./scripts/generate-index.js"
36
38
  },
37
39
  "author": {
@@ -101,11 +103,11 @@
101
103
  "publishConfig": {
102
104
  "access": "public"
103
105
  },
104
- "version": "0.0.3-pre.11",
106
+ "version": "0.0.3-pre.12",
105
107
  "jest": {
106
108
  "testMatch": [
107
109
  "<rootDir>/src/**/__tests__/**/*.ts?(x)",
108
- "<rootDir>/@(|src)/**/*(*.)@(spec|test).ts?(x)"
110
+ "<rootDir>/@(|src)/**/*(*.)@(spec|test|integ).ts?(x)"
109
111
  ],
110
112
  "clearMocks": true,
111
113
  "collectCoverage": true,
@@ -157,7 +159,7 @@
157
159
  "java": {
158
160
  "package": "com.microsoft.terraformcdkconstructs",
159
161
  "maven": {
160
- "groupId": "com.microsoft",
162
+ "groupId": "com.microsoft.terraformcdkconstructs",
161
163
  "artifactId": "cdktf-azure-constructs"
162
164
  }
163
165
  },
@@ -1,13 +0,0 @@
1
- {
2
- "version": "0.17.3",
3
- "stacks": {
4
- "testExampleAzureResource": {
5
- "name": "testExampleAzureResource",
6
- "constructPath": "testExampleAzureResource",
7
- "workingDirectory": "stacks/testExampleAzureResource",
8
- "synthesizedStackPath": "stacks/testExampleAzureResource/cdk.tf.json",
9
- "annotations": [],
10
- "dependencies": []
11
- }
12
- }
13
- }
@@ -1,111 +0,0 @@
1
- {
2
- "//": {
3
- "metadata": {
4
- "backend": "local",
5
- "stackName": "testAzureActionGroup",
6
- "version": "0.17.3"
7
- },
8
- "outputs": {
9
- "testAzureActionGroup": {
10
- "id": "id",
11
- "testAzureActionGroup": {
12
- "id": "id"
13
- }
14
- }
15
- }
16
- },
17
- "output": {
18
- "id": {
19
- "value": "${azurerm_monitor_action_group.testAzureActionGroup_actiongroup_73C559FB.id}"
20
- }
21
- },
22
- "provider": {
23
- "azurerm": [
24
- {
25
- "features": {
26
- "resource_group": {
27
- "prevent_deletion_if_contains_resources": false
28
- }
29
- }
30
- }
31
- ]
32
- },
33
- "resource": {
34
- "azurerm_monitor_action_group": {
35
- "testAzureActionGroup_actiongroup_73C559FB": {
36
- "//": {
37
- "metadata": {
38
- "path": "testAzureActionGroup/testAzureActionGroup/actiongroup",
39
- "uniqueId": "testAzureActionGroup_actiongroup_73C559FB"
40
- }
41
- },
42
- "email_receiver": [
43
- {
44
- "email_address": "test1@email.com",
45
- "name": "testemail1",
46
- "use_common_alert_schema": true
47
- },
48
- {
49
- "email_address": "test2@email.com",
50
- "name": "testemail2",
51
- "use_common_alert_schema": false
52
- }
53
- ],
54
- "enabled": true,
55
- "location": "global",
56
- "name": "testactiongroup",
57
- "resource_group_name": "${azurerm_resource_group.rg.name}",
58
- "short_name": "testshortn",
59
- "tags": {
60
- },
61
- "webhook_receiver": [
62
- {
63
- "name": "testwebhook1",
64
- "service_uri": "https://www.example1.com",
65
- "use_common_alert_schema": true
66
- },
67
- {
68
- "name": "testwebhook2",
69
- "service_uri": "https://www.example2.com",
70
- "use_common_alert_schema": false
71
- }
72
- ]
73
- }
74
- },
75
- "azurerm_resource_group": {
76
- "rg": {
77
- "//": {
78
- "metadata": {
79
- "path": "testAzureActionGroup/rg",
80
- "uniqueId": "rg"
81
- }
82
- },
83
- "location": "eastus",
84
- "name": "rg-${var.name}",
85
- "tags": {
86
- "test": "test"
87
- }
88
- }
89
- }
90
- },
91
- "terraform": {
92
- "backend": {
93
- "local": {
94
- "path": "/home/runner/work/terraform-cdk-constructs/terraform-cdk-constructs/terraform.testAzureActionGroup.tfstate"
95
- }
96
- },
97
- "required_providers": {
98
- "azurerm": {
99
- "source": "azurerm",
100
- "version": "3.70.0"
101
- }
102
- }
103
- },
104
- "variable": {
105
- "name": {
106
- "default": "test",
107
- "description": "System name used to randomize the resources",
108
- "type": "string"
109
- }
110
- }
111
- }