@guardian/cdk 64.0.0 → 64.1.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 (102) hide show
  1. package/lib/aspects/cfn-include-reporter.js.map +1 -1
  2. package/lib/aspects/cfn-parameter-reporter.js.map +1 -1
  3. package/lib/aspects/metadata.js.map +1 -1
  4. package/lib/bin/aws-credential-provider.d.ts.map +1 -1
  5. package/lib/bin/commands/account-readiness/index.d.ts.map +1 -1
  6. package/lib/bin/commands/account-readiness/index.js.map +1 -1
  7. package/lib/bin/commands/account-readiness/ssm.d.ts.map +1 -1
  8. package/lib/bin/commands/account-readiness/ssm.js.map +1 -1
  9. package/lib/bin/commands/aws-cdk-version.d.ts.map +1 -1
  10. package/lib/bin/commands/new-project/index.d.ts.map +1 -1
  11. package/lib/bin/commands/new-project/index.js.map +1 -1
  12. package/lib/bin/commands/new-project/utils/app.d.ts.map +1 -1
  13. package/lib/bin/commands/new-project/utils/app.js.map +1 -1
  14. package/lib/bin/commands/new-project/utils/imports.js.map +1 -1
  15. package/lib/bin/commands/new-project/utils/init.d.ts.map +1 -1
  16. package/lib/bin/commands/new-project/utils/init.js.map +1 -1
  17. package/lib/bin/commands/new-project/utils/snapshot.d.ts.map +1 -1
  18. package/lib/bin/commands/new-project/utils/snapshot.js.map +1 -1
  19. package/lib/bin/commands/new-project/utils/stack.d.ts.map +1 -1
  20. package/lib/bin/commands/new-project/utils/stack.js.map +1 -1
  21. package/lib/bin/commands/new-project/utils/utils.js +1 -2
  22. package/lib/bin/commands/new-project/utils/utils.js.map +1 -1
  23. package/lib/bin/index.js.map +1 -1
  24. package/lib/constants/library-info.js +3 -3
  25. package/lib/constants/library-info.js.map +1 -1
  26. package/lib/constructs/autoscaling/asg.js.map +1 -1
  27. package/lib/constructs/autoscaling/user-data.js.map +1 -1
  28. package/lib/constructs/cloudwatch/alarm.js.map +1 -1
  29. package/lib/constructs/core/identity.d.ts.map +1 -1
  30. package/lib/constructs/core/parameters/anghammarad.js.map +1 -1
  31. package/lib/constructs/core/parameters/fastly.js.map +1 -1
  32. package/lib/constructs/core/parameters/log-shipping.js.map +1 -1
  33. package/lib/constructs/core/parameters/s3.js.map +1 -1
  34. package/lib/constructs/core/parameters/vpc.js.map +1 -1
  35. package/lib/constructs/core/stack.js.map +1 -1
  36. package/lib/constructs/dns/dns-records.js.map +1 -1
  37. package/lib/constructs/ec2/security-groups/base.js.map +1 -1
  38. package/lib/constructs/ec2/vpc.d.ts.map +1 -1
  39. package/lib/constructs/ec2/vpc.js.map +1 -1
  40. package/lib/constructs/ecs/ecs-task.js +1 -1
  41. package/lib/constructs/ecs/ecs-task.js.map +1 -1
  42. package/lib/constructs/iam/policies/anghammarad.js.map +1 -1
  43. package/lib/constructs/iam/policies/describe-ec2.js.map +1 -1
  44. package/lib/constructs/iam/policies/kcl.js +1 -1
  45. package/lib/constructs/iam/policies/kcl.js.map +1 -1
  46. package/lib/constructs/iam/policies/log-shipping.js.map +1 -1
  47. package/lib/constructs/iam/policies/parameter-store-read.js.map +1 -1
  48. package/lib/constructs/iam/policies/ssm-ssh.js.map +1 -1
  49. package/lib/constructs/lambda/lambda.js.map +1 -1
  50. package/lib/constructs/loadbalancing/alb/application-load-balancer.js.map +1 -1
  51. package/lib/constructs/loadbalancing/alb/application-target-group.js +1 -1
  52. package/lib/constructs/loadbalancing/alb/application-target-group.js.map +1 -1
  53. package/lib/constructs/ses/index.js.map +1 -1
  54. package/lib/constructs/vpc/vpc.js.map +1 -1
  55. package/lib/experimental/constructs/iam/policies/developer-policy.js.map +1 -1
  56. package/lib/experimental/constructs/riff-raff-deployment-id.js.map +1 -1
  57. package/lib/experimental/patterns/ec2-app.js.map +1 -1
  58. package/lib/experimental/patterns/gu-load-balanced-app.d.ts.map +1 -1
  59. package/lib/experimental/patterns/gu-load-balanced-app.js +21 -4
  60. package/lib/experimental/patterns/gu-load-balanced-app.js.map +1 -1
  61. package/lib/patterns/api-lambda.js.map +1 -1
  62. package/lib/patterns/api-multiple-lambdas.js.map +1 -1
  63. package/lib/patterns/ec2-app/base.js +2 -2
  64. package/lib/patterns/ec2-app/base.js.map +1 -1
  65. package/lib/riff-raff-yaml-file/deployments/autoscaling.js +2 -3
  66. package/lib/riff-raff-yaml-file/deployments/autoscaling.js.map +1 -1
  67. package/lib/riff-raff-yaml-file/deployments/cloudformation.js +3 -4
  68. package/lib/riff-raff-yaml-file/deployments/cloudformation.js.map +1 -1
  69. package/lib/riff-raff-yaml-file/deployments/lambda.js +2 -3
  70. package/lib/riff-raff-yaml-file/deployments/lambda.js.map +1 -1
  71. package/lib/riff-raff-yaml-file/deployments/update-parameters.js +1 -2
  72. package/lib/riff-raff-yaml-file/deployments/update-parameters.js.map +1 -1
  73. package/lib/riff-raff-yaml-file/group-by.js +5 -6
  74. package/lib/riff-raff-yaml-file/group-by.js.map +1 -1
  75. package/lib/riff-raff-yaml-file/index.js +2 -2
  76. package/lib/riff-raff-yaml-file/index.js.map +1 -1
  77. package/lib/types/access.js.map +1 -1
  78. package/lib/utils/array.js +1 -2
  79. package/lib/utils/array.js.map +1 -1
  80. package/lib/utils/cli/vpc.d.ts.map +1 -1
  81. package/lib/utils/cli/vpc.js.map +1 -1
  82. package/lib/utils/cognito/cognito.d.ts.map +1 -1
  83. package/lib/utils/exec.js +2 -3
  84. package/lib/utils/exec.js.map +1 -1
  85. package/lib/utils/git.js +2 -3
  86. package/lib/utils/git.js.map +1 -1
  87. package/lib/utils/lambda/event-source.js +2 -2
  88. package/lib/utils/lambda/event-source.js.map +1 -1
  89. package/lib/utils/math.d.ts.map +1 -1
  90. package/lib/utils/mixin/app-aware-construct.js +1 -2
  91. package/lib/utils/mixin/app-aware-construct.js.map +1 -1
  92. package/lib/utils/security-groups/helpers.d.ts.map +1 -1
  93. package/lib/utils/singleton.d.ts +1 -1
  94. package/lib/utils/singleton.d.ts.map +1 -1
  95. package/lib/utils/string.d.ts.map +1 -1
  96. package/lib/utils/test/assertions.js.map +1 -1
  97. package/lib/utils/test/attach-policy-to-test-role.d.ts.map +1 -1
  98. package/lib/utils/test/simple-gu-stack.js +1 -2
  99. package/lib/utils/test/simple-gu-stack.js.map +1 -1
  100. package/lib/utils/test/template.js +1 -2
  101. package/lib/utils/test/template.js.map +1 -1
  102. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"cloudformation.js","sourceRoot":"","sources":["../../../src/riff-raff-yaml-file/deployments/cloudformation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { GuAutoScalingGroup } from \"../../constructs/autoscaling\";\nimport type { GuAsgMinInstancesInServiceParameterExperimental } from \"../../experimental/patterns/ec2-app\";\nimport { toKebabCase } from \"../../utils/string\";\nimport type { CdkStacksDifferingOnlyByStage, RiffRaffDeployment, RiffRaffDeploymentParameters } from \"../types\";\n\nexport function cloudFormationDeployment(\n cdkStacks: CdkStacksDifferingOnlyByStage,\n dependencies: RiffRaffDeployment[],\n contentDirectory: string,\n): RiffRaffDeployment {\n // The stacks in `cdkStacks` only differ by stage, so we can just use the first item in the list for key information.\n const [cdkStack] = cdkStacks;\n\n if (!cdkStack) {\n throw new Error(\"Unable to produce a working riff-raff.yaml file; there are no stacks!\");\n }\n\n const {\n region,\n stack,\n constructor: { name },\n } = cdkStack;\n\n const kebabClassName = toKebabCase(name);\n\n const templateStagePaths = cdkStacks.reduce(\n (acc, { stage, templateFile }) => ({\n ...acc,\n [stage]: templateFile,\n }),\n {},\n );\n\n return {\n name: [\"cfn\", region, stack, kebabClassName].join(\"-\"),\n props: {\n type: \"cloud-formation\",\n regions: new Set([region]),\n stacks: new Set([stack]),\n app: kebabClassName,\n contentDirectory,\n parameters: {\n templateStagePaths,\n },\n // only add the `dependencies` property if there are some\n ...(dependencies.length > 0 && { dependencies: dependencies.map(({ name }) => name) }),\n },\n };\n}\n\nexport function getAmiParameters(autoScalingGroups: GuAutoScalingGroup[]): RiffRaffDeploymentParameters {\n return autoScalingGroups.reduce<RiffRaffDeploymentParameters>((acc, asg) => {\n const { imageRecipe, app, amiParameter } = asg;\n\n if (!imageRecipe) {\n throw new Error(`Unable to produce a working riff-raff.yaml file; imageRecipe missing from ASG ${app}`);\n }\n\n const Recipe = typeof imageRecipe === \"string\" ? imageRecipe : imageRecipe.Recipe;\n const AmigoStage = typeof imageRecipe === \"string\" ? \"PROD\" : (imageRecipe.AmigoStage ?? \"PROD\");\n\n // In YAML `true` is a Boolean. Riff-Raff expects a String here, so call `toString` to make it `'true'`.\n const Encrypted = (typeof imageRecipe === \"string\" ? true : (imageRecipe.Encrypted ?? true)).toString();\n\n return {\n ...acc,\n [amiParameter.node.id]: {\n BuiltBy: \"amigo\",\n AmigoStage,\n Recipe,\n Encrypted,\n },\n };\n }, {});\n}\n\nexport function getMinInstancesInServiceParameters(\n cfnParameters: Map<string, GuAsgMinInstancesInServiceParameterExperimental>,\n): RiffRaffDeploymentParameters {\n const response: RiffRaffDeploymentParameters = {};\n\n cfnParameters.forEach((cfnParam, cfnParamName) => {\n const app = cfnParam.asg.app;\n response[cfnParamName] = { App: app };\n });\n\n return response;\n}\n"]}
1
+ {"version":3,"file":"cloudformation.js","sourceRoot":"","sources":["../../../src/riff-raff-yaml-file/deployments/cloudformation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { GuAutoScalingGroup } from \"../../constructs/autoscaling\";\nimport type { GuAsgMinInstancesInServiceParameterExperimental } from \"../../experimental/patterns/ec2-app\";\nimport { toKebabCase } from \"../../utils/string\";\nimport type { CdkStacksDifferingOnlyByStage, RiffRaffDeployment, RiffRaffDeploymentParameters } from \"../types\";\n\nexport function cloudFormationDeployment(\n cdkStacks: CdkStacksDifferingOnlyByStage,\n dependencies: RiffRaffDeployment[],\n contentDirectory: string,\n): RiffRaffDeployment {\n // The stacks in `cdkStacks` only differ by stage, so we can just use the first item in the list for key information.\n const [cdkStack] = cdkStacks;\n\n if (!cdkStack) {\n throw new Error(\"Unable to produce a working riff-raff.yaml file; there are no stacks!\");\n }\n\n const {\n region,\n stack,\n constructor: { name },\n } = cdkStack;\n\n const kebabClassName = toKebabCase(name);\n\n const templateStagePaths = cdkStacks.reduce(\n (acc, { stage, templateFile }) => ({\n ...acc,\n [stage]: templateFile,\n }),\n {},\n );\n\n return {\n name: [\"cfn\", region, stack, kebabClassName].join(\"-\"),\n props: {\n type: \"cloud-formation\",\n regions: new Set([region]),\n stacks: new Set([stack]),\n app: kebabClassName,\n contentDirectory,\n parameters: {\n templateStagePaths,\n },\n // only add the `dependencies` property if there are some\n ...(dependencies.length > 0 && { dependencies: dependencies.map(({ name }) => name) }),\n },\n };\n}\n\nexport function getAmiParameters(autoScalingGroups: GuAutoScalingGroup[]): RiffRaffDeploymentParameters {\n return autoScalingGroups.reduce<RiffRaffDeploymentParameters>((acc, asg) => {\n const { imageRecipe, app, amiParameter } = asg;\n\n if (!imageRecipe) {\n throw new Error(`Unable to produce a working riff-raff.yaml file; imageRecipe missing from ASG ${app}`);\n }\n\n const Recipe = typeof imageRecipe === \"string\" ? imageRecipe : imageRecipe.Recipe;\n const AmigoStage = typeof imageRecipe === \"string\" ? \"PROD\" : (imageRecipe.AmigoStage ?? \"PROD\");\n\n // In YAML `true` is a Boolean. Riff-Raff expects a String here, so call `toString` to make it `'true'`.\n const Encrypted = (typeof imageRecipe === \"string\" ? true : (imageRecipe.Encrypted ?? true)).toString();\n\n return {\n ...acc,\n [amiParameter.node.id]: {\n BuiltBy: \"amigo\",\n AmigoStage,\n Recipe,\n Encrypted,\n },\n };\n }, {});\n}\n\nexport function getMinInstancesInServiceParameters(\n cfnParameters: Map<string, GuAsgMinInstancesInServiceParameterExperimental>,\n): RiffRaffDeploymentParameters {\n const response: RiffRaffDeploymentParameters = {};\n\n cfnParameters.forEach((cfnParam, cfnParamName) => {\n const app = cfnParam.asg.app;\n response[cfnParamName] = { App: app };\n });\n\n return response;\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.updateLambdaDeployment = exports.uploadLambdaArtifact = void 0;
3
+ exports.uploadLambdaArtifact = uploadLambdaArtifact;
4
+ exports.updateLambdaDeployment = updateLambdaDeployment;
4
5
  const locationProps = (lambda) => {
5
6
  const bucketProp = lambda.bucketNamePath === undefined
6
7
  ? {
@@ -46,7 +47,6 @@ function uploadLambdaArtifact(lambda) {
46
47
  },
47
48
  };
48
49
  }
49
- exports.uploadLambdaArtifact = uploadLambdaArtifact;
50
50
  function updateLambdaDeployment(lambda, { name: cfnDeployName }) {
51
51
  const { app, fileName } = lambda;
52
52
  const { stack, region } = lambda.stack;
@@ -68,5 +68,4 @@ function updateLambdaDeployment(lambda, { name: cfnDeployName }) {
68
68
  },
69
69
  };
70
70
  }
71
- exports.updateLambdaDeployment = updateLambdaDeployment;
72
71
  //# sourceMappingURL=lambda.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lambda.js","sourceRoot":"","sources":["../../../src/riff-raff-yaml-file/deployments/lambda.ts"],"names":[],"mappings":";;;AAYA,MAAM,aAAa,GAAG,CAAC,MAAwB,EAAmB,EAAE;IAClE,MAAM,UAAU,GACd,MAAM,CAAC,cAAc,KAAK,SAAS;QACjC,CAAC,CAAC;YACE,eAAe,EAAE,IAAI;SACtB;QACH,CAAC,CAAC;YACE,YAAY,EAAE,MAAM,CAAC,cAAc;SACpC,CAAC;IAER;;;;OAIG;IACH,MAAM,WAAW,GAAG,MAAM,CAAC,iBAAiB;QAC1C,CAAC,CAAC;YACE,gBAAgB,EAAE,KAAK;YACvB,cAAc,EAAE,KAAK;YACrB,gBAAgB,EAAE,KAAK;SACxB;QACH,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;QACL,GAAG,UAAU;QACb,GAAG,WAAW;KACf,CAAC;AACJ,CAAC,CAAC;AAEF,SAAgB,oBAAoB,CAAC,MAAwB;IAC3D,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IACjC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,KAAgB,CAAC;IAElD,OAAO;QACL,IAAI,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QACrD,KAAK,EAAE;YACL,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;YAC1B,GAAG;YACH,gBAAgB,EAAE,GAAG;YACrB,UAAU,EAAE;gBACV,GAAG,aAAa,CAAC,MAAM,CAAC;gBACxB,YAAY,EAAE,IAAI;gBAClB,QAAQ;aACT;YACD,OAAO,EAAE,CAAC,cAAc,CAAC;SAC1B;KACF,CAAC;AACJ,CAAC;AApBD,oDAoBC;AAED,SAAgB,sBAAsB,CACpC,MAAwB,EACxB,EAAE,IAAI,EAAE,aAAa,EAAsB;IAE3C,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IACjC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,KAAgB,CAAC;IAElD,OAAO;QACL,IAAI,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QACrD,KAAK,EAAE;YACL,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;YAC1B,GAAG;YACH,gBAAgB,EAAE,GAAG;YACrB,UAAU,EAAE;gBACV,GAAG,aAAa,CAAC,MAAM,CAAC;gBACxB,YAAY,EAAE,IAAI;gBAClB,QAAQ;aACT;YACD,OAAO,EAAE,CAAC,cAAc,CAAC;YACzB,YAAY,EAAE,CAAC,aAAa,CAAC;SAC9B;KACF,CAAC;AACJ,CAAC;AAxBD,wDAwBC","sourcesContent":["import type { GuStack } from \"../../constructs/core\";\nimport type { GuLambdaFunction } from \"../../constructs/lambda\";\nimport type { RiffRaffDeployment } from \"../types\";\n\ninterface S3LocationProps {\n bucketSsmLookup?: boolean;\n bucketSsmKey?: string;\n prefixStackToKey?: boolean;\n prefixAppToKey?: boolean;\n prefixStageToKey?: boolean;\n}\n\nconst locationProps = (lambda: GuLambdaFunction): S3LocationProps => {\n const bucketProp =\n lambda.bucketNamePath === undefined\n ? {\n bucketSsmLookup: true,\n }\n : {\n bucketSsmKey: lambda.bucketNamePath,\n };\n\n /**\n * If the lambda has a file prefix, we don't want to prefix the key with the stack, app or stage.\n * The default value for these properties is `true`, so we don't need to set them explicitly if\n * we *do* want to add the prefixes (and RiffRaff will complain if we add them).\n */\n const prefixProps = lambda.withoutFilePrefix\n ? {\n prefixStackToKey: false,\n prefixAppToKey: false,\n prefixStageToKey: false,\n }\n : {};\n\n return {\n ...bucketProp,\n ...prefixProps,\n };\n};\n\nexport function uploadLambdaArtifact(lambda: GuLambdaFunction): RiffRaffDeployment {\n const { app, fileName } = lambda;\n const { stack, region } = lambda.stack as GuStack;\n\n return {\n name: [\"lambda-upload\", region, stack, app].join(\"-\"),\n props: {\n type: \"aws-lambda\",\n stacks: new Set([stack]),\n regions: new Set([region]),\n app,\n contentDirectory: app,\n parameters: {\n ...locationProps(lambda),\n lookupByTags: true,\n fileName,\n },\n actions: [\"uploadLambda\"],\n },\n };\n}\n\nexport function updateLambdaDeployment(\n lambda: GuLambdaFunction,\n { name: cfnDeployName }: RiffRaffDeployment,\n): RiffRaffDeployment {\n const { app, fileName } = lambda;\n const { stack, region } = lambda.stack as GuStack;\n\n return {\n name: [\"lambda-update\", region, stack, app].join(\"-\"),\n props: {\n type: \"aws-lambda\",\n stacks: new Set([stack]),\n regions: new Set([region]),\n app,\n contentDirectory: app,\n parameters: {\n ...locationProps(lambda),\n lookupByTags: true,\n fileName,\n },\n actions: [\"updateLambda\"],\n dependencies: [cfnDeployName],\n },\n };\n}\n"]}
1
+ {"version":3,"file":"lambda.js","sourceRoot":"","sources":["../../../src/riff-raff-yaml-file/deployments/lambda.ts"],"names":[],"mappings":";;AAyCA,oDAoBC;AAED,wDAwBC;AA3ED,MAAM,aAAa,GAAG,CAAC,MAAwB,EAAmB,EAAE;IAClE,MAAM,UAAU,GACd,MAAM,CAAC,cAAc,KAAK,SAAS;QACjC,CAAC,CAAC;YACE,eAAe,EAAE,IAAI;SACtB;QACH,CAAC,CAAC;YACE,YAAY,EAAE,MAAM,CAAC,cAAc;SACpC,CAAC;IAER;;;;OAIG;IACH,MAAM,WAAW,GAAG,MAAM,CAAC,iBAAiB;QAC1C,CAAC,CAAC;YACE,gBAAgB,EAAE,KAAK;YACvB,cAAc,EAAE,KAAK;YACrB,gBAAgB,EAAE,KAAK;SACxB;QACH,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;QACL,GAAG,UAAU;QACb,GAAG,WAAW;KACf,CAAC;AACJ,CAAC,CAAC;AAEF,SAAgB,oBAAoB,CAAC,MAAwB;IAC3D,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IACjC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,KAAgB,CAAC;IAElD,OAAO;QACL,IAAI,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QACrD,KAAK,EAAE;YACL,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;YAC1B,GAAG;YACH,gBAAgB,EAAE,GAAG;YACrB,UAAU,EAAE;gBACV,GAAG,aAAa,CAAC,MAAM,CAAC;gBACxB,YAAY,EAAE,IAAI;gBAClB,QAAQ;aACT;YACD,OAAO,EAAE,CAAC,cAAc,CAAC;SAC1B;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,sBAAsB,CACpC,MAAwB,EACxB,EAAE,IAAI,EAAE,aAAa,EAAsB;IAE3C,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;IACjC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,KAAgB,CAAC;IAElD,OAAO;QACL,IAAI,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QACrD,KAAK,EAAE;YACL,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;YAC1B,GAAG;YACH,gBAAgB,EAAE,GAAG;YACrB,UAAU,EAAE;gBACV,GAAG,aAAa,CAAC,MAAM,CAAC;gBACxB,YAAY,EAAE,IAAI;gBAClB,QAAQ;aACT;YACD,OAAO,EAAE,CAAC,cAAc,CAAC;YACzB,YAAY,EAAE,CAAC,aAAa,CAAC;SAC9B;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { GuStack } from \"../../constructs/core\";\nimport type { GuLambdaFunction } from \"../../constructs/lambda\";\nimport type { RiffRaffDeployment } from \"../types\";\n\ninterface S3LocationProps {\n bucketSsmLookup?: boolean;\n bucketSsmKey?: string;\n prefixStackToKey?: boolean;\n prefixAppToKey?: boolean;\n prefixStageToKey?: boolean;\n}\n\nconst locationProps = (lambda: GuLambdaFunction): S3LocationProps => {\n const bucketProp =\n lambda.bucketNamePath === undefined\n ? {\n bucketSsmLookup: true,\n }\n : {\n bucketSsmKey: lambda.bucketNamePath,\n };\n\n /**\n * If the lambda has a file prefix, we don't want to prefix the key with the stack, app or stage.\n * The default value for these properties is `true`, so we don't need to set them explicitly if\n * we *do* want to add the prefixes (and RiffRaff will complain if we add them).\n */\n const prefixProps = lambda.withoutFilePrefix\n ? {\n prefixStackToKey: false,\n prefixAppToKey: false,\n prefixStageToKey: false,\n }\n : {};\n\n return {\n ...bucketProp,\n ...prefixProps,\n };\n};\n\nexport function uploadLambdaArtifact(lambda: GuLambdaFunction): RiffRaffDeployment {\n const { app, fileName } = lambda;\n const { stack, region } = lambda.stack as GuStack;\n\n return {\n name: [\"lambda-upload\", region, stack, app].join(\"-\"),\n props: {\n type: \"aws-lambda\",\n stacks: new Set([stack]),\n regions: new Set([region]),\n app,\n contentDirectory: app,\n parameters: {\n ...locationProps(lambda),\n lookupByTags: true,\n fileName,\n },\n actions: [\"uploadLambda\"],\n },\n };\n}\n\nexport function updateLambdaDeployment(\n lambda: GuLambdaFunction,\n { name: cfnDeployName }: RiffRaffDeployment,\n): RiffRaffDeployment {\n const { app, fileName } = lambda;\n const { stack, region } = lambda.stack as GuStack;\n\n return {\n name: [\"lambda-update\", region, stack, app].join(\"-\"),\n props: {\n type: \"aws-lambda\",\n stacks: new Set([stack]),\n regions: new Set([region]),\n app,\n contentDirectory: app,\n parameters: {\n ...locationProps(lambda),\n lookupByTags: true,\n fileName,\n },\n actions: [\"updateLambda\"],\n dependencies: [cfnDeployName],\n },\n };\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.updateDeploymentParameters = void 0;
3
+ exports.updateDeploymentParameters = updateDeploymentParameters;
4
4
  function updateDeploymentParameters(allDeployments, deploymentToUpdate, additionalParametersToApply) {
5
5
  const currentDeployment = allDeployments.get(deploymentToUpdate.name);
6
6
  if (!currentDeployment) {
@@ -14,5 +14,4 @@ function updateDeploymentParameters(allDeployments, deploymentToUpdate, addition
14
14
  },
15
15
  });
16
16
  }
17
- exports.updateDeploymentParameters = updateDeploymentParameters;
18
17
  //# sourceMappingURL=update-parameters.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"update-parameters.js","sourceRoot":"","sources":["../../../src/riff-raff-yaml-file/deployments/update-parameters.ts"],"names":[],"mappings":";;;AAEA,SAAgB,0BAA0B,CACxC,cAAmC,EACnC,kBAAsC,EACtC,2BAAyD;IAEzD,MAAM,iBAAiB,GAAG,cAAc,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACtE,IAAI,CAAC,iBAAiB,EAAE;QACtB,MAAM,IAAI,KAAK,CAAC,6BAA6B,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC;KACzE;IAED,cAAc,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE;QAC1C,GAAG,iBAAiB;QACpB,UAAU,EAAE;YACV,GAAG,iBAAiB,CAAC,UAAU;YAC/B,GAAG,2BAA2B;SAC/B;KACF,CAAC,CAAC;AACL,CAAC;AAjBD,gEAiBC","sourcesContent":["import type { RiffRaffDeployment, RiffRaffDeploymentParameters, RiffRaffDeployments } from \"../types\";\n\nexport function updateDeploymentParameters(\n allDeployments: RiffRaffDeployments,\n deploymentToUpdate: RiffRaffDeployment,\n additionalParametersToApply: RiffRaffDeploymentParameters,\n) {\n const currentDeployment = allDeployments.get(deploymentToUpdate.name);\n if (!currentDeployment) {\n throw new Error(`Unable to find deployment ${deploymentToUpdate.name}`);\n }\n\n allDeployments.set(deploymentToUpdate.name, {\n ...currentDeployment,\n parameters: {\n ...currentDeployment.parameters,\n ...additionalParametersToApply,\n },\n });\n}\n"]}
1
+ {"version":3,"file":"update-parameters.js","sourceRoot":"","sources":["../../../src/riff-raff-yaml-file/deployments/update-parameters.ts"],"names":[],"mappings":";;AAEA,gEAiBC;AAjBD,SAAgB,0BAA0B,CACxC,cAAmC,EACnC,kBAAsC,EACtC,2BAAyD;IAEzD,MAAM,iBAAiB,GAAG,cAAc,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACtE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,6BAA6B,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,cAAc,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE;QAC1C,GAAG,iBAAiB;QACpB,UAAU,EAAE;YACV,GAAG,iBAAiB,CAAC,UAAU;YAC/B,GAAG,2BAA2B;SAC/B;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { RiffRaffDeployment, RiffRaffDeploymentParameters, RiffRaffDeployments } from \"../types\";\n\nexport function updateDeploymentParameters(\n allDeployments: RiffRaffDeployments,\n deploymentToUpdate: RiffRaffDeployment,\n additionalParametersToApply: RiffRaffDeploymentParameters,\n) {\n const currentDeployment = allDeployments.get(deploymentToUpdate.name);\n if (!currentDeployment) {\n throw new Error(`Unable to find deployment ${deploymentToUpdate.name}`);\n }\n\n allDeployments.set(deploymentToUpdate.name, {\n ...currentDeployment,\n parameters: {\n ...currentDeployment.parameters,\n ...additionalParametersToApply,\n },\n });\n}\n"]}
@@ -1,26 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.groupByRiffRaffProjectName = exports.groupByRegion = exports.groupByStageTag = exports.groupByStackTag = exports.groupByClassName = void 0;
3
+ exports.groupByClassName = groupByClassName;
4
+ exports.groupByStackTag = groupByStackTag;
5
+ exports.groupByStageTag = groupByStageTag;
6
+ exports.groupByRegion = groupByRegion;
7
+ exports.groupByRiffRaffProjectName = groupByRiffRaffProjectName;
4
8
  const array_1 = require("../utils/array");
5
9
  const types_1 = require("./types");
6
10
  function groupByClassName(cdkStacks) {
7
11
  return (0, array_1.groupBy)(cdkStacks, (stack) => stack.constructor.name);
8
12
  }
9
- exports.groupByClassName = groupByClassName;
10
13
  function groupByStackTag(cdkStacks) {
11
14
  return (0, array_1.groupBy)(cdkStacks, ({ stack }) => stack);
12
15
  }
13
- exports.groupByStackTag = groupByStackTag;
14
16
  function groupByStageTag(cdkStacks) {
15
17
  return (0, array_1.groupBy)(cdkStacks, ({ stage }) => stage);
16
18
  }
17
- exports.groupByStageTag = groupByStageTag;
18
19
  function groupByRegion(cdkStacks) {
19
20
  return (0, array_1.groupBy)(cdkStacks, ({ region }) => region);
20
21
  }
21
- exports.groupByRegion = groupByRegion;
22
22
  function groupByRiffRaffProjectName(cdkStacks) {
23
23
  return (0, array_1.groupBy)(cdkStacks, (_) => _.riffRaffProjectName ?? types_1.UnknownRiffRaffProjectName);
24
24
  }
25
- exports.groupByRiffRaffProjectName = groupByRiffRaffProjectName;
26
25
  //# sourceMappingURL=group-by.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"group-by.js","sourceRoot":"","sources":["../../src/riff-raff-yaml-file/group-by.ts"],"names":[],"mappings":";;;AACA,0CAAyC;AAEzC,mCAAqD;AAErD,SAAgB,gBAAgB,CAAC,SAAoB;IACnD,OAAO,IAAA,eAAO,EAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAC/D,CAAC;AAFD,4CAEC;AAED,SAAgB,eAAe,CAAC,SAAoB;IAClD,OAAO,IAAA,eAAO,EAAC,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC;AAFD,0CAEC;AAED,SAAgB,eAAe,CAAC,SAAoB;IAClD,OAAO,IAAA,eAAO,EAAC,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC;AAFD,0CAEC;AAED,SAAgB,aAAa,CAAC,SAAoB;IAChD,OAAO,IAAA,eAAO,EAAC,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;AACpD,CAAC;AAFD,sCAEC;AAED,SAAgB,0BAA0B,CAAC,SAAoB;IAC7D,OAAO,IAAA,eAAO,EAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,IAAI,kCAA0B,CAAC,CAAC;AACxF,CAAC;AAFD,gEAEC","sourcesContent":["import type { GuStack } from \"../constructs/core\";\nimport { groupBy } from \"../utils/array\";\nimport type { ClassName, Region, RiffRaffProjectName, StackTag, StageTag } from \"./types\";\nimport { UnknownRiffRaffProjectName } from \"./types\";\n\nexport function groupByClassName(cdkStacks: GuStack[]): Record<ClassName, GuStack[]> {\n return groupBy(cdkStacks, (stack) => stack.constructor.name);\n}\n\nexport function groupByStackTag(cdkStacks: GuStack[]): Record<StackTag, GuStack[]> {\n return groupBy(cdkStacks, ({ stack }) => stack);\n}\n\nexport function groupByStageTag(cdkStacks: GuStack[]): Record<StageTag, GuStack[]> {\n return groupBy(cdkStacks, ({ stage }) => stage);\n}\n\nexport function groupByRegion(cdkStacks: GuStack[]): Record<Region, GuStack[]> {\n return groupBy(cdkStacks, ({ region }) => region);\n}\n\nexport function groupByRiffRaffProjectName(cdkStacks: GuStack[]): Record<RiffRaffProjectName, GuStack[]> {\n return groupBy(cdkStacks, (_) => _.riffRaffProjectName ?? UnknownRiffRaffProjectName);\n}\n"]}
1
+ {"version":3,"file":"group-by.js","sourceRoot":"","sources":["../../src/riff-raff-yaml-file/group-by.ts"],"names":[],"mappings":";;AAKA,4CAEC;AAED,0CAEC;AAED,0CAEC;AAED,sCAEC;AAED,gEAEC;AAtBD,0CAAyC;AAEzC,mCAAqD;AAErD,SAAgB,gBAAgB,CAAC,SAAoB;IACnD,OAAO,IAAA,eAAO,EAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED,SAAgB,eAAe,CAAC,SAAoB;IAClD,OAAO,IAAA,eAAO,EAAC,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,SAAgB,eAAe,CAAC,SAAoB;IAClD,OAAO,IAAA,eAAO,EAAC,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC;AAED,SAAgB,aAAa,CAAC,SAAoB;IAChD,OAAO,IAAA,eAAO,EAAC,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,SAAgB,0BAA0B,CAAC,SAAoB;IAC7D,OAAO,IAAA,eAAO,EAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,mBAAmB,IAAI,kCAA0B,CAAC,CAAC;AACxF,CAAC","sourcesContent":["import type { GuStack } from \"../constructs/core\";\nimport { groupBy } from \"../utils/array\";\nimport type { ClassName, Region, RiffRaffProjectName, StackTag, StageTag } from \"./types\";\nimport { UnknownRiffRaffProjectName } from \"./types\";\n\nexport function groupByClassName(cdkStacks: GuStack[]): Record<ClassName, GuStack[]> {\n return groupBy(cdkStacks, (stack) => stack.constructor.name);\n}\n\nexport function groupByStackTag(cdkStacks: GuStack[]): Record<StackTag, GuStack[]> {\n return groupBy(cdkStacks, ({ stack }) => stack);\n}\n\nexport function groupByStageTag(cdkStacks: GuStack[]): Record<StageTag, GuStack[]> {\n return groupBy(cdkStacks, ({ stage }) => stage);\n}\n\nexport function groupByRegion(cdkStacks: GuStack[]): Record<Region, GuStack[]> {\n return groupBy(cdkStacks, ({ region }) => region);\n}\n\nexport function groupByRiffRaffProjectName(cdkStacks: GuStack[]): Record<RiffRaffProjectName, GuStack[]> {\n return groupBy(cdkStacks, (_) => _.riffRaffProjectName ?? UnknownRiffRaffProjectName);\n}\n"]}
@@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.validateRiffRaffYamlDirectory = exports.RiffRaffYamlFile = void 0;
6
+ exports.RiffRaffYamlFile = void 0;
7
+ exports.validateRiffRaffYamlDirectory = validateRiffRaffYamlDirectory;
7
8
  const fs_1 = require("fs");
8
9
  const path_1 = __importDefault(require("path"));
9
10
  const aws_cdk_lib_1 = require("aws-cdk-lib");
@@ -240,5 +241,4 @@ function validateRiffRaffYamlDirectory(basePath, riffRaffProjectName) {
240
241
  }
241
242
  return resolvedPath;
242
243
  }
243
- exports.validateRiffRaffYamlDirectory = validateRiffRaffYamlDirectory;
244
244
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/riff-raff-yaml-file/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from \"fs\";\nimport path from \"path\";\nimport type { App } from \"aws-cdk-lib\";\nimport { Token } from \"aws-cdk-lib\";\nimport type { CfnAutoScalingGroup } from \"aws-cdk-lib/aws-autoscaling\";\nimport { dump } from \"js-yaml\";\nimport { GuAutoScalingGroup } from \"../constructs/autoscaling\";\nimport { GuStack } from \"../constructs/core\";\nimport { GuLambdaFunction } from \"../constructs/lambda\";\nimport { GuAsgMinInstancesInServiceParameterExperimental } from \"../experimental/patterns/ec2-app\";\nimport { autoscalingDeployment, uploadAutoscalingArtifact } from \"./deployments/autoscaling\";\nimport {\n cloudFormationDeployment,\n getAmiParameters,\n getMinInstancesInServiceParameters,\n} from \"./deployments/cloudformation\";\nimport { updateLambdaDeployment, uploadLambdaArtifact } from \"./deployments/lambda\";\nimport { updateDeploymentParameters } from \"./deployments/update-parameters\";\nimport {\n groupByClassName,\n groupByRegion,\n groupByRiffRaffProjectName,\n groupByStackTag,\n groupByStageTag,\n} from \"./group-by\";\nimport type {\n ClassName,\n Region,\n RiffRaffDeployment,\n RiffRaffDeploymentName,\n RiffRaffDeploymentProps,\n RiffRaffProjectName,\n RiffRaffYaml,\n StackTag,\n StageTag,\n} from \"./types\";\nimport { UnknownRiffRaffProjectName } from \"./types\";\n\nfunction validateAllRegionsAreResolved(regions: Region[]): void {\n const unresolved = regions.filter((region) => Token.isUnresolved(region));\n\n if (unresolved.length !== 0) {\n throw new Error(`Unable to produce a working riff-raff.yaml file; all stacks must have an explicit region set`);\n }\n}\n\nfunction getLambdas(cdkStack: GuStack): GuLambdaFunction[] {\n return cdkStack.node.findAll().filter((_) => _ instanceof GuLambdaFunction) as GuLambdaFunction[];\n}\n\nfunction getAutoScalingGroups(cdkStack: GuStack): GuAutoScalingGroup[] {\n return cdkStack.node.findAll().filter((_) => _ instanceof GuAutoScalingGroup) as GuAutoScalingGroup[];\n}\n\nfunction getGuStackDependencies(cdkStack: GuStack): GuStack[] {\n return cdkStack.dependencies.filter((_) => _ instanceof GuStack) as GuStack[];\n}\n\ninterface MissingStack {\n riffRaffProjectName: RiffRaffProjectName;\n className: ClassName;\n stack: StackTag;\n stage: StageTag;\n region: Region;\n}\n\n/**\n * A class that creates a `riff-raff.yaml` file.\n *\n * Rather than using this directly, prefer to use [[`GuRoot`]] instead.\n *\n * Supports:\n * - Multiple CloudFormation stacks\n * - Multiple regions\n * - Lambda applications\n * - EC2 (autoscaling) applications\n *\n * For lambda applications, 3 deployments will be defined:\n * 1. Lambda upload (`aws-lambda`, `action: [uploadLambda]`)\n * 2. CloudFormation deploy (`cloud-formation`)\n * 3. Lambda update (`aws-lambda`, `action: [updateLambda]`)\n *\n * For EC2 applications, 3 deployments will be defined:\n * 1. Artifact upload (`autoscaling`, `action: [uploadArtifacts]`)\n * 2. CloudFormation deploy (`cloud-formation`)\n * 3. Autoscaling deploy (`autoscaling`, `action: [deploy]`)\n *\n * It assumes a Riff-Raff bundle structure as follows:\n *\n * ```\n * .\n * ├── cdk.out\n * │ └── MyApplication.template.json\n * ├── my-application\n * │ └── my-application.deb\n * └── my-lambda\n * └── my-lambda.zip\n * ```\n *\n * That is, all CloudFormation templates are in a `cdk.out` directory, and there is a directory per app.\n * Application artifact(s) are in the app directory.\n *\n * NOTE: The file extension is decided by you, the above file tree is used for illustration purposes.\n *\n * NOTE: Resources will be looked up by tags (Stack, Stage, App). Ensure your CFN stack is tagged appropriately!\n *\n * @see https://riffraff.gutools.co.uk/docs/reference/riff-raff.yaml.md\n * @see https://riffraff.gutools.co.uk/docs/magenta-lib/types\n */\nexport class RiffRaffYamlFile {\n private readonly outdir: string;\n\n /**\n * A mapping between a Riff-Raff project and `riff-raff.yaml` content as an object.\n *\n * It is useful for specifying additional deployment types that GuCDK does not support.\n * Consider raising an issue or pull request if you think it should be supported.\n *\n * @see https://riffraff.gutools.co.uk/docs/magenta-lib/types\n */\n public readonly configuration: Map<RiffRaffProjectName, RiffRaffYaml>;\n\n // eslint-disable-next-line custom-rules/valid-constructors -- this needs to sit above GuStack on the cdk tree\n constructor(app: App) {\n const allCdkStacks = app.node.findAll().filter((_) => _ instanceof GuStack) as GuStack[];\n const allRegions = Array.from(new Set(allCdkStacks.map((_) => _.region)));\n\n validateAllRegionsAreResolved(allRegions);\n\n this.outdir = app.outdir;\n const configuration = new Map<RiffRaffProjectName, RiffRaffYaml>();\n const missingStacks: MissingStack[] = [];\n\n Object.entries(groupByRiffRaffProjectName(allCdkStacks)).forEach(\n ([riffRaffProjectName, stacksGroupedByRiffRaffProject]) => {\n const allowedStages = new Set(stacksGroupedByRiffRaffProject.map((_) => _.stage));\n const requiredStages = Array.from(allowedStages);\n const deployments = new Map<RiffRaffDeploymentName, RiffRaffDeploymentProps>();\n\n Object.entries(groupByClassName(stacksGroupedByRiffRaffProject)).forEach(\n ([className, stacksGroupedByClassName]) => {\n Object.entries(groupByStackTag(stacksGroupedByClassName)).forEach(([stackTag, stacksGroupedByStackTag]) => {\n Object.entries(groupByRegion(stacksGroupedByStackTag)).forEach(([region, stacksGroupedByRegion]) => {\n const stacks: GuStack[] = Object.values(groupByStageTag(stacksGroupedByRegion)).flat();\n\n requiredStages.forEach((requiredStage) => {\n if (!stacks.find(({ stage }) => stage === requiredStage)) {\n missingStacks.push({\n riffRaffProjectName,\n className,\n region,\n stack: stackTag,\n stage: requiredStage,\n });\n }\n });\n\n // The items in `stacks` only differ by stage, so we can just use the first item in the list.\n const [stack] = stacks;\n\n if (!stack) {\n throw new Error(\"Unable to produce a working riff-raff.yaml file; there are no stacks!\");\n }\n\n const lambdas = getLambdas(stack);\n const autoscalingGroups = getAutoScalingGroups(stack);\n\n const artifactUploads: RiffRaffDeployment[] = [\n lambdas.filter((_) => !_.withoutArtifactUpload).map(uploadLambdaArtifact),\n autoscalingGroups.map(uploadAutoscalingArtifact),\n ].flat();\n artifactUploads.forEach(({ name, props }) => deployments.set(name, props));\n\n const parentStacks: RiffRaffDeployment[] = getGuStackDependencies(stack).map((x) =>\n cloudFormationDeployment([x], [], this.outdir),\n );\n\n const cfnDeployment = cloudFormationDeployment(\n stacks,\n [...artifactUploads, ...parentStacks],\n this.outdir,\n );\n deployments.set(cfnDeployment.name, cfnDeployment.props);\n\n const lambdasWithoutAnAlias = lambdas.filter((lambda) => lambda.alias === undefined);\n // If the Lambda has an alias it is using versioning. When using versioning, there is no need for Riff-Raff\n // to modify the unpublished version of the function\n lambdasWithoutAnAlias.forEach((lambda) => {\n const lambdaDeployment = updateLambdaDeployment(lambda, cfnDeployment);\n deployments.set(lambdaDeployment.name, lambdaDeployment.props);\n });\n\n /*\n Instances in an ASG with an `AutoScalingRollingUpdate` update policy are rotated via CloudFormation.\n Therefore, they do not need to also perform an `autoscaling` deployment via Riff-Raff.\n */\n const legacyAutoscalingGroups = autoscalingGroups.filter((asg) => {\n const { cfnOptions } = asg.node.defaultChild as CfnAutoScalingGroup;\n const { updatePolicy } = cfnOptions;\n return updatePolicy?.autoScalingRollingUpdate === undefined;\n });\n\n legacyAutoscalingGroups.forEach((asg) => {\n const asgDeployment = autoscalingDeployment(asg, cfnDeployment);\n deployments.set(asgDeployment.name, asgDeployment.props);\n });\n\n // only add the `amiParametersToTags` property if there are some ASGs in the stack\n if (autoscalingGroups.length > 0) {\n updateDeploymentParameters(deployments, cfnDeployment, {\n amiParametersToTags: getAmiParameters(autoscalingGroups),\n });\n }\n\n /*\n At this point, `stacks` is a collection of similar `GuStack`s that differ only by their `stage`.\n We're about to add `minInstancesInServiceParameters` to assist Riff-Raff when deploying ASGs with scaling policies.\n This is driven by the presence of conditionally added CFN Parameters.\n To support the possibility of there being a scaling policy in PROD but not CODE, look at all the CFN Parameters in `stacks`.\n */\n const minInstancesInServiceParameters: Map<string, GuAsgMinInstancesInServiceParameterExperimental> =\n stacks\n .flatMap((stack) => Object.values(stack.parameters))\n .filter(\n (_): _ is GuAsgMinInstancesInServiceParameterExperimental =>\n _ instanceof GuAsgMinInstancesInServiceParameterExperimental,\n )\n .reduce((acc, item) => {\n if (!acc.has(item.node.id)) {\n acc.set(item.node.id, item);\n }\n return acc;\n }, new Map<string, GuAsgMinInstancesInServiceParameterExperimental>());\n\n /**\n * Only add the `minInstancesInServiceParameters` property if there are some ASGs affected by {@link GuHorizontallyScalingDeploymentPropertiesExperimental}.\n */\n if (minInstancesInServiceParameters.size > 0) {\n updateDeploymentParameters(deployments, cfnDeployment, {\n minInstancesInServiceParameters: getMinInstancesInServiceParameters(\n minInstancesInServiceParameters,\n ),\n });\n }\n });\n });\n },\n );\n\n configuration.set(riffRaffProjectName, { allowedStages, deployments });\n },\n );\n\n if (missingStacks.length > 0) {\n const message = `Unable to produce a working riff-raff.yaml file; missing ${missingStacks.length} definitions`;\n console.log(`${message} (details below)`);\n console.table(missingStacks);\n\n throw new Error(message);\n }\n\n this.configuration = configuration;\n }\n\n /**\n * A `riff-raff.yaml` file as a string.\n * Useful for testing.\n *\n * @param riffRaffProjectName which project to convert to YAML. Defaults to {@link UnknownRiffRaffProjectName} - any {@link GuStack} without an explicit `riffRaffProjectName` property.\n */\n toYAML(riffRaffProjectName: RiffRaffProjectName = UnknownRiffRaffProjectName): string {\n // Add support for ES6 Set and Map. See https://github.com/nodeca/js-yaml/issues/436.\n const replacer = (_key: string, value: unknown) => {\n if (value instanceof Set) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return -- this is how `js-yaml` is typed\n return Array.from(value);\n }\n if (value instanceof Map) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return -- this is how `js-yaml` is typed\n return Object.fromEntries(value);\n }\n return value;\n };\n\n const content = this.configuration.get(riffRaffProjectName);\n\n if (!content) {\n throw new Error(`No Riff-Raff project found with name: ${riffRaffProjectName}`);\n }\n\n const yaml = dump(content, { replacer });\n\n const comments = [\n \"This file was generated by @guardian/cdk, do not edit it directly.\",\n \"See also https://github.com/guardian/cdk/blob/main/src/riff-raff-yaml-file/README.md.\",\n ]\n .map((line) => `# ${line}`)\n .join(\"\\n\");\n\n return [comments, yaml].join(\"\\n\");\n }\n\n /**\n * Write the `riff-raff.yaml` file(s) to disk, located in the same directory as the CFN JSON templates generated by `cdk synth`.\n */\n synth(): void {\n this.configuration.forEach((_, riffRaffProjectName) => {\n const targetDirectory =\n riffRaffProjectName === UnknownRiffRaffProjectName\n ? this.outdir\n : validateRiffRaffYamlDirectory(this.outdir, riffRaffProjectName);\n\n if (!existsSync(targetDirectory)) {\n mkdirSync(targetDirectory, { recursive: true });\n }\n\n const outPath = path.join(targetDirectory, \"riff-raff.yaml\");\n writeFileSync(outPath, this.toYAML(riffRaffProjectName));\n });\n }\n}\n\nexport function validateRiffRaffYamlDirectory(basePath: string, riffRaffProjectName: RiffRaffProjectName): string {\n const resolvedBase = path.resolve(basePath);\n const resolvedPath = path.resolve(basePath, riffRaffProjectName);\n const relativePath = path.relative(resolvedBase, resolvedPath);\n const isOutside = relativePath === \"..\" || relativePath.startsWith(`..${path.sep}`) || path.isAbsolute(relativePath);\n\n if (isOutside) {\n throw new Error(\n `Directory traversal detected: '${riffRaffProjectName}' would create a directory outside of ${basePath} (riffRaffProjectName=${riffRaffProjectName}, resolvedPath='${resolvedPath}', resolvedBase='${resolvedBase}')`,\n );\n }\n\n return resolvedPath;\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/riff-raff-yaml-file/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from \"fs\";\nimport path from \"path\";\nimport type { App } from \"aws-cdk-lib\";\nimport { Token } from \"aws-cdk-lib\";\nimport type { CfnAutoScalingGroup } from \"aws-cdk-lib/aws-autoscaling\";\nimport { dump } from \"js-yaml\";\nimport { GuAutoScalingGroup } from \"../constructs/autoscaling\";\nimport { GuStack } from \"../constructs/core\";\nimport { GuLambdaFunction } from \"../constructs/lambda\";\nimport { GuAsgMinInstancesInServiceParameterExperimental } from \"../experimental/patterns/ec2-app\";\nimport { autoscalingDeployment, uploadAutoscalingArtifact } from \"./deployments/autoscaling\";\nimport {\n cloudFormationDeployment,\n getAmiParameters,\n getMinInstancesInServiceParameters,\n} from \"./deployments/cloudformation\";\nimport { updateLambdaDeployment, uploadLambdaArtifact } from \"./deployments/lambda\";\nimport { updateDeploymentParameters } from \"./deployments/update-parameters\";\nimport {\n groupByClassName,\n groupByRegion,\n groupByRiffRaffProjectName,\n groupByStackTag,\n groupByStageTag,\n} from \"./group-by\";\nimport type {\n ClassName,\n Region,\n RiffRaffDeployment,\n RiffRaffDeploymentName,\n RiffRaffDeploymentProps,\n RiffRaffProjectName,\n RiffRaffYaml,\n StackTag,\n StageTag,\n} from \"./types\";\nimport { UnknownRiffRaffProjectName } from \"./types\";\n\nfunction validateAllRegionsAreResolved(regions: Region[]): void {\n const unresolved = regions.filter((region) => Token.isUnresolved(region));\n\n if (unresolved.length !== 0) {\n throw new Error(`Unable to produce a working riff-raff.yaml file; all stacks must have an explicit region set`);\n }\n}\n\nfunction getLambdas(cdkStack: GuStack): GuLambdaFunction[] {\n return cdkStack.node.findAll().filter((_) => _ instanceof GuLambdaFunction);\n}\n\nfunction getAutoScalingGroups(cdkStack: GuStack): GuAutoScalingGroup[] {\n return cdkStack.node.findAll().filter((_) => _ instanceof GuAutoScalingGroup);\n}\n\nfunction getGuStackDependencies(cdkStack: GuStack): GuStack[] {\n return cdkStack.dependencies.filter((_) => _ instanceof GuStack);\n}\n\ninterface MissingStack {\n riffRaffProjectName: RiffRaffProjectName;\n className: ClassName;\n stack: StackTag;\n stage: StageTag;\n region: Region;\n}\n\n/**\n * A class that creates a `riff-raff.yaml` file.\n *\n * Rather than using this directly, prefer to use [[`GuRoot`]] instead.\n *\n * Supports:\n * - Multiple CloudFormation stacks\n * - Multiple regions\n * - Lambda applications\n * - EC2 (autoscaling) applications\n *\n * For lambda applications, 3 deployments will be defined:\n * 1. Lambda upload (`aws-lambda`, `action: [uploadLambda]`)\n * 2. CloudFormation deploy (`cloud-formation`)\n * 3. Lambda update (`aws-lambda`, `action: [updateLambda]`)\n *\n * For EC2 applications, 3 deployments will be defined:\n * 1. Artifact upload (`autoscaling`, `action: [uploadArtifacts]`)\n * 2. CloudFormation deploy (`cloud-formation`)\n * 3. Autoscaling deploy (`autoscaling`, `action: [deploy]`)\n *\n * It assumes a Riff-Raff bundle structure as follows:\n *\n * ```\n * .\n * ├── cdk.out\n * │ └── MyApplication.template.json\n * ├── my-application\n * │ └── my-application.deb\n * └── my-lambda\n * └── my-lambda.zip\n * ```\n *\n * That is, all CloudFormation templates are in a `cdk.out` directory, and there is a directory per app.\n * Application artifact(s) are in the app directory.\n *\n * NOTE: The file extension is decided by you, the above file tree is used for illustration purposes.\n *\n * NOTE: Resources will be looked up by tags (Stack, Stage, App). Ensure your CFN stack is tagged appropriately!\n *\n * @see https://riffraff.gutools.co.uk/docs/reference/riff-raff.yaml.md\n * @see https://riffraff.gutools.co.uk/docs/magenta-lib/types\n */\nexport class RiffRaffYamlFile {\n private readonly outdir: string;\n\n /**\n * A mapping between a Riff-Raff project and `riff-raff.yaml` content as an object.\n *\n * It is useful for specifying additional deployment types that GuCDK does not support.\n * Consider raising an issue or pull request if you think it should be supported.\n *\n * @see https://riffraff.gutools.co.uk/docs/magenta-lib/types\n */\n public readonly configuration: Map<RiffRaffProjectName, RiffRaffYaml>;\n\n // eslint-disable-next-line custom-rules/valid-constructors -- this needs to sit above GuStack on the cdk tree\n constructor(app: App) {\n const allCdkStacks = app.node.findAll().filter((_) => _ instanceof GuStack);\n const allRegions = Array.from(new Set(allCdkStacks.map((_) => _.region)));\n\n validateAllRegionsAreResolved(allRegions);\n\n this.outdir = app.outdir;\n const configuration = new Map<RiffRaffProjectName, RiffRaffYaml>();\n const missingStacks: MissingStack[] = [];\n\n Object.entries(groupByRiffRaffProjectName(allCdkStacks)).forEach(\n ([riffRaffProjectName, stacksGroupedByRiffRaffProject]) => {\n const allowedStages = new Set(stacksGroupedByRiffRaffProject.map((_) => _.stage));\n const requiredStages = Array.from(allowedStages);\n const deployments = new Map<RiffRaffDeploymentName, RiffRaffDeploymentProps>();\n\n Object.entries(groupByClassName(stacksGroupedByRiffRaffProject)).forEach(\n ([className, stacksGroupedByClassName]) => {\n Object.entries(groupByStackTag(stacksGroupedByClassName)).forEach(([stackTag, stacksGroupedByStackTag]) => {\n Object.entries(groupByRegion(stacksGroupedByStackTag)).forEach(([region, stacksGroupedByRegion]) => {\n const stacks: GuStack[] = Object.values(groupByStageTag(stacksGroupedByRegion)).flat();\n\n requiredStages.forEach((requiredStage) => {\n if (!stacks.find(({ stage }) => stage === requiredStage)) {\n missingStacks.push({\n riffRaffProjectName,\n className,\n region,\n stack: stackTag,\n stage: requiredStage,\n });\n }\n });\n\n // The items in `stacks` only differ by stage, so we can just use the first item in the list.\n const [stack] = stacks;\n\n if (!stack) {\n throw new Error(\"Unable to produce a working riff-raff.yaml file; there are no stacks!\");\n }\n\n const lambdas = getLambdas(stack);\n const autoscalingGroups = getAutoScalingGroups(stack);\n\n const artifactUploads: RiffRaffDeployment[] = [\n lambdas.filter((_) => !_.withoutArtifactUpload).map(uploadLambdaArtifact),\n autoscalingGroups.map(uploadAutoscalingArtifact),\n ].flat();\n artifactUploads.forEach(({ name, props }) => deployments.set(name, props));\n\n const parentStacks: RiffRaffDeployment[] = getGuStackDependencies(stack).map((x) =>\n cloudFormationDeployment([x], [], this.outdir),\n );\n\n const cfnDeployment = cloudFormationDeployment(\n stacks,\n [...artifactUploads, ...parentStacks],\n this.outdir,\n );\n deployments.set(cfnDeployment.name, cfnDeployment.props);\n\n const lambdasWithoutAnAlias = lambdas.filter((lambda) => lambda.alias === undefined);\n // If the Lambda has an alias it is using versioning. When using versioning, there is no need for Riff-Raff\n // to modify the unpublished version of the function\n lambdasWithoutAnAlias.forEach((lambda) => {\n const lambdaDeployment = updateLambdaDeployment(lambda, cfnDeployment);\n deployments.set(lambdaDeployment.name, lambdaDeployment.props);\n });\n\n /*\n Instances in an ASG with an `AutoScalingRollingUpdate` update policy are rotated via CloudFormation.\n Therefore, they do not need to also perform an `autoscaling` deployment via Riff-Raff.\n */\n const legacyAutoscalingGroups = autoscalingGroups.filter((asg) => {\n const { cfnOptions } = asg.node.defaultChild as CfnAutoScalingGroup;\n const { updatePolicy } = cfnOptions;\n return updatePolicy?.autoScalingRollingUpdate === undefined;\n });\n\n legacyAutoscalingGroups.forEach((asg) => {\n const asgDeployment = autoscalingDeployment(asg, cfnDeployment);\n deployments.set(asgDeployment.name, asgDeployment.props);\n });\n\n // only add the `amiParametersToTags` property if there are some ASGs in the stack\n if (autoscalingGroups.length > 0) {\n updateDeploymentParameters(deployments, cfnDeployment, {\n amiParametersToTags: getAmiParameters(autoscalingGroups),\n });\n }\n\n /*\n At this point, `stacks` is a collection of similar `GuStack`s that differ only by their `stage`.\n We're about to add `minInstancesInServiceParameters` to assist Riff-Raff when deploying ASGs with scaling policies.\n This is driven by the presence of conditionally added CFN Parameters.\n To support the possibility of there being a scaling policy in PROD but not CODE, look at all the CFN Parameters in `stacks`.\n */\n const minInstancesInServiceParameters: Map<string, GuAsgMinInstancesInServiceParameterExperimental> =\n stacks\n .flatMap((stack) => Object.values(stack.parameters))\n .filter(\n (_): _ is GuAsgMinInstancesInServiceParameterExperimental =>\n _ instanceof GuAsgMinInstancesInServiceParameterExperimental,\n )\n .reduce((acc, item) => {\n if (!acc.has(item.node.id)) {\n acc.set(item.node.id, item);\n }\n return acc;\n }, new Map<string, GuAsgMinInstancesInServiceParameterExperimental>());\n\n /**\n * Only add the `minInstancesInServiceParameters` property if there are some ASGs affected by {@link GuHorizontallyScalingDeploymentPropertiesExperimental}.\n */\n if (minInstancesInServiceParameters.size > 0) {\n updateDeploymentParameters(deployments, cfnDeployment, {\n minInstancesInServiceParameters: getMinInstancesInServiceParameters(\n minInstancesInServiceParameters,\n ),\n });\n }\n });\n });\n },\n );\n\n configuration.set(riffRaffProjectName, { allowedStages, deployments });\n },\n );\n\n if (missingStacks.length > 0) {\n const message = `Unable to produce a working riff-raff.yaml file; missing ${missingStacks.length} definitions`;\n console.log(`${message} (details below)`);\n console.table(missingStacks);\n\n throw new Error(message);\n }\n\n this.configuration = configuration;\n }\n\n /**\n * A `riff-raff.yaml` file as a string.\n * Useful for testing.\n *\n * @param riffRaffProjectName which project to convert to YAML. Defaults to {@link UnknownRiffRaffProjectName} - any {@link GuStack} without an explicit `riffRaffProjectName` property.\n */\n toYAML(riffRaffProjectName: RiffRaffProjectName = UnknownRiffRaffProjectName): string {\n // Add support for ES6 Set and Map. See https://github.com/nodeca/js-yaml/issues/436.\n const replacer = (_key: string, value: unknown) => {\n if (value instanceof Set) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return -- this is how `js-yaml` is typed\n return Array.from(value);\n }\n if (value instanceof Map) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return -- this is how `js-yaml` is typed\n return Object.fromEntries(value);\n }\n return value;\n };\n\n const content = this.configuration.get(riffRaffProjectName);\n\n if (!content) {\n throw new Error(`No Riff-Raff project found with name: ${riffRaffProjectName}`);\n }\n\n const yaml = dump(content, { replacer });\n\n const comments = [\n \"This file was generated by @guardian/cdk, do not edit it directly.\",\n \"See also https://github.com/guardian/cdk/blob/main/src/riff-raff-yaml-file/README.md.\",\n ]\n .map((line) => `# ${line}`)\n .join(\"\\n\");\n\n return [comments, yaml].join(\"\\n\");\n }\n\n /**\n * Write the `riff-raff.yaml` file(s) to disk, located in the same directory as the CFN JSON templates generated by `cdk synth`.\n */\n synth(): void {\n this.configuration.forEach((_, riffRaffProjectName) => {\n const targetDirectory =\n riffRaffProjectName === UnknownRiffRaffProjectName\n ? this.outdir\n : validateRiffRaffYamlDirectory(this.outdir, riffRaffProjectName);\n\n if (!existsSync(targetDirectory)) {\n mkdirSync(targetDirectory, { recursive: true });\n }\n\n const outPath = path.join(targetDirectory, \"riff-raff.yaml\");\n writeFileSync(outPath, this.toYAML(riffRaffProjectName));\n });\n }\n}\n\nexport function validateRiffRaffYamlDirectory(basePath: string, riffRaffProjectName: RiffRaffProjectName): string {\n const resolvedBase = path.resolve(basePath);\n const resolvedPath = path.resolve(basePath, riffRaffProjectName);\n const relativePath = path.relative(resolvedBase, resolvedPath);\n const isOutside = relativePath === \"..\" || relativePath.startsWith(`..${path.sep}`) || path.isAbsolute(relativePath);\n\n if (isOutside) {\n throw new Error(\n `Directory traversal detected: '${riffRaffProjectName}' would create a directory outside of ${basePath} (riffRaffProjectName=${riffRaffProjectName}, resolvedPath='${resolvedPath}', resolvedBase='${resolvedBase}')`,\n );\n }\n\n return resolvedPath;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"access.js","sourceRoot":"","sources":["../../src/types/access.ts"],"names":[],"mappings":";;;AACA,iDAA2C;AAC3C,4CAA2C;AA0D9B,QAAA,SAAS,GAAG;IACvB;;;;;;;;OAQG;IACH,QAAQ,EAAE,CAAC,MAAiB,EAAE,EAAE;QAC9B,QAAQ,MAAM,CAAC,KAAK,EAAE;YACpB,KAAK,uBAAW,CAAC,UAAU,CAAC,CAAC;gBAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACxD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEvC,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE;oBACxF,MAAM,IAAI,KAAK,CACb,GAAG,uBAAW,CAAC,UAAU,4DAA4D,YAAY,YAAY,uBAAW,CAAC,MAAM,GAAG,CACnI,CAAC;iBACH;gBACD,MAAM;aACP;YAED,KAAK,uBAAW,CAAC,QAAQ,CAAC,CAAC;gBACzB,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACxD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEvC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE;oBACpD,MAAM,IAAI,KAAK,CACb,GAAG,uBAAW,CAAC,QAAQ,sEAAsE,YAAY,YAAY,uBAAW,CAAC,UAAU,GAAG,CAC/I,CAAC;iBACH;gBACD,MAAM;aACP;YACD;gBACE,MAAM;SACT;IACH,CAAC;CACF,CAAC","sourcesContent":["import type { IPeer } from \"aws-cdk-lib/aws-ec2\";\nimport { Peer } from \"aws-cdk-lib/aws-ec2\";\nimport { AccessScope } from \"../constants\";\n\nexport interface Access {\n scope: AccessScope;\n}\n\n/**\n * For when you want your application to be accessible to the world (0.0.0.0/0).\n * Your application load balancer will have a public IP address that can be reached by anyone,\n * so only use if you are aware and happy with the consequences!\n *\n * Example usage:\n * ```typescript\n * { scope: AccessScope.PUBLIC }\n * ```\n */\nexport interface PublicAccess extends Access {\n scope: AccessScope.PUBLIC;\n}\n\n/**\n * For when you want to restrict your application's access to a list of CIDR ranges. For example,\n * if you want limit access to users connecting from Guardian offices only.\n *\n * Example usage:\n * ```typescript\n * {\n * scope: AccessScope.RESTRICTED,\n * cidrRanges: [Peer.ipv4(\"192.168.1.1/32\"), Peer.ipv4(\"8.8.8.8/32\")]\n * }\n * ```\n */\nexport interface RestrictedAccess extends Access {\n scope: AccessScope.RESTRICTED;\n cidrRanges: IPeer[];\n}\n\n/**\n * For when you want to restrict your application's access to services running inside your VPC.\n *\n * Note that if your account uses Direct Connect or VPC Peering, then incoming traffic from these sources\n * can also be allowed.\n *\n * Example usage:\n * ```typescript\n * {\n * scope: AccessScope.INTERNAL,\n * cidrRanges: [Peer.ipv4(\"10.0.0.0/8\")]\n * }\n * ```\n */\nexport interface InternalAccess extends Access {\n scope: AccessScope.INTERNAL;\n cidrRanges: IPeer[];\n}\n\nexport type AppAccess = PublicAccess | RestrictedAccess | InternalAccess;\n\nexport const AppAccess = {\n /**\n * Validate the CIDR rules for AppAccess.\n *\n * Public - always valid. No CIDR rules are needed here, and the type-system enforces this\n * Restricted - Must not include global CIDR ranges as doing so makes other listed CIDR ranges redundant\n * Internal - All CIDR ranges must start `10.`\n *\n * @throws `Error` when CIDR rules are invalid\n */\n validate: (access: AppAccess) => {\n switch (access.scope) {\n case AccessScope.RESTRICTED: {\n const ranges = access.cidrRanges.map((_) => _.uniqueId);\n const rangesString = ranges.join(\", \");\n\n if (ranges.includes(Peer.anyIpv4().uniqueId) || ranges.includes(Peer.anyIpv6().uniqueId)) {\n throw new Error(\n `${AccessScope.RESTRICTED} apps cannot be globally accessible. Adjust CIDR ranges (${rangesString}) or use ${AccessScope.PUBLIC}.`,\n );\n }\n break;\n }\n\n case AccessScope.INTERNAL: {\n const ranges = access.cidrRanges.map((_) => _.uniqueId);\n const rangesString = ranges.join(\", \");\n\n if (ranges.some((range) => !range.startsWith(\"10.\"))) {\n throw new Error(\n `${AccessScope.INTERNAL} apps should only be accessible on 10. ranges. Adjust CIDR ranges (${rangesString}) or use ${AccessScope.RESTRICTED}.`,\n );\n }\n break;\n }\n default:\n break;\n }\n },\n};\n"]}
1
+ {"version":3,"file":"access.js","sourceRoot":"","sources":["../../src/types/access.ts"],"names":[],"mappings":";;;AACA,iDAA2C;AAC3C,4CAA2C;AA0D9B,QAAA,SAAS,GAAG;IACvB;;;;;;;;OAQG;IACH,QAAQ,EAAE,CAAC,MAAiB,EAAE,EAAE;QAC9B,QAAQ,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,KAAK,uBAAW,CAAC,UAAU,CAAC,CAAC,CAAC;gBAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACxD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEvC,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACzF,MAAM,IAAI,KAAK,CACb,GAAG,uBAAW,CAAC,UAAU,4DAA4D,YAAY,YAAY,uBAAW,CAAC,MAAM,GAAG,CACnI,CAAC;gBACJ,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,uBAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACxD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEvC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;oBACrD,MAAM,IAAI,KAAK,CACb,GAAG,uBAAW,CAAC,QAAQ,sEAAsE,YAAY,YAAY,uBAAW,CAAC,UAAU,GAAG,CAC/I,CAAC;gBACJ,CAAC;gBACD,MAAM;YACR,CAAC;YACD;gBACE,MAAM;QACV,CAAC;IACH,CAAC;CACF,CAAC","sourcesContent":["import type { IPeer } from \"aws-cdk-lib/aws-ec2\";\nimport { Peer } from \"aws-cdk-lib/aws-ec2\";\nimport { AccessScope } from \"../constants\";\n\nexport interface Access {\n scope: AccessScope;\n}\n\n/**\n * For when you want your application to be accessible to the world (0.0.0.0/0).\n * Your application load balancer will have a public IP address that can be reached by anyone,\n * so only use if you are aware and happy with the consequences!\n *\n * Example usage:\n * ```typescript\n * { scope: AccessScope.PUBLIC }\n * ```\n */\nexport interface PublicAccess extends Access {\n scope: AccessScope.PUBLIC;\n}\n\n/**\n * For when you want to restrict your application's access to a list of CIDR ranges. For example,\n * if you want limit access to users connecting from Guardian offices only.\n *\n * Example usage:\n * ```typescript\n * {\n * scope: AccessScope.RESTRICTED,\n * cidrRanges: [Peer.ipv4(\"192.168.1.1/32\"), Peer.ipv4(\"8.8.8.8/32\")]\n * }\n * ```\n */\nexport interface RestrictedAccess extends Access {\n scope: AccessScope.RESTRICTED;\n cidrRanges: IPeer[];\n}\n\n/**\n * For when you want to restrict your application's access to services running inside your VPC.\n *\n * Note that if your account uses Direct Connect or VPC Peering, then incoming traffic from these sources\n * can also be allowed.\n *\n * Example usage:\n * ```typescript\n * {\n * scope: AccessScope.INTERNAL,\n * cidrRanges: [Peer.ipv4(\"10.0.0.0/8\")]\n * }\n * ```\n */\nexport interface InternalAccess extends Access {\n scope: AccessScope.INTERNAL;\n cidrRanges: IPeer[];\n}\n\nexport type AppAccess = PublicAccess | RestrictedAccess | InternalAccess;\n\nexport const AppAccess = {\n /**\n * Validate the CIDR rules for AppAccess.\n *\n * Public - always valid. No CIDR rules are needed here, and the type-system enforces this\n * Restricted - Must not include global CIDR ranges as doing so makes other listed CIDR ranges redundant\n * Internal - All CIDR ranges must start `10.`\n *\n * @throws `Error` when CIDR rules are invalid\n */\n validate: (access: AppAccess) => {\n switch (access.scope) {\n case AccessScope.RESTRICTED: {\n const ranges = access.cidrRanges.map((_) => _.uniqueId);\n const rangesString = ranges.join(\", \");\n\n if (ranges.includes(Peer.anyIpv4().uniqueId) || ranges.includes(Peer.anyIpv6().uniqueId)) {\n throw new Error(\n `${AccessScope.RESTRICTED} apps cannot be globally accessible. Adjust CIDR ranges (${rangesString}) or use ${AccessScope.PUBLIC}.`,\n );\n }\n break;\n }\n\n case AccessScope.INTERNAL: {\n const ranges = access.cidrRanges.map((_) => _.uniqueId);\n const rangesString = ranges.join(\", \");\n\n if (ranges.some((range) => !range.startsWith(\"10.\"))) {\n throw new Error(\n `${AccessScope.INTERNAL} apps should only be accessible on 10. ranges. Adjust CIDR ranges (${rangesString}) or use ${AccessScope.RESTRICTED}.`,\n );\n }\n break;\n }\n default:\n break;\n }\n },\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.groupBy = void 0;
3
+ exports.groupBy = groupBy;
4
4
  /**
5
5
  * Group an array of T by a field in T.
6
6
  * @param input what to group
@@ -16,5 +16,4 @@ function groupBy(input, keyFn) {
16
16
  };
17
17
  }, {});
18
18
  }
19
- exports.groupBy = groupBy;
20
19
  //# sourceMappingURL=array.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"array.js","sourceRoot":"","sources":["../../src/utils/array.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACH,SAAgB,OAAO,CAAI,KAAU,EAAE,KAAuB;IAC5D,OAAO,KAAK,CAAC,MAAM,CAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;QACxD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO;YACL,GAAG,GAAG;YACN,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC;SAC7B,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AATD,0BASC","sourcesContent":["/**\n * Group an array of T by a field in T.\n * @param input what to group\n * @param keyFn which field to group on\n */\nexport function groupBy<T>(input: T[], keyFn: (i: T) => string): Record<string, T[]> {\n return input.reduce<Record<string, T[]>>((acc, element) => {\n const key = keyFn(element);\n const current = acc[key] ?? [];\n return {\n ...acc,\n [key]: [...current, element],\n };\n }, {});\n}\n"]}
1
+ {"version":3,"file":"array.js","sourceRoot":"","sources":["../../src/utils/array.ts"],"names":[],"mappings":";;AAKA,0BASC;AAdD;;;;GAIG;AACH,SAAgB,OAAO,CAAI,KAAU,EAAE,KAAuB;IAC5D,OAAO,KAAK,CAAC,MAAM,CAAsB,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;QACxD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC/B,OAAO;YACL,GAAG,GAAG;YACN,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,OAAO,CAAC;SAC7B,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC","sourcesContent":["/**\n * Group an array of T by a field in T.\n * @param input what to group\n * @param keyFn which field to group on\n */\nexport function groupBy<T>(input: T[], keyFn: (i: T) => string): Record<string, T[]> {\n return input.reduce<Record<string, T[]>>((acc, element) => {\n const key = keyFn(element);\n const current = acc[key] ?? [];\n return {\n ...acc,\n [key]: [...current, element],\n };\n }, {});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"vpc.d.ts","sourceRoot":"","sources":["../../../src/utils/cli/vpc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA6C,GAAG,EAAe,MAAM,qBAAqB,CAAC;AACvG,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD,eAAO,MAAM,2BAA2B,EAAE,MAAM,EAE/C,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,MAAM,EAGvC,CAAC;AAWH,eAAO,MAAM,sBAAsB,cAAqB,GAAG,KAAG,QAAQ,SAAS,EAAE,CAWhF,CAAC;AA2CF,eAAO,MAAM,eAAe,cAAqB,GAAG,KAAG,QAAQ,WAAW,EAAE,CAgB3E,CAAC"}
1
+ {"version":3,"file":"vpc.d.ts","sourceRoot":"","sources":["../../../src/utils/cli/vpc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA6C,GAAG,EAAe,MAAM,qBAAqB,CAAC;AACvG,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD,eAAO,MAAM,2BAA2B,EAAE,MAAM,EAE/C,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,MAAM,EAGvC,CAAC;AAWH,eAAO,MAAM,sBAAsB,GAAU,WAAW,GAAG,KAAG,OAAO,CAAC,SAAS,EAAE,CAWhF,CAAC;AA2CF,eAAO,MAAM,eAAe,GAAU,WAAW,GAAG,KAAG,OAAO,CAAC,WAAW,EAAE,CAgB3E,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"vpc.js","sourceRoot":"","sources":["../../../src/utils/cli/vpc.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DescribeSubnetsResult, DescribeVpcsResult, EC2, Subnet, Vpc } from \"@aws-sdk/client-ec2\";\nimport type { Parameter, SSM } from \"@aws-sdk/client-ssm\";\nimport { ALL_SSM_PARAMETER_PATHS, VPC_SSM_PARAMETER_PREFIX } from \"../../constants\";\nimport type { VpcInDetail } from \"../../types/cli\";\nimport { sum } from \"../math\";\n\nexport const primaryVpcSsmParameterPaths: string[] = ALL_SSM_PARAMETER_PATHS.map((_) => _.path).filter((_) =>\n _.startsWith(VPC_SSM_PARAMETER_PREFIX),\n);\n\nexport const vpcSsmParameterPaths: RegExp[] = primaryVpcSsmParameterPaths.map((primaryPath) => {\n const reBody = primaryPath.replace(\"primary\", \"([A-z0-9.-_])+\");\n return new RegExp(`^${reBody}$`);\n});\n\nconst getSsmParametersWithVpcPrefix = async (ssmClient: SSM): Promise<Parameter[]> => {\n const params = await ssmClient.getParametersByPath({\n Path: VPC_SSM_PARAMETER_PREFIX,\n Recursive: true,\n });\n\n return params.Parameters ?? [];\n};\n\nexport const getSsmParametersForVpc = async (ssmClient: SSM): Promise<Parameter[]> => {\n const paramsWithVpcPrefix = await getSsmParametersWithVpcPrefix(ssmClient);\n\n return paramsWithVpcPrefix.filter((param) => {\n const path = param.Name;\n if (!path) {\n return false;\n }\n\n return vpcSsmParameterPaths.filter((re) => re.exec(path)).length > 0;\n });\n};\n\nconst getSubnetsForVpc = async (vpc: Vpc, ec2Client: EC2): Promise<Subnet[]> => {\n if (!vpc.VpcId) {\n return [];\n }\n const response: DescribeSubnetsResult = await ec2Client.describeSubnets({\n Filters: [{ Name: \"vpc-id\", Values: [vpc.VpcId] }],\n });\n return response.Subnets ?? [];\n};\n\nconst getVpcs = async (ec2Client: EC2): Promise<Vpc[]> => {\n const vpcs: DescribeVpcsResult = await ec2Client.describeVpcs();\n return vpcs.Vpcs ?? [];\n};\n\nconst totalUnusedAddressesInSubnet = (subnets: Subnet[]): number => {\n return sum(subnets.map((_) => _.AvailableIpAddressCount ?? 0));\n};\n\nconst countFromCidr = (cidr: string): number => {\n const UNUSABLE_IPS_IN_CIDR_BLOCK = 5;\n\n const [, mask] = cidr.split(\"/\");\n const maskAsNumber = Number(mask);\n\n if (isNaN(maskAsNumber)) {\n return 0;\n }\n\n const hostBits = 32 - maskAsNumber;\n return Math.pow(2, hostBits) - UNUSABLE_IPS_IN_CIDR_BLOCK;\n};\n\nconst totalCapacityOfSubnet = (subnets: Subnet[]): number => {\n const counts = subnets\n .map((subnet) => subnet.CidrBlock)\n .map((cidrBlock) => (cidrBlock ? countFromCidr(cidrBlock) : 0));\n\n return sum(counts.filter((_) => !!_));\n};\n\nexport const getVpcsInDetail = async (ec2Client: EC2): Promise<VpcInDetail[]> => {\n const vpcs = await getVpcs(ec2Client);\n\n return await Promise.all(\n vpcs.map(async (vpc) => {\n const subnets = await getSubnetsForVpc(vpc, ec2Client);\n\n const isUsed: boolean = totalCapacityOfSubnet(subnets) - totalUnusedAddressesInSubnet(subnets) !== 0;\n\n return {\n ...vpc,\n subnets,\n isUsed,\n };\n }),\n );\n};\n"]}
1
+ {"version":3,"file":"vpc.js","sourceRoot":"","sources":["../../../src/utils/cli/vpc.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DescribeSubnetsResult, DescribeVpcsResult, EC2, Subnet, Vpc } from \"@aws-sdk/client-ec2\";\nimport type { Parameter, SSM } from \"@aws-sdk/client-ssm\";\nimport { ALL_SSM_PARAMETER_PATHS, VPC_SSM_PARAMETER_PREFIX } from \"../../constants\";\nimport type { VpcInDetail } from \"../../types/cli\";\nimport { sum } from \"../math\";\n\nexport const primaryVpcSsmParameterPaths: string[] = ALL_SSM_PARAMETER_PATHS.map((_) => _.path).filter((_) =>\n _.startsWith(VPC_SSM_PARAMETER_PREFIX),\n);\n\nexport const vpcSsmParameterPaths: RegExp[] = primaryVpcSsmParameterPaths.map((primaryPath) => {\n const reBody = primaryPath.replace(\"primary\", \"([A-z0-9.-_])+\");\n return new RegExp(`^${reBody}$`);\n});\n\nconst getSsmParametersWithVpcPrefix = async (ssmClient: SSM): Promise<Parameter[]> => {\n const params = await ssmClient.getParametersByPath({\n Path: VPC_SSM_PARAMETER_PREFIX,\n Recursive: true,\n });\n\n return params.Parameters ?? [];\n};\n\nexport const getSsmParametersForVpc = async (ssmClient: SSM): Promise<Parameter[]> => {\n const paramsWithVpcPrefix = await getSsmParametersWithVpcPrefix(ssmClient);\n\n return paramsWithVpcPrefix.filter((param) => {\n const path = param.Name;\n if (!path) {\n return false;\n }\n\n return vpcSsmParameterPaths.filter((re) => re.exec(path)).length > 0;\n });\n};\n\nconst getSubnetsForVpc = async (vpc: Vpc, ec2Client: EC2): Promise<Subnet[]> => {\n if (!vpc.VpcId) {\n return [];\n }\n const response: DescribeSubnetsResult = await ec2Client.describeSubnets({\n Filters: [{ Name: \"vpc-id\", Values: [vpc.VpcId] }],\n });\n return response.Subnets ?? [];\n};\n\nconst getVpcs = async (ec2Client: EC2): Promise<Vpc[]> => {\n const vpcs: DescribeVpcsResult = await ec2Client.describeVpcs();\n return vpcs.Vpcs ?? [];\n};\n\nconst totalUnusedAddressesInSubnet = (subnets: Subnet[]): number => {\n return sum(subnets.map((_) => _.AvailableIpAddressCount ?? 0));\n};\n\nconst countFromCidr = (cidr: string): number => {\n const UNUSABLE_IPS_IN_CIDR_BLOCK = 5;\n\n const [, mask] = cidr.split(\"/\");\n const maskAsNumber = Number(mask);\n\n if (isNaN(maskAsNumber)) {\n return 0;\n }\n\n const hostBits = 32 - maskAsNumber;\n return Math.pow(2, hostBits) - UNUSABLE_IPS_IN_CIDR_BLOCK;\n};\n\nconst totalCapacityOfSubnet = (subnets: Subnet[]): number => {\n const counts = subnets\n .map((subnet) => subnet.CidrBlock)\n .map((cidrBlock) => (cidrBlock ? countFromCidr(cidrBlock) : 0));\n\n return sum(counts.filter((_) => !!_));\n};\n\nexport const getVpcsInDetail = async (ec2Client: EC2): Promise<VpcInDetail[]> => {\n const vpcs = await getVpcs(ec2Client);\n\n return await Promise.all(\n vpcs.map(async (vpc) => {\n const subnets = await getSubnetsForVpc(vpc, ec2Client);\n\n const isUsed: boolean = totalCapacityOfSubnet(subnets) - totalUnusedAddressesInSubnet(subnets) !== 0;\n\n return {\n ...vpc,\n subnets,\n isUsed,\n };\n }),\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"cognito.d.ts","sourceRoot":"","sources":["../../../src/utils/cognito/cognito.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uBAAuB,WAAY,MAAM,KAAG,MAWxD,CAAC"}
1
+ {"version":3,"file":"cognito.d.ts","sourceRoot":"","sources":["../../../src/utils/cognito/cognito.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uBAAuB,GAAI,QAAQ,MAAM,KAAG,MAWxD,CAAC"}
package/lib/utils/exec.js CHANGED
@@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.executeSync = exports.execute = void 0;
6
+ exports.execute = execute;
7
+ exports.executeSync = executeSync;
7
8
  const child_process_1 = __importDefault(require("child_process"));
8
9
  // copied from https://github.com/aws/aws-cdk/blob/eda1640fcaf6375d7edc5f8edcb5d69c82d130a1/packages/aws-cdk/lib/init.ts#L381-L404
9
10
  async function execute(cmd, args, { cwd }) {
@@ -28,7 +29,6 @@ async function execute(cmd, args, { cwd }) {
28
29
  });
29
30
  });
30
31
  }
31
- exports.execute = execute;
32
32
  function executeSync(cmd, args, { cwd }) {
33
33
  const { stdout, status } = child_process_1.default.spawnSync(cmd, args, {
34
34
  cwd,
@@ -43,5 +43,4 @@ function executeSync(cmd, args, { cwd }) {
43
43
  throw new Error(`${cmd} exited with status ${status ?? "unknown"}`);
44
44
  }
45
45
  }
46
- exports.executeSync = executeSync;
47
46
  //# sourceMappingURL=exec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":";;;;;;AAAA,kEAAyC;AAEzC,kIAAkI;AAC3H,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,GAAG,EAAmB;IACjF,MAAM,KAAK,GAAG,uBAAY,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;QAC1C,GAAG;QACH,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC;KACrC,CAAC,CAAC;IAEH,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,gHAAgH;IAChH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAEjE,OAAO,IAAI,OAAO,CAAS,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE;QACtC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YAC5B,IAAI,MAAM,KAAK,CAAC,EAAE;gBAChB,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;aAC1B;iBAAM;gBACL,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC7B,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,uBAAuB,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;aAC5E;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAvBD,0BAuBC;AAED,SAAgB,WAAW,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,GAAG,EAAmB;IAC/E,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,uBAAY,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE;QAC3D,GAAG;QACH,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC;KACrC,CAAC,CAAC;IAEH,IAAI,MAAM,KAAK,CAAC,EAAE;QAChB,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;KACjC;SAAM;QACL,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,uBAAuB,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;KACrE;AACH,CAAC;AAbD,kCAaC","sourcesContent":["import childProcess from \"child_process\";\n\n// copied from https://github.com/aws/aws-cdk/blob/eda1640fcaf6375d7edc5f8edcb5d69c82d130a1/packages/aws-cdk/lib/init.ts#L381-L404\nexport async function execute(cmd: string, args: string[], { cwd }: { cwd: string }): Promise<string> {\n const child = childProcess.spawn(cmd, args, {\n cwd,\n shell: false,\n stdio: [\"ignore\", \"pipe\", \"inherit\"],\n });\n\n let stdout = \"\";\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access -- ???\n child.stdout.on(\"data\", (chunk) => (stdout += chunk.toString()));\n\n return new Promise<string>((ok, fail) => {\n child.once(\"error\", (err) => fail(err));\n child.once(\"exit\", (status) => {\n if (status === 0) {\n return ok(stdout.trim());\n } else {\n process.stderr.write(stdout);\n return fail(new Error(`${cmd} exited with status ${status ?? \"unknown\"}`));\n }\n });\n });\n}\n\nexport function executeSync(cmd: string, args: string[], { cwd }: { cwd: string }): string {\n const { stdout, status } = childProcess.spawnSync(cmd, args, {\n cwd,\n shell: false,\n stdio: [\"ignore\", \"pipe\", \"inherit\"],\n });\n\n if (status === 0) {\n return stdout.toString().trim();\n } else {\n process.stderr.write(stdout);\n throw new Error(`${cmd} exited with status ${status ?? \"unknown\"}`);\n }\n}\n"]}
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":";;;;;AAGA,0BAuBC;AAED,kCAaC;AAzCD,kEAAyC;AAEzC,kIAAkI;AAC3H,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,GAAG,EAAmB;IACjF,MAAM,KAAK,GAAG,uBAAY,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;QAC1C,GAAG;QACH,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC;KACrC,CAAC,CAAC;IAEH,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,gHAAgH;IAChH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IAEjE,OAAO,IAAI,OAAO,CAAS,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE;QACtC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;YAC5B,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjB,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBAC7B,OAAO,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,uBAAuB,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,WAAW,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,GAAG,EAAmB;IAC/E,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,uBAAY,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE;QAC3D,GAAG;QACH,KAAK,EAAE,KAAK;QACZ,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC;KACrC,CAAC,CAAC;IAEH,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,uBAAuB,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC;IACtE,CAAC;AACH,CAAC","sourcesContent":["import childProcess from \"child_process\";\n\n// copied from https://github.com/aws/aws-cdk/blob/eda1640fcaf6375d7edc5f8edcb5d69c82d130a1/packages/aws-cdk/lib/init.ts#L381-L404\nexport async function execute(cmd: string, args: string[], { cwd }: { cwd: string }): Promise<string> {\n const child = childProcess.spawn(cmd, args, {\n cwd,\n shell: false,\n stdio: [\"ignore\", \"pipe\", \"inherit\"],\n });\n\n let stdout = \"\";\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access -- ???\n child.stdout.on(\"data\", (chunk) => (stdout += chunk.toString()));\n\n return new Promise<string>((ok, fail) => {\n child.once(\"error\", (err) => fail(err));\n child.once(\"exit\", (status) => {\n if (status === 0) {\n return ok(stdout.trim());\n } else {\n process.stderr.write(stdout);\n return fail(new Error(`${cmd} exited with status ${status ?? \"unknown\"}`));\n }\n });\n });\n}\n\nexport function executeSync(cmd: string, args: string[], { cwd }: { cwd: string }): string {\n const { stdout, status } = childProcess.spawnSync(cmd, args, {\n cwd,\n shell: false,\n stdio: [\"ignore\", \"pipe\", \"inherit\"],\n });\n\n if (status === 0) {\n return stdout.toString().trim();\n } else {\n process.stderr.write(stdout);\n throw new Error(`${cmd} exited with status ${status ?? \"unknown\"}`);\n }\n}\n"]}
package/lib/utils/git.js CHANGED
@@ -1,13 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.gitRootOrCwd = exports.gitRemoteOriginUrl = void 0;
3
+ exports.gitRemoteOriginUrl = gitRemoteOriginUrl;
4
+ exports.gitRootOrCwd = gitRootOrCwd;
4
5
  const exec_1 = require("./exec");
5
6
  function gitRemoteOriginUrl() {
6
7
  return (0, exec_1.executeSync)("git", ["config", "--get", "remote.origin.url"], {
7
8
  cwd: process.cwd(),
8
9
  });
9
10
  }
10
- exports.gitRemoteOriginUrl = gitRemoteOriginUrl;
11
11
  function gitRootOrCwd() {
12
12
  const cwd = process.cwd();
13
13
  try {
@@ -20,5 +20,4 @@ function gitRootOrCwd() {
20
20
  return cwd;
21
21
  }
22
22
  }
23
- exports.gitRootOrCwd = gitRootOrCwd;
24
23
  //# sourceMappingURL=git.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":";;;AAAA,iCAAqC;AAErC,SAAgB,kBAAkB;IAChC,OAAO,IAAA,kBAAW,EAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,mBAAmB,CAAC,EAAE;QAClE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;KACnB,CAAC,CAAC;AACL,CAAC;AAJD,gDAIC;AAED,SAAgB,YAAY;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI;QACF,OAAO,IAAA,kBAAW,EAAC,KAAK,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE;YAC1D,GAAG;SACJ,CAAC,CAAC;KACJ;IAAC,OAAO,GAAG,EAAE;QACZ,OAAO,CAAC,IAAI,CAAC,4DAA4D,GAAG,EAAE,CAAC,CAAC;QAChF,OAAO,GAAG,CAAC;KACZ;AACH,CAAC;AAXD,oCAWC","sourcesContent":["import { executeSync } from \"./exec\";\n\nexport function gitRemoteOriginUrl(): string {\n return executeSync(\"git\", [\"config\", \"--get\", \"remote.origin.url\"], {\n cwd: process.cwd(),\n });\n}\n\nexport function gitRootOrCwd(): string {\n const cwd = process.cwd();\n\n try {\n return executeSync(\"git\", [\"rev-parse\", \"--show-toplevel\"], {\n cwd,\n });\n } catch (err) {\n console.warn(`Failed to identify a git repository. Falling back to CWD ${cwd}`);\n return cwd;\n }\n}\n"]}
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":";;AAEA,gDAIC;AAED,oCAWC;AAnBD,iCAAqC;AAErC,SAAgB,kBAAkB;IAChC,OAAO,IAAA,kBAAW,EAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,mBAAmB,CAAC,EAAE;QAClE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;KACnB,CAAC,CAAC;AACL,CAAC;AAED,SAAgB,YAAY;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI,CAAC;QACH,OAAO,IAAA,kBAAW,EAAC,KAAK,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE;YAC1D,GAAG;SACJ,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,4DAA4D,GAAG,EAAE,CAAC,CAAC;QAChF,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC","sourcesContent":["import { executeSync } from \"./exec\";\n\nexport function gitRemoteOriginUrl(): string {\n return executeSync(\"git\", [\"config\", \"--get\", \"remote.origin.url\"], {\n cwd: process.cwd(),\n });\n}\n\nexport function gitRootOrCwd(): string {\n const cwd = process.cwd();\n\n try {\n return executeSync(\"git\", [\"rev-parse\", \"--show-toplevel\"], {\n cwd,\n });\n } catch (err) {\n console.warn(`Failed to identify a git repository. Falling back to CWD ${cwd}`);\n return cwd;\n }\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.StreamRetry = exports.toAwsErrorHandlingProps = void 0;
3
+ exports.StreamRetry = void 0;
4
+ exports.toAwsErrorHandlingProps = toAwsErrorHandlingProps;
4
5
  const aws_cdk_lib_1 = require("aws-cdk-lib");
5
6
  function toAwsErrorHandlingProps(errorHandlingProps) {
6
7
  return {
@@ -9,7 +10,6 @@ function toAwsErrorHandlingProps(errorHandlingProps) {
9
10
  ...errorHandlingProps.retryBehaviour.toAwsProp(),
10
11
  };
11
12
  }
12
- exports.toAwsErrorHandlingProps = toAwsErrorHandlingProps;
13
13
  /**
14
14
  * To retry based on number of attempts, use:
15
15
  * ```typescript
@@ -1 +1 @@
1
- {"version":3,"file":"event-source.js","sourceRoot":"","sources":["../../../src/utils/lambda/event-source.ts"],"names":[],"mappings":";;;AAAA,6CAAuC;AAuCvC,SAAgB,uBAAuB,CAAC,kBAA4C;IAClF,OAAO;QACL,kBAAkB,EAAE,kBAAkB,CAAC,kBAAkB;QACzD,SAAS,EAAE,kBAAkB,CAAC,gCAAgC;QAC9D,GAAG,kBAAkB,CAAC,cAAc,CAAC,SAAS,EAAE;KACjD,CAAC;AACJ,CAAC;AAND,0DAMC;AAKD;;;;;;;;;GASG;AACH,MAAa,WAAW;IACf,MAAM,CAAC,WAAW,CAAC,MAAc;QACtC,OAAO,IAAI,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC7C,CAAC;IACM,MAAM,CAAC,MAAM,CAAC,QAAkB;QACrC,OAAO,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,WAAW,CAAC,CAAC;IAC5D,CAAC;IACM,SAAS;QACd,OAAO,IAAI,CAAC,SAAS,KAAK,UAAU;YAClC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE;YAChC,CAAC,CAAC,EAAE,YAAY,EAAE,sBAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACtD,CAAC;IAID,YAAoB,MAAc,EAAE,IAAe;QACjD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;CACF;AAnBD,kCAmBC","sourcesContent":["import { Duration } from \"aws-cdk-lib\";\nimport type { IEventSourceDlq } from \"aws-cdk-lib/aws-lambda\";\nimport type { KinesisEventSourceProps } from \"aws-cdk-lib/aws-lambda-event-sources\";\n\nexport type StreamProcessingProps = Omit<\n KinesisEventSourceProps,\n \"bisectBatchOnError\" | \"maxRecordAge\" | \"onFailure\" | \"retryAttempts\"\n>;\n\n/**\n * In order to prevent your lambda from continuously retrying if it encounters errors\n * whilst processing a batch, use `retryBehaviour` to give up on a record once it reaches a certain age,\n * or after a specified number of attempts. See [[`StreamRetry`]] for more details.\n *\n * In order to isolate bad records as part of the retry process, you may also want to bisect problematic batches\n * using `bisectBatchOnError`. For example:\n *\n * ```typescript\n * const errorHandlingProps: ErrorHandlingProps = {\n * bisectBatchOnError: true,\n * retryBehaviour: StreamRetry.maxAttempts(5),\n * }\n * ```\n *\n * Records which could not be processed successfully can (optionally) be sent to a dead letter queue\n * via `deadLetterQueueForSkippedRecords`.\n */\nexport interface StreamErrorHandlingProps {\n retryBehaviour: StreamRetry;\n bisectBatchOnError: boolean;\n deadLetterQueueForSkippedRecords?: IEventSourceDlq;\n blockProcessingAndRetryIndefinitely?: false;\n}\n\ntype AwsErrorHandlingProps = Pick<\n KinesisEventSourceProps,\n \"bisectBatchOnError\" | \"maxRecordAge\" | \"onFailure\" | \"retryAttempts\"\n>;\n\nexport function toAwsErrorHandlingProps(errorHandlingProps: StreamErrorHandlingProps): AwsErrorHandlingProps {\n return {\n bisectBatchOnError: errorHandlingProps.bisectBatchOnError,\n onFailure: errorHandlingProps.deadLetterQueueForSkippedRecords,\n ...errorHandlingProps.retryBehaviour.toAwsProp(),\n };\n}\n\ntype AwsRetryProp = Pick<AwsErrorHandlingProps, \"maxRecordAge\" | \"retryAttempts\">;\ntype RetryType = \"attempts\" | \"recordAge\";\n\n/**\n * To retry based on number of attempts, use:\n * ```typescript\n * StreamRetry.maxAttempts(5)\n * ```\n * To retry based on the age of a record, use:\n * ```typescript\n * StreamRetry.maxAge(Duration.minutes(5))\n * ```\n */\nexport class StreamRetry {\n public static maxAttempts(amount: number): StreamRetry {\n return new StreamRetry(amount, \"attempts\");\n }\n public static maxAge(duration: Duration): StreamRetry {\n return new StreamRetry(duration.toSeconds(), \"recordAge\");\n }\n public toAwsProp(): AwsRetryProp {\n return this.retryType === \"attempts\"\n ? { retryAttempts: this.amount }\n : { maxRecordAge: Duration.seconds(this.amount) };\n }\n private readonly amount: number;\n readonly retryType: RetryType;\n\n private constructor(amount: number, type: RetryType) {\n this.amount = amount;\n this.retryType = type;\n }\n}\n"]}
1
+ {"version":3,"file":"event-source.js","sourceRoot":"","sources":["../../../src/utils/lambda/event-source.ts"],"names":[],"mappings":";;;AAuCA,0DAMC;AA7CD,6CAAuC;AAuCvC,SAAgB,uBAAuB,CAAC,kBAA4C;IAClF,OAAO;QACL,kBAAkB,EAAE,kBAAkB,CAAC,kBAAkB;QACzD,SAAS,EAAE,kBAAkB,CAAC,gCAAgC;QAC9D,GAAG,kBAAkB,CAAC,cAAc,CAAC,SAAS,EAAE;KACjD,CAAC;AACJ,CAAC;AAKD;;;;;;;;;GASG;AACH,MAAa,WAAW;IACf,MAAM,CAAC,WAAW,CAAC,MAAc;QACtC,OAAO,IAAI,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC7C,CAAC;IACM,MAAM,CAAC,MAAM,CAAC,QAAkB;QACrC,OAAO,IAAI,WAAW,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,WAAW,CAAC,CAAC;IAC5D,CAAC;IACM,SAAS;QACd,OAAO,IAAI,CAAC,SAAS,KAAK,UAAU;YAClC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE;YAChC,CAAC,CAAC,EAAE,YAAY,EAAE,sBAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IACtD,CAAC;IAID,YAAoB,MAAc,EAAE,IAAe;QACjD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;CACF;AAnBD,kCAmBC","sourcesContent":["import { Duration } from \"aws-cdk-lib\";\nimport type { IEventSourceDlq } from \"aws-cdk-lib/aws-lambda\";\nimport type { KinesisEventSourceProps } from \"aws-cdk-lib/aws-lambda-event-sources\";\n\nexport type StreamProcessingProps = Omit<\n KinesisEventSourceProps,\n \"bisectBatchOnError\" | \"maxRecordAge\" | \"onFailure\" | \"retryAttempts\"\n>;\n\n/**\n * In order to prevent your lambda from continuously retrying if it encounters errors\n * whilst processing a batch, use `retryBehaviour` to give up on a record once it reaches a certain age,\n * or after a specified number of attempts. See [[`StreamRetry`]] for more details.\n *\n * In order to isolate bad records as part of the retry process, you may also want to bisect problematic batches\n * using `bisectBatchOnError`. For example:\n *\n * ```typescript\n * const errorHandlingProps: ErrorHandlingProps = {\n * bisectBatchOnError: true,\n * retryBehaviour: StreamRetry.maxAttempts(5),\n * }\n * ```\n *\n * Records which could not be processed successfully can (optionally) be sent to a dead letter queue\n * via `deadLetterQueueForSkippedRecords`.\n */\nexport interface StreamErrorHandlingProps {\n retryBehaviour: StreamRetry;\n bisectBatchOnError: boolean;\n deadLetterQueueForSkippedRecords?: IEventSourceDlq;\n blockProcessingAndRetryIndefinitely?: false;\n}\n\ntype AwsErrorHandlingProps = Pick<\n KinesisEventSourceProps,\n \"bisectBatchOnError\" | \"maxRecordAge\" | \"onFailure\" | \"retryAttempts\"\n>;\n\nexport function toAwsErrorHandlingProps(errorHandlingProps: StreamErrorHandlingProps): AwsErrorHandlingProps {\n return {\n bisectBatchOnError: errorHandlingProps.bisectBatchOnError,\n onFailure: errorHandlingProps.deadLetterQueueForSkippedRecords,\n ...errorHandlingProps.retryBehaviour.toAwsProp(),\n };\n}\n\ntype AwsRetryProp = Pick<AwsErrorHandlingProps, \"maxRecordAge\" | \"retryAttempts\">;\ntype RetryType = \"attempts\" | \"recordAge\";\n\n/**\n * To retry based on number of attempts, use:\n * ```typescript\n * StreamRetry.maxAttempts(5)\n * ```\n * To retry based on the age of a record, use:\n * ```typescript\n * StreamRetry.maxAge(Duration.minutes(5))\n * ```\n */\nexport class StreamRetry {\n public static maxAttempts(amount: number): StreamRetry {\n return new StreamRetry(amount, \"attempts\");\n }\n public static maxAge(duration: Duration): StreamRetry {\n return new StreamRetry(duration.toSeconds(), \"recordAge\");\n }\n public toAwsProp(): AwsRetryProp {\n return this.retryType === \"attempts\"\n ? { retryAttempts: this.amount }\n : { maxRecordAge: Duration.seconds(this.amount) };\n }\n private readonly amount: number;\n readonly retryType: RetryType;\n\n private constructor(amount: number, type: RetryType) {\n this.amount = amount;\n this.retryType = type;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,GAAG,UAAW,MAAM,EAAE,KAAG,MAAsE,CAAC"}
1
+ {"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,GAAG,GAAI,OAAO,MAAM,EAAE,KAAG,MAAsE,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GuAppAwareConstruct = void 0;
3
+ exports.GuAppAwareConstruct = GuAppAwareConstruct;
4
4
  const constructs_1 = require("constructs");
5
5
  const core_1 = require("../../constructs/core");
6
6
  function GuAppAwareConstruct(BaseClass) {
@@ -32,5 +32,4 @@ function GuAppAwareConstruct(BaseClass) {
32
32
  }
33
33
  return Mixin;
34
34
  }
35
- exports.GuAppAwareConstruct = GuAppAwareConstruct;
36
35
  //# sourceMappingURL=app-aware-construct.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-aware-construct.js","sourceRoot":"","sources":["../../../src/utils/mixin/app-aware-construct.ts"],"names":[],"mappings":";;;AAAA,2CAAuC;AACvC,gDAAoD;AAGpD,SAAgB,mBAAmB,CAA+B,SAAgB;IAChF,MAAM,KAAM,SAAQ,SAAS;QAO3B,wGAAwG;QACxG,YAAsB,GAAG,IAAW;YAClC,4EAA4E;YAC5E,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;YAEzC,IAAI,CAAC,kBAAW,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;gBACrC,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;aACpF;YAED,MAAM,GAAG,GAAW,KAAK,CAAC,GAAG,CAAC;YAC9B,MAAM,SAAS,GAAG,kBAAW,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,EAAE,EAAY,CAAC,CAAC;YAEhE,4EAA4E;YAC5E,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;YACnD,0EAA0E;YAC1E,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC;YAElB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAE3B;;;;;iBAKK;YACL,IAAI,sBAAS,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE;gBAC/B,kBAAW,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;aAC5C;QACH,CAAC;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAvCD,kDAuCC","sourcesContent":["import { Construct } from \"constructs\";\nimport { AppIdentity } from \"../../constructs/core\";\nimport type { AnyConstructor } from \"./types\";\n\nexport function GuAppAwareConstruct<TBase extends AnyConstructor>(BaseClass: TBase) {\n class Mixin extends BaseClass {\n /**\n * The ID of the construct with the App suffix.\n * This should be used in place of `id` when trying to reference the construct.\n */\n readonly idWithApp: string;\n\n // eslint-disable-next-line custom-rules/valid-constructors, @typescript-eslint/no-explicit-any -- mixin\n protected constructor(...args: any[]) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- mixin\n const [scope, id, props, ...rest] = args;\n\n if (!AppIdentity.isAppIdentity(props)) {\n throw new Error(\"Cannot use the GuAppAwareConstruct mixin without an AppIdentity\");\n }\n\n const app: string = props.app;\n const idWithApp = AppIdentity.suffixText({ app }, id as string);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- mixin\n const newArgs = [scope, idWithApp, props, ...rest];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument -- mixin\n super(...newArgs);\n\n this.idWithApp = idWithApp;\n\n /*\n Add the `App` tag to the construct.\n Although not every resource can be tagged, it's still safe to make the call.\n If AWS support tags on a new resource one day, our test suite will fail and we can celebrate!\n See https://docs.aws.amazon.com/ARG/latest/userguide/supported-resources.html\n */\n if (Construct.isConstruct(this)) {\n AppIdentity.taggedConstruct({ app }, this);\n }\n }\n }\n return Mixin;\n}\n"]}
1
+ {"version":3,"file":"app-aware-construct.js","sourceRoot":"","sources":["../../../src/utils/mixin/app-aware-construct.ts"],"names":[],"mappings":";;AAIA,kDAuCC;AA3CD,2CAAuC;AACvC,gDAAoD;AAGpD,SAAgB,mBAAmB,CAA+B,SAAgB;IAChF,MAAM,KAAM,SAAQ,SAAS;QAO3B,wGAAwG;QACxG,YAAsB,GAAG,IAAW;YAClC,4EAA4E;YAC5E,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;YAEzC,IAAI,CAAC,kBAAW,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;YACrF,CAAC;YAED,MAAM,GAAG,GAAW,KAAK,CAAC,GAAG,CAAC;YAC9B,MAAM,SAAS,GAAG,kBAAW,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,EAAE,EAAY,CAAC,CAAC;YAEhE,4EAA4E;YAC5E,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;YACnD,0EAA0E;YAC1E,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC;YAElB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAE3B;;;;;iBAKK;YACL,IAAI,sBAAS,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChC,kBAAW,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC","sourcesContent":["import { Construct } from \"constructs\";\nimport { AppIdentity } from \"../../constructs/core\";\nimport type { AnyConstructor } from \"./types\";\n\nexport function GuAppAwareConstruct<TBase extends AnyConstructor>(BaseClass: TBase) {\n class Mixin extends BaseClass {\n /**\n * The ID of the construct with the App suffix.\n * This should be used in place of `id` when trying to reference the construct.\n */\n readonly idWithApp: string;\n\n // eslint-disable-next-line custom-rules/valid-constructors, @typescript-eslint/no-explicit-any -- mixin\n protected constructor(...args: any[]) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- mixin\n const [scope, id, props, ...rest] = args;\n\n if (!AppIdentity.isAppIdentity(props)) {\n throw new Error(\"Cannot use the GuAppAwareConstruct mixin without an AppIdentity\");\n }\n\n const app: string = props.app;\n const idWithApp = AppIdentity.suffixText({ app }, id as string);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- mixin\n const newArgs = [scope, idWithApp, props, ...rest];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument -- mixin\n super(...newArgs);\n\n this.idWithApp = idWithApp;\n\n /*\n Add the `App` tag to the construct.\n Although not every resource can be tagged, it's still safe to make the call.\n If AWS support tags on a new resource one day, our test suite will fail and we can celebrate!\n See https://docs.aws.amazon.com/ARG/latest/userguide/supported-resources.html\n */\n if (Construct.isConstruct(this)) {\n AppIdentity.taggedConstruct({ app }, this);\n }\n }\n }\n return Mixin;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/security-groups/helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEpE,eAAO,MAAM,kCAAkC,eACjC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAC7B,IAAI,GAAG,MAAM,KAClB,uBAAuB,EAQzB,CAAC"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/utils/security-groups/helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAEpE,eAAO,MAAM,kCAAkC,GAC7C,YAAY,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACnC,MAAM,IAAI,GAAG,MAAM,KAClB,uBAAuB,EAQzB,CAAC"}
@@ -36,5 +36,5 @@ import type { GuStack } from "../constructs/core";
36
36
  */
37
37
  export declare const isSingletonPresentInStack: (stack: GuStack, maybeSingletonInstance?: {
38
38
  stack: Stack;
39
- } | undefined) => boolean;
39
+ }) => boolean;
40
40
  //# sourceMappingURL=singleton.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"singleton.d.ts","sourceRoot":"","sources":["../../src/utils/singleton.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,yBAAyB,UAAW,OAAO;WAAoC,KAAK;kBAAK,OAGrG,CAAC"}
1
+ {"version":3,"file":"singleton.d.ts","sourceRoot":"","sources":["../../src/utils/singleton.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,eAAO,MAAM,yBAAyB,GAAI,OAAO,OAAO,EAAE,yBAAyB;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,KAAG,OAGrG,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/utils/string.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,QAAS,MAAM,KAAG,MAM1C,CAAC;AAEF,eAAO,MAAM,WAAW,QAAS,MAAM,KAAG,MAKzC,CAAC"}
1
+ {"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/utils/string.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,KAAG,MAM1C,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,KAAG,MAKzC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"assertions.js","sourceRoot":"","sources":["../../../src/utils/test/assertions.ts"],"names":[],"mappings":"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","sourcesContent":["import { Match, Template } from \"aws-cdk-lib/assertions\";\nimport type { Resource } from \"aws-cdk-lib/assertions/lib/private/template\";\nimport { MetadataKeys, TrackingTag } from \"../../constants\";\nimport type { AppIdentity, GuStack } from \"../../constructs/core\";\n\ninterface Tag {\n Key: string;\n Value: unknown;\n PropagateAtLaunch?: boolean;\n}\n\ninterface GuTagMatcherProps {\n appIdentity?: AppIdentity;\n additionalTags?: Tag[];\n propagateAtLaunch?: boolean;\n}\n\nfunction sortTagsByKey(tags: Tag[]): Tag[] {\n return [...tags].sort((first, second) => {\n if (first.Key.toLowerCase() < second.Key.toLowerCase()) {\n return -1;\n }\n if (first.Key.toLowerCase() > second.Key.toLowerCase()) {\n return 1;\n }\n return 0;\n });\n}\n\nexport class GuTemplate {\n private readonly template: Template;\n private readonly stack: GuStack;\n\n private constructor(scope: GuStack) {\n this.stack = scope;\n this.template = Template.fromStack(scope);\n }\n\n static fromStack(stack: GuStack) {\n return new GuTemplate(stack);\n }\n\n findResourceByLogicalId(type: string, logicalId: string | RegExp): Record<string, Resource> | undefined {\n const resources = this.template.findResources(type) as Record<string, Resource>;\n\n const match = Object.entries(resources).find(([id, resource]) => {\n const idMatch = logicalId instanceof RegExp ? logicalId.test(id) : id === logicalId;\n return idMatch && resource;\n });\n\n if (match) {\n const [logicalId, resource] = match;\n return { [logicalId]: resource };\n }\n\n return undefined;\n }\n\n hasResourceWithLogicalId(type: string, logicalId: string | RegExp) {\n const result = this.findResourceByLogicalId(type, logicalId);\n\n if (!result) {\n throw new Error(`No resource found matching logicalId ${logicalId.toString()} and Type ${type}`);\n }\n }\n\n hasGuTaggedResource(type: string, props?: GuTagMatcherProps) {\n const { stack, stage } = this.stack;\n const { appIdentity, additionalTags, propagateAtLaunch } = props ?? {};\n\n const coreTags = [\n {\n Key: \"Stack\",\n Value: stack,\n },\n {\n Key: \"Stage\",\n Value: stage,\n },\n TrackingTag,\n {\n Key: MetadataKeys.REPOSITORY_NAME,\n Value: \"guardian/cdk\",\n },\n ];\n\n const tagMap = new Map<string, Tag>();\n coreTags.forEach((tag) => tagMap.set(tag.Key, tag));\n\n if (appIdentity) {\n tagMap.set(\"App\", { Key: \"App\", Value: appIdentity.app });\n }\n\n if (additionalTags) {\n additionalTags.forEach((tag) => tagMap.set(tag.Key, tag));\n }\n\n // set `PropagateAtLaunch` if the prop is defined\n if (propagateAtLaunch !== undefined) {\n tagMap.forEach((tag) => {\n tagMap.set(tag.Key, { ...tag, PropagateAtLaunch: propagateAtLaunch });\n });\n }\n\n this.template.hasResourceProperties(type, { Tags: sortTagsByKey(Array.from(tagMap.values())) });\n }\n\n hasResourceWithTag(type: string, tag: Tag) {\n this.template.hasResourceProperties(type, {\n Tags: Match.arrayWith([tag]),\n });\n }\n}\n"]}
1
+ {"version":3,"file":"assertions.js","sourceRoot":"","sources":["../../../src/utils/test/assertions.ts"],"names":[],"mappings":"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","sourcesContent":["import { Match, Template } from \"aws-cdk-lib/assertions\";\nimport type { Resource } from \"aws-cdk-lib/assertions/lib/private/template\";\nimport { MetadataKeys, TrackingTag } from \"../../constants\";\nimport type { AppIdentity, GuStack } from \"../../constructs/core\";\n\ninterface Tag {\n Key: string;\n Value: unknown;\n PropagateAtLaunch?: boolean;\n}\n\ninterface GuTagMatcherProps {\n appIdentity?: AppIdentity;\n additionalTags?: Tag[];\n propagateAtLaunch?: boolean;\n}\n\nfunction sortTagsByKey(tags: Tag[]): Tag[] {\n return [...tags].sort((first, second) => {\n if (first.Key.toLowerCase() < second.Key.toLowerCase()) {\n return -1;\n }\n if (first.Key.toLowerCase() > second.Key.toLowerCase()) {\n return 1;\n }\n return 0;\n });\n}\n\nexport class GuTemplate {\n private readonly template: Template;\n private readonly stack: GuStack;\n\n private constructor(scope: GuStack) {\n this.stack = scope;\n this.template = Template.fromStack(scope);\n }\n\n static fromStack(stack: GuStack) {\n return new GuTemplate(stack);\n }\n\n findResourceByLogicalId(type: string, logicalId: string | RegExp): Record<string, Resource> | undefined {\n const resources = this.template.findResources(type) as Record<string, Resource>;\n\n const match = Object.entries(resources).find(([id, resource]) => {\n const idMatch = logicalId instanceof RegExp ? logicalId.test(id) : id === logicalId;\n return idMatch && resource;\n });\n\n if (match) {\n const [logicalId, resource] = match;\n return { [logicalId]: resource };\n }\n\n return undefined;\n }\n\n hasResourceWithLogicalId(type: string, logicalId: string | RegExp) {\n const result = this.findResourceByLogicalId(type, logicalId);\n\n if (!result) {\n throw new Error(`No resource found matching logicalId ${logicalId.toString()} and Type ${type}`);\n }\n }\n\n hasGuTaggedResource(type: string, props?: GuTagMatcherProps) {\n const { stack, stage } = this.stack;\n const { appIdentity, additionalTags, propagateAtLaunch } = props ?? {};\n\n const coreTags = [\n {\n Key: \"Stack\",\n Value: stack,\n },\n {\n Key: \"Stage\",\n Value: stage,\n },\n TrackingTag,\n {\n Key: MetadataKeys.REPOSITORY_NAME,\n Value: \"guardian/cdk\",\n },\n ];\n\n const tagMap = new Map<string, Tag>();\n coreTags.forEach((tag) => tagMap.set(tag.Key, tag));\n\n if (appIdentity) {\n tagMap.set(\"App\", { Key: \"App\", Value: appIdentity.app });\n }\n\n if (additionalTags) {\n additionalTags.forEach((tag) => tagMap.set(tag.Key, tag));\n }\n\n // set `PropagateAtLaunch` if the prop is defined\n if (propagateAtLaunch !== undefined) {\n tagMap.forEach((tag) => {\n tagMap.set(tag.Key, { ...tag, PropagateAtLaunch: propagateAtLaunch });\n });\n }\n\n this.template.hasResourceProperties(type, { Tags: sortTagsByKey(Array.from(tagMap.values())) });\n }\n\n hasResourceWithTag(type: string, tag: Tag) {\n this.template.hasResourceProperties(type, {\n Tags: Match.arrayWith([tag]),\n });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"attach-policy-to-test-role.d.ts","sourceRoot":"","sources":["../../../src/utils/test/attach-policy-to-test-role.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGlD,eAAO,MAAM,sBAAsB,UAAW,KAAK,UAAU,MAAM,OAAM,MAAM,KAAgB,IAM9F,CAAC"}
1
+ {"version":3,"file":"attach-policy-to-test-role.d.ts","sourceRoot":"","sources":["../../../src/utils/test/attach-policy-to-test-role.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGlD,eAAO,MAAM,sBAAsB,GAAI,OAAO,KAAK,EAAE,QAAQ,MAAM,EAAE,KAAI,MAAmB,KAAG,IAM9F,CAAC"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.simpleGuStackForTesting = void 0;
3
+ exports.simpleGuStackForTesting = simpleGuStackForTesting;
4
4
  const aws_cdk_lib_1 = require("aws-cdk-lib");
5
5
  const core_1 = require("../../constructs/core");
6
6
  function simpleGuStackForTesting(props) {
@@ -10,5 +10,4 @@ function simpleGuStackForTesting(props) {
10
10
  ...props,
11
11
  });
12
12
  }
13
- exports.simpleGuStackForTesting = simpleGuStackForTesting;
14
13
  //# sourceMappingURL=simple-gu-stack.js.map