From 4f541ed729c7ee08969dae043f60a6bf9f805bf4 Mon Sep 17 00:00:00 2001 From: Stefan Freitag Date: Sun, 23 Jul 2023 19:42:54 +0200 Subject: [PATCH] feat: added tests (#36) --- .projen/deps.json | 8 +-- .projenrc.js | 16 ++++-- API.md | 6 +-- README.md | 6 +-- docs/features.md | 6 ++- package.json | 8 +-- src/terraformStateBackend.ts | 1 + test/integ.terraformStateBackend.ts | 3 +- test/terraformStateBackend.test.ts | 84 +++++++++++++++++++++++++---- tsconfig.dev.json | 3 +- yarn.lock | 84 ++++++++++++++--------------- 11 files changed, 151 insertions(+), 74 deletions(-) diff --git a/.projen/deps.json b/.projen/deps.json index 829e8b9..b0eec43 100644 --- a/.projen/deps.json +++ b/.projen/deps.json @@ -2,12 +2,12 @@ "dependencies": [ { "name": "@aws-cdk/integ-runner", - "version": "2.87.0-alpha.0", + "version": "2.88.0-alpha.0", "type": "build" }, { "name": "@aws-cdk/integ-tests-alpha", - "version": "2.87.0-alpha.0", + "version": "2.88.0-alpha.0", "type": "build" }, { @@ -32,7 +32,7 @@ }, { "name": "aws-cdk-lib", - "version": "2.87.0", + "version": "2.88.0", "type": "build" }, { @@ -133,7 +133,7 @@ }, { "name": "aws-cdk-lib", - "version": "^2.87.0", + "version": "^2.88.0", "type": "peer" }, { diff --git a/.projenrc.js b/.projenrc.js index f9dac9b..36aad8f 100644 --- a/.projenrc.js +++ b/.projenrc.js @@ -5,7 +5,7 @@ const { UpgradeDependenciesSchedule } = require('projen/lib/javascript'); const project = new awscdk.AwsCdkConstructLibrary({ author: 'Stefan Freitag', authorAddress: 'stefan.freitag@udo.edu', - cdkVersion: '2.87.0', + cdkVersion: '2.88.0', defaultReleaseBranch: 'main', name: 'terraform-backend-s3-bucket', description: 'Creates an S3 bucket and a DynamoDB table for Terraform state and lock management.', @@ -13,8 +13,8 @@ const project = new awscdk.AwsCdkConstructLibrary({ 'https://github.com/stefanfreitag/terraform-backend-s3-bucket.git', codeCov: true, devDeps: [ - '@aws-cdk/integ-tests-alpha@2.87.0-alpha.0', - '@aws-cdk/integ-runner@2.87.0-alpha.0', + '@aws-cdk/integ-tests-alpha@2.88.0-alpha.0', + '@aws-cdk/integ-runner@2.88.0-alpha.0', 'cdk-nag@2.27.75', 'ts-node', ], @@ -38,6 +38,16 @@ const project = new awscdk.AwsCdkConstructLibrary({ module: 'terraform_backend_s3_bucket', distName: 'terraform-backend-s3-bucket', }, + tsconfigDev: { + compilerOptions: { + ignoreDeprecations: '5.0', + }, + }, + tsconfig: { + compilerOptions: { + ignoreDeprecations: '5.0', + }, + }, }); const common_exclude = ['.history/']; diff --git a/API.md b/API.md index deb534d..7a46b6d 100644 --- a/API.md +++ b/API.md @@ -1,10 +1,8 @@ # Terraform Backend S3 Bucket -Provides a CDK construct for Terraform state management. The construct consists -of +Provides a CDK construct for Terraform state management. -- S3 bucket -- DynamoDB table. +The documentation is available [here](https://stefanfreitag.github.io/terraform-backend-s3-bucket/). ## Contributing diff --git a/README.md b/README.md index 8dcb7d7..61758e3 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,8 @@ # Terraform Backend S3 Bucket -Provides a CDK construct for Terraform state management. The construct consists -of +Provides a CDK construct for Terraform state management. -- S3 bucket -- DynamoDB table. +The documentation is available [here](https://stefanfreitag.github.io/terraform-backend-s3-bucket/). ## Contributing diff --git a/docs/features.md b/docs/features.md index 4248148..e502cef 100644 --- a/docs/features.md +++ b/docs/features.md @@ -1,7 +1,9 @@ # Features -- [[S3.1] S3 Block Public Access setting should be enabled](https://docs.aws.amazon.com/securityhub/latest/userguide/s3-controls.html#s3-1) -- [[S3.5] S3 buckets should require requests to use Secure Socket Layer](https://docs.aws.amazon.com/securityhub/latest/userguide/s3-controls.html#s3-1) +- [[S3.2] S3 buckets should prohibit public read access](https://docs.aws.amazon.com/securityhub/latest/userguide/s3-controls.html#s3-2) +- [[S3.3] S3 buckets should prohibit public write access](https://docs.aws.amazon.com/securityhub/latest/userguide/s3-controls.html#s3-3) +- [[S3.4] S3 buckets should have server-side encryption enabled](https://docs.aws.amazon.com/securityhub/latest/userguide/s3-controls.html#s3-4) +- [[S3.5] S3 buckets should require requests to use Secure Socket Layer](https://docs.aws.amazon.com/securityhub/latest/userguide/s3-controls.html#s3-5) - [[S3.14] S3 buckets should use versioning](https://docs.aws.amazon.com/securityhub/latest/userguide/s3-controls.html#s3-14) - A lifecycle policy for non-current versions of objects [[S3.10] S3 buckets with versioning enabled should have lifecycle policies configured](https://docs.aws.amazon.com/securityhub/latest/userguide/s3-controls.html#s3-10) diff --git a/package.json b/package.json index b67cda7..5a8f4d6 100644 --- a/package.json +++ b/package.json @@ -38,13 +38,13 @@ "organization": false }, "devDependencies": { - "@aws-cdk/integ-runner": "2.87.0-alpha.0", - "@aws-cdk/integ-tests-alpha": "2.87.0-alpha.0", + "@aws-cdk/integ-runner": "2.88.0-alpha.0", + "@aws-cdk/integ-tests-alpha": "2.88.0-alpha.0", "@types/jest": "^27", "@types/node": "^16", "@typescript-eslint/eslint-plugin": "^5", "@typescript-eslint/parser": "^5", - "aws-cdk-lib": "2.87.0", + "aws-cdk-lib": "2.88.0", "cdk-nag": "2.27.75", "constructs": "10.0.5", "eslint": "^8", @@ -66,7 +66,7 @@ "typescript": "^5.1.6" }, "peerDependencies": { - "aws-cdk-lib": "^2.87.0", + "aws-cdk-lib": "^2.88.0", "constructs": "^10.0.5" }, "resolutions": { diff --git a/src/terraformStateBackend.ts b/src/terraformStateBackend.ts index e424d01..63a901e 100644 --- a/src/terraformStateBackend.ts +++ b/src/terraformStateBackend.ts @@ -20,6 +20,7 @@ export class TerraformStateBackend extends Construct { enforceSSL: true, objectOwnership: s3.ObjectOwnership.BUCKET_OWNER_ENFORCED, removalPolicy: RemovalPolicy.DESTROY, + encryption: s3.BucketEncryption.KMS_MANAGED, lifecycleRules: [ { enabled: true, diff --git a/test/integ.terraformStateBackend.ts b/test/integ.terraformStateBackend.ts index 6eda9df..9b864ec 100644 --- a/test/integ.terraformStateBackend.ts +++ b/test/integ.terraformStateBackend.ts @@ -22,8 +22,9 @@ class StackUnderTest extends cdk.Stack { // Beginning of the test suite const app = new cdk.App(); -const stack = new StackUnderTest(app, 'terraform-state-backend', {}); +const stack = new StackUnderTest(app, 'terraform-state-backend', { description: 'Integration test for Terraform State Backend' }); const integ = new IntegTest(app, 'MyTestCase', { + regions: ['eu-central-1'], testCases: [stack], }); diff --git a/test/terraformStateBackend.test.ts b/test/terraformStateBackend.test.ts index 119e097..ad99a3d 100644 --- a/test/terraformStateBackend.test.ts +++ b/test/terraformStateBackend.test.ts @@ -85,39 +85,105 @@ describe('Ensure passing HIPAASecurityChecks', () => { describe('Bucket Configuration', () => { let stack: cdk.Stack; + let backend: TerraformStateBackend; beforeEach(() => { const app = new cdk.App(); stack = new cdk.Stack(app, 'stack', {}); - new TerraformStateBackend(stack, 'backend', { + backend = new TerraformStateBackend(stack, 'backend', { bucketName: '', tableName: '', }); }); - test('Versioning is enabled', () => { + test('[S3.2] S3 buckets should prohibit public read access', () => { assertions.Template.fromStack(stack).hasResourceProperties( 'AWS::S3::Bucket', { - VersioningConfiguration: { Status: 'Enabled' }, + PublicAccessBlockConfiguration: { + BlockPublicAcls: true, + BlockPublicPolicy: true, + IgnorePublicAcls: true, + RestrictPublicBuckets: true, + }, }, ); }); - test('Public access is blocked', () => { + //TODO + test('[S3.4] S3 buckets should have server-side encryption enabled', () => { assertions.Template.fromStack(stack).hasResourceProperties( 'AWS::S3::Bucket', { - PublicAccessBlockConfiguration: { - BlockPublicAcls: true, - BlockPublicPolicy: true, - IgnorePublicAcls: true, - RestrictPublicBuckets: true, + BucketEncryption: { + ServerSideEncryptionConfiguration: [ + { ServerSideEncryptionByDefault: { SSEAlgorithm: 'aws:kms' } }, + ], }, }, ); }); + test('[S3.5] S3 buckets should require requests to use Secure Socket Layer', () => { + const template = assertions.Template.fromStack(stack); + template.resourceCountIs('AWS::S3::BucketPolicy', 1); + + const logicalId = stack.getLogicalId(backend.bucket.node.defaultChild as cdk.CfnResource); + + template.hasResourceProperties( + 'AWS::S3::BucketPolicy', + { + PolicyDocument: { + Statement: [ + { + Action: 's3:*', + Condition: { + Bool: { + 'aws:SecureTransport': 'false', + }, + }, + Effect: 'Deny', + Principal: { + AWS: '*', + }, + Resource: [ + { + 'Fn::GetAtt': [ + logicalId, + 'Arn', + ], + }, + { + 'Fn::Join': [ + '', + [ + { + 'Fn::GetAtt': [ + logicalId, + 'Arn', + ], + }, + '/*', + ], + ], + }, + ], + }, + ], + }, + }, + ); + }); + + test('[S3.14] S3 buckets should use versioning', () => { + assertions.Template.fromStack(stack).hasResourceProperties( + 'AWS::S3::Bucket', + { + VersioningConfiguration: { Status: 'Enabled' }, + }, + ); + }); + test('Lifecycle policy is defined', () => { assertions.Template.fromStack(stack).hasResourceProperties( 'AWS::S3::Bucket', diff --git a/tsconfig.dev.json b/tsconfig.dev.json index 3bd3671..fc9ec81 100644 --- a/tsconfig.dev.json +++ b/tsconfig.dev.json @@ -23,7 +23,8 @@ "strictNullChecks": true, "strictPropertyInitialization": true, "stripInternal": true, - "target": "ES2019" + "target": "ES2019", + "ignoreDeprecations": "5.0" }, "include": [ ".projenrc.js", diff --git a/yarn.lock b/yarn.lock index 3bc51e7..7bc3d46 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15,34 +15,34 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@aws-cdk/asset-awscli-v1@^2.2.177": +"@aws-cdk/asset-awscli-v1@^2.2.200": version "2.2.200" resolved "https://registry.yarnpkg.com/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.200.tgz#6ead533f73f705ad7350eb46955e2538e50cd013" integrity sha512-Kf5J8DfJK4wZFWT2Myca0lhwke7LwHcHBo+4TvWOGJrFVVKVuuiLCkzPPRBQQVDj0Vtn2NBokZAz8pfMpAqAKg== -"@aws-cdk/asset-kubectl-v20@^2.1.1": +"@aws-cdk/asset-kubectl-v20@^2.1.2": version "2.1.2" resolved "https://registry.yarnpkg.com/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.2.tgz#d8e20b5f5dc20128ea2000dc479ca3c7ddc27248" integrity sha512-3M2tELJOxQv0apCIiuKQ4pAbncz9GuLwnKFqxifWfe77wuMxyTRPmxssYHs42ePqzap1LT6GDcPygGs+hHstLg== -"@aws-cdk/asset-node-proxy-agent-v5@^2.0.148": +"@aws-cdk/asset-node-proxy-agent-v5@^2.0.165": version "2.0.166" resolved "https://registry.yarnpkg.com/@aws-cdk/asset-node-proxy-agent-v5/-/asset-node-proxy-agent-v5-2.0.166.tgz#467507db141cd829ff8aa9d6ea5519310a4276b8" integrity sha512-j0xnccpUQHXJKPgCwQcGGNu4lRiC1PptYfdxBIH1L4dRK91iBxtSQHESRQX+yB47oGLaF/WfNN/aF3WXwlhikg== -"@aws-cdk/integ-runner@2.87.0-alpha.0": - version "2.87.0-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/integ-runner/-/integ-runner-2.87.0-alpha.0.tgz#6af04537c74ef363cc1ca4655d79aa9170c8bd4f" - integrity sha512-VjboZssHzf1nN/CntT5lbsJH6xSIvl8EpvtOUWWBT/UpxA1Kow7VH83sswVZH8dMn17/ZpXe+DfMHEDam61CZQ== +"@aws-cdk/integ-runner@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/integ-runner/-/integ-runner-2.88.0-alpha.0.tgz#8e65241d0a78b43332fa75e3088789132515794f" + integrity sha512-sjNVQ5f/UkT6QnCArtydTELZp6zclsLTsnn/Y/IkhDUX034vs8SVm63LaM3pzwskP4I8ajmqE0mfKzlWhbcBGQ== dependencies: - aws-cdk "2.87.0" + aws-cdk "2.88.0" optionalDependencies: fsevents "2.3.2" -"@aws-cdk/integ-tests-alpha@2.87.0-alpha.0": - version "2.87.0-alpha.0" - resolved "https://registry.yarnpkg.com/@aws-cdk/integ-tests-alpha/-/integ-tests-alpha-2.87.0-alpha.0.tgz#563a35dc355ef3c4d27ada2db22dd9aa3f4e4136" - integrity sha512-WwJrXCBDwP5e0UYipmTakLqF5q8aALS0oJzcyfqDGA4WsQP0vMfKnZ+1FSUaRhf60exKST/dZR4Mdt9CvOyMig== +"@aws-cdk/integ-tests-alpha@2.88.0-alpha.0": + version "2.88.0-alpha.0" + resolved "https://registry.yarnpkg.com/@aws-cdk/integ-tests-alpha/-/integ-tests-alpha-2.88.0-alpha.0.tgz#3f01f4e0134fe8082d4a65f2d6b4d2ca01faf33f" + integrity sha512-/77O081CbyF7VGHAGc4MtQ6UoXvwRWxZH8ICasgdrGF7UH61IELBmrNcX/cuCJJmqNErRmd95Vo5nJzVwzhhgQ== "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.5": version "7.22.5" @@ -348,9 +348,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" - integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== + version "4.6.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.0.tgz#5b63f0df5528a44e28aa8578d393de908cc3d4d0" + integrity sha512-uiPeRISaglZnaZk8vwrjQZ1CxogZeY/4IYft6gBOTqu1WhVXWmCmZMWxUv2Q/pxSvPdp1JPaO62kLOcOkMqWrw== "@eslint/eslintrc@^2.1.0": version "2.1.0" @@ -993,14 +993,14 @@ integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== "@types/node@*": - version "20.4.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.2.tgz#129cc9ae69f93824f92fac653eebfb4812ab4af9" - integrity sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw== + version "20.4.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.4.tgz#c79c7cc22c9d0e97a7944954c9e663bcbd92b0cb" + integrity sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew== "@types/node@^16": - version "16.18.38" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.38.tgz#1dcdb6c54d02b323f621213745f2e44af30c73e6" - integrity sha512-6sfo1qTulpVbkxECP+AVrHV9OoJqhzCsfTNp5NIG+enM4HyM3HvZCO798WShIXBN0+QtDIcutJCjsVYnQP5rIQ== + version "16.18.39" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.39.tgz#aa39a1a87a40ef6098ee69689a1acb0c1b034832" + integrity sha512-8q9ZexmdYYyc5/cfujaXb4YOucpQxAV4RMG0himLyDUOEr8Mr79VrqsFI+cQ2M2h89YIuy95lbxuYjxT4Hk4kQ== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -1395,14 +1395,14 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -aws-cdk-lib@2.87.0: - version "2.87.0" - resolved "https://registry.yarnpkg.com/aws-cdk-lib/-/aws-cdk-lib-2.87.0.tgz#585a2569fa139ffecc3ff40ffc399eb7da030a4a" - integrity sha512-9kirXX7L7OP/yGmCbaYlkt5OAtowGiGw0AYFIQvSwvx/UU3aJO5XuDwAgDsvToDkRpBi0yX0bNwqa0DItu+C6A== +aws-cdk-lib@2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/aws-cdk-lib/-/aws-cdk-lib-2.88.0.tgz#72d165cb7dc168c5fa3b22caaacd8d33364866fc" + integrity sha512-bmhokh30HVeqlotWaoEmK7mKB9SJbJwpbsiVgmYe3JcMu8DposHQqaIPI7LnC+dg015tZaxUsExxOYBEw+vntQ== dependencies: - "@aws-cdk/asset-awscli-v1" "^2.2.177" - "@aws-cdk/asset-kubectl-v20" "^2.1.1" - "@aws-cdk/asset-node-proxy-agent-v5" "^2.0.148" + "@aws-cdk/asset-awscli-v1" "^2.2.200" + "@aws-cdk/asset-kubectl-v20" "^2.1.2" + "@aws-cdk/asset-node-proxy-agent-v5" "^2.0.165" "@balena/dockerignore" "^1.0.2" case "1.6.3" fs-extra "^11.1.1" @@ -1410,14 +1410,14 @@ aws-cdk-lib@2.87.0: jsonschema "^1.4.1" minimatch "^3.1.2" punycode "^2.3.0" - semver "^7.5.1" + semver "^7.5.4" table "^6.8.1" yaml "1.10.2" -aws-cdk@2.87.0: - version "2.87.0" - resolved "https://registry.yarnpkg.com/aws-cdk/-/aws-cdk-2.87.0.tgz#916febc4477119b7a6b799001ea890f78043dc92" - integrity sha512-dBm74nl3dMUxoAzgjcfKnzJyoVNIV//B1sqDN11cC3LXEflYapcBxPxZHAyGcRXg5dW3m14dMdKVQfmt4N970g== +aws-cdk@2.88.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/aws-cdk/-/aws-cdk-2.88.0.tgz#2e1adfa0d13145c44ff8a81705d962e861bf29f1" + integrity sha512-7Tj0uusA2nsEOsqkd4kB5vmzciz7l/eGBN5a+Ce4/CCcoe4ZCvT85L+T6tK0aohUTLZTAlTPBceH34RN5iMYpA== optionalDependencies: fsevents "2.3.2" @@ -2324,9 +2324,9 @@ eastasianwidth@^0.2.0: integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.4.431: - version "1.4.466" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.466.tgz#17193d70f203da3d52a89c653b8d89f47a51d79d" - integrity sha512-TSkRvbXRXD8BwhcGlZXDsbI2lRoP8dvqR7LQnqQNk9KxXBc4tG8O+rTuXgTyIpEdiqSGKEBSqrxdqEntnjNncA== + version "1.4.468" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.468.tgz#3cbf64ad67d9f12bfe69fefe5eb1935ec4f6ab7a" + integrity sha512-6M1qyhaJOt7rQtNti1lBA0GwclPH+oKCmsra/hkcWs5INLxfXXD/dtdnaKUYQu/pjOBP/8Osoe4mAcNvvzoFag== emittery@^0.8.1: version "0.8.1" @@ -2700,9 +2700,9 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.12, fast-glob@^3.2.9, fast-glob@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" - integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -5348,9 +5348,9 @@ progress@^2.0.3: integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== projen@^0.71.138: - version "0.71.144" - resolved "https://registry.yarnpkg.com/projen/-/projen-0.71.144.tgz#95c42c661d868b84ff31456a448f414e74af7c5d" - integrity sha512-nTp/bsVbGCU/gjRfNPewlMORAhKvUKBKsGWmXrk587cX9fzycRHaa8lDxnrHc8qANMNbArAErbNUlX+n6tMwtQ== + version "0.71.147" + resolved "https://registry.yarnpkg.com/projen/-/projen-0.71.147.tgz#f809f1786af91d761b25bb6940ca80076f48b050" + integrity sha512-xPZl/ZCgoFzOHJx9VFY3/9IamD89kU6N7XTpD1vxp1dNziupIR4dpKklaBPtLSgxaFVRM70dyRW/6PeKNO46pQ== dependencies: "@iarna/toml" "^2.2.5" case "^1.6.3"