From 16596e5a25ba705ebb4a3cc709911a813d7c4f2f Mon Sep 17 00:00:00 2001 From: Verinder Singh Date: Tue, 8 Aug 2023 12:06:58 +1000 Subject: [PATCH] release v1.2.0 (#25) Co-authored-by: Verinder Singh --- CHANGELOG.md | 11 + README.md | 44 +- source/.eslintrc.js | 4 +- source/bin/blueprint-service-infra.ts | 52 +- source/blueprint-infrastructure/.eslintrc.js | 4 +- .../bin/blueprint-infrastructure.ts | 4 +- .../lambda/codepipeline/blueprint/common.ts | 2 +- .../lambda/codepipeline/blueprint/publish.ts | 68 +- .../lambda/codepipeline/blueprint/register.ts | 22 +- .../lambda/common/logger-factory.ts | 2 +- .../lambda/github/createWebhook.ts | 18 +- .../lib/blueprint-infrastructure-stack.ts | 61 +- .../lib/blueprint-infrastructure-types.ts | 8 + ...lueprint-publication-pipeline-construct.ts | 89 +- .../lib/buildspecs.ts | 227 +- .../lib/cfn-nag-suppression.ts | 16 +- .../package-lock.json | 1707 ++++++++++++--- source/blueprint-infrastructure/package.json | 20 +- .../codepipeline/blueprint/publish.test.ts | 46 +- .../codepipeline/blueprint/register.test.ts | 26 +- .../test/unit/github/createWebhook.test.ts | 4 +- source/blueprint-ui/package.json | 4 +- .../Attributes/Table/index.test.tsx | 14 + .../containers/Attributes/Table/index.tsx | 69 +- .../src/components/core/AppContext/index.tsx | 3 - .../core/Authenticate/index.test.tsx | 4 + .../components/core/Authenticate/index.tsx | 13 + .../core/HasPermission/index.test.tsx | 48 + .../components/core/HasPermission/index.tsx | 43 + .../pages/Attributes/Detail/index.test.tsx | 13 + .../pages/Attributes/Detail/index.tsx | 37 +- .../pages/Attributes/List/index.test.tsx | 13 + .../pages/Patterns/Detail/index.tsx | 35 +- .../pages/Patterns/List/index.test.tsx | 14 + .../components/pages/Patterns/List/index.tsx | 41 +- .../src/components/types/index.ts | 13 + source/blueprint-ui/yarn.lock | 16 +- source/cypress.config.ts | 88 +- .../lib/compliant-dynamodb-table.ts | 2 +- .../compliant-dynamodb-table/package.json | 2 +- .../packages/compliant-s3-bucket/package.json | 2 +- .../cfn/packages/dynamodb/package.json | 3 +- .../blueprintgovernanceservice/.eslintrc.js | 4 +- .../initialRepoTemplates/cdk/package.json | 2 + .../cdk/packages/cdk-test-app/package.json | 1 + .../initialRepoTemplates/cfn/package.json | 2 + .../package-lock.json | 1884 ++++++++++++++--- .../blueprintgovernanceservice/package.json | 28 +- .../blueprintgovernanceservice/src/App.ts | 26 +- .../src/Container.ts | 25 +- .../AppRegistryUpdateHandler.ts | 2 +- .../src/appregistry-updater/MainHandler.ts | 6 +- .../src/codecommit/trigger-security-scan.ts | 8 +- .../src/common/AppRegistrySyncRequestQueue.ts | 6 +- .../src/common/AttributeBaseHandler.ts | 14 +- .../src/common/MainHandler.ts | 6 +- .../src/common/common-types.ts | 14 +- .../logging/context-logging-middleware.ts | 12 +- .../src/common/logging/logger-factory.ts | 6 +- .../src/common/metrics/operational-metric.ts | 2 +- .../src/common/middleware-chain.ts | 6 +- .../DependencyConfigurationProvider.ts | 12 +- .../src/common/response-formatter.ts | 8 +- .../src/common/router/RouteData.ts | 2 +- .../src/common/router/Router.ts | 10 +- .../validator/AttributePayloadValidator.ts | 4 +- .../src/email-sender/index.ts | 22 +- .../src/handlers/AttributeCreateHandler.ts | 12 +- .../src/handlers/AttributeDeleteHandler.ts | 12 +- .../handlers/AttributeGetDetailsHandler.ts | 4 +- .../src/handlers/AttributeListHandler.ts | 26 +- .../src/handlers/AttributeUpdateHandler.ts | 14 +- .../handlers/CreateBlueprintRequestHandler.ts | 26 +- .../GetAllBlueprintsRequestHandler.ts | 8 +- .../src/handlers/GetBlueprintInfoHandler.ts | 8 +- .../src/handlers/GetSubscriptionHandler.ts | 6 +- .../InitialiseBlueprintPipelineHandler.ts | 10 +- .../src/handlers/SubscribeHandler.ts | 14 +- .../UpdateBlueprintInfraStatusHandler.ts | 18 +- .../UpdateBlueprintMetaInfoHandler.ts | 10 +- .../src/metrics/OperationalMetricHandler.ts | 2 +- .../service/AppRegistryIntegrationService.ts | 20 +- .../src/service/BlueprintDBService.ts | 18 +- .../BlueprintPipelineBuilderService.ts | 2 +- .../BlueprintCodeCommitRepoBuilderService.ts | 41 +- .../BlueprintGitHubRepoBuilderService.ts | 52 +- .../IBlueprintRepoBuilderService.ts | 2 +- .../src/timed-synchroniser/MainHandler.ts | 6 +- .../timed-synchroniser/SyncEventHandler.ts | 4 +- .../test/unit/App.test.ts | 18 +- .../test/unit/Container.test.ts | 10 +- .../codecommit/trigger-security-scan.test.ts | 2 +- .../AppRegistrySyncRequestQueue.test.ts | 2 +- .../test/unit/common/Attribute.test.ts | 4 +- .../test/unit/common/LoggerFactory.test.ts | 14 +- .../DependencyConfigurationProvider.test.ts | 4 +- .../unit/common/response-formatter.test.ts | 16 +- .../configuration/AppConfiguration.test.ts | 6 +- .../handlers/AttributeCreateHandler.test.ts | 36 +- .../handlers/AttributeDeleteHandler.test.ts | 16 +- .../AttributeGetDetailHandler.test.ts | 10 +- .../handlers/AttributeListHandler.test.ts | 16 +- .../handlers/AttributeUpdateHandler.test.ts | 32 +- .../CreateBlueprintRequestHandler.test.ts | 40 +- .../GetAllBlueprintsRequestHandler.test.ts | 26 +- .../handlers/GetBlueprintInfoHandler.test.ts | 8 +- .../handlers/GetSubscriptionHandler.test.ts | 6 +- ...InitialiseBlueprintPipelineHandler.test.ts | 6 +- .../unit/handlers/SubscribeHandler.test.ts | 16 +- .../UpdateBlueprintInfraStatusHandler.test.ts | 8 +- .../UpdateBlueprintMetaInfoHandler.test.ts | 14 +- .../unit/services/BlueprintDBService.test.ts | 10 +- .../BlueprintPipelineBuilderService.test.ts | 4 +- ...eprintCodeCommitRepoBuilderService.test.ts | 20 +- .../BlueprintGitHubRepoBuilderService.test.ts | 52 +- .../SyncEventHandler.test.ts | 8 +- source/lib/app-registry-aspect.ts | 6 +- .../lib/blueprint-artifact-api-definition.ts | 2 +- source/lib/blueprint-authentication.ts | 61 +- source/lib/blueprint-backend.ts | 70 +- source/lib/blueprint-base-infra.ts | 16 +- source/lib/blueprint-frontend-config.ts | 2 +- source/lib/blueprint-frontend.ts | 8 +- ...lueprint-infrastructure-setup-construct.ts | 99 +- source/lib/blueprint-notification.ts | 10 +- source/lib/blueprint-portal-service.ts | 14 +- source/lib/blueprint-stack.ts | 17 +- source/lib/blueprint-types.ts | 8 + source/lib/cfn-nag-suppression.ts | 12 +- .../lib/infra-utils/ags-synthetics-canary.ts | 10 +- source/lib/infra-utils/aws-lambda-function.ts | 2 +- source/lib/infra-utils/aws-rest-api.ts | 14 +- source/lib/infra-utils/aws-secure-bucket.ts | 8 +- .../lib/infra-utils/aws-service-dashboard.ts | 86 +- source/lib/infra-utils/aws-waf-web-acl.ts | 2 +- source/lib/infra-utils/zip-bundle.ts | 4 +- source/lib/operational-metrics-construct.ts | 12 +- source/package-lock.json | 1702 +++++++++++++-- source/package.json | 21 +- 139 files changed, 5985 insertions(+), 1944 deletions(-) create mode 100644 source/blueprint-ui/src/components/core/HasPermission/index.test.tsx create mode 100644 source/blueprint-ui/src/components/core/HasPermission/index.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index d4d174c..ae225fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## [1.2.0] - 2023-08-08 + +### Added + +- Integrated CfnGuard and Checkov as additional IaC scanning tools for pattern validation. +- Added user role based access to the solution UI + +### Fixed + +- Pull request comments max size issue. + ## [1.1.0] - 2023-05-03 ### Added diff --git a/README.md b/README.md index 22ddac5..c95e342 100644 --- a/README.md +++ b/README.md @@ -178,7 +178,15 @@ By default, all solution data (S3 buckets, DynamoDB tables) will be removed when **Identity Provider configuration (optional)** -Users can sign into the solution web UI either directly through the user pool, or federate through a third-party identity provider (IdP) that supports OpenID Connect authentication. To federate through a third-party identity provider via OpenID Connect, add the following parameters to `source/cdk.json`: +Users can sign into the solution web UI either directly through the user pool, or federate through a third-party identity provider (IdP) that supports OpenID Connect authentication. + +The solution by default creates two user groups in Amazon Cognito user pool: +- SYSTEM_ADMIN: This user group has permissions to access all pages in the UI. The default user created by the solution is automatically added to this group when the solution is deployed. +- PATTERN_PUBLISHER: This group has permissions to create, update and view patterns. This group also allows you to view pattern attributes. To update or delete pattern attributes you would need to be in SYSTEM_ADMIN group. + +If you are federating through a third-party identity provider via OpenID Connect, please add a claim type of `group` in your IdP and map the roles that should relate to `SYSTEM_ADMIN` and `PATTERN_PUBLISHER` roles in Amazon Cognito. In absence of this mapping the federated user would only have read only access to the solution UI. + +To federate through a third-party identity provider via OpenID Connect, add the following parameters to `source/cdk.json`: ``` "identityProviderInfo": { @@ -202,11 +210,14 @@ Example: Identity provider configuration to federate through Auth0. "oidcIssuer": "https://dev-abcdefgx.us.auth0.com", "attributeMapping": { "email": "EMAIL", - "username": "sub" + "username": "sub", + "custom:groups": "groups" } } ``` +It's important to note that if you want to use user groups from your IdP please make sure you add `attributeMapping` to map your groups claim name with `custom:groups` (as in the example above). + **AWS WAF configuration (optional)** This solution provisions AWS WAF Web ACL for API Gateway resources, by default. For a CloudFront distribution WAF Web ACL, the solution allows users to associate their existing AWS WAF Web ACL for CloudFront with the CloudFront distribution created by the solution. Refer to the configuration options below for configuring your AWS WAF Web ACL. Note: The WAF configuration is optional. If you need to configure it, add this information to `source/cdk.json`. @@ -231,6 +242,35 @@ Example WAF Configuration: } ``` +**Security scanning tool configuration (optional)** + +This solution uses [CfnNag](https://github.com/stelligent/cfn_nag) as the default IaC security scanning tool. In addition to CfnNag, this solution also supports below security scanning tools: + +- [AWS CloudFormation Guard](https://github.com/aws-cloudformation/cloudformation-guard): +AWS CloudFormation Guard is a policy-as-code evaluation tool that is open source and can be used for checking the security posture of AWS CloudFormation templates. The solution also supports [AWS Rule Registry](https://github.com/aws-cloudformation/aws-guard-rules-registry) and allows users to configure [managed rule sets](https://github.com/aws-cloudformation/aws-guard-rules-registry#managed-rule-sets) against which the CloudFormation templates should be evaluated. + +- [Checkov](https://www.checkov.io/): +Checkov is another policy-as-code security evaluation tool which has over 1000 built in policies that covers security and compliance best practices for AWS + +If you need to configure it, add this information to `source/cdk.json`. + +``` +"securityScanTool": { + "name": "", + "cfnGuardManagedRuleSets": [(This is optional and only applicable if the name property is 'CfnGuard'. If not specified it defaults to 'wa-Security-Pillar' and 'wa-Reliability-Pillar'). A list of AWS managed rule sets against which the security posture of CloudFormation template needs to be evaluated.] +} +``` + +Example securityScanTool configuration: + +``` +"securityScanTool": { + "name": "CfnGuard", + "cfnGuardManagedRuleSets": [ "wa-Security-Pillar" ] +} +``` + + ### Build and deploy 1. Clone the solution source code from the GitHub repository. diff --git a/source/.eslintrc.js b/source/.eslintrc.js index e601840..13381ad 100644 --- a/source/.eslintrc.js +++ b/source/.eslintrc.js @@ -18,7 +18,7 @@ module.exports = { tsconfigRootDir: __dirname, project: ['./tsconfig.json'], }, - plugins: ['@typescript-eslint', 'header'], + plugins: ['@typescript-eslint', 'header', 'import'], rules: { 'header/header': [2, path.join(__dirname, 'LicenseHeader.txt')], @@ -35,7 +35,7 @@ module.exports = { { selector: 'typeLike', format: ['PascalCase'] }, ], '@typescript-eslint/no-confusing-void-expression': ['error'], - '@typescript-eslint/no-duplicate-imports': ['error'], + 'import/no-duplicates': ['error'], '@typescript-eslint/no-empty-interface': ['warn'], '@typescript-eslint/no-inferrable-types': ['warn'], '@typescript-eslint/no-invalid-void-type': ['error'], diff --git a/source/bin/blueprint-service-infra.ts b/source/bin/blueprint-service-infra.ts index 6cfd937..6c3c9de 100644 --- a/source/bin/blueprint-service-infra.ts +++ b/source/bin/blueprint-service-infra.ts @@ -58,6 +58,15 @@ if (githubConfig && !githubConfig.githubOrganization) { throw new Error('githubConfig is missing GitHubOrganization'); } +// Validate securityScanTool config input, if not provided, use CfnNag as default +const supportedScanningTools = ['CfnNag', 'CfnGuard', 'Checkov']; +let securityScanTool = app.node.tryGetContext('securityScanTool'); +securityScanTool = securityScanTool ?? { name: 'CfnNag' }; + +if (!supportedScanningTools.includes(securityScanTool.name)) { + throw new Error(`Unsupported security scanning tool: ${securityScanTool.name}`); +} + const stackName = 'ApoStack'; const blueprintStack = new BlueprintStack(app, { @@ -77,6 +86,7 @@ const blueprintStack = new BlueprintStack(app, { wafInfo, removalPolicy, logLevel, + securityScanTool, }); Aspects.of(app).add(new AwsSolutionsChecks()); @@ -89,7 +99,7 @@ Aspects.of(app).add( solutionName, applicationType: 'AWS-Solutions', applicationName: 'Application-Pattern-Orchestrator-on-AWS', - }) + }), ); // CFk Nag suppression for UpdateBlueprintInfrastructureProjectRole default policy @@ -102,7 +112,7 @@ NagSuppressions.addResourceSuppressionsByPath( reason: 'The IAM permission has wildcard attached as suffix to specific permission.', }, ], - true + true, ); // CFk Nag suppression for BlueprintArtifactsApiRole default policy @@ -115,7 +125,7 @@ NagSuppressions.addResourceSuppressionsByPath( reason: 'The IAM permission has wildcard attached as suffix to specific permission.', }, ], - true + true, ); // CFk Nag suppression for CDKBucketDeployment service role @@ -128,7 +138,7 @@ NagSuppressions.addResourceSuppressionsByPath( reason: 'Needs managed policy AWSLambdaBasicExecutionRole', }, ], - true + true, ); NagSuppressions.addResourceSuppressionsByPath( blueprintStack, @@ -139,7 +149,7 @@ NagSuppressions.addResourceSuppressionsByPath( reason: 'The IAM permission has wildcard attached as suffix to specific permission.', }, ], - true + true, ); NagSuppressions.addResourceSuppressionsByPath( blueprintStack, @@ -150,7 +160,7 @@ NagSuppressions.addResourceSuppressionsByPath( reason: 'Needs managed policy AWSLambdaBasicExecutionRole', }, ], - true + true, ); NagSuppressions.addResourceSuppressionsByPath( blueprintStack, @@ -161,7 +171,7 @@ NagSuppressions.addResourceSuppressionsByPath( reason: 'The IAM permission has wildcard attached as suffix to specific permission.', }, ], - true + true, ); // CFk Nag suppression for LogRetention default policy @@ -174,7 +184,7 @@ NagSuppressions.addResourceSuppressionsByPath( reason: 'Needs managed policy AWSLambdaBasicExecutionRole.', }, ], - true + true, ); NagSuppressions.addResourceSuppressionsByPath( blueprintStack, @@ -185,7 +195,7 @@ NagSuppressions.addResourceSuppressionsByPath( reason: 'Autogenerated by CDK.', }, ], - true + true, ); // CFk Nag suppression for UpdateBlueprintInfraStatusLambda default policy @@ -198,7 +208,7 @@ NagSuppressions.addResourceSuppressionsByPath( reason: 'The IAM permission has wildcard attached as suffix to specific permission.', }, ], - true + true, ); // CDK Nag CloudFront Distribution Suppression @@ -219,7 +229,7 @@ NagSuppressions.addResourceSuppressionsByPath( reason: 'This is subject to customer and it uses Cloudfront certificates', }, ], - true + true, ); // CDK Nag API Gateway suppressions @@ -235,7 +245,7 @@ NagSuppressions.addResourceSuppressionsByPath( id: 'AwsSolutions-COG4', reason: 'API Gateway OPTIONS method is created implicitly by CDK', }, - ] + ], ); NagSuppressions.addResourceSuppressionsByPath( blueprintStack, @@ -249,7 +259,7 @@ NagSuppressions.addResourceSuppressionsByPath( id: 'AwsSolutions-COG4', reason: 'API Gateway OPTIONS method is created implicitly by CDK', }, - ] + ], ); NagSuppressions.addResourceSuppressionsByPath( blueprintStack, @@ -263,7 +273,7 @@ NagSuppressions.addResourceSuppressionsByPath( id: 'AwsSolutions-COG4', reason: 'API Gateway OPTIONS method is created implicitly by CDK', }, - ] + ], ); NagSuppressions.addResourceSuppressionsByPath( blueprintStack, @@ -277,7 +287,7 @@ NagSuppressions.addResourceSuppressionsByPath( id: 'AwsSolutions-COG4', reason: 'API Gateway OPTIONS method is created implicitly by CDK', }, - ] + ], ); NagSuppressions.addResourceSuppressionsByPath( blueprintStack, @@ -291,7 +301,7 @@ NagSuppressions.addResourceSuppressionsByPath( id: 'AwsSolutions-COG4', reason: 'API Gateway OPTIONS method is created implicitly by CDK', }, - ] + ], ); NagSuppressions.addResourceSuppressionsByPath( blueprintStack, @@ -305,7 +315,7 @@ NagSuppressions.addResourceSuppressionsByPath( id: 'AwsSolutions-COG4', reason: 'API Gateway OPTIONS method is created implicitly by CDK', }, - ] + ], ); NagSuppressions.addResourceSuppressionsByPath( blueprintStack, @@ -319,7 +329,7 @@ NagSuppressions.addResourceSuppressionsByPath( id: 'AwsSolutions-COG4', reason: 'API Gateway OPTIONS method is created implicitly by CDK', }, - ] + ], ); NagSuppressions.addResourceSuppressionsByPath( blueprintStack, @@ -333,7 +343,7 @@ NagSuppressions.addResourceSuppressionsByPath( id: 'AwsSolutions-COG4', reason: 'API Gateway OPTIONS method is created implicitly by CDK', }, - ] + ], ); NagSuppressions.addResourceSuppressionsByPath( blueprintStack, @@ -347,7 +357,7 @@ NagSuppressions.addResourceSuppressionsByPath( id: 'AwsSolutions-COG4', reason: 'API Gateway OPTIONS method is created implicitly by CDK', }, - ] + ], ); NagSuppressions.addResourceSuppressionsByPath( blueprintStack, @@ -361,7 +371,7 @@ NagSuppressions.addResourceSuppressionsByPath( id: 'AwsSolutions-COG4', reason: 'API Gateway OPTIONS method is created implicitly by CDK', }, - ] + ], ); // CfnNag suppressions diff --git a/source/blueprint-infrastructure/.eslintrc.js b/source/blueprint-infrastructure/.eslintrc.js index e601840..13381ad 100644 --- a/source/blueprint-infrastructure/.eslintrc.js +++ b/source/blueprint-infrastructure/.eslintrc.js @@ -18,7 +18,7 @@ module.exports = { tsconfigRootDir: __dirname, project: ['./tsconfig.json'], }, - plugins: ['@typescript-eslint', 'header'], + plugins: ['@typescript-eslint', 'header', 'import'], rules: { 'header/header': [2, path.join(__dirname, 'LicenseHeader.txt')], @@ -35,7 +35,7 @@ module.exports = { { selector: 'typeLike', format: ['PascalCase'] }, ], '@typescript-eslint/no-confusing-void-expression': ['error'], - '@typescript-eslint/no-duplicate-imports': ['error'], + 'import/no-duplicates': ['error'], '@typescript-eslint/no-empty-interface': ['warn'], '@typescript-eslint/no-inferrable-types': ['warn'], '@typescript-eslint/no-invalid-void-type': ['error'], diff --git a/source/blueprint-infrastructure/bin/blueprint-infrastructure.ts b/source/blueprint-infrastructure/bin/blueprint-infrastructure.ts index aab68fc..f805939 100644 --- a/source/blueprint-infrastructure/bin/blueprint-infrastructure.ts +++ b/source/blueprint-infrastructure/bin/blueprint-infrastructure.ts @@ -32,7 +32,7 @@ const blueprintId: string = app.node.tryGetContext('blueprintId'); const blueprintType: BlueprintType = app.node.tryGetContext('blueprintType'); const blueprintInfrastructureSharedConfigJson = app.node.tryGetContext( - 'blueprintInfrastructureSharedConfigJson' + 'blueprintInfrastructureSharedConfigJson', ); const repositoryName = app.node.tryGetContext('repositoryName'); @@ -65,7 +65,7 @@ if (githubConnectionArn && githubRepositoryOwner) { const infraStack = new BlueprintInfrastructureStack( app, `BlueprintInfrastructureStack${blueprintId}`, - blueprintInfraStackProps + blueprintInfraStackProps, ); Aspects.of(infraStack).add(new CfnNagCustomResourceSuppressionAspect()); Aspects.of(infraStack).add(new CfnNagServiceRoleDefaultPolicyResourceSuppressionAspect()); diff --git a/source/blueprint-infrastructure/lambda/codepipeline/blueprint/common.ts b/source/blueprint-infrastructure/lambda/codepipeline/blueprint/common.ts index a1834d0..d885aa6 100644 --- a/source/blueprint-infrastructure/lambda/codepipeline/blueprint/common.ts +++ b/source/blueprint-infrastructure/lambda/codepipeline/blueprint/common.ts @@ -17,7 +17,7 @@ import { DynamoDBDocumentClient, GetCommand } from '@aws-sdk/lib-dynamodb'; export async function getPatternById( ddbDocClient: DynamoDBDocumentClient, - patternId: string + patternId: string, // eslint-disable-next-line @typescript-eslint/no-explicit-any ): Promise | undefined> { const params = { diff --git a/source/blueprint-infrastructure/lambda/codepipeline/blueprint/publish.ts b/source/blueprint-infrastructure/lambda/codepipeline/blueprint/publish.ts index 635fb44..776db86 100644 --- a/source/blueprint-infrastructure/lambda/codepipeline/blueprint/publish.ts +++ b/source/blueprint-infrastructure/lambda/codepipeline/blueprint/publish.ts @@ -102,7 +102,7 @@ export async function getProduct(name: string): Promise { let product; try { @@ -131,7 +131,7 @@ export async function createProduct( }, Type: SERVICE_CATALOG_PRODUCT_TYPE, }, - }) + }), ); logger.info(`product created: ${JSON.stringify(product, null, 4)}`); } catch (err) { @@ -144,7 +144,7 @@ export async function createProduct( new AssociateProductWithPortfolioCommand({ PortfolioId: BLUEPRINT_SERVICE_CATALOG_PORTFOLIO_ID, ProductId: product.ProductViewDetail?.ProductViewSummary?.ProductId, - }) + }), ); logger.info(`Attached: ${JSON.stringify(attachmentResp)}`); } catch (err) { @@ -159,7 +159,7 @@ export async function createProvisioningArtifact( productId: string, version: string, templateUrl: string, - description: string + description: string, ): Promise { return serviceCatalogClient.send( new CreateProvisioningArtifactCommand({ @@ -172,7 +172,7 @@ export async function createProvisioningArtifact( }, Type: SERVICE_CATALOG_PRODUCT_TYPE, }, - }) + }), ); } @@ -214,18 +214,18 @@ export async function handler(event: CodePipelineEvent, context: Context): Promi const changedPackagesParsed = CHANGED_PACKAGES ? JSON.parse( // The products JSON is base 64 encoded by the publish handler - Buffer.from(CHANGED_PACKAGES, 'base64').toString() + Buffer.from(CHANGED_PACKAGES, 'base64').toString(), ) : undefined; logger.info( - 'changedPackagesParsed: ' + JSON.stringify(changedPackagesParsed, null, 4) + 'changedPackagesParsed: ' + JSON.stringify(changedPackagesParsed, null, 4), ); const allPackagesParsed = ALL_PACKAGES ? JSON.parse( // The products JSON is base 64 encoded by the publish handler - Buffer.from(ALL_PACKAGES, 'base64').toString() + Buffer.from(ALL_PACKAGES, 'base64').toString(), ) : undefined; @@ -240,18 +240,18 @@ export async function handler(event: CodePipelineEvent, context: Context): Promi name: changedPackagesItem.name, version: allPackagesParsed.find( (allPackagesItem: NpmPackageDetails) => - allPackagesItem.name === changedPackagesItem.name + allPackagesItem.name === changedPackagesItem.name, ).version, location: changedPackagesItem.location, - }) + }), ); for (const npmPackage of changedPackagesParsedSyncVersions) { logger.info( - `Creating new version ${npmPackage.version} from template in package ${npmPackage.name}` + `Creating new version ${npmPackage.version} from template in package ${npmPackage.name}`, ); const templatePathFromPackages = npmPackage.location.substring( - npmPackage.location.lastIndexOf('/packages') + npmPackage.location.lastIndexOf('/packages'), ); const s3GetObjResp = await s3Client.send( @@ -259,12 +259,12 @@ export async function handler(event: CodePipelineEvent, context: Context): Promi Bucket: `${BLUEPRINT_ARTIFACTS_BUCKET_NAME}`, MaxKeys: 1, Prefix: `${TEMPLATES_ARTIFACTS_LOCATION}${templatePathFromPackages}/template/`, - }) + }), ); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const s3GetObjKey = s3GetObjResp.Contents![0].Key!; const s3CfnTemplateFileName = s3GetObjKey.substring( - s3GetObjKey.lastIndexOf('/template') + s3GetObjKey.lastIndexOf('/template'), ); const templateS3ObjectKey = `${TEMPLATES_ARTIFACTS_LOCATION}${templatePathFromPackages}${s3CfnTemplateFileName}`; const templateUrl = `https://${BLUEPRINT_ARTIFACTS_BUCKET_NAME}.s3.${AWS_REGION}.amazonaws.com/${templateS3ObjectKey}`; @@ -275,7 +275,7 @@ export async function handler(event: CodePipelineEvent, context: Context): Promi await embedAttributeGroupMapping( patternDetails.attributes, BLUEPRINT_ARTIFACTS_BUCKET_NAME as string, - templateS3ObjectKey + templateS3ObjectKey, ); } const product: DescribeProductAsAdminCommandOutput | undefined = @@ -283,14 +283,14 @@ export async function handler(event: CodePipelineEvent, context: Context): Promi if (product?.ProductViewDetail?.ProductViewSummary?.ProductId) { logger.info( - 'Product already exists in service catalog, creating a new version' + 'Product already exists in service catalog, creating a new version', ); const result = (await createProvisioningArtifact( product.ProductViewDetail.ProductViewSummary.ProductId, npmPackage.version, templateUrl, - patternDetails?.description + patternDetails?.description, )) as CreateProvisioningArtifactCommandOutput; changedBlueprintProducts.push({ name: productName, @@ -305,7 +305,7 @@ export async function handler(event: CodePipelineEvent, context: Context): Promi productName, npmPackage.version, templateUrl, - patternDetails?.description + patternDetails?.description, )) as CreateProductCommandOutput; changedBlueprintProducts.push({ @@ -323,8 +323,8 @@ export async function handler(event: CodePipelineEvent, context: Context): Promi changedPackagesParsedSyncVersions.map((item: NpmPackageDetails) => ({ name: item.name, version: item.version, - })) - ) + })), + ), ).toString('base64'); allPackagesOutputVariable = allPackagesParsed ? Buffer.from( @@ -332,16 +332,16 @@ export async function handler(event: CodePipelineEvent, context: Context): Promi allPackagesParsed.map((item: NpmPackageDetails) => ({ name: item.name, version: item.version, - })) - ) + })), + ), ).toString('base64') : ''; const unchangedPackages = allPackagesParsed.filter( (arr1Obj: NpmPackageDetails) => !changedPackagesParsed.some( - (arr2Obj: NpmPackageDetails) => arr1Obj.name === arr2Obj.name - ) + (arr2Obj: NpmPackageDetails) => arr1Obj.name === arr2Obj.name, + ), ); allBlueprintProducts = [...changedBlueprintProducts]; for (const unchangedPackage of unchangedPackages) { @@ -365,15 +365,15 @@ export async function handler(event: CodePipelineEvent, context: Context): Promi outputVariables: { // Need to base 64 encode the below json strings because output variables get JSON encoded CHANGED_SERVICE_CATALOG_PRODUCTS: Buffer.from( - JSON.stringify(changedBlueprintProducts) + JSON.stringify(changedBlueprintProducts), ).toString('base64'), ALL_SERVICE_CATALOG_PRODUCTS: Buffer.from( - JSON.stringify(allBlueprintProducts) + JSON.stringify(allBlueprintProducts), ).toString('base64'), CHANGED_PACKAGES: changedPackagesOutputVariable, ALL_PACKAGES: allPackagesOutputVariable, }, - }) + }), ); } catch (e) { logger.error(`Error: ${JSON.stringify(e)}`); @@ -385,7 +385,7 @@ export async function handler(event: CodePipelineEvent, context: Context): Promi type: 'JobFailed', externalExecutionId: context.awsRequestId, }, - }) + }), ); throw e; } @@ -406,10 +406,10 @@ export function streamToString(stream: Readable): Promise { async function embedAttributeGroupMapping( patternAttributes: Record, blueprintArtifactsBucketName: string, - s3CfnObjectKey: string + s3CfnObjectKey: string, ): Promise { const attributeGroupNames = Object.entries(patternAttributes).map( - ([key, value]) => `APO.${key.toUpperCase()}.${value.toUpperCase()}` + ([key, value]) => `APO.${key.toUpperCase()}.${value.toUpperCase()}`, ); const bucketParams = { Bucket: blueprintArtifactsBucketName, @@ -429,8 +429,8 @@ async function embedAttributeGroupMapping( } catch (e) { logger.error( `Unable to parse the cloudformation template : ${blueprintArtifactsBucketName}, ${s3CfnObjectKey}, error: ${JSON.stringify( - e - )}` + e, + )}`, ); throw e; } @@ -473,6 +473,6 @@ async function embedAttributeGroupMapping( Bucket: blueprintArtifactsBucketName, Key: s3CfnObjectKey, Body: finalCfnTemplate, - }) + }), ); } diff --git a/source/blueprint-infrastructure/lambda/codepipeline/blueprint/register.ts b/source/blueprint-infrastructure/lambda/codepipeline/blueprint/register.ts index 35631c2..8da251a 100644 --- a/source/blueprint-infrastructure/lambda/codepipeline/blueprint/register.ts +++ b/source/blueprint-infrastructure/lambda/codepipeline/blueprint/register.ts @@ -55,7 +55,7 @@ const snsClient = new SNSClient(awsSdkConfiguration); const codepipelineClient = new CodePipelineClient(awsSdkConfiguration); async function registerBlueprintVersion( - item: Partial + item: Partial, ): Promise { // Inserting publish data and updating lastCommitId in metadata table in a transaction await ddbDocClient.transactWrite({ @@ -85,7 +85,7 @@ async function registerBlueprintVersion( } export async function notifySubscribers( - item: Partial + item: Partial, ): Promise { const patternDetails = await getPatternById(ddbDocClient, item.patternId as string); @@ -173,14 +173,14 @@ export async function handler(event: CodePipelineEvent, context: Context): Promi const changedPackagesParsed = CHANGED_PACKAGES ? JSON.parse( // The products JSON is base 64 encoded by the publish handler - Buffer.from(CHANGED_PACKAGES, 'base64').toString() + Buffer.from(CHANGED_PACKAGES, 'base64').toString(), ) : undefined; const allPackagesParsed = ALL_PACKAGES ? JSON.parse( // The products JSON is base 64 encoded by the publish handler - Buffer.from(ALL_PACKAGES, 'base64').toString() + Buffer.from(ALL_PACKAGES, 'base64').toString(), ) : undefined; @@ -189,9 +189,9 @@ export async function handler(event: CodePipelineEvent, context: Context): Promi name: changedPackagesItem.name, version: allPackagesParsed.find( (allPackagesItem: NpmPackageDetails) => - allPackagesItem.name === changedPackagesItem.name + allPackagesItem.name === changedPackagesItem.name, ).version, - }) + }), ); if ( @@ -207,7 +207,7 @@ export async function handler(event: CodePipelineEvent, context: Context): Promi (allPackagesItem: NpmPackageDetails) => ({ name: allPackagesItem.name, version: allPackagesItem.version, - }) + }), ); const artifacts: BlueprintArtifact[] = []; @@ -249,13 +249,13 @@ export async function handler(event: CodePipelineEvent, context: Context): Promi const changedServiceCatalogProducts = CHANGED_SERVICE_CATALOG_PRODUCTS ? JSON.parse( // The products JSON is base 64 encoded by the publish handler - Buffer.from(CHANGED_SERVICE_CATALOG_PRODUCTS, 'base64').toString() + Buffer.from(CHANGED_SERVICE_CATALOG_PRODUCTS, 'base64').toString(), ) : undefined; const allServiceCatalogProducts = ALL_SERVICE_CATALOG_PRODUCTS ? JSON.parse( // The products JSON is base 64 encoded by the publish handler - Buffer.from(ALL_SERVICE_CATALOG_PRODUCTS, 'base64').toString() + Buffer.from(ALL_SERVICE_CATALOG_PRODUCTS, 'base64').toString(), ) : undefined; @@ -285,7 +285,7 @@ export async function handler(event: CodePipelineEvent, context: Context): Promi await codepipelineClient.send( new PutJobSuccessResultCommand({ jobId, - }) + }), ); } catch (e) { logger.error(`Error: ${JSON.stringify(e)}`); @@ -297,7 +297,7 @@ export async function handler(event: CodePipelineEvent, context: Context): Promi type: 'JobFailed', externalExecutionId: context.awsRequestId, }, - }) + }), ); throw e; } diff --git a/source/blueprint-infrastructure/lambda/common/logger-factory.ts b/source/blueprint-infrastructure/lambda/common/logger-factory.ts index 0782653..e322714 100644 --- a/source/blueprint-infrastructure/lambda/common/logger-factory.ts +++ b/source/blueprint-infrastructure/lambda/common/logger-factory.ts @@ -31,7 +31,7 @@ export class StaticLoggerFactory implements LoggerFactory { winston.format.label({ label: name }), winston.format.timestamp(), winston.format.splat(), - winston.format.json() + winston.format.json(), ), level: logLevel ?? DEFAULT_LOG_LEVEL, }); diff --git a/source/blueprint-infrastructure/lambda/github/createWebhook.ts b/source/blueprint-infrastructure/lambda/github/createWebhook.ts index a75d56c..d2bc061 100644 --- a/source/blueprint-infrastructure/lambda/github/createWebhook.ts +++ b/source/blueprint-infrastructure/lambda/github/createWebhook.ts @@ -44,12 +44,12 @@ async function deleteCodebuildGithubWebhook(projectName: string): Promise await codebuildClient.send( new DeleteWebhookCommand({ projectName, - }) + }), ); } async function createCodebuildGithubWebhook( - projectName: string + projectName: string, // eslint-disable-next-line @typescript-eslint/no-explicit-any ): Promise> { const { webhook } = await codebuildClient.send( @@ -64,7 +64,7 @@ async function createCodebuildGithubWebhook( }, ], ], - }) + }), ); if (!webhook?.payloadUrl) { @@ -78,7 +78,7 @@ async function getGithubToken(): Promise { const { SecretString } = await secretsManagerClient.send( new GetSecretValueCommand({ SecretId: GITHUB_TOKEN_SECRET_ID, - }) + }), ); if (!SecretString) { @@ -90,7 +90,7 @@ async function getGithubToken(): Promise { async function createGithubWebhook( payloadUrl: string, - secret: string | undefined + secret: string | undefined, // eslint-disable-next-line @typescript-eslint/no-explicit-any ): Promise> { const githubToken = await getGithubToken(); @@ -129,8 +129,8 @@ export async function handler(event: CloudFormationCustomResourceEvent): Promise const response = await createCodebuildGithubWebhook(PROJECT_NAME); logger.info( `Successfully created Codebuild Github webhook: ${JSON.stringify( - response - )}` + response, + )}`, ); } catch (err) { logger.error(`Could not create webhook: ${JSON.stringify(err)}`); @@ -139,7 +139,7 @@ export async function handler(event: CloudFormationCustomResourceEvent): Promise await deleteCodebuildGithubWebhook(PROJECT_NAME); } catch (err2) { logger.error( - `Could not delete Codebuild Github webhook: ${JSON.stringify(err2)}` + `Could not delete Codebuild Github webhook: ${JSON.stringify(err2)}`, ); } throw new Error(`Could not create Codebuild Github webhook: ${err}`); @@ -151,7 +151,7 @@ export async function handler(event: CloudFormationCustomResourceEvent): Promise } catch (err) { // Ignore webhook clean up failures logger.error( - `Could not delete Codebuild Github webhook: ${JSON.stringify(err)}` + `Could not delete Codebuild Github webhook: ${JSON.stringify(err)}`, ); } } diff --git a/source/blueprint-infrastructure/lib/blueprint-infrastructure-stack.ts b/source/blueprint-infrastructure/lib/blueprint-infrastructure-stack.ts index a64b06d..0d6c0f5 100644 --- a/source/blueprint-infrastructure/lib/blueprint-infrastructure-stack.ts +++ b/source/blueprint-infrastructure/lib/blueprint-infrastructure-stack.ts @@ -98,12 +98,12 @@ export class BlueprintInfrastructureStack extends Stack { public constructor( scope: Construct, id: string, - props: BlueprintInfrastructureStackProps + props: BlueprintInfrastructureStackProps, ) { super(scope, id, props); const sharedConfig: BlueprintInfraSharedConfig = JSON.parse( - props.blueprintInfrastructureSharedConfigJson + props.blueprintInfrastructureSharedConfigJson, ); // Lookup the VPC where the compute resources will get created @@ -114,7 +114,7 @@ export class BlueprintInfrastructureStack extends Stack { const securityGroup = SecurityGroup.fromSecurityGroupId( this, 'BlueprintInfrastructureSecurityGroup', - sharedConfig.blueprintInfrastructureSecurityGroupId + sharedConfig.blueprintInfrastructureSecurityGroupId, ); // Generate the buildspec for the automated security check @@ -125,13 +125,14 @@ export class BlueprintInfrastructureStack extends Stack { props.blueprintType, 'PR', patternRepoType, + sharedConfig.securityScanTool, sharedConfig.proxyUri, props.githubConfig ? sharedConfig.githubConfig?.githubTokenSecretId : undefined, props.githubConfig ? sharedConfig.githubConfig?.githubUrl : undefined, props.repositoryName, - props.githubConfig ? props.githubConfig.githubOrganization : undefined + props.githubConfig ? props.githubConfig.githubOrganization : undefined, ); // Generate the buildspec for the build stage in the publishing pipeline @@ -139,7 +140,8 @@ export class BlueprintInfrastructureStack extends Stack { props.blueprintType, 'Pipeline', patternRepoType, - sharedConfig.proxyUri + sharedConfig.securityScanTool, + sharedConfig.proxyUri, ); // Create the codebuild project that will automatically run checks on source repo PRs @@ -148,6 +150,7 @@ export class BlueprintInfrastructureStack extends Stack { description: `Automated security checks for blueprint ${props.blueprintId}`, environment: { buildImage: LinuxBuildImage.STANDARD_7_0, + privileged: true, }, source: props.githubConfig ? sharedConfig.githubConfig?.githubUrl @@ -162,7 +165,7 @@ export class BlueprintInfrastructureStack extends Stack { repository: Repository.fromRepositoryName( this, `CodeCommitRepo${props.repositoryName}`, - props.repositoryName + props.repositoryName, ), }), buildSpec: BuildSpec.fromObject(buildSpecForSecurityCheckTriggerTypePr), @@ -182,7 +185,7 @@ export class BlueprintInfrastructureStack extends Stack { `arn:aws:secretsmanager:${this.region}:${this.account}:secret:${sharedConfig.githubConfig?.githubTokenSecretId}*`, ], actions: ['secretsmanager:GetSecretValue'], - }) + }), ); } else { checksProject.addToRolePolicy( @@ -197,7 +200,7 @@ export class BlueprintInfrastructureStack extends Stack { 'codecommit:GetPullRequest', 'codecommit:UpdatePullRequestApprovalState', ], - }) + }), ); } @@ -213,7 +216,7 @@ export class BlueprintInfrastructureStack extends Stack { reason: 'The policy is implicitly generated by CDK.', }, ], - 'PolicyDocument' + 'PolicyDocument', ); Aspects.of(checksProject).add( new CfnNagResourcePathEndingWithSuppressionAspect('/SecurityGroup/Resource', [ @@ -225,7 +228,7 @@ export class BlueprintInfrastructureStack extends Stack { id: 'W5', reason: 'Security group is created by CDK and is egress only', }, - ]) + ]), ); const blueprintPublicationPipelineConstructProps: BlueprintPublicationPipelineConstructProps = @@ -265,7 +268,7 @@ export class BlueprintInfrastructureStack extends Stack { const codeCommitPatternRepo = Repository.fromRepositoryName( this, `${props.repositoryName}`, - props.repositoryName + props.repositoryName, ); blueprintPublicationPipelineConstructProps.codeCommitPipelineConfig = { patternRepository: codeCommitPatternRepo, @@ -274,11 +277,11 @@ export class BlueprintInfrastructureStack extends Stack { const codeCommitPatternRepoNotificationTopic = Topic.fromTopicArn( this, `codeCommitPatternRepoNotificationTopic-${codeCommitPatternRepo.repositoryName}`, - sharedConfig.codeCommitConfig.patternRepoNotificationTopicArn + sharedConfig.codeCommitConfig.patternRepoNotificationTopicArn, ); const synthTimeRegion = Arn.split( sharedConfig.codeCommitConfig.patternRepoNotificationTopicArn, - ArnFormat.NO_RESOURCE_NAME + ArnFormat.NO_RESOURCE_NAME, ).region; codeCommitPatternRepo.notifyOn( `codecommitPatternRepoNotification-${synthTimeRegion}-${codeCommitPatternRepo.repositoryName}`, @@ -289,7 +292,7 @@ export class BlueprintInfrastructureStack extends Stack { RepositoryNotificationEvents.PULL_REQUEST_SOURCE_UPDATED, ], detailType: DetailType.BASIC, - } + }, ); } else { throw new Error('Neither GitHub nor CodeCommit config supplied'); @@ -299,13 +302,13 @@ export class BlueprintInfrastructureStack extends Stack { const publicationPipelineConstruct = new BlueprintPublicationPipelineConstruct( this, 'BlueprintPublicationPipeline', - blueprintPublicationPipelineConstructProps + blueprintPublicationPipelineConstructProps, ); this.publicationPipelineCfnNagSuppressions(publicationPipelineConstruct); } private publicationPipelineCfnNagSuppressions( - publicationPipelineConstruct: BlueprintPublicationPipelineConstruct + publicationPipelineConstruct: BlueprintPublicationPipelineConstruct, ): void { Aspects.of(publicationPipelineConstruct).add( new CfnNagResourcePathEndingWithSuppressionAspect( @@ -319,8 +322,8 @@ export class BlueprintInfrastructureStack extends Stack { id: 'W76', reason: 'The policy is implicitly generated by CDK.', }, - ] - ) + ], + ), ); Aspects.of(publicationPipelineConstruct).add( new CfnNagResourcePathEndingWithSuppressionAspect('/DefaultPolicy/Resource', [ @@ -328,7 +331,7 @@ export class BlueprintInfrastructureStack extends Stack { id: 'W76', reason: 'The policy is implicitly generated by CDK.', }, - ]) + ]), ); Aspects.of(publicationPipelineConstruct).add( new CfnNagResourcePathEndingWithSuppressionAspect('/SecurityGroup/Resource', [ @@ -340,7 +343,7 @@ export class BlueprintInfrastructureStack extends Stack { id: 'W5', reason: 'Security group is created by CDK and is egress only', }, - ]) + ]), ); } @@ -380,7 +383,7 @@ export class BlueprintInfrastructureStack extends Stack { SOLUTION_USER_AGENT: params.customUserAgent, LOG_LEVEL: params.logLevel, }, - } + }, ); addCfnNagSuppression(createGithubWebhookFunction, [ { @@ -402,7 +405,7 @@ export class BlueprintInfrastructureStack extends Stack { id: 'W5', reason: 'Security group is created by CDK and is egress only', }, - ]) + ]), ); createGithubWebhookFunction.addToRolePolicy( @@ -410,7 +413,7 @@ export class BlueprintInfrastructureStack extends Stack { effect: Effect.ALLOW, resources: [params.project.projectArn], actions: ['codebuild:CreateWebhook'], - }) + }), ); createGithubWebhookFunction.addToRolePolicy( @@ -420,7 +423,7 @@ export class BlueprintInfrastructureStack extends Stack { `arn:aws:secretsmanager:${this.region}:${this.account}:secret:${params.githubTokenSecretId}*`, ], actions: ['secretsmanager:GetSecretValue'], - }) + }), ); const createGithubWebhookProvider = new custom_resources.Provider( @@ -430,7 +433,7 @@ export class BlueprintInfrastructureStack extends Stack { onEventHandler: createGithubWebhookFunction, vpc: params.vpc, securityGroups: [params.securityGroup], - } + }, ); Aspects.of(createGithubWebhookProvider).add( new CfnNagResourcePathEndingWithSuppressionAspect( @@ -444,8 +447,8 @@ export class BlueprintInfrastructureStack extends Stack { id: 'W92', reason: 'Lambda is automatically created by CDK', }, - ] - ) + ], + ), ); Aspects.of(createGithubWebhookProvider).add( new CfnNagResourcePathEndingWithSuppressionAspect( @@ -459,8 +462,8 @@ export class BlueprintInfrastructureStack extends Stack { id: 'W5', reason: 'Security group is created by CDK and is egress only', }, - ] - ) + ], + ), ); new CustomResource(this, 'CreateGithubWebhookResource', { diff --git a/source/blueprint-infrastructure/lib/blueprint-infrastructure-types.ts b/source/blueprint-infrastructure/lib/blueprint-infrastructure-types.ts index 7b01038..4a08e43 100644 --- a/source/blueprint-infrastructure/lib/blueprint-infrastructure-types.ts +++ b/source/blueprint-infrastructure/lib/blueprint-infrastructure-types.ts @@ -50,10 +50,18 @@ export interface BlueprintInfraSharedConfig { solutionName: string; solutionTradeMarkName: string; logLevel: LogLevelType; + securityScanTool: SecurityScanTool; githubConfig?: GithubConfigBlueprintInfraSharedConfig; codeCommitConfig?: CodeCommitConfig; } +export interface SecurityScanTool { + name: SecurityScanToolName; + cfnGuardManagedRuleSets?: string[]; +} + +export type SecurityScanToolName = 'CfnGuard' | 'CfnNag' | 'Checkov'; + export type GithubConfigBlueprintInfraSharedConfig = Pick< GithubConfig, 'githubUrl' | 'githubTokenSecretId' diff --git a/source/blueprint-infrastructure/lib/blueprint-publication-pipeline-construct.ts b/source/blueprint-infrastructure/lib/blueprint-publication-pipeline-construct.ts index 5553081..2f12855 100644 --- a/source/blueprint-infrastructure/lib/blueprint-publication-pipeline-construct.ts +++ b/source/blueprint-infrastructure/lib/blueprint-publication-pipeline-construct.ts @@ -89,14 +89,14 @@ export class BlueprintPublicationPipelineConstruct extends Construct { public constructor( scope: Construct, id: string, - props: BlueprintPublicationPipelineConstructProps + props: BlueprintPublicationPipelineConstructProps, ) { super(scope, id); const { s3Bucket: pipelineArtifactsBucket } = this.createPipelineArtifactBucket( props.blueprintId, props.blueprintType, - props.sharedConfig.s3BucketEncryptionKeyARN + props.sharedConfig.s3BucketEncryptionKeyARN, ); const blueprintPortalUrl = Fn.importValue('rapmExportedPortalUrl'); @@ -119,7 +119,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { reason: 'The policy is automatically generated by CDK.', }, ], - 'DefaultPolicy' + 'DefaultPolicy', ); Aspects.of(pipeline).add( new CfnNagResourcePathEndingWithSuppressionAspect( @@ -133,8 +133,8 @@ export class BlueprintPublicationPipelineConstruct extends Construct { id: 'W76', reason: 'The policy is automatically generated by CDK.', }, - ] - ) + ], + ), ); pipelineArtifactsBucket.grantReadWrite(pipeline.role); @@ -149,7 +149,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { 'codecommit:GetRepository', ], resources: [`*`], - }) + }), ); const sourceVariablesNamespace = 'SourceVariables'; @@ -161,7 +161,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { const blueprintInfrastructureBucket = Bucket.fromBucketName( this, 'BlueprintInfrastructureBucket', - props.sharedConfig.blueprintInfrastructureBucketName + props.sharedConfig.blueprintInfrastructureBucketName, ); const sourceStageActions: IAction[] = [ @@ -187,7 +187,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { variablesNamespace: sourceVariablesNamespace, // Cloning the output allows to use semantic-release from codepipeline codeBuildCloneOutput: true, - }) + }), ); } else if (props.codeCommitPipelineConfig) { sourceStageActions.unshift( @@ -198,11 +198,11 @@ export class BlueprintPublicationPipelineConstruct extends Construct { branch: props.repositoryMainBranchName, variablesNamespace: sourceVariablesNamespace, codeBuildCloneOutput: true, - }) + }), ); } else { throw new Error( - 'Neither GitHub nor CodeCommit config passed to pattern pipeline construct' + 'Neither GitHub nor CodeCommit config passed to pattern pipeline construct', ); } @@ -215,7 +215,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { const updateBlueprintInfrastructureProject = Project.fromProjectName( this, 'UpdateBlueprintInfrastructureProject', - props.sharedConfig.updateBlueprintInfrastructureProjectName + props.sharedConfig.updateBlueprintInfrastructureProjectName, ); const updatePipelineActionEnvVars: Record = { @@ -257,6 +257,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { project: new Project(this, 'Build', { environment: { buildImage: LinuxBuildImage.STANDARD_7_0, + privileged: true, }, buildSpec: BuildSpec.fromObject(props.buildSpec), vpc: props.vpc, @@ -280,7 +281,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { const artifactsBucket = Bucket.fromBucketName( this, 'BlueprintBuildArtifactsBucket', - props.sharedConfig.blueprintArtifactsBucketName + props.sharedConfig.blueprintArtifactsBucketName, ); const storeArtifactsRole = new Role(this, 'StoreArtifactsRole', { @@ -295,7 +296,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { resources: [ `${props.sharedConfig.blueprintArtifactsBucketEncryptionKeyArn}`, ], - }) + }), ); pipeline.addStage({ @@ -338,7 +339,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { const releaseBuildSpec = generateReleaseStageBuildspec( props.blueprintType, - props.sharedConfig.proxyUri + props.sharedConfig.proxyUri, ); const releaseProject = new Project(this, 'Release', { @@ -378,7 +379,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { resources: [ `arn:aws:codecommit:${Aws.REGION}:${Aws.ACCOUNT_ID}:${props.repositoryName}`, ], - }) + }), ); } @@ -395,7 +396,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { resources: [ `arn:aws:codeartifact:${Aws.REGION}:${Aws.ACCOUNT_ID}:domain/${props.sharedConfig.codeArtifactDomainName}`, ], - }) + }), ); releaseProject.addToRolePolicy( new PolicyStatement({ @@ -404,7 +405,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { resources: [ `arn:aws:codeartifact:${Aws.REGION}:${Aws.ACCOUNT_ID}:repository/${props.sharedConfig.codeArtifactDomainName}/${props.sharedConfig.codeArtifactRepositoryName}`, ], - }) + }), ); releaseProject.addToRolePolicy( new PolicyStatement({ @@ -413,7 +414,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { resources: [ `arn:aws:codeartifact:${Aws.REGION}:${Aws.ACCOUNT_ID}:package/${props.sharedConfig.codeArtifactDomainName}/${props.sharedConfig.codeArtifactRepositoryName}*`, ], - }) + }), ); releaseProject.addToRolePolicy( new PolicyStatement({ @@ -425,7 +426,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { 'sts:AWSServiceName': 'codeartifact.amazonaws.com', }, }, - }) + }), ); } @@ -452,7 +453,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { handler: 'handler', entry: path.join( __dirname, - '../lambda/codepipeline/blueprint/publish.ts' + '../lambda/codepipeline/blueprint/publish.ts', ), timeout: Duration.seconds(30), environment: { @@ -472,7 +473,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { subnetType: SubnetType.PRIVATE_WITH_EGRESS, }, securityGroups: [props.securityGroup], - } + }, ); // Service catalog permissions @@ -487,7 +488,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { ], // Product names are automatically generated so we can't scope the resources down resources: ['*'], - }) + }), ); // permission to get pattern from DynamoDb @@ -498,7 +499,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { resources: [ `arn:aws:dynamodb:${Aws.REGION}:${Aws.ACCOUNT_ID}:table/${props.sharedConfig.rapmMetaDataTable}`, ], - }) + }), ); // Permission required to validate CFN templates before creating a provisioning artifact @@ -507,7 +508,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { effect: Effect.ALLOW, actions: ['cloudformation:ValidateTemplate'], resources: ['*'], - }) + }), ); artifactsBucket.grantReadWrite(publishBlueprintToServiceCatalogLambda); @@ -524,14 +525,14 @@ export class BlueprintPublicationPipelineConstruct extends Construct { resources: [ `${props.sharedConfig.blueprintArtifactsBucketEncryptionKeyArn}`, ], - }) + }), ); publishBlueprintToServiceCatalogLambda.addToRolePolicy( new PolicyStatement({ effect: Effect.ALLOW, actions: ['kms:Decrypt', 'kms:List*', 'kms:DescribeKey'], resources: [`${props.sharedConfig.rapmMetaDataTableEncryptionKey}`], - }) + }), ); publishAction = new LambdaInvokeAction({ @@ -558,7 +559,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { handler: 'handler', entry: path.join( __dirname, - '../lambda/codepipeline/blueprint/register.ts' + '../lambda/codepipeline/blueprint/register.ts', ), bundling: { externalModules: ['@aws-sdk/signature-v4-crt'], @@ -588,7 +589,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { subnetType: SubnetType.PRIVATE_WITH_EGRESS, }, securityGroups: [props.securityGroup], - } + }, ); registerBlueprintLambda.addToRolePolicy( @@ -599,7 +600,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { `arn:aws:dynamodb:${Aws.REGION}:${Aws.ACCOUNT_ID}:table/${props.sharedConfig.rapmMetaDataTable}`, `arn:aws:dynamodb:${Aws.REGION}:${Aws.ACCOUNT_ID}:table/${props.sharedConfig.rapmPublishDataTable}`, ], - }) + }), ); registerBlueprintLambda.addToRolePolicy( new PolicyStatement({ @@ -608,7 +609,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { resources: [ `arn:aws:dynamodb:${Aws.REGION}:${Aws.ACCOUNT_ID}:table/${props.sharedConfig.rapmMetaDataTable}`, ], - }) + }), ); registerBlueprintLambda.addToRolePolicy( new PolicyStatement({ @@ -617,14 +618,14 @@ export class BlueprintPublicationPipelineConstruct extends Construct { resources: [ `${props.sharedConfig.blueprintGovernanceNotificationTopicArn}`, ], - }) + }), ); registerBlueprintLambda.addToRolePolicy( new PolicyStatement({ effect: Effect.ALLOW, actions: ['kms:Decrypt', 'kms:GenerateDataKey*'], resources: [`${props.sharedConfig.blueprintSnsEncryptionKeyArn}`], - }) + }), ); addCfnNagSuppression(registerBlueprintLambda, [ { @@ -664,7 +665,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { effect: Effect.ALLOW, actions: ['kms:Decrypt', 'kms:List*', 'kms:DescribeKey'], resources: kmsKeys, - }) + }), ); artifactsBucket.grantRead(registerBlueprintLambda); @@ -674,7 +675,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { Effect: Effect.ALLOW, Action: 'execute-api:Invoke', Resource: 'arn:aws:execute-api:*:*:*/*/*/*', - }) + }), ); pipeline.addStage({ @@ -689,21 +690,21 @@ export class BlueprintPublicationPipelineConstruct extends Construct { BLUEPRINT_TYPE: `${props.blueprintType}`, CONTROL_ARTIFACTS_LOCATION: controlArtifactsLocation, CONTROL_ARTIFACTS_NAMES: buildAction.variable( - 'CONTROL_ARTIFACTS_NAMES' + 'CONTROL_ARTIFACTS_NAMES', ), IMAGE_ARTIFACTS_LOCATION: imageArtifactsLocation, IMAGE_ARTIFACTS_NAMES: buildAction.variable( - 'IMAGE_ARTIFACTS_NAMES' + 'IMAGE_ARTIFACTS_NAMES', ), MARKDOWN_ARTIFACTS_LOCATION: markdownArtifactsLocation, MARKDOWN_ARTIFACTS_NAMES: buildAction.variable( - 'MARKDOWN_ARTIFACTS_NAMES' + 'MARKDOWN_ARTIFACTS_NAMES', ), CHANGED_SERVICE_CATALOG_PRODUCTS: publishAction?.variable( - 'CHANGED_SERVICE_CATALOG_PRODUCTS' + 'CHANGED_SERVICE_CATALOG_PRODUCTS', ), ALL_SERVICE_CATALOG_PRODUCTS: publishAction?.variable( - 'ALL_SERVICE_CATALOG_PRODUCTS' + 'ALL_SERVICE_CATALOG_PRODUCTS', ), CHANGED_PACKAGES: releaseAction.variable('CHANGED_PACKAGES'), ALL_PACKAGES: releaseAction.variable('ALL_PACKAGES'), @@ -719,15 +720,15 @@ export class BlueprintPublicationPipelineConstruct extends Construct { id: 'W12', reason: 'Security group is created by CDK and is egress only', }, - ] - ) + ], + ), ); } private createPipelineArtifactBucket( patternId: string, patternType: string, - encryptionKeyArn?: string + encryptionKeyArn?: string, ): { s3Bucket: Bucket; encryptionKey: IKey; @@ -756,7 +757,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { versioned: true, removalPolicy: RemovalPolicy.DESTROY, autoDeleteObjects: true, - } + }, ); const s3Bucket = new Bucket(this, 'PipelineArtifactsBucket', { @@ -782,7 +783,7 @@ export class BlueprintPublicationPipelineConstruct extends Construct { 'aws:SecureTransport': 'false', }, }, - }) + }), ); return { s3Bucket, encryptionKey }; diff --git a/source/blueprint-infrastructure/lib/buildspecs.ts b/source/blueprint-infrastructure/lib/buildspecs.ts index 418a7c8..718a164 100644 --- a/source/blueprint-infrastructure/lib/buildspecs.ts +++ b/source/blueprint-infrastructure/lib/buildspecs.ts @@ -14,26 +14,32 @@ limitations under the License. */ /* eslint-disable @typescript-eslint/naming-convention */ -import { BlueprintType, PatternRepoType } from './blueprint-infrastructure-types'; +import { + BlueprintType, + PatternRepoType, + SecurityScanTool, +} from './blueprint-infrastructure-types'; // Security check codebuild trigger type type TriggerType = 'PR' | 'Pipeline'; -// eslint-disable-next-line @typescript-eslint/explicit-function-return-type export const generateBuildStageBuildspec = ( blueprintType: BlueprintType, triggerType: TriggerType, patternRepoType: PatternRepoType, + securityScanTool: SecurityScanTool, proxyUri?: string, githubTokenSecretId?: string, githubEnterpriseServerUrl?: string, repoName?: string, - githubRepoOwner?: string -) => { + githubRepoOwner?: string, // eslint-disable-next-line @typescript-eslint/no-explicit-any - const buildSpec: any = { +): Record => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const buildSpec: Record = { version: 0.2, env: { + shell: 'bash', variables: { CONTROLS_FOLDER: '/controls', TEMPLATES_FOLDER: '/templates', @@ -50,13 +56,11 @@ export const generateBuildStageBuildspec = ( phases: { install: { 'runtime-versions': { - ruby: 3.2, nodejs: 18, }, commands: [ 'apt-get update -y', 'apt-get install -y cpio', - 'gem install cfn-nag', 'mkdir -p ${CONTROLS_FOLDER} ${IMAGES_FOLDER} ${MARKDOWN_FOLDER} ${TEMPLATES_FOLDER}', ], }, @@ -67,12 +71,10 @@ export const generateBuildStageBuildspec = ( // Copy markdown documents in the markdown artifacts folder 'cp *.md ${MARKDOWN_FOLDER} | true', // Run controls and save the controls output in the control artifacts folder - getCfnNagCommand(triggerType), - // Store the artifact names in exported environment variables - "export CONTROL_ARTIFACTS_NAMES=`ls -m ${CONTROLS_FOLDER} | sed 's/ //g'`", - "export TEMPLATES_ARTIFACTS_NAMES=`ls -m ${TEMPLATES_FOLDER} | sed 's/ //g'`", - "export IMAGE_ARTIFACTS_NAMES=`ls -m ${IMAGES_FOLDER} | sed 's/ //g'`", - "export MARKDOWN_ARTIFACTS_NAMES=`ls -m ${MARKDOWN_FOLDER} | sed 's/ //g'`", + `SCAN_RESULT=$(${getSecurityScanCommand( + securityScanTool, + triggerType, + )}); EXITCODE=$?`, ], }, post_build: { @@ -108,36 +110,90 @@ export const generateBuildStageBuildspec = ( }, }; + if (securityScanTool.name === 'CfnGuard') { + buildSpec.phases.build.commands.push( + `SCAN_RESULT=$(echo $SCAN_RESULT | sed 's/CFN//g')`, + ); + } + buildSpec.phases.build.commands.push(`echo "$SCAN_RESULT" | jq . || true`); + buildSpec.phases.build.commands.push( + `if [ $EXITCODE -ne 0 ] + then + exit $EXITCODE + fi`, + ); + // Store the artifact names in exported environment variables + buildSpec.phases.build.commands.push( + "export CONTROL_ARTIFACTS_NAMES=`ls -m ${CONTROLS_FOLDER} | sed 's/ //g'`", + ); + buildSpec.phases.build.commands.push( + "export TEMPLATES_ARTIFACTS_NAMES=`ls -m ${TEMPLATES_FOLDER} | sed 's/ //g'`", + ); + buildSpec.phases.build.commands.push( + "export IMAGE_ARTIFACTS_NAMES=`ls -m ${IMAGES_FOLDER} | sed 's/ //g'`", + ); + buildSpec.phases.build.commands.push( + "export MARKDOWN_ARTIFACTS_NAMES=`ls -m ${MARKDOWN_FOLDER} | sed 's/ //g'`", + ); + + if (securityScanTool.name === 'CfnNag') { + buildSpec.phases.install.commands.push('gem install cfn-nag'); + buildSpec.phases.install['runtime-versions']['ruby'] = 3.2; + } if (triggerType === 'PR') { + const prPostInstallCommands = [ + `COMPACT_SCAN_RESULT=$(${getCompactScanResultCommand(securityScanTool)})`, + `SCAN_RESULT_CHAR_COUNT=\${#COMPACT_SCAN_RESULT}`, + `if [ $SCAN_RESULT_CHAR_COUNT -gt $MAX_RESULT_CHAR_LIMIT ] + then + COMPACT_SCAN_RESULT=\${COMPACT_SCAN_RESULT:0:MAX_RESULT_CHAR_LIMIT}... + fi`, + `FAILURE_COUNT=$(${getFailureCountCommand(securityScanTool)})`, + `if [ $EXITCODE -eq 0 ] + then + SCAN_STATUS="PASS" + else + SCAN_STATUS="FAIL" + fi`, + `MAX_RESULT_CHAR_LIMIT=8000`, + `NEW_LINE='\n'`, + `CODE_BLOCK_BACKTICKS="\\\`\\\`\\\`"`, + `PR_COMMENT_HEADING="# ${securityScanTool.name} security scan result"`, + `IFS=':' read -ra CODEBUILD_BUILD_ID_ARR <<< "$CODEBUILD_BUILD_ID"; CODEBUILD_ID="\${CODEBUILD_BUILD_ID_ARR[0]}"`, + `IFS=':' read -ra CODEBUILD_BUILD_ARN_ARR <<< "$CODEBUILD_BUILD_ARN"; ACCOUNT_ID="\${CODEBUILD_BUILD_ARN_ARR[4]}"`, + `CODEBUILD_BUILD_ARN_ARR_SLASH=($(echo "$CODEBUILD_BUILD_ARN" | tr '/' '\n'))`, + `DETAILED_LOGS="To view complete security scan response, please refer to the AWS CodeBuild [logs](https://$AWS_REGION.console.aws.amazon.com/codesuite/codebuild/$ACCOUNT_ID/projects/$CODEBUILD_ID/build/$CODEBUILD_BUILD_ID/?region=$AWS_REGION)."`, + `FAIL_MSG="$NEW_LINE$CODE_BLOCK_BACKTICKS$NEW_LINE$COMPACT_SCAN_RESULT$NEW_LINE$CODE_BLOCK_BACKTICKS"`, + `COMMENT_MSG="$PR_COMMENT_HEADING$NEW_LINE---$NEW_LINE### Status: $SCAN_STATUS"`, + `if [ $FAILURE_COUNT -gt 0 ] + then + COMMENT_MSG="$COMMENT_MSG$NEW_LINE### Failure count: $FAILURE_COUNT$FAIL_MSG" + fi`, + `COMMENT_MSG=$COMMENT_MSG$NEW_LINE$DETAILED_LOGS`, + ]; + + buildSpec.phases.post_build.commands.push(...prPostInstallCommands); + if (patternRepoType === 'GitHub') { buildSpec.env['secrets-manager'] = { GITHUB_TOKEN: githubTokenSecretId, }; buildSpec.phases.post_build.commands.push( - `PR_NUMBER=$(echo $CODEBUILD_WEBHOOK_TRIGGER | sed 's:.*/::')` + `PR_NUMBER=$(echo $CODEBUILD_WEBHOOK_TRIGGER | sed 's:.*/::')`, ); const githubBaseUrl = getGithubBaseUrl(githubEnterpriseServerUrl); buildSpec.phases.post_build.commands.push( - `curl -X POST -H "Accept: application/vnd.github+json" -H "Authorization: token $GITHUB_TOKEN" ${githubBaseUrl}/repos/${githubRepoOwner}/${repoName}/issues/$PR_NUMBER/comments -d "$(${getCfnNagCommand( - triggerType - )}| sed 's/-//g' | jq -Rsc '{"body": .}')"` + `curl -X POST -H "Accept: application/vnd.github+json" -H "Authorization: token $GITHUB_TOKEN" ${githubBaseUrl}/repos/${githubRepoOwner}/${repoName}/issues/$PR_NUMBER/comments -d "$(echo "$COMMENT_MSG" | jq -Rsc '{"body": .}')"`, ); } else { // For CodeCommit // Create approval rule buildSpec.phases.post_build.commands.push( - `aws codecommit create-pull-request-approval-rule --pull-request-id $PR_NUMBER --approval-rule-name "Require one approval atleast" --approval-rule-content "{\\"Version\\": \\"2018-11-08\\",\\"Statements\\": [{\\"Type\\": \\"Approvers\\",\\"NumberOfApprovalsNeeded\\": 1}]}" || true` - ); - // perform security check - buildSpec.phases.post_build.commands.push( - `SCAN_RESULT=$(${getCfnNagCommand(triggerType)}); EXITCODE=$?` + `aws codecommit create-pull-request-approval-rule --pull-request-id $PR_NUMBER --approval-rule-name "Require one approval atleast" --approval-rule-content "{\\"Version\\": \\"2018-11-08\\",\\"Statements\\": [{\\"Type\\": \\"Approvers\\",\\"NumberOfApprovalsNeeded\\": 1}]}" || true`, ); // Post security scan result in PR comments buildSpec.phases.post_build.commands.push( - `aws codecommit post-comment-for-pull-request --pull-request-id $PR_NUMBER --repository-name ${repoName} --content "$SCAN_RESULT" --before-commit-id $BEFORE_COMMIT_ID --after-commit-id $AFTER_COMMIT_ID` - ); - buildSpec.phases.post_build.commands.push( - `${getCfnNagCommand(triggerType)}; EXITCODE=$?` + `aws codecommit post-comment-for-pull-request --pull-request-id $PR_NUMBER --repository-name ${repoName} --content "$COMMENT_MSG" --before-commit-id $BEFORE_COMMIT_ID --after-commit-id $AFTER_COMMIT_ID`, ); buildSpec.phases.post_build.commands.push( `if [ $EXITCODE -ne 0 ] @@ -145,23 +201,22 @@ export const generateBuildStageBuildspec = ( PR_STATUS='REVOKE' else PR_STATUS='APPROVE' - fi` + fi`, ); // get revision id buildSpec.phases.post_build.commands.push( - `REVISION_ID=$(aws codecommit get-pull-request --pull-request-id $PR_NUMBER | jq -r '.pullRequest.revisionId')` + `REVISION_ID=$(aws codecommit get-pull-request --pull-request-id $PR_NUMBER | jq -r '.pullRequest.revisionId')`, ); // approve/reject the PR based on the security scan result. For approval there should be no failures or warnings in security scan result buildSpec.phases.post_build.commands.push( - `aws codecommit update-pull-request-approval-state --pull-request-id $PR_NUMBER --revision-id $REVISION_ID --approval-state $PR_STATUS` + `aws codecommit update-pull-request-approval-state --pull-request-id $PR_NUMBER --revision-id $REVISION_ID --approval-state $PR_STATUS`, ); } } - if (blueprintType === 'CFN') { // Copy CFN templates to the template artifacts folder buildSpec.phases.build.commands.unshift( - "find ./packages -name '*.template' | cpio -pdm ${TEMPLATES_FOLDER}" + "find ./packages -name '*.template' | cpio -pdm ${TEMPLATES_FOLDER}", ); } else { // For CDK based pattern @@ -177,7 +232,7 @@ export const generateBuildStageBuildspec = ( // Generate CFN templates 'yarn synth', // Copy synth generated templates to ${TEMPLATES_FOLDER} - 'cp -R templates/*.template.json ${TEMPLATES_FOLDER}' + 'cp -R templates/*.template.json ${TEMPLATES_FOLDER}', ); } @@ -186,7 +241,7 @@ export const generateBuildStageBuildspec = ( `export http_proxy=${proxyUri}`, `export https_proxy=${proxyUri}`, `npm config set proxy http://${proxyUri}`, - `npm config set https-proxy http://${proxyUri}` + `npm config set https-proxy http://${proxyUri}`, ); } @@ -202,23 +257,101 @@ const getGithubBaseUrl = (githubEnterpriseServerUrl: string | undefined): string ? removeTrailingSlash(githubEnterpriseServerUrl) + '/api/v3' : 'https://api.github.com'; -const getCfnNagCommand = (triggerType: TriggerType): string => { - let cfnNagCommand = 'cfn_nag_scan --input-path ${TEMPLATES_FOLDER} -o txt'; - if (triggerType === 'PR') { - // let cfn nag fail fast for PR triggered security check - cfnNagCommand = cfnNagCommand.replace('cfn_nag_scan', 'cfn_nag_scan -f'); - } else { - cfnNagCommand = cfnNagCommand + ' | tee ${CONTROLS_FOLDER}/cfn_nag.txt'; +const getCompactScanResultCommand = (securityScanTool: SecurityScanTool): string => { + let scanSummaryCommand = ''; + switch (securityScanTool.name) { + case 'CfnNag': + scanSummaryCommand = `echo $SCAN_RESULT | jq -r '.[].file_results.violations[].message'`; + break; + case 'CfnGuard': + scanSummaryCommand = `echo $SCAN_RESULT | jq -rs '. | map(select(.status == "FAIL")) | map(.not_compliant[].Rule.checks[].Clause.Binary.messages.custom_message | select(. != null) | sub("; "; "") | gsub(" "; " ") | gsub("; "; "") | sub("; "; "") | gsub(";"; ""))[]'`; + break; + case 'Checkov': + scanSummaryCommand = `echo $SCAN_RESULT | jq -r '.results.failed_checks[].check_name' || true`; + break; + default: + throw new Error( + `Unrecognised security scanning tool: ${securityScanTool.name}`, + ); } - return cfnNagCommand; + return scanSummaryCommand; +}; + +const getFailureCountCommand = (securityScanTool: SecurityScanTool): string => { + let scanSummaryCommand = ''; + switch (securityScanTool.name) { + case 'CfnNag': + scanSummaryCommand = `echo $SCAN_RESULT | jq '[.[].file_results.violations[]] | length'`; + break; + case 'CfnGuard': + scanSummaryCommand = `echo $SCAN_RESULT | jq -rs '. | map(select(.status == "FAIL")) | map(.not_compliant[].Rule.checks[].Clause.Binary.messages.custom_message | select(. != null) | gsub(" "; "") | gsub(";"; " ")) | length'`; + break; + case 'Checkov': + scanSummaryCommand = `echo $SCAN_RESULT | jq '.results.failed_checks | length' || true`; + break; + default: + throw new Error( + `Unrecognised security scanning tool: ${securityScanTool.name}`, + ); + } + return scanSummaryCommand; +}; + +const getSecurityScanCommand = ( + securityScanTool: SecurityScanTool, + triggerType: TriggerType, +): string => { + let securityScanCommand = ''; + switch (securityScanTool.name) { + case 'CfnNag': + securityScanCommand = + 'cfn_nag_scan -f --input-path ${TEMPLATES_FOLDER} -o json'; + break; + case 'CfnGuard': + securityScanCommand = + 'docker run -v ${TEMPLATES_FOLDER}:/container/templates -t public.ecr.aws/r7q6h7y6/guard cfn-guard validate -d /container/templates -o json --show-summary none'; + if ( + !securityScanTool.cfnGuardManagedRuleSets || + securityScanTool.cfnGuardManagedRuleSets.length === 0 + ) { + // If not provided, defaults to AWS Well Architected Security and Reliability managed rule sets (https://github.com/aws-cloudformation/aws-guard-rules-registry#managed-rule-sets) + securityScanTool.cfnGuardManagedRuleSets = [ + 'wa-Security-Pillar', + 'wa-Reliability-Pillar', + ]; + } + for (const managedRuleSetName of securityScanTool.cfnGuardManagedRuleSets) { + securityScanCommand = `${securityScanCommand} -r ${ + managedRuleSetName.endsWith('guard') + ? managedRuleSetName + : managedRuleSetName + '.guard' + }`; + } + break; + case 'Checkov': + securityScanCommand = + 'docker run -v ${TEMPLATES_FOLDER}:/container/templates -t bridgecrew/checkov --directory /container/templates -o json --compact'; + break; + default: + throw new Error( + `Unrecognised security scanning tool: ${securityScanTool.name}`, + ); + } + + if (triggerType === 'Pipeline') { + securityScanCommand = + securityScanCommand + ' | tee ${CONTROLS_FOLDER}/security-scan.json'; + } + return securityScanCommand; }; -// eslint-disable-next-line @typescript-eslint/explicit-function-return-type export const generateReleaseStageBuildspec = ( blueprintType: BlueprintType, - proxyUri?: string -) => { - const buildSpec = { + proxyUri?: string, + // eslint-disable-next-line @typescript-eslint/no-explicit-any +): Record => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const buildSpec: Record = { version: 0.2, env: { 'git-credential-helper': true, @@ -251,7 +384,7 @@ export const generateReleaseStageBuildspec = ( if (blueprintType === 'CDK') { // Login to codeartifact at the start of build phase buildSpec.phases.build.commands.unshift( - 'aws codeartifact login --tool npm --domain ${CODEARTIFACT_DOMAIN_NAME} --repository ${CODEARTIFACT_REPOSITORY_NAME}' + 'aws codeartifact login --tool npm --domain ${CODEARTIFACT_DOMAIN_NAME} --repository ${CODEARTIFACT_REPOSITORY_NAME}', ); // publish packages // lerna by default uses atomic push when pushing to git which is not configurable. @@ -268,7 +401,7 @@ export const generateReleaseStageBuildspec = ( `export http_proxy=${proxyUri}`, `export https_proxy=${proxyUri}`, `npm config set proxy http://${proxyUri}`, - `npm config set https-proxy http://${proxyUri}` + `npm config set https-proxy http://${proxyUri}`, ); } diff --git a/source/blueprint-infrastructure/lib/cfn-nag-suppression.ts b/source/blueprint-infrastructure/lib/cfn-nag-suppression.ts index 6f38842..54b18a3 100644 --- a/source/blueprint-infrastructure/lib/cfn-nag-suppression.ts +++ b/source/blueprint-infrastructure/lib/cfn-nag-suppression.ts @@ -30,7 +30,7 @@ export interface CfnNagRuleSuppression { */ export const addCfnNagSuppressionMeta = ( construct: CfnResource, - rulesToSuppress: CfnNagRuleSuppression[] + rulesToSuppress: CfnNagRuleSuppression[], ): void => { construct.cfnOptions.metadata = { ...construct.cfnOptions.metadata, @@ -47,7 +47,7 @@ export const addCfnNagSuppressionMeta = ( export const addCfnNagSuppression = ( construct: Construct, rulesToSuppress: CfnNagRuleSuppression[], - resourceName?: string + resourceName?: string, ): void => { const child = resourceName ? construct.node.findChild(resourceName) : construct; // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition @@ -60,16 +60,16 @@ export class CfnNagCustomResourceSuppressionAspect implements IAspect { public visit(construct: Construct): void { if ( construct.node.path.endsWith( - '/Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler' + '/Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler', ) || construct.node.path.endsWith( - '/CustomAttributeMapping/customerProvierLambda/Resource' + '/CustomAttributeMapping/customerProvierLambda/Resource', ) || construct.node.path.endsWith( - '/CustomAttributeMapping/customProvider/framework-onEvent/Resource' + '/CustomAttributeMapping/customProvider/framework-onEvent/Resource', ) || construct.node.path.match( - /\/Custom::CDKBucketDeployment[0-9A-Za-z]+\/Resource$/ + /\/Custom::CDKBucketDeployment[0-9A-Za-z]+\/Resource$/, ) ) { // Enabling auto delete objects on an s3 bucket creates a lambda, which is created via CfnResource @@ -108,7 +108,7 @@ export class CfnNagServiceRoleDefaultPolicyResourceSuppressionAspect implements export class CfnNagResourcePathEndingWithSuppressionAspect implements IAspect { public constructor( private readonly resourcePathEndingWith: string, - private readonly rulesToSuppress: CfnNagRuleSuppression[] + private readonly rulesToSuppress: CfnNagRuleSuppression[], ) {} public visit(construct: Construct): void { @@ -122,7 +122,7 @@ export class CfnNagResourcePathEndingWithSuppressionAspect implements IAspect { export class CfnNagResourcePathRegexSuppressionAspect implements IAspect { public constructor( private readonly resourcePathEndingWith: RegExp, - private readonly rulesToSuppress: CfnNagRuleSuppression[] + private readonly rulesToSuppress: CfnNagRuleSuppression[], ) {} public visit(construct: Construct): void { diff --git a/source/blueprint-infrastructure/package-lock.json b/source/blueprint-infrastructure/package-lock.json index 395840a..a40b923 100644 --- a/source/blueprint-infrastructure/package-lock.json +++ b/source/blueprint-infrastructure/package-lock.json @@ -18,7 +18,7 @@ "@aws-sdk/client-service-catalog": "^3.310.0", "@aws-sdk/client-sns": "^3.310.0", "@aws-sdk/lib-dynamodb": "^3.310.0", - "@octokit/rest": "^19.0.3", + "@octokit/rest": "^20.0.1", "aws-cdk-lib": "^2.85.0", "js-yaml": "^4.1.0", "js-yaml-cloudformation-schema": "^1.0.0", @@ -30,26 +30,27 @@ }, "devDependencies": { "@aws-sdk/types": "^3.310.0", - "@octokit/types": "^9.1.2", + "@octokit/types": "^11.1.0", "@types/aws-lambda": "^8.10.101", "@types/jest": "^29.1.0", "@types/js-yaml": "^4.0.5", - "@types/node": "^18.14.5", - "@typescript-eslint/eslint-plugin": "^5.54.1", - "@typescript-eslint/parser": "^5.54.1", + "@types/node": "^20.4.5", + "@typescript-eslint/eslint-plugin": "^6.2.0", + "@typescript-eslint/parser": "^6.2.0", "aws-cdk": "^2.85.0", "aws-lambda": "^1.0.7", - "aws-sdk-client-mock": "^2.0.1", + "aws-sdk-client-mock": "^3.0.0", "constructs": "^10.1.84", "esbuild": "^0.14.53", "eslint": "^8.20.0", "eslint-config-prettier": "^8.3.0", "eslint-config-typescript": "^3.0.0", "eslint-plugin-header": "^3.1.1", - "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-prettier": "^5.0.0", "jest": "^29.3.1", "jest-junit": "^16.0.0", - "prettier": "^2.7.1", + "prettier": "^3.0.0", "ts-jest": "^29.0.3", "typescript": "^5.0.4" } @@ -2366,9 +2367,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -2915,150 +2916,168 @@ } }, "node_modules/@octokit/auth-token": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz", - "integrity": "sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==", - "dependencies": { - "@octokit/types": "^9.0.0" - }, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz", - "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==", - "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.0.tgz", + "integrity": "sha512-YbAtMWIrbZ9FCXbLwT9wWB8TyLjq9mxpKdgB3dUNxQcIVTf9hJ70gRPwAcqGZdY6WdJPZ0I7jLaaNDCiloGN2A==", + "dependencies": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.0.0", + "@octokit/request": "^8.0.2", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^11.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/endpoint": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz", - "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz", + "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==", "dependencies": { - "@octokit/types": "^9.0.0", + "@octokit/types": "^11.0.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/graphql": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz", - "integrity": "sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.1.tgz", + "integrity": "sha512-T5S3oZ1JOE58gom6MIcrgwZXzTaxRnxBso58xhozxHpOqSTgDS6YNeEUvZ/kRvXgPrRz/KHnZhtb7jUMRi9E6w==", "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", + "@octokit/request": "^8.0.1", + "@octokit/types": "^11.0.0", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/openapi-types": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-17.0.0.tgz", - "integrity": "sha512-V8BVJGN0ZmMlURF55VFHFd/L92XQQ43KvFjNmY1IYbCN3V/h/uUFV6iQi19WEHM395Nn+1qhUbViCAD/1czzog==" + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz", - "integrity": "sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-8.0.0.tgz", + "integrity": "sha512-2xZ+baZWUg+qudVXnnvXz7qfrTmDeYPCzangBVq/1gXxii/OiS//4shJp9dnCCvj1x+JAm9ji1Egwm1BA47lPQ==", "dependencies": { - "@octokit/types": "^9.0.0" + "@octokit/types": "^11.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=4" + "@octokit/core": ">=5" } }, "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz", + "integrity": "sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA==", + "engines": { + "node": ">= 18" + }, "peerDependencies": { - "@octokit/core": ">=3" + "@octokit/core": ">=5" } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz", - "integrity": "sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-9.0.0.tgz", + "integrity": "sha512-KquMF/VB1IkKNiVnzJKspY5mFgGyLd7HzdJfVEGTJFzqu9BRFNWt+nwTCMuUiWc72gLQhRWYubTwOkQj+w/1PA==", "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.3.1" + "@octokit/types": "^11.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=3" + "@octokit/core": ">=5" } }, "node_modules/@octokit/request": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.3.tgz", - "integrity": "sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", + "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", + "@octokit/endpoint": "^9.0.0", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^11.1.0", "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz", + "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==", "dependencies": { - "@octokit/types": "^9.0.0", + "@octokit/types": "^11.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/rest": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz", - "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==", + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.0.1.tgz", + "integrity": "sha512-wROV21RwHQIMNb2Dgd4+pY+dVy1Dwmp85pBrgr6YRRDYRBu9Gb+D73f4Bl2EukZSj5hInq2Tui9o7gAQpc2k2Q==", "dependencies": { - "@octokit/core": "^4.1.0", - "@octokit/plugin-paginate-rest": "^6.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.0.0" + "@octokit/core": "^5.0.0", + "@octokit/plugin-paginate-rest": "^8.0.0", + "@octokit/plugin-request-log": "^4.0.0", + "@octokit/plugin-rest-endpoint-methods": "^9.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/types": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.1.2.tgz", - "integrity": "sha512-LPbJIuu1WNoRHbN4UMysEdlissRFpTCWyoKT7kHPufI8T+XX33/qilfMWJo3mCOjNIKu0+43oSQPf+HJa0+TTQ==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz", + "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, "dependencies": { - "@octokit/openapi-types": "^17.0.0" + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, "node_modules/@sinclair/typebox": { @@ -3199,15 +3218,21 @@ "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "node_modules/@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", + "version": "20.4.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.5.tgz", + "integrity": "sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg==", "dev": true }, "node_modules/@types/prettier": { @@ -3217,9 +3242,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "node_modules/@types/sinon": { @@ -3264,32 +3289,34 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.58.0.tgz", - "integrity": "sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.2.0.tgz", + "integrity": "sha512-rClGrMuyS/3j0ETa1Ui7s6GkLhfZGKZL3ZrChLeAiACBE/tRc1wq8SNZESUuluxhLj9FkUefRs2l6bCIArWBiQ==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/type-utils": "5.58.0", - "@typescript-eslint/utils": "5.58.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.2.0", + "@typescript-eslint/type-utils": "6.2.0", + "@typescript-eslint/utils": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -3298,25 +3325,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz", - "integrity": "sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.2.0.tgz", + "integrity": "sha512-igVYOqtiK/UsvKAmmloQAruAdUHihsOCvplJpplPZ+3h4aDkC/UKZZNKgB6h93ayuYLuEymU3h8nF1xMRbh37g==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", + "@typescript-eslint/scope-manager": "6.2.0", + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/typescript-estree": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -3325,16 +3353,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz", - "integrity": "sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.2.0.tgz", + "integrity": "sha512-1ZMNVgm5nnHURU8ZSJ3snsHzpFeNK84rdZjluEVBGNu7jDymfqceB3kdIZ6A4xCfEFFhRIB6rF8q/JIqJd2R0Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0" + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3342,25 +3370,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.58.0.tgz", - "integrity": "sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.2.0.tgz", + "integrity": "sha512-DnGZuNU2JN3AYwddYIqrVkYW0uUQdv0AY+kz2M25euVNlujcN2u+rJgfJsBFlUEzBB6OQkUqSZPyuTLf2bP5mw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.58.0", - "@typescript-eslint/utils": "5.58.0", + "@typescript-eslint/typescript-estree": "6.2.0", + "@typescript-eslint/utils": "6.2.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -3369,12 +3397,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz", - "integrity": "sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.2.0.tgz", + "integrity": "sha512-1nRRaDlp/XYJQLvkQJG5F3uBTno5SHPT7XVcJ5n1/k2WfNI28nJsvLakxwZRNY5spuatEKO7d5nZWsQpkqXwBA==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3382,21 +3410,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz", - "integrity": "sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.2.0.tgz", + "integrity": "sha512-Mts6+3HQMSM+LZCglsc2yMIny37IhUgp1Qe8yJUYVyO6rHP7/vN0vajKu3JvHCBIy8TSiKddJ/Zwu80jhnGj1w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0", + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3409,42 +3437,41 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz", - "integrity": "sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.2.0.tgz", + "integrity": "sha512-RCFrC1lXiX1qEZN8LmLrxYRhOkElEsPKTVSNout8DMzf8PeWoQG7Rxz2SadpJa3VSh5oYKGwt7j7X/VRg+Y3OQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.2.0", + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/typescript-estree": "6.2.0", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz", - "integrity": "sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.2.0.tgz", + "integrity": "sha512-QbaYUQVKKo9bgCzpjz45llCfwakyoxHetIy8CAvYCtd16Zu1KrpzNHofwF8kGkpPOxZB2o6kz+0nqH8ZkIzuoQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.58.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.2.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -3557,6 +3584,38 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -3566,6 +3625,62 @@ "node": ">=8" } }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -3997,9 +4112,9 @@ } }, "node_modules/aws-sdk-client-mock": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/aws-sdk-client-mock/-/aws-sdk-client-mock-2.1.1.tgz", - "integrity": "sha512-UuxXmICU4nmXTRm2BzLZdXmnyI+5NEBb5McRDkObasXVxXChvLm0Ci/PGENh4sCD+Es64SJiz70mtY48JROk0A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock/-/aws-sdk-client-mock-3.0.0.tgz", + "integrity": "sha512-4mBiWhuLYLZe1+K/iB8eYy5SAZyW2se+Keyh5u9QouMt6/qJ5SRZhss68xvUX5g3ApzROJ06QPRziYHP6buuvQ==", "dev": true, "dependencies": { "@types/sinon": "^10.0.10", @@ -4138,11 +4253,32 @@ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4230,6 +4366,21 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -4492,6 +4643,178 @@ "node": ">=0.10.0" } }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-browser/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/default-browser/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/deprecation": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", @@ -4586,19 +4909,112 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/esbuild": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", - "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, - "optionalDependencies": { + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", + "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { "@esbuild/linux-loong64": "0.14.54", "esbuild-android-64": "0.14.54", "esbuild-android-arm64": "0.14.54", @@ -5044,6 +5460,52 @@ "typescript": "*" } }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/eslint-plugin-header": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", @@ -5053,44 +5515,89 @@ "eslint": ">=7.7.0" } }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=4" }, "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } + "engines": { + "node": ">=0.10.0" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/eslint-plugin-prettier": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" }, "engines": { - "node": ">=8.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5195,15 +5702,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -5283,9 +5781,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -5465,6 +5963,33 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -5484,13 +6009,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -5518,6 +6044,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -5571,6 +6113,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -5615,6 +6172,12 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -5627,6 +6190,15 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5636,6 +6208,30 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -5752,6 +6348,20 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -5768,12 +6378,54 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -5798,6 +6450,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5852,6 +6534,36 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -5861,6 +6573,21 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -5878,6 +6605,34 @@ "node": ">=0.10.0" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -5889,6 +6644,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typed-array": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", @@ -5908,6 +6693,45 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -6857,6 +7681,15 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -6907,25 +7740,6 @@ "path-to-regexp": "^1.7.0" } }, - "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -6959,6 +7773,59 @@ "node": ">=8" } }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/obliterator": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz", @@ -6995,6 +7862,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -7239,15 +8124,15 @@ } }, "node_modules/prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -7378,6 +8263,23 @@ "node": ">= 6" } }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -7468,6 +8370,21 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -7491,6 +8408,30 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -7510,6 +8451,20 @@ } ] }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-stable-stringify": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", @@ -7578,6 +8533,20 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -7734,6 +8703,51 @@ "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -7805,6 +8819,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -7830,6 +8860,18 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -7857,16 +8899,23 @@ "node": ">=8.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "node_modules/triple-beam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, + "node_modules/ts-api-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", + "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-jest": { "version": "29.1.0", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", @@ -7910,31 +8959,43 @@ } } }, - "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { - "tslib": "^1.8.1" + "minimist": "^1.2.0" }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "node": ">=4" } }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" }, "node_modules/type-check": { "version": "0.4.0", @@ -7969,6 +9030,71 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", @@ -7982,11 +9108,35 @@ "node": ">=12.20" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/universal-user-agent": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -8106,20 +9256,6 @@ "node": ">=10.13.0" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -8135,18 +9271,33 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -8190,9 +9341,9 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" diff --git a/source/blueprint-infrastructure/package.json b/source/blueprint-infrastructure/package.json index 1411caf..1b2b7e4 100644 --- a/source/blueprint-infrastructure/package.json +++ b/source/blueprint-infrastructure/package.json @@ -19,26 +19,27 @@ }, "devDependencies": { "@aws-sdk/types": "^3.310.0", - "@octokit/types": "^9.1.2", + "@octokit/types": "^11.1.0", "@types/aws-lambda": "^8.10.101", "@types/jest": "^29.1.0", "@types/js-yaml": "^4.0.5", - "@types/node": "^18.14.5", - "@typescript-eslint/eslint-plugin": "^5.54.1", - "@typescript-eslint/parser": "^5.54.1", + "@types/node": "^20.4.5", + "@typescript-eslint/eslint-plugin": "^6.2.0", + "@typescript-eslint/parser": "^6.2.0", "aws-cdk": "^2.85.0", "aws-lambda": "^1.0.7", - "aws-sdk-client-mock": "^2.0.1", + "aws-sdk-client-mock": "^3.0.0", "constructs": "^10.1.84", "esbuild": "^0.14.53", "eslint": "^8.20.0", "eslint-config-prettier": "^8.3.0", "eslint-config-typescript": "^3.0.0", "eslint-plugin-header": "^3.1.1", - "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-prettier": "^5.0.0", "jest": "^29.3.1", "jest-junit": "^16.0.0", - "prettier": "^2.7.1", + "prettier": "^3.0.0", "ts-jest": "^29.0.3", "typescript": "^5.0.4" }, @@ -52,7 +53,7 @@ "@aws-sdk/client-service-catalog": "^3.310.0", "@aws-sdk/client-sns": "^3.310.0", "@aws-sdk/lib-dynamodb": "^3.310.0", - "@octokit/rest": "^19.0.3", + "@octokit/rest": "^20.0.1", "aws-cdk-lib": "^2.85.0", "js-yaml": "^4.1.0", "js-yaml-cloudformation-schema": "^1.0.0", @@ -61,6 +62,7 @@ }, "overrides": { "fast-xml-parser": "^4.2.5", - "semver": "^7.5.3" + "semver": "^7.5.3", + "word-wrap": "^1.2.5" } } diff --git a/source/blueprint-infrastructure/test/unit/codepipeline/blueprint/publish.test.ts b/source/blueprint-infrastructure/test/unit/codepipeline/blueprint/publish.test.ts index 5bb4471..6de478d 100644 --- a/source/blueprint-infrastructure/test/unit/codepipeline/blueprint/publish.test.ts +++ b/source/blueprint-infrastructure/test/unit/codepipeline/blueprint/publish.test.ts @@ -156,14 +156,14 @@ describe('Publish CFN blueprint handler tests', () => { test('streamToString', async () => { const response = await publishModule.streamToString( - fs.createReadStream(path.resolve(__dirname, 'publish.test.ts')) + fs.createReadStream(path.resolve(__dirname, 'publish.test.ts')), ); expect(response).toContain("test('streamToString')"); }); test('handler should fail when cfn template cannot be parsed', async () => { jest.spyOn(publishModule, 'streamToString').mockReturnValue( - Promise.resolve(fixtureDynamoDbCfnTemplateJunk) + Promise.resolve(fixtureDynamoDbCfnTemplateJunk), ); s3Mock.on(ListObjectsCommand).resolves({ Contents: [ @@ -191,7 +191,7 @@ describe('Publish CFN blueprint handler tests', () => { }, }, } as unknown as CodePipelineEvent, - {} as Context + {} as Context, ); await expect(() => task()).rejects.toThrow(); @@ -200,21 +200,21 @@ describe('Publish CFN blueprint handler tests', () => { test('createProduct should throw error when create product command fails', async () => { scMock.on(CreateProductCommand).rejects('InvalidParametersException'); jest.spyOn(publishModule, 'streamToString').mockReturnValue( - Promise.resolve(JSON.stringify(fixtureDynamoDbCfnTemplateJson)) + Promise.resolve(JSON.stringify(fixtureDynamoDbCfnTemplateJson)), ); await expect(async () => { await publishModule.createProduct( 'package-test1', '1.1.1', 'https://test.com/package-test1', - 'test description' + 'test description', ); }).rejects.toThrowError('InvalidParametersException'); }); test('do nothing if user parameters is empty', async () => { jest.spyOn(publishModule, 'streamToString').mockReturnValue( - Promise.resolve(JSON.stringify(fixtureDynamoDbCfnTemplateJson)) + Promise.resolve(JSON.stringify(fixtureDynamoDbCfnTemplateJson)), ); await publishModule.handler( { @@ -229,13 +229,13 @@ describe('Publish CFN blueprint handler tests', () => { }, }, } as CodePipelineEvent, - {} as Context + {} as Context, ); }); test('do nothing if version name is empty', async () => { jest.spyOn(publishModule, 'streamToString').mockReturnValue( - Promise.resolve(JSON.stringify(fixtureDynamoDbCfnTemplateJson)) + Promise.resolve(JSON.stringify(fixtureDynamoDbCfnTemplateJson)), ); await publishModule.handler( { @@ -252,7 +252,7 @@ describe('Publish CFN blueprint handler tests', () => { }, }, } as CodePipelineEvent, - {} as Context + {} as Context, ); expect(cpMock.calls()).toHaveLength(1); expect(cpMock.call(0).firstArg).toBeInstanceOf(PutJobSuccessResultCommand); @@ -261,7 +261,7 @@ describe('Publish CFN blueprint handler tests', () => { test('create a product if it does not already exist', async () => { jest.spyOn(publishModule, 'streamToString').mockReturnValue( - Promise.resolve(fixtureDynamoDbCfnTemplateYml) + Promise.resolve(fixtureDynamoDbCfnTemplateYml), ); scMock.on(DescribeProductAsAdminCommand).rejects({ name: 'ResourceNotFoundException', @@ -296,7 +296,7 @@ describe('Publish CFN blueprint handler tests', () => { }, }, } as CodePipelineEvent, - {} as Context + {} as Context, ); expect(cloudFormationClientMock.calls()).toHaveLength(1); expect(s3Mock.calls()).toHaveLength(3); @@ -304,7 +304,7 @@ describe('Publish CFN blueprint handler tests', () => { expect(scMock.call(0).firstArg).toBeInstanceOf(DescribeProductAsAdminCommand); expect(scMock.call(1).firstArg).toBeInstanceOf(CreateProductCommand); expect(scMock.call(2).firstArg).toBeInstanceOf( - AssociateProductWithPortfolioCommand + AssociateProductWithPortfolioCommand, ); expect(cpMock.calls()).toHaveLength(1); expect(cpMock.call(0).firstArg).toBeInstanceOf(PutJobSuccessResultCommand); @@ -314,9 +314,9 @@ describe('Publish CFN blueprint handler tests', () => { Buffer.from( cpMock.call(0).firstArg?.input?.outputVariables ?.CHANGED_SERVICE_CATALOG_PRODUCTS, - 'base64' - ).toString() - ) + 'base64', + ).toString(), + ), ).toEqual([ { name: `${BLUEPRINT_ID}_${TEMPLATE_NAME}`, @@ -330,7 +330,7 @@ describe('Publish CFN blueprint handler tests', () => { test('should fail the pipeline when creating product fails', async () => { jest.spyOn(publishModule, 'streamToString').mockReturnValue( - Promise.resolve(JSON.stringify(fixtureDynamoDbCfnTemplateJson)) + Promise.resolve(JSON.stringify(fixtureDynamoDbCfnTemplateJson)), ); scMock.on(DescribeProductAsAdminCommand).resolves({ ProductViewDetail: { ProductViewSummary: { ProductId: '123' } }, @@ -357,7 +357,7 @@ describe('Publish CFN blueprint handler tests', () => { UserParameters: JSON.stringify({ CHANGED_PACKAGES: Buffer.from(CHANGED_PACKAGES).toString( - 'base64' + 'base64', ), ALL_PACKAGES: Buffer.from(ALL_PACKAGES).toString('base64'), @@ -367,7 +367,7 @@ describe('Publish CFN blueprint handler tests', () => { }, }, } as CodePipelineEvent, - {} as Context + {} as Context, ); await expect(() => task()).rejects.toThrow(); @@ -377,7 +377,7 @@ describe('Publish CFN blueprint handler tests', () => { test('create a product version if product already exists', async () => { jest.spyOn(publishModule, 'streamToString').mockReturnValue( - Promise.resolve(JSON.stringify(fixtureDynamoDbCfnTemplateJson)) + Promise.resolve(JSON.stringify(fixtureDynamoDbCfnTemplateJson)), ); scMock.on(DescribeProductAsAdminCommand).resolves({ ProductViewDetail: { ProductViewSummary: { ProductId: '123' } }, @@ -411,7 +411,7 @@ describe('Publish CFN blueprint handler tests', () => { }, }, } as CodePipelineEvent, - {} as Context + {} as Context, ); expect(cloudFormationClientMock.calls()).toHaveLength(1); expect(scMock.calls()).toHaveLength(3); @@ -424,9 +424,9 @@ describe('Publish CFN blueprint handler tests', () => { Buffer.from( cpMock.call(0).firstArg?.input?.outputVariables ?.CHANGED_SERVICE_CATALOG_PRODUCTS, - 'base64' - ).toString() - ) + 'base64', + ).toString(), + ), ).toEqual([ { name: `${BLUEPRINT_ID}_${TEMPLATE_NAME}`, diff --git a/source/blueprint-infrastructure/test/unit/codepipeline/blueprint/register.test.ts b/source/blueprint-infrastructure/test/unit/codepipeline/blueprint/register.test.ts index 3ad93f1..0c0642c 100644 --- a/source/blueprint-infrastructure/test/unit/codepipeline/blueprint/register.test.ts +++ b/source/blueprint-infrastructure/test/unit/codepipeline/blueprint/register.test.ts @@ -85,7 +85,7 @@ describe('Register blueprint handler tests', () => { }, }, } as CodePipelineEvent, - {} as Context + {} as Context, ); }); @@ -105,7 +105,7 @@ describe('Register blueprint handler tests', () => { }, }, } as CodePipelineEvent, - {} as Context + {} as Context, ); expect(cpMock.calls()).toHaveLength(1); expect(cpMock.call(0).firstArg).toBeInstanceOf(PutJobSuccessResultCommand); @@ -134,7 +134,7 @@ describe('Register blueprint handler tests', () => { }, }, } as CodePipelineEvent, - {} as Context + {} as Context, ); expect(cpMock.calls()).toHaveLength(1); @@ -201,10 +201,10 @@ describe('Register blueprint handler tests', () => { VERSION_COMMIT_ID: 'commitabcd', VERSION_COMMIN_MESSAGE: 'commit message test', CHANGED_SERVICE_CATALOG_PRODUCTS: Buffer.from( - JSON.stringify([serviceCatalogProduct]) + JSON.stringify([serviceCatalogProduct]), ).toString('base64'), ALL_SERVICE_CATALOG_PRODUCTS: Buffer.from( - JSON.stringify([serviceCatalogProduct]) + JSON.stringify([serviceCatalogProduct]), ).toString('base64'), CHANGED_PACKAGES: Buffer.from(CHANGED_PACKAGES).toString('base64'), @@ -216,7 +216,7 @@ describe('Register blueprint handler tests', () => { }, }, } as CodePipelineEvent, - {} as Context + {} as Context, ); expect(cpMock.calls()).toHaveLength(1); expect(cpMock.call(0).firstArg).toBeInstanceOf(PutJobSuccessResultCommand); @@ -302,7 +302,7 @@ describe('Register blueprint handler tests', () => { }, }, } as CodePipelineEvent, - {} as Context + {} as Context, ); expect(cpMock.calls()).toHaveLength(1); expect(cpMock.call(0).firstArg).toBeInstanceOf(PutJobSuccessResultCommand); @@ -385,14 +385,14 @@ describe('Register blueprint handler tests', () => { VERSION_COMMIT_ID: 'commitabcd', VERSION_COMMIN_MESSAGE: 'commit message test', CHANGED_SERVICE_CATALOG_PRODUCTS: Buffer.from( - JSON.stringify([serviceCatalogProduct]) + JSON.stringify([serviceCatalogProduct]), ).toString('base64'), ALL_SERVICE_CATALOG_PRODUCTS: Buffer.from( - JSON.stringify([serviceCatalogProduct]) + JSON.stringify([serviceCatalogProduct]), ).toString('base64'), CHANGED_PACKAGES: Buffer.from(CHANGED_PACKAGES).toString( - 'base64' + 'base64', ), ALL_PACKAGES: Buffer.from(ALL_PACKAGES).toString('base64'), @@ -402,7 +402,7 @@ describe('Register blueprint handler tests', () => { }, }, } as CodePipelineEvent, - {} as Context + {} as Context, ); await expect(() => task()).rejects.toThrow(); @@ -534,7 +534,7 @@ describe('Register blueprint handler tests', () => { region: testRegion, products: testServiceCatalogProducts.map((p) => p.name), }, - }) + }), ); }); @@ -646,7 +646,7 @@ describe('Register blueprint handler tests', () => { domain: testCodeArtifactDomain, repository: testCodeArtifactRepository, }, - }) + }), ); }); }); diff --git a/source/blueprint-infrastructure/test/unit/github/createWebhook.test.ts b/source/blueprint-infrastructure/test/unit/github/createWebhook.test.ts index 4ae89e9..da386c6 100644 --- a/source/blueprint-infrastructure/test/unit/github/createWebhook.test.ts +++ b/source/blueprint-infrastructure/test/unit/github/createWebhook.test.ts @@ -77,7 +77,7 @@ describe('Create Codebuild Github webhook handler tests', () => { secret: 'secret', url: 'payloadUrl', }, - }) + }), ); }); @@ -95,7 +95,7 @@ describe('Create Codebuild Github webhook handler tests', () => { ResourceProperties: { PROJECT_NAME: 'codeBuildProject', }, - } as unknown as CloudFormationCustomResourceEvent) + } as unknown as CloudFormationCustomResourceEvent), ).rejects.toThrow(); expect(cbMock.calls()).toHaveLength(2); expect(cbMock.call(0).firstArg).toBeInstanceOf(CreateWebhookCommand); diff --git a/source/blueprint-ui/package.json b/source/blueprint-ui/package.json index 312b820..14428be 100644 --- a/source/blueprint-ui/package.json +++ b/source/blueprint-ui/package.json @@ -82,6 +82,8 @@ "jest": "^29.3.1", "webpack": "^5.81.0", "yaml": "^2.2.2", - "fast-xml-parser": "^4.2.5" + "fast-xml-parser": "^4.2.5", + "word-wrap": "^1.2.5", + "tough-cookie": "^4.1.3" } } diff --git a/source/blueprint-ui/src/components/containers/Attributes/Table/index.test.tsx b/source/blueprint-ui/src/components/containers/Attributes/Table/index.test.tsx index a06ea15..990eeed 100644 --- a/source/blueprint-ui/src/components/containers/Attributes/Table/index.test.tsx +++ b/source/blueprint-ui/src/components/containers/Attributes/Table/index.test.tsx @@ -42,6 +42,20 @@ const attributes: AttributeSummary[] = [ }, ]; jest.useRealTimers(); +jest.mock('../../../core/AppContext', () => { + return { + ...jest.requireActual('../../../core/AppContext'), + useAppContext: jest.fn().mockImplementation(() => { + return { + user: { + email: 'test@test.com', + groups: ['SYSTEM_ADMIN'], + }, + }; + }), + }; +}); + describe('AttributeTable', () => { test('render', async () => { const mockOnDelete = jest.fn(); diff --git a/source/blueprint-ui/src/components/containers/Attributes/Table/index.tsx b/source/blueprint-ui/src/components/containers/Attributes/Table/index.tsx index 9a418c3..71ceb4a 100644 --- a/source/blueprint-ui/src/components/containers/Attributes/Table/index.tsx +++ b/source/blueprint-ui/src/components/containers/Attributes/Table/index.tsx @@ -22,7 +22,8 @@ import Button from 'aws-northstar/components/Button'; import Inline from 'aws-northstar/layouts/Inline'; import { formatDate } from '../../../../utils/helpers'; import { ROUTE_ATTRIBUTE_CREATE, ROUTE_ATTRIBUTE_UPDATE } from '../../../routes'; -import { AttributeSummary } from '../../../types'; +import { AttributeSummary, PERMISSION_ATTRIBUTE_MANAGE } from '../../../types'; +import HasPermission from '../../../core/HasPermission'; export interface AttributeTableProps { attributes?: AttributeSummary[]; @@ -100,38 +101,40 @@ const AttributeTable: FunctionComponent = ({ : ''; return ( - - {!disableRowSelect && ( - - )} - {!disableRowSelect && !disableDelete && ( - - )} - {!disableCreate && ( - - )} - + + + {!disableRowSelect && ( + + )} + {!disableRowSelect && !disableDelete && ( + + )} + {!disableCreate && ( + + )} + + ); }, [ selectedAttributes, diff --git a/source/blueprint-ui/src/components/core/AppContext/index.tsx b/source/blueprint-ui/src/components/core/AppContext/index.tsx index 1164d6c..957b6e4 100644 --- a/source/blueprint-ui/src/components/core/AppContext/index.tsx +++ b/source/blueprint-ui/src/components/core/AppContext/index.tsx @@ -18,14 +18,12 @@ import { User } from '../../types'; export interface BlueprintContext { user?: User; - email: string; setUser: (user: User) => void; } const AppContext = createContext({ // eslint-disable-next-line @typescript-eslint/no-empty-function setUser: () => {}, - email: 'guest', }); export const AppContextProvider: FunctionComponent = ({ children }) => { @@ -36,7 +34,6 @@ export const AppContextProvider: FunctionComponent = ({ children }) => { value={{ user: authenticatedUser, setUser: setAuthenticatedUser, - email: authenticatedUser?.email ?? 'guest', }} > {children} diff --git a/source/blueprint-ui/src/components/core/Authenticate/index.test.tsx b/source/blueprint-ui/src/components/core/Authenticate/index.test.tsx index 9096e0c..e77501b 100644 --- a/source/blueprint-ui/src/components/core/Authenticate/index.test.tsx +++ b/source/blueprint-ui/src/components/core/Authenticate/index.test.tsx @@ -90,6 +90,9 @@ describe('Authenticate component tests', () => { idToken: { payload: { 'cognito:groups': ['User'] }, }, + accessToken: { + payload: { 'cognito:groups': ['SYSTEM_ADMIN'] }, + }, }, username: 'test_user', }); @@ -108,6 +111,7 @@ describe('Authenticate component tests', () => { // assert expect(mockSetUser).toHaveBeenCalledWith({ email: 'test@amazon.com', + groups: ['SYSTEM_ADMIN'], }); }); diff --git a/source/blueprint-ui/src/components/core/Authenticate/index.tsx b/source/blueprint-ui/src/components/core/Authenticate/index.tsx index 7e022bb..bb3df8e 100644 --- a/source/blueprint-ui/src/components/core/Authenticate/index.tsx +++ b/source/blueprint-ui/src/components/core/Authenticate/index.tsx @@ -39,8 +39,21 @@ export const Authenticate: FunctionComponent = ({ children }) => { Auth.currentAuthenticatedUser() .then((currentUser) => { logger.debug('Authenticated user', currentUser); + let federatedGroups = + currentUser.attributes['custom:groups'] ?? JSON.stringify([]); + try { + federatedGroups = JSON.parse(federatedGroups); + } catch (e) { + logger.debug(`federatedGroups is already parsed`); + } + const cognitoUserPoolGroups = + currentUser.signInUserSession.accessToken?.payload[ + 'cognito:groups' + ] ?? []; + const groups = cognitoUserPoolGroups.concat(federatedGroups); setUser({ email: currentUser.attributes.email, + groups, }); Cache.removeItem('signingIn'); }) diff --git a/source/blueprint-ui/src/components/core/HasPermission/index.test.tsx b/source/blueprint-ui/src/components/core/HasPermission/index.test.tsx new file mode 100644 index 0000000..8897fce --- /dev/null +++ b/source/blueprint-ui/src/components/core/HasPermission/index.test.tsx @@ -0,0 +1,48 @@ +/* + Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"). + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import { render } from '@testing-library/react'; + +import { UserGroup } from '../../types'; +import HasPermission from '.'; + +jest.mock('../AppContext', () => ({ + useAppContext: jest.fn().mockImplementation(() => { + return { + user: { + email: 'test@test.com', + groups: ['SYSTEM_ADMIN'], + }, + }; + }), +})); + +describe('Has Group', () => { + test('user group match', () => { + const { getByText } = render( + Test Text + ); + expect(getByText('Test Text')).toBeInTheDocument(); + }); + + test('user group not match', () => { + const { queryByText } = render( + + Test Text + + ); + expect(queryByText('Test Text')).not.toBeInTheDocument(); + }); +}); diff --git a/source/blueprint-ui/src/components/core/HasPermission/index.tsx b/source/blueprint-ui/src/components/core/HasPermission/index.tsx new file mode 100644 index 0000000..013d7b1 --- /dev/null +++ b/source/blueprint-ui/src/components/core/HasPermission/index.tsx @@ -0,0 +1,43 @@ +/* + Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + + Licensed under the Apache License, Version 2.0 (the "License"). + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ +import { FunctionComponent } from 'react'; +import { useAppContext } from '../AppContext'; +import { UserGroup } from '../../types'; + +export interface HasPermissionProps { + groups: UserGroup[]; + children: unknown; +} + +/** + * Usage: + * Things to Render + * + * @param groups list of UserGroup to check. + * @param children elements to render if user is in at least one of the groups passed in. + * @constructor + */ +export const HasPermission: FunctionComponent = ({ + groups, + children, +}) => { + const { user } = useAppContext(); + return user?.groups?.some((userGroup) => groups.includes(userGroup)) ? ( + <>{children} + ) : null; +}; + +export default HasPermission; diff --git a/source/blueprint-ui/src/components/pages/Attributes/Detail/index.test.tsx b/source/blueprint-ui/src/components/pages/Attributes/Detail/index.test.tsx index 2a6f1f9..70b4573 100644 --- a/source/blueprint-ui/src/components/pages/Attributes/Detail/index.test.tsx +++ b/source/blueprint-ui/src/components/pages/Attributes/Detail/index.test.tsx @@ -29,6 +29,19 @@ const mockUseHistoryPushFn = jest.fn(); const mockAddNotificationFn = jest.fn(); jest.mock('react-query'); +jest.mock('../../../core/AppContext', () => { + return { + ...jest.requireActual('../../../core/AppContext'), + useAppContext: jest.fn().mockImplementation(() => { + return { + user: { + email: 'test@test.com', + groups: ['SYSTEM_ADMIN'], + }, + }; + }), + }; +}); jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), useHistory: () => ({ diff --git a/source/blueprint-ui/src/components/pages/Attributes/Detail/index.tsx b/source/blueprint-ui/src/components/pages/Attributes/Detail/index.tsx index c6c2d7a..76401f7 100644 --- a/source/blueprint-ui/src/components/pages/Attributes/Detail/index.tsx +++ b/source/blueprint-ui/src/components/pages/Attributes/Detail/index.tsx @@ -30,7 +30,8 @@ import QueryContainerTemplate from '../../../core/QueryContainerTemplate'; import GetAttributeDetailsQuery from '../../../queries/GetAttributeDetailsQuery'; import { deleteAttribute } from '../../../queries/Mutation'; import { ROUTE_ATTRIBUTES_VIEW, ROUTE_ATTRIBUTE_UPDATE } from '../../../routes'; -import { DeleteAttributeParams } from '../../../types'; +import { DeleteAttributeParams, PERMISSION_ATTRIBUTE_MANAGE } from '../../../types'; +import HasPermission from '../../../core/HasPermission'; const AttributeDetail: FunctionComponent = () => { const appLayout = useAppLayoutContext(); @@ -87,22 +88,24 @@ const AttributeDetail: FunctionComponent = () => { }); return ( - - - - + + + + + + ); }, [attributeId, history]); diff --git a/source/blueprint-ui/src/components/pages/Attributes/List/index.test.tsx b/source/blueprint-ui/src/components/pages/Attributes/List/index.test.tsx index 745e402..d90c0e5 100644 --- a/source/blueprint-ui/src/components/pages/Attributes/List/index.test.tsx +++ b/source/blueprint-ui/src/components/pages/Attributes/List/index.test.tsx @@ -35,6 +35,19 @@ jest.mock('aws-northstar/layouts/AppLayout', () => ({ addNotification: mockAddNotificationFn, }), })); +jest.mock('../../../core/AppContext', () => { + return { + ...jest.requireActual('../../../core/AppContext'), + useAppContext: jest.fn().mockImplementation(() => { + return { + user: { + email: 'test@test.com', + groups: ['SYSTEM_ADMIN'], + }, + }; + }), + }; +}); const mockedUseQuery = useQuery as jest.Mock; const mockedUseMutation = useMutation as jest.Mock; diff --git a/source/blueprint-ui/src/components/pages/Patterns/Detail/index.tsx b/source/blueprint-ui/src/components/pages/Patterns/Detail/index.tsx index 142e13a..acfc793 100644 --- a/source/blueprint-ui/src/components/pages/Patterns/Detail/index.tsx +++ b/source/blueprint-ui/src/components/pages/Patterns/Detail/index.tsx @@ -42,7 +42,12 @@ import { setupNotification } from '../../../queries/Mutation'; import { useAppLayoutContext } from 'aws-northstar/layouts/AppLayout'; import { v4 as uuid } from 'uuid'; import { ROUTE_BLUEPRINT_UPDATE } from '../../../routes'; -import { NpmPackageDetails, PatternServiceCatalogProduct } from '../../../types'; +import { + NpmPackageDetails, + PERMISSION_PATTERN_MANAGE, + PatternServiceCatalogProduct, +} from '../../../types'; +import HasPermission from '../../../core/HasPermission'; const PatternDetails: FunctionComponent = () => { const context = useAppContext(); @@ -58,7 +63,7 @@ const PatternDetails: FunctionComponent = () => { retry: 3, }); - const email = useMemo(() => context.email, [context]); + const email = useMemo(() => context.user?.email, [context]); const { data: subscription, @@ -66,7 +71,8 @@ const PatternDetails: FunctionComponent = () => { refetch, } = useQuery( ['getsubs', blueprintId, email], - () => getSubscriptionQuery(blueprintId, email), + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + () => getSubscriptionQuery(blueprintId, email!), { retry: 3, refetchOnWindowFocus: false, @@ -261,15 +267,17 @@ const PatternDetails: FunctionComponent = () => { }); return ( - - - + + + + + ); }, [blueprintId, history]); @@ -318,7 +326,8 @@ const PatternDetails: FunctionComponent = () => { onChange={(enabled) => { subscribe.mutate({ patternId: blueprintId, - email, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + email: email!, subscribe: enabled, }); }} diff --git a/source/blueprint-ui/src/components/pages/Patterns/List/index.test.tsx b/source/blueprint-ui/src/components/pages/Patterns/List/index.test.tsx index 78e8435..76d5411 100644 --- a/source/blueprint-ui/src/components/pages/Patterns/List/index.test.tsx +++ b/source/blueprint-ui/src/components/pages/Patterns/List/index.test.tsx @@ -28,6 +28,20 @@ import { GetPatternsApiResponse } from '../../../types'; const mockUseHistoryReplaceFn = jest.fn(); const mockUseHistoryPushFn = jest.fn(); +jest.mock('../../../core/AppContext', () => { + return { + ...jest.requireActual('../../../core/AppContext'), + useAppContext: jest.fn().mockImplementation(() => { + return { + user: { + email: 'test@test.com', + groups: ['SYSTEM_ADMIN'], + }, + }; + }), + }; +}); + jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), useHistory: () => ({ diff --git a/source/blueprint-ui/src/components/pages/Patterns/List/index.tsx b/source/blueprint-ui/src/components/pages/Patterns/List/index.tsx index 0372d4c..aefbf70 100644 --- a/source/blueprint-ui/src/components/pages/Patterns/List/index.tsx +++ b/source/blueprint-ui/src/components/pages/Patterns/List/index.tsx @@ -28,7 +28,8 @@ import GetAllPatternsQuery from '../../../queries/GetAllPatternsQuery'; import QueryContainerTemplate from '../../../core/QueryContainerTemplate'; import BlueprintInfrastructureStatus from '../../InfrastructureStatus/index'; import { formatDate } from '../../../../utils/helpers'; -import { PatternWithPublishData } from '../../../types'; +import { PERMISSION_PATTERN_MANAGE, PatternWithPublishData } from '../../../types'; +import HasPermission from '../../../core/HasPermission'; export const getColumnDefinitions = () => { // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -226,24 +227,26 @@ const PatternsList: FunctionComponent = () => { : ''; return ( - - - - + + + + + + ); }, [history, selectedPatterns]); diff --git a/source/blueprint-ui/src/components/types/index.ts b/source/blueprint-ui/src/components/types/index.ts index dd51d01..a3717d4 100644 --- a/source/blueprint-ui/src/components/types/index.ts +++ b/source/blueprint-ui/src/components/types/index.ts @@ -181,4 +181,17 @@ export interface AttributeDetailProps { export interface User { email: string; + groups?: UserGroup[]; } + +export enum UserGroup { + SYSTEM_ADMIN = 'SYSTEM_ADMIN', + PATTERN_PUBLISHER = 'PATTERN_PUBLISHER', +} + +export const PERMISSION_PATTERN_MANAGE = [ + UserGroup.PATTERN_PUBLISHER, + UserGroup.SYSTEM_ADMIN, +]; + +export const PERMISSION_ATTRIBUTE_MANAGE = [UserGroup.SYSTEM_ADMIN]; diff --git a/source/blueprint-ui/yarn.lock b/source/blueprint-ui/yarn.lock index 35c4ffb..5932885 100644 --- a/source/blueprint-ui/yarn.lock +++ b/source/blueprint-ui/yarn.lock @@ -13370,10 +13370,10 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tough-cookie@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874" - integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ== +tough-cookie@^4.1.2, tough-cookie@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" punycode "^2.1.1" @@ -14129,10 +14129,10 @@ which@^2.0.1: dependencies: isexe "^2.0.0" -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word-wrap@^1.2.3, word-wrap@^1.2.5, word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== workbox-background-sync@6.5.4: version "6.5.4" diff --git a/source/cypress.config.ts b/source/cypress.config.ts index 3f6aaae..9d6abb7 100644 --- a/source/cypress.config.ts +++ b/source/cypress.config.ts @@ -70,7 +70,7 @@ async function deleteNpmPackagesFromCodeArtifact(): Promise { format: 'npm', package: packageName, namespace: 'cypress-cdk', - }) + }), ); console.log(`Deleted the npm package ${packageName}`); } @@ -81,7 +81,7 @@ async function deleteGithubSourceCodeRepo( githubBaseUrl: string, githubToken: string, githubOrg: string, - repoName: string + repoName: string, ): Promise { const octokit = getOctokit(githubBaseUrl, githubToken); await octokit.request(`DELETE /repos/${githubOrg}/${repoName}`); @@ -93,7 +93,7 @@ async function deleteCodeCommmitSourceCodeRepo(repositoryName: string): Promise< await codeCommitClient.send( new DeleteRepositoryCommand({ repositoryName, - }) + }), ); console.log(`Deleted codecommit source code repo: ${repositoryName}`); } @@ -105,7 +105,7 @@ async function deletePatternStack(patternName: string): Promise { await cfnClient.send( new DeleteStackCommand({ StackName: stackName, - }) + }), ); await waitUntilStackDeleteComplete( @@ -115,7 +115,7 @@ async function deletePatternStack(patternName: string): Promise { }, { StackName: stackName, - } + }, ); console.log(`Stack: ${stackName} deletion completed successfully`); } @@ -125,7 +125,7 @@ async function deleteFromDynamoDbTable(patternName: string): Promise { // get table names const listTablesResponse = await ddbClient.send(new ListTablesCommand({})); const publishTableArr = listTablesResponse.TableNames?.filter((item) => - item.startsWith('ApoStack-RapmBackendrapmPublishDataTable') + item.startsWith('ApoStack-RapmBackendrapmPublishDataTable'), ); if (publishTableArr) { if (publishTableArr.length > 1) { @@ -133,7 +133,7 @@ async function deleteFromDynamoDbTable(patternName: string): Promise { } const publishTableName = publishTableArr[0]; const metaDataTableArr = listTablesResponse.TableNames?.filter((item) => - item.startsWith('ApoStack-RapmBackendrapmMetaDataTable') + item.startsWith('ApoStack-RapmBackendrapmMetaDataTable'), ); if (metaDataTableArr) { if (metaDataTableArr.length > 1) { @@ -149,7 +149,7 @@ async function deleteFromDynamoDbTable(patternName: string): Promise { ExpressionAttributeValues: { ':patternId': { S: patternName }, }, - }) + }), ); // delete publish data for pattern @@ -166,13 +166,13 @@ async function deleteFromDynamoDbTable(patternName: string): Promise { S: patternPublishItem.commitId.S as string, }, }, - }) + }), ); } } console.log( - `Deleted pattern's publish data from publish table. (${patternName})` + `Deleted pattern's publish data from publish table. (${patternName})`, ); // Delete metadata table await ddbClient.send( @@ -183,10 +183,10 @@ async function deleteFromDynamoDbTable(patternName: string): Promise { S: patternName, }, }, - }) + }), ); console.log( - `Deleted pattern's meta data from metadata table (${patternName})` + `Deleted pattern's meta data from metadata table (${patternName})`, ); } } @@ -196,7 +196,7 @@ async function deleteFromDynamoDbTable(patternName: string): Promise { async function deleteServiceCatalogProduct(patternName: string): Promise { const listCommandResponse = await scClient.send(new ListPortfoliosCommand({})); const portfolioResponse = listCommandResponse.PortfolioDetails?.find( - (element) => element.DisplayName === 'PatternsPortfolio' + (element) => element.DisplayName === 'PatternsPortfolio', ); if (!portfolioResponse) { throw new Error(`Can't find portfolio PatternsPortfolio`); @@ -206,7 +206,7 @@ async function deleteServiceCatalogProduct(patternName: string): Promise { const describeProductAsAdminResponse = await scClient.send( new DescribeProductAsAdminCommand({ Name: `${patternName}_dynamodb`, - }) + }), ); // Disassociate product from portfolio @@ -216,19 +216,19 @@ async function deleteServiceCatalogProduct(patternName: string): Promise { new DisassociateProductFromPortfolioCommand({ PortfolioId: portfolioId, ProductId: productId, - }) + }), ); console.log( - `Disassociated the product ${patternName}_dynamodb from portfolio. (PatternName: ${patternName})` + `Disassociated the product ${patternName}_dynamodb from portfolio. (PatternName: ${patternName})`, ); // Delete product scClient.send( new DeleteProductCommand({ Id: productId, - }) + }), ); console.log( - `Deleted the service catalog product ${patternName}_dynamodb. (PatternName: ${patternName})` + `Deleted the service catalog product ${patternName}_dynamodb. (PatternName: ${patternName})`, ); } @@ -263,7 +263,7 @@ module.exports = defineConfig({ const getParamResp = await ssmClient.send( new GetParameterCommand({ Name: ssmParamApoEndpoint, - }) + }), ); const apoApiEndpoint = getParamResp.Parameter?.Value; @@ -291,7 +291,7 @@ module.exports = defineConfig({ const getParamResp = await ssmClient.send( new GetParameterCommand({ Name: ssmParamApoEndpoint, - }) + }), ); const apoApiEndpoint = getParamResp.Parameter?.Value; @@ -306,11 +306,11 @@ module.exports = defineConfig({ `${apoApiEndpoint}attributes/${attributeKey}:${attributeValue}`, { headers: { Authorization: `Bearer ${accessToken}` }, - } + }, ); } catch (e) { console.log( - `attribute ${attributeKey}:${attributeValue} doesn't exist, hence ignoring delete` + `attribute ${attributeKey}:${attributeValue} doesn't exist, hence ignoring delete`, ); } return null; @@ -323,12 +323,12 @@ module.exports = defineConfig({ config.env.templateDir, config.env.githubBaseUrl, config.env.githubToken, - patternType + patternType, ) : await commitAndPushToCodeCommitPatternRepo( patternName, config.env.templateDir, - patternType + patternType, ); return null; }, @@ -347,7 +347,7 @@ module.exports = defineConfig({ config.env.githubBaseUrl, config.env.githubToken, config.env.githubOrg, - patternName + patternName, ) : await deleteCodeCommmitSourceCodeRepo(patternName); return null; @@ -363,7 +363,7 @@ async function commitAndPushToGitHubPatternRepo( templateDir: string, githubBaseUrl: string, githubToken: string, - patternType: string + patternType: string, ): Promise { const repoName = patternName; const octokit = getOctokit(githubBaseUrl, githubToken); @@ -376,7 +376,7 @@ async function commitAndPushToGitHubPatternRepo( do { try { latestSHAResp = await octokit.request( - `GET /repos/${githubOrg}/${repoName}/branches/master` + `GET /repos/${githubOrg}/${repoName}/branches/master`, ); if (latestSHAResp.status >= 200 && latestSHAResp.status <= 299) { retry = false; @@ -405,7 +405,7 @@ async function commitAndPushToGitHubPatternRepo( githubBaseUrl, githubToken, githubOrg, - templateDir + templateDir, ); // 3. Create the commit @@ -416,7 +416,7 @@ async function commitAndPushToGitHubPatternRepo( message: 'feat: added packages', parents: [latestSHA], tree: createTreeResp.data.sha, - } + }, ); // 4. Update the reference of your branch to point to the new commit SHA (on master branch example) @@ -431,20 +431,20 @@ async function commitAndPushToGitHubPatternRepo( async function commitAndPushToCodeCommitPatternRepo( repoName: string, templateDir: string, - patternType: string + patternType: string, ): Promise { const branchName = 'master'; const getBranchRes = await codeCommitClient.send( new GetBranchCommand({ repositoryName: repoName, branchName, - }) + }), ); // initialise repo const putFilesArr: PutFileEntry[] = []; const dirPath = path.resolve( __dirname, - `./${templateDir}/${patternType.toLowerCase()}` + `./${templateDir}/${patternType.toLowerCase()}`, ); buildPutFilesArr(patternType, templateDir, dirPath, branchName, putFilesArr); await codeCommitClient.send( @@ -454,7 +454,7 @@ async function commitAndPushToCodeCommitPatternRepo( parentCommitId: getBranchRes.branch?.commitId, commitMessage: 'Initialise repository', putFiles: putFilesArr, - }) + }), ); } @@ -463,7 +463,7 @@ function buildPutFilesArr( templateDir: string, dirPath: string, branchName: string, - putFileEntryArr: PutFileEntry[] + putFileEntryArr: PutFileEntry[], ): void { const list = fs.readdirSync(dirPath); for (const fname of list) { @@ -477,7 +477,7 @@ function buildPutFilesArr( const fileContent = fs.readFileSync(file).toString(); const fileRelativePath = file.substring( path.resolve(__dirname, `./${templateDir}/${patternType.toLowerCase()}`) - .length + 1 + .length + 1, ); putFileEntryArr.push({ filePath: fileRelativePath, @@ -501,7 +501,7 @@ async function createGitTreeArray( templateDir: string, gitTreeArray?: | { path: unknown; mode: string; type: string; sha: unknown }[] - | undefined + | undefined, ) { if (!gitTreeArray) { gitTreeArray = []; @@ -520,7 +520,7 @@ async function createGitTreeArray( githubToken, githubOrg, templateDir, - gitTreeArray + gitTreeArray, ); } else { /* Is a file */ @@ -530,7 +530,7 @@ async function createGitTreeArray( githubBaseUrl, githubToken, githubOrg, - templateDir + templateDir, ); gitTreeArray.push(treeObjForCommit); } @@ -547,7 +547,7 @@ async function getGitTree( githubBaseUrl: string, githubToken: string, githubOrg: string, - templateDir: string + templateDir: string, ) { const octokit = getOctokit(githubBaseUrl, githubToken); const tree = await createGitTreeArray( @@ -556,7 +556,7 @@ async function getGitTree( githubBaseUrl, githubToken, githubOrg, - templateDir + templateDir, ); return octokit.request(`POST /repos/${githubOrg}/${repoName}/git/trees`, { accept: 'application/vnd.github.v3+json', @@ -575,7 +575,7 @@ async function getTreeObjectForCommit( githubBaseUrl: string, githubToken: string, githubOrg: string, - templateDir: string + templateDir: string, ): Promise<{ path: string; mode: string; @@ -590,7 +590,7 @@ async function getTreeObjectForCommit( accept: 'application/vnd.github.v3+json', content, encoding: 'utf-8', - } + }, ); const relativePathFromRoot = getRelativePathFromRoot(filePath, templateDir); return getTreeObject(relativePathFromRoot, createBlob.data.sha); @@ -599,7 +599,7 @@ async function getTreeObjectForCommit( function getRelativePathFromRoot(filePath: string, templateDir: string): string { const templateRootDir = `/${templateDir}`; return filePath.substring( - filePath.lastIndexOf(templateRootDir) + templateRootDir.length + 5 + filePath.lastIndexOf(templateRootDir) + templateRootDir.length + 5, ); } @@ -609,7 +609,7 @@ function getRelativePathFromRoot(filePath: string, templateDir: string): string // eslint-disable-next-line @typescript-eslint/explicit-function-return-type function getTreeObject( filePath: string, - sha: string + sha: string, ): { path: string; mode: string; diff --git a/source/cypress/fixtures/templaterepo/cdk/packages/compliant-dynamodb-table/lib/compliant-dynamodb-table.ts b/source/cypress/fixtures/templaterepo/cdk/packages/compliant-dynamodb-table/lib/compliant-dynamodb-table.ts index 8f44e30..bb823b8 100644 --- a/source/cypress/fixtures/templaterepo/cdk/packages/compliant-dynamodb-table/lib/compliant-dynamodb-table.ts +++ b/source/cypress/fixtures/templaterepo/cdk/packages/compliant-dynamodb-table/lib/compliant-dynamodb-table.ts @@ -25,7 +25,7 @@ export class CompliantDynamoDbTable extends Construct { public constructor( scope: Construct, id: string, - props?: CompliantDynamoDbTableProps + props?: CompliantDynamoDbTableProps, ) { super(scope, id); this.table = new ddb.Table(this, 'CompliantDdbTable', { diff --git a/source/cypress/fixtures/templaterepo/cdk/packages/compliant-dynamodb-table/package.json b/source/cypress/fixtures/templaterepo/cdk/packages/compliant-dynamodb-table/package.json index 6e2bf8f..0541e19 100644 --- a/source/cypress/fixtures/templaterepo/cdk/packages/compliant-dynamodb-table/package.json +++ b/source/cypress/fixtures/templaterepo/cdk/packages/compliant-dynamodb-table/package.json @@ -2,7 +2,7 @@ "name": "@cypress-cdk/compliant-dynamodbtable", "version": "1.0.0", "description": "Compliant DynamoDb Table ", - "license": "ISC", + "license": "Apache-2.0", "main": "lib/compliant-dynamodb-table.js", "directories": { "lib": "lib", diff --git a/source/cypress/fixtures/templaterepo/cdk/packages/compliant-s3-bucket/package.json b/source/cypress/fixtures/templaterepo/cdk/packages/compliant-s3-bucket/package.json index a93edff..882b2c6 100644 --- a/source/cypress/fixtures/templaterepo/cdk/packages/compliant-s3-bucket/package.json +++ b/source/cypress/fixtures/templaterepo/cdk/packages/compliant-s3-bucket/package.json @@ -2,7 +2,7 @@ "name": "@cypress-cdk/compliant-s3-bucket", "version": "1.0.0", "description": "Compliant S3 bucket", - "license": "ISC", + "license": "Apache-2.0", "main": "lib/compliant-s3-bucket.js", "directories": { "lib": "lib" diff --git a/source/cypress/fixtures/templaterepo/cfn/packages/dynamodb/package.json b/source/cypress/fixtures/templaterepo/cfn/packages/dynamodb/package.json index 63fd764..2cca2d9 100644 --- a/source/cypress/fixtures/templaterepo/cfn/packages/dynamodb/package.json +++ b/source/cypress/fixtures/templaterepo/cfn/packages/dynamodb/package.json @@ -1,5 +1,6 @@ { "name": "dynamodb", "version": "1.0.0", - "license": "MIT" + "license": "Apache-2.0", + "description": "Test package for cypress testing" } \ No newline at end of file diff --git a/source/lambda/blueprintgovernanceservice/.eslintrc.js b/source/lambda/blueprintgovernanceservice/.eslintrc.js index e601840..13381ad 100644 --- a/source/lambda/blueprintgovernanceservice/.eslintrc.js +++ b/source/lambda/blueprintgovernanceservice/.eslintrc.js @@ -18,7 +18,7 @@ module.exports = { tsconfigRootDir: __dirname, project: ['./tsconfig.json'], }, - plugins: ['@typescript-eslint', 'header'], + plugins: ['@typescript-eslint', 'header', 'import'], rules: { 'header/header': [2, path.join(__dirname, 'LicenseHeader.txt')], @@ -35,7 +35,7 @@ module.exports = { { selector: 'typeLike', format: ['PascalCase'] }, ], '@typescript-eslint/no-confusing-void-expression': ['error'], - '@typescript-eslint/no-duplicate-imports': ['error'], + 'import/no-duplicates': ['error'], '@typescript-eslint/no-empty-interface': ['warn'], '@typescript-eslint/no-inferrable-types': ['warn'], '@typescript-eslint/no-invalid-void-type': ['error'], diff --git a/source/lambda/blueprintgovernanceservice/initialRepoTemplates/cdk/package.json b/source/lambda/blueprintgovernanceservice/initialRepoTemplates/cdk/package.json index 710b8aa..645f6bf 100644 --- a/source/lambda/blueprintgovernanceservice/initialRepoTemplates/cdk/package.json +++ b/source/lambda/blueprintgovernanceservice/initialRepoTemplates/cdk/package.json @@ -1,5 +1,7 @@ { "private": true, + "description": "CDK based pattern", + "license": "Apache-2.0", "workspaces": [ "packages/*" ], diff --git a/source/lambda/blueprintgovernanceservice/initialRepoTemplates/cdk/packages/cdk-test-app/package.json b/source/lambda/blueprintgovernanceservice/initialRepoTemplates/cdk/packages/cdk-test-app/package.json index e4f6d89..76afdf4 100644 --- a/source/lambda/blueprintgovernanceservice/initialRepoTemplates/cdk/packages/cdk-test-app/package.json +++ b/source/lambda/blueprintgovernanceservice/initialRepoTemplates/cdk/packages/cdk-test-app/package.json @@ -1,6 +1,7 @@ { "name": "cdk-test-app", "version": "1.0.0", + "license": "Apache-2.0", "private": "true", "description": "CDK Test app to generate CDK templates for all constructs.", "bin": { diff --git a/source/lambda/blueprintgovernanceservice/initialRepoTemplates/cfn/package.json b/source/lambda/blueprintgovernanceservice/initialRepoTemplates/cfn/package.json index 0ede003..eb28b73 100644 --- a/source/lambda/blueprintgovernanceservice/initialRepoTemplates/cfn/package.json +++ b/source/lambda/blueprintgovernanceservice/initialRepoTemplates/cfn/package.json @@ -1,5 +1,7 @@ { "private": true, + "description": "Cloudformation based pattern", + "license": "Apache-2.0", "workspaces": [ "packages/*" ] diff --git a/source/lambda/blueprintgovernanceservice/package-lock.json b/source/lambda/blueprintgovernanceservice/package-lock.json index a1b4b7d..343a9fd 100644 --- a/source/lambda/blueprintgovernanceservice/package-lock.json +++ b/source/lambda/blueprintgovernanceservice/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-js": "^4.0.0", + "@aws-crypto/sha256-js": "^5.0.0", "@aws-sdk/client-cloudformation": "^3.310.0", "@aws-sdk/client-codebuild": "^3.310.0", "@aws-sdk/client-codecommit": "^3.310.0", @@ -24,7 +24,7 @@ "@aws-sdk/util-utf8-node": "^3.259.0", "@middy/core": "^4.3.1", "@middy/http-cors": "^4.3.1", - "@octokit/rest": "^19.0.3", + "@octokit/rest": "^20.0.1", "@types/uuid": "^9.0.1", "aws-lambda": "^1.0.6", "aws-sdk": "^2.1354.0", @@ -33,7 +33,7 @@ "axios": "^1.3.6", "encoding": "^0.1.13", "handlebars": "^4.7.7", - "https-proxy-agent": "^5.0.1", + "https-proxy-agent": "^7.0.1", "lodash": "^4.17.21", "lodash.isstring": "^4.0.1", "loglevel": "^1.7.1", @@ -42,9 +42,9 @@ "reflect-metadata": "^0.1.13", "source-map-support": "^0.5.21", "ts-mockito": "^2.6.1", - "tsyringe": "^4.7.0", + "tsyringe": "^4.8.0", "uuid": "^9.0.0", - "whatwg-url": "^12.0.1", + "whatwg-url": "^13.0.0", "winston": "^3.8.1", "winston-transport": "^4.5.0" }, @@ -56,22 +56,23 @@ "@types/lodash": "^4.14.182", "@types/lodash.isstring": "^4.0.6", "@types/whatwg-url": "^11.0.0", - "@typescript-eslint/eslint-plugin": "^5.31.0", - "@typescript-eslint/parser": "^5.31.0", - "aws-sdk-client-mock": "^2.0.1", - "aws-sdk-client-mock-jest": "^2.1.0", + "@typescript-eslint/eslint-plugin": "^6.2.0", + "@typescript-eslint/parser": "^6.2.0", + "aws-sdk-client-mock": "^3.0.0", + "aws-sdk-client-mock-jest": "^3.0.0", "eslint": "^8.20.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-header": "^3.1.1", - "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-prettier": "^5.0.0", "filemanager-webpack-plugin": "^8.0.0", "jest": "^29.3.1", "jest-junit": "^16.0.0", "jest-when": "^3.5.1", - "prettier": "^2.7.1", + "prettier": "^3.0.0", "ts-jest": "^29.0.3", "ts-loader": "^9.3.1", - "typescript": "^4.7.4", + "typescript": "^5.1.6", "webpack": "^5.81.0", "webpack-cli": "^5.0.2" }, @@ -204,13 +205,16 @@ } }, "node_modules/@aws-crypto/sha256-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-4.0.0.tgz", - "integrity": "sha512-MHGJyjE7TX9aaqXj7zk2ppnFUOhaDs5sP+HtNS0evOxn72c+5njUmyJmpGd7TfyoDznZlHMmdo/xGUdu2NIjNQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.0.0.tgz", + "integrity": "sha512-g+u9iKkaQVp9Mjoxq1IJSHj9NHGZF441+R/GIH0dn7u4mix5QQ4VqgpppHrNm1LzjUzb0BpcFGsBXP6cOVf+ZQ==", "dependencies": { - "@aws-crypto/util": "^4.0.0", + "@aws-crypto/util": "^5.0.0", "@aws-sdk/types": "^3.222.0", "tslib": "^1.11.1" + }, + "engines": { + "node": ">=16.0.0" } }, "node_modules/@aws-crypto/supports-web-crypto": { @@ -222,9 +226,9 @@ } }, "node_modules/@aws-crypto/util": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-4.0.0.tgz", - "integrity": "sha512-2EnmPy2gsFZ6m8bwUQN4jq+IyXV3quHAcwPOS6ZA3k+geujiqI8aRokO2kFJe+idJ/P3v4qWI186rVMo0+zLDQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.0.0.tgz", + "integrity": "sha512-1GYqLdYRe96idcCltlqxdJ68OWE6ADT8qGLmVi7PVHKl8AxD2EWSbJSSevPq2eTx6vaPZpkr1RoZ3lcw/uGoEA==", "dependencies": { "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-utf8-browser": "^3.0.0", @@ -3189,9 +3193,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -3783,152 +3787,176 @@ } }, "node_modules/@octokit/auth-token": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz", - "integrity": "sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==", - "dependencies": { - "@octokit/types": "^9.0.0" - }, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz", - "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==", - "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.0.tgz", + "integrity": "sha512-YbAtMWIrbZ9FCXbLwT9wWB8TyLjq9mxpKdgB3dUNxQcIVTf9hJ70gRPwAcqGZdY6WdJPZ0I7jLaaNDCiloGN2A==", + "dependencies": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.0.0", + "@octokit/request": "^8.0.2", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^11.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/endpoint": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz", - "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz", + "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==", "dependencies": { - "@octokit/types": "^9.0.0", + "@octokit/types": "^11.0.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/graphql": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz", - "integrity": "sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.1.tgz", + "integrity": "sha512-T5S3oZ1JOE58gom6MIcrgwZXzTaxRnxBso58xhozxHpOqSTgDS6YNeEUvZ/kRvXgPrRz/KHnZhtb7jUMRi9E6w==", "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", + "@octokit/request": "^8.0.1", + "@octokit/types": "^11.0.0", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/openapi-types": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz", - "integrity": "sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==" + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz", - "integrity": "sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-8.0.0.tgz", + "integrity": "sha512-2xZ+baZWUg+qudVXnnvXz7qfrTmDeYPCzangBVq/1gXxii/OiS//4shJp9dnCCvj1x+JAm9ji1Egwm1BA47lPQ==", "dependencies": { - "@octokit/types": "^9.0.0" + "@octokit/types": "^11.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=4" + "@octokit/core": ">=5" } }, "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz", + "integrity": "sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA==", + "engines": { + "node": ">= 18" + }, "peerDependencies": { - "@octokit/core": ">=3" + "@octokit/core": ">=5" } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz", - "integrity": "sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-9.0.0.tgz", + "integrity": "sha512-KquMF/VB1IkKNiVnzJKspY5mFgGyLd7HzdJfVEGTJFzqu9BRFNWt+nwTCMuUiWc72gLQhRWYubTwOkQj+w/1PA==", "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.3.1" + "@octokit/types": "^11.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=3" + "@octokit/core": ">=5" } }, "node_modules/@octokit/request": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.3.tgz", - "integrity": "sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", + "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", + "@octokit/endpoint": "^9.0.0", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^11.1.0", "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz", + "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==", "dependencies": { - "@octokit/types": "^9.0.0", + "@octokit/types": "^11.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/rest": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz", - "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==", + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.0.1.tgz", + "integrity": "sha512-wROV21RwHQIMNb2Dgd4+pY+dVy1Dwmp85pBrgr6YRRDYRBu9Gb+D73f4Bl2EukZSj5hInq2Tui9o7gAQpc2k2Q==", "dependencies": { - "@octokit/core": "^4.1.0", - "@octokit/plugin-paginate-rest": "^6.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.0.0" + "@octokit/core": "^5.0.0", + "@octokit/plugin-paginate-rest": "^8.0.0", + "@octokit/plugin-request-log": "^4.0.0", + "@octokit/plugin-rest-endpoint-methods": "^9.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/types": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz", - "integrity": "sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz", + "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, "dependencies": { - "@octokit/openapi-types": "^16.0.0" + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, + "node_modules/@pkgr/utils/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "dev": true + }, "node_modules/@sinclair/typebox": { "version": "0.25.24", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", @@ -4147,9 +4175,15 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "node_modules/@types/lodash": { @@ -4221,9 +4255,9 @@ } }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "node_modules/@types/serve-static": { @@ -4297,32 +4331,34 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.58.0.tgz", - "integrity": "sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.2.0.tgz", + "integrity": "sha512-rClGrMuyS/3j0ETa1Ui7s6GkLhfZGKZL3ZrChLeAiACBE/tRc1wq8SNZESUuluxhLj9FkUefRs2l6bCIArWBiQ==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/type-utils": "5.58.0", - "@typescript-eslint/utils": "5.58.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.2.0", + "@typescript-eslint/type-utils": "6.2.0", + "@typescript-eslint/utils": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4331,25 +4367,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz", - "integrity": "sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.2.0.tgz", + "integrity": "sha512-igVYOqtiK/UsvKAmmloQAruAdUHihsOCvplJpplPZ+3h4aDkC/UKZZNKgB6h93ayuYLuEymU3h8nF1xMRbh37g==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", + "@typescript-eslint/scope-manager": "6.2.0", + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/typescript-estree": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4358,16 +4395,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz", - "integrity": "sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.2.0.tgz", + "integrity": "sha512-1ZMNVgm5nnHURU8ZSJ3snsHzpFeNK84rdZjluEVBGNu7jDymfqceB3kdIZ6A4xCfEFFhRIB6rF8q/JIqJd2R0Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0" + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -4375,25 +4412,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.58.0.tgz", - "integrity": "sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.2.0.tgz", + "integrity": "sha512-DnGZuNU2JN3AYwddYIqrVkYW0uUQdv0AY+kz2M25euVNlujcN2u+rJgfJsBFlUEzBB6OQkUqSZPyuTLf2bP5mw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.58.0", - "@typescript-eslint/utils": "5.58.0", + "@typescript-eslint/typescript-estree": "6.2.0", + "@typescript-eslint/utils": "6.2.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -4402,12 +4439,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz", - "integrity": "sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.2.0.tgz", + "integrity": "sha512-1nRRaDlp/XYJQLvkQJG5F3uBTno5SHPT7XVcJ5n1/k2WfNI28nJsvLakxwZRNY5spuatEKO7d5nZWsQpkqXwBA==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -4415,21 +4452,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz", - "integrity": "sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.2.0.tgz", + "integrity": "sha512-Mts6+3HQMSM+LZCglsc2yMIny37IhUgp1Qe8yJUYVyO6rHP7/vN0vajKu3JvHCBIy8TSiKddJ/Zwu80jhnGj1w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0", + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -4442,42 +4479,41 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz", - "integrity": "sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.2.0.tgz", + "integrity": "sha512-RCFrC1lXiX1qEZN8LmLrxYRhOkElEsPKTVSNout8DMzf8PeWoQG7Rxz2SadpJa3VSh5oYKGwt7j7X/VRg+Y3OQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.2.0", + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/typescript-estree": "6.2.0", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz", - "integrity": "sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.2.0.tgz", + "integrity": "sha512-QbaYUQVKKo9bgCzpjz45llCfwakyoxHetIy8CAvYCtd16Zu1KrpzNHofwF8kGkpPOxZB2o6kz+0nqH8ZkIzuoQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.58.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.2.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -4717,14 +4753,14 @@ } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dependencies": { - "debug": "4" + "debug": "^4.3.4" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/aggregate-error": { @@ -4945,6 +4981,38 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -4954,6 +5022,62 @@ "node": ">=8" } }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -5026,9 +5150,9 @@ } }, "node_modules/aws-sdk-client-mock": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/aws-sdk-client-mock/-/aws-sdk-client-mock-2.1.1.tgz", - "integrity": "sha512-UuxXmICU4nmXTRm2BzLZdXmnyI+5NEBb5McRDkObasXVxXChvLm0Ci/PGENh4sCD+Es64SJiz70mtY48JROk0A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock/-/aws-sdk-client-mock-3.0.0.tgz", + "integrity": "sha512-4mBiWhuLYLZe1+K/iB8eYy5SAZyW2se+Keyh5u9QouMt6/qJ5SRZhss68xvUX5g3ApzROJ06QPRziYHP6buuvQ==", "dev": true, "dependencies": { "@types/sinon": "^10.0.10", @@ -5037,16 +5161,16 @@ } }, "node_modules/aws-sdk-client-mock-jest": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/aws-sdk-client-mock-jest/-/aws-sdk-client-mock-jest-2.1.1.tgz", - "integrity": "sha512-z1rpv2ACN1WSGU8u73sJVC0pHPuJfHyITAE88Luz6ph6w47YIkgG0G2latoSmvqJwanv1gJYFk+1VPHJdco1Ig==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock-jest/-/aws-sdk-client-mock-jest-3.0.0.tgz", + "integrity": "sha512-oV1rBQZc4UumLbzZAhi8UAehUq+k75hkQYGLrVIP0iJj85Z9xw+EaSsmJke/KQ8Z3vng+Xv1xbounsxpvZpunQ==", "dev": true, "dependencies": { "@types/jest": "^28.1.3", "tslib": "^2.1.0" }, "peerDependencies": { - "aws-sdk-client-mock": "2.1.1" + "aws-sdk-client-mock": "3.0.0" } }, "node_modules/aws-sdk-client-mock-jest/node_modules/@jest/expect-utils": { @@ -5467,6 +5591,15 @@ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -5507,6 +5640,18 @@ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -5602,6 +5747,21 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -5973,103 +6133,275 @@ "node": ">=0.10.0" } }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", "dev": true, "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, "engines": { - "node": ">=0.4.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" + "node_modules/default-browser/node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "node_modules/default-browser/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=14.18.0" } }, - "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "node_modules/default-browser/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, "engines": { - "node": ">=0.3.1" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "node_modules/default-browser/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/default-browser/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "dependencies": { - "path-type": "^4.0.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "node_modules/default-browser/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "dependencies": { - "esutils": "^2.0.2" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/electron-to-chromium": { - "version": "1.4.363", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.363.tgz", - "integrity": "sha512-ReX5qgmSU7ybhzMuMdlJAdYnRhT90UB3k9M05O5nF5WH3wR5wgdJjXw0uDeFyKNhmglmQiOxkAbzrP0hMKM59g==", - "dev": true - }, - "node_modules/emitter-listener": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", - "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", - "dependencies": { - "shimmer": "^1.2.0" + "node_modules/default-browser/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "dev": true, + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.363", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.363.tgz", + "integrity": "sha512-ReX5qgmSU7ybhzMuMdlJAdYnRhT90UB3k9M05O5nF5WH3wR5wgdJjXw0uDeFyKNhmglmQiOxkAbzrP0hMKM59g==", + "dev": true + }, + "node_modules/emitter-listener": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz", + "integrity": "sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==", + "dependencies": { + "shimmer": "^1.2.0" } }, "node_modules/emittery": { @@ -6146,12 +6478,105 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-module-lexer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", "dev": true }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -6242,6 +6667,52 @@ "eslint": ">=7.0.0" } }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/eslint-plugin-header": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", @@ -6251,22 +6722,80 @@ "eslint": ">=7.7.0" } }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", "dev": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" }, "engines": { - "node": ">=12.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" }, "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" }, "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, "eslint-config-prettier": { "optional": true } @@ -6286,9 +6815,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6498,9 +7027,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -6761,6 +7290,33 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -6780,12 +7336,13 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -6807,10 +7364,26 @@ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "engines": { - "node": ">=10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/glob": { @@ -6865,6 +7438,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -6907,6 +7495,12 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/handlebars": { "version": "4.7.7", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", @@ -6938,6 +7532,15 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -6946,6 +7549,29 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -6978,15 +7604,15 @@ "dev": true }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz", + "integrity": "sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==", "dependencies": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/human-signals": { @@ -7091,6 +7717,20 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/interpret": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", @@ -7115,12 +7755,54 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -7144,6 +7826,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -7197,6 +7909,36 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -7206,6 +7948,21 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -7232,6 +7989,34 @@ "node": ">=0.10.0" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -7243,6 +8028,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typed-array": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", @@ -7261,6 +8076,45 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -8438,44 +9292,6 @@ "node": ">= 10.13" } }, - "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -8488,25 +9304,78 @@ "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", "dev": true }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "dependencies": { - "path-key": "^3.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/obliterator": { @@ -8545,6 +9414,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -8865,15 +9752,15 @@ } }, "node_modules/prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -9077,6 +9964,23 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -9176,6 +10080,21 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -9199,6 +10118,30 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -9218,6 +10161,20 @@ } ] }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-stable-stringify": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", @@ -9366,6 +10323,20 @@ "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -9524,6 +10495,51 @@ "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -9594,6 +10610,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/synckit/node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "dev": true + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -9749,6 +10787,18 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -9800,6 +10850,18 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, + "node_modules/ts-api-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", + "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-jest": { "version": "29.1.0", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", @@ -9870,30 +10932,48 @@ "lodash": "^4.17.5" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { - "tslib": "^1.8.1" + "minimist": "^1.2.0" }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "node": ">=4" } }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/tsyringe": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.7.0.tgz", - "integrity": "sha512-ncFDM1jTLsok4ejMvSW5jN1VGPQD48y2tfAR0pdptWRKYX4bkbqPt92k7KJ5RFJ1KV36JEs/+TMh7I6OUgj74g==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.8.0.tgz", + "integrity": "sha512-YB1FG+axdxADa3ncEtRnQCFq/M0lALGLxSZeVNbTU8NqhOVc51nnv2CISTcvc1kyv6EGPtXVr0v6lWeDxiijOA==", "dependencies": { "tslib": "^1.9.3" }, @@ -9933,17 +11013,82 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/uglify-js": { @@ -9958,6 +11103,21 @@ "node": ">=0.8.0" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/universal-user-agent": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", @@ -9972,6 +11132,15 @@ "node": ">= 10.0.0" } }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -10246,15 +11415,15 @@ } }, "node_modules/whatwg-url": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", - "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", "dependencies": { "tr46": "^4.1.1", "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/which": { @@ -10272,17 +11441,32 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10332,9 +11516,9 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" diff --git a/source/lambda/blueprintgovernanceservice/package.json b/source/lambda/blueprintgovernanceservice/package.json index e326da1..fd73565 100644 --- a/source/lambda/blueprintgovernanceservice/package.json +++ b/source/lambda/blueprintgovernanceservice/package.json @@ -9,7 +9,7 @@ }, "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-js": "^4.0.0", + "@aws-crypto/sha256-js": "^5.0.0", "@aws-sdk/client-cloudformation": "^3.310.0", "@aws-sdk/client-codebuild": "^3.310.0", "@aws-sdk/client-codecommit": "^3.310.0", @@ -24,7 +24,7 @@ "@aws-sdk/util-utf8-node": "^3.259.0", "@middy/core": "^4.3.1", "@middy/http-cors": "^4.3.1", - "@octokit/rest": "^19.0.3", + "@octokit/rest": "^20.0.1", "@types/uuid": "^9.0.1", "aws-lambda": "^1.0.6", "aws-sdk": "^2.1354.0", @@ -33,7 +33,7 @@ "axios": "^1.3.6", "encoding": "^0.1.13", "handlebars": "^4.7.7", - "https-proxy-agent": "^5.0.1", + "https-proxy-agent": "^7.0.1", "lodash": "^4.17.21", "lodash.isstring": "^4.0.1", "loglevel": "^1.7.1", @@ -42,9 +42,9 @@ "reflect-metadata": "^0.1.13", "source-map-support": "^0.5.21", "ts-mockito": "^2.6.1", - "tsyringe": "^4.7.0", + "tsyringe": "^4.8.0", "uuid": "^9.0.0", - "whatwg-url": "^12.0.1", + "whatwg-url": "^13.0.0", "winston": "^3.8.1", "winston-transport": "^4.5.0" }, @@ -56,22 +56,23 @@ "@types/lodash": "^4.14.182", "@types/lodash.isstring": "^4.0.6", "@types/whatwg-url": "^11.0.0", - "@typescript-eslint/eslint-plugin": "^5.31.0", - "@typescript-eslint/parser": "^5.31.0", - "aws-sdk-client-mock": "^2.0.1", - "aws-sdk-client-mock-jest": "^2.1.0", + "@typescript-eslint/eslint-plugin": "^6.2.0", + "@typescript-eslint/parser": "^6.2.0", + "aws-sdk-client-mock": "^3.0.0", + "aws-sdk-client-mock-jest": "^3.0.0", "eslint": "^8.20.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-header": "^3.1.1", - "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-prettier": "^5.0.0", "filemanager-webpack-plugin": "^8.0.0", "jest": "^29.3.1", "jest-junit": "^16.0.0", "jest-when": "^3.5.1", - "prettier": "^2.7.1", + "prettier": "^3.0.0", "ts-jest": "^29.0.3", "ts-loader": "^9.3.1", - "typescript": "^4.7.4", + "typescript": "^5.1.6", "webpack": "^5.81.0", "webpack-cli": "^5.0.2" }, @@ -80,7 +81,8 @@ }, "overrides": { "fast-xml-parser": "^4.2.5", - "semver": "^7.5.3" + "semver": "^7.5.3", + "word-wrap": "^1.2.5" }, "scripts": { "lint": "eslint --ext .ts . --fix", diff --git a/source/lambda/blueprintgovernanceservice/src/App.ts b/source/lambda/blueprintgovernanceservice/src/App.ts index 187bdf3..13d76e4 100644 --- a/source/lambda/blueprintgovernanceservice/src/App.ts +++ b/source/lambda/blueprintgovernanceservice/src/App.ts @@ -35,57 +35,57 @@ const routes = new Router() // Patterns routes .addRoute( (e) => e.httpMethod === 'POST' && e.resource == '/patterns', - CreateBlueprintRequestHandler + CreateBlueprintRequestHandler, ) .addRoute( (e) => e.httpMethod === 'GET' && e.resource == '/patterns', - GetAllBlueprintsRequestHandler + GetAllBlueprintsRequestHandler, ) .addRoute( (e) => e.httpMethod === 'GET' && e.resource == '/patterns/{id}', - GetBlueprintInfoHandler + GetBlueprintInfoHandler, ) .addRoute( (e) => e.httpMethod === 'PUT' && e.resource == '/patterns/{id}', - UpdateBlueprintMetaInfoHandler + UpdateBlueprintMetaInfoHandler, ) .addRoute( (e) => e.httpMethod === 'PUT' && e.resource == '/patterns/pipeline/{id}', - InitialiseBlueprintPipelineHandler + InitialiseBlueprintPipelineHandler, ) // Attributes routes .addRoute( (e) => e.httpMethod === 'POST' && e.resource == '/attributes', - AttributeCreateHandler + AttributeCreateHandler, ) .addRoute( (e) => e.httpMethod === 'GET' && e.resource == '/attributes', - AttributeListHandler + AttributeListHandler, ) .addRoute( (e) => e.httpMethod === 'PUT' && e.resource == '/attributes/{id}', - AttributeUpdateHandler + AttributeUpdateHandler, ) .addRoute( (e) => e.httpMethod === 'GET' && e.resource == '/attributes/{id}', - AttributeGetDetailsHandler + AttributeGetDetailsHandler, ) .addRoute( (e) => e.httpMethod === 'DELETE' && e.resource == '/attributes/{id}', - AttributeDeleteHandler + AttributeDeleteHandler, ) // Pattern subscription notification routes .addRoute( (e) => e.httpMethod === 'POST' && e.resource === '/subscriptions', - SubscribeHandler + SubscribeHandler, ) .addRoute( (e) => e.httpMethod === 'DELETE' && e.resource === '/subscriptions', - SubscribeHandler + SubscribeHandler, ) .addRoute( (e) => e.httpMethod === 'GET' && e.resource === '/subscriptions', - GetSubscriptionHandler + GetSubscriptionHandler, ); setupContainer(routes); diff --git a/source/lambda/blueprintgovernanceservice/src/Container.ts b/source/lambda/blueprintgovernanceservice/src/Container.ts index b661d66..392ce97 100644 --- a/source/lambda/blueprintgovernanceservice/src/Container.ts +++ b/source/lambda/blueprintgovernanceservice/src/Container.ts @@ -58,7 +58,7 @@ export function setupContainer(router: Router): void { 'DependencyConfigurationProvider', { useClass: DependencyConfigurationProvider, - } + }, ); container.register('S3', { @@ -70,7 +70,7 @@ export function setupContainer(router: Router): void { new CodeBuildClient({ region: appConfiguration.region, customUserAgent: customUserAgentV3, - }) + }), ), }); @@ -79,7 +79,7 @@ export function setupContainer(router: Router): void { new CodeCommitClient({ region: appConfiguration.region, customUserAgent: customUserAgentV3, - }) + }), ), }); @@ -94,10 +94,13 @@ export function setupContainer(router: Router): void { ...configuration, httpOptions: appConfiguration.proxyUri ? { - agent: new HttpsProxyAgent({ - host: url.parseURL(appConfiguration.proxyUri)?.host?.toString(), - port: url.parseURL(appConfiguration.proxyUri)?.port, - }), + agent: new HttpsProxyAgent( + `http://${url + .parseURL(appConfiguration.proxyUri)! + .host!.toString()}:${url + .parseURL(appConfiguration.proxyUri)! + .port!.toString()}`, + ), } : undefined, }), @@ -120,14 +123,14 @@ export function setupContainer(router: Router): void { 'BlueprintRepoBuilderService', { useClass: BlueprintGitHubRepoBuilderService, - } + }, ); } else { container.register( 'BlueprintRepoBuilderService', { useClass: BlueprintCodeCommitRepoBuilderService, - } + }, ); } @@ -135,13 +138,13 @@ export function setupContainer(router: Router): void { 'BlueprintPipelineBuilderService', { useClass: BlueprintPipelineBuilderService, - } + }, ); container.register( 'InitialiseBlueprintPipelineHandler', { useClass: InitialiseBlueprintPipelineHandler, - } + }, ); } diff --git a/source/lambda/blueprintgovernanceservice/src/appregistry-updater/AppRegistryUpdateHandler.ts b/source/lambda/blueprintgovernanceservice/src/appregistry-updater/AppRegistryUpdateHandler.ts index cabb6b1..e6baa36 100644 --- a/source/lambda/blueprintgovernanceservice/src/appregistry-updater/AppRegistryUpdateHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/appregistry-updater/AppRegistryUpdateHandler.ts @@ -49,7 +49,7 @@ export class AppRegistryUpdateHandler /* eslint-disable-next-line */ } catch (e: any) { logger.error( - `Invalid message received. Error: ${e.message}, Message:${record.body}` + `Invalid message received. Error: ${e.message}, Message:${record.body}`, ); throw new Error(`Invalid message received. Error: ${e.message}`); } diff --git a/source/lambda/blueprintgovernanceservice/src/appregistry-updater/MainHandler.ts b/source/lambda/blueprintgovernanceservice/src/appregistry-updater/MainHandler.ts index 860cfd7..0c220ff 100644 --- a/source/lambda/blueprintgovernanceservice/src/appregistry-updater/MainHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/appregistry-updater/MainHandler.ts @@ -36,7 +36,7 @@ export class MainHandler { appConfig.applicationName, container, appConfig.runningLocally, - appConfig.logLevel + appConfig.logLevel, ), responseFormatter(), errorLogger(), @@ -45,14 +45,14 @@ export class MainHandler { // main lambda handler this.lambdaHandler = new MiddlewareChain( handler, - middlewares + middlewares, ).lambdaHandler; } } function errorLogger(): middy.MiddlewareObj { const onError: middy.MiddlewareFn = async ( - request + request, ): Promise => { const logger = getLogger('ErrorLoggingMiddleware'); diff --git a/source/lambda/blueprintgovernanceservice/src/codecommit/trigger-security-scan.ts b/source/lambda/blueprintgovernanceservice/src/codecommit/trigger-security-scan.ts index 037d7b8..c10ccbd 100644 --- a/source/lambda/blueprintgovernanceservice/src/codecommit/trigger-security-scan.ts +++ b/source/lambda/blueprintgovernanceservice/src/codecommit/trigger-security-scan.ts @@ -23,13 +23,13 @@ const codeBuildClient = new CodeBuildClient(awsSdkV3Configuration); export async function handler( event: lambda.SNSEvent, - context: lambda.Context + context: lambda.Context, ): Promise { const logger = getLogger('codecommit-trigger-security-scan'); logger.debug( `Processing event ${JSON.stringify(event)} with context ${JSON.stringify( - context - )}` + context, + )}`, ); const snsMessage = JSON.parse(event.Records[0].Sns.Message); const sourceCommitId = snsMessage.detail.sourceCommit; @@ -54,6 +54,6 @@ export async function handler( value: prId, }, ], - }) + }), ); } diff --git a/source/lambda/blueprintgovernanceservice/src/common/AppRegistrySyncRequestQueue.ts b/source/lambda/blueprintgovernanceservice/src/common/AppRegistrySyncRequestQueue.ts index 3840813..6685de6 100644 --- a/source/lambda/blueprintgovernanceservice/src/common/AppRegistrySyncRequestQueue.ts +++ b/source/lambda/blueprintgovernanceservice/src/common/AppRegistrySyncRequestQueue.ts @@ -31,7 +31,7 @@ function getLogger(): Logger { } export async function addSyncRequestToQueue( - id: string + id: string, ): Promise { const logger = getLogger(); // use try catch to make sure this function will not throw errors @@ -49,8 +49,8 @@ export async function addSyncRequestToQueue( } catch (e: any) { logger.error( `Failed to send update message to AppRegistry Update Queue. Error: ${JSON.stringify( - e - )}, ID: ${id} ` + e, + )}, ID: ${id} `, ); return undefined; } diff --git a/source/lambda/blueprintgovernanceservice/src/common/AttributeBaseHandler.ts b/source/lambda/blueprintgovernanceservice/src/common/AttributeBaseHandler.ts index 02a5134..e2e324f 100644 --- a/source/lambda/blueprintgovernanceservice/src/common/AttributeBaseHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/common/AttributeBaseHandler.ts @@ -81,7 +81,7 @@ export abstract class AttributeBaseHandler */ public async handle( event: APIGatewayProxyEvent, - context: Context + context: Context, ): Promise { const { validated, errors } = this.validate(event, context); if (validated) { @@ -95,17 +95,17 @@ export abstract class AttributeBaseHandler // abstract methods that need to be implemented by each resource handle public abstract validateInputParameters( event: APIGatewayProxyEvent, - context: Context + context: Context, ): InputValidationResult; public abstract process( event: APIGatewayProxyEvent, - context: Context + context: Context, ): Promise; public validate( event: APIGatewayProxyEvent, - context: Context + context: Context, ): InputValidationResult { let validated = true; const errors: string[] = []; @@ -130,7 +130,7 @@ export abstract class AttributeBaseHandler // eslint-disable-next-line @typescript-eslint/naming-convention _event: APIGatewayProxyEvent, // eslint-disable-next-line @typescript-eslint/naming-convention - _context: Context + _context: Context, ): InputValidationResult { return { validated: true, errors: [] }; } @@ -139,7 +139,7 @@ export abstract class AttributeBaseHandler public validateAttributeIdInputParameter( event: APIGatewayProxyEvent, // eslint-disable-next-line @typescript-eslint/naming-convention - _context: Context + _context: Context, ): InputValidationResult { const regAttributeId = /^[-\w]{1,120}:[-\w]{1,120}$/; let validated = true; @@ -151,7 +151,7 @@ export abstract class AttributeBaseHandler ) { validated &&= false; errors.push( - `Invalid attribute id. The attribute id must match ${regAttributeId}.` + `Invalid attribute id. The attribute id must match ${regAttributeId}.`, ); } return { validated, errors }; diff --git a/source/lambda/blueprintgovernanceservice/src/common/MainHandler.ts b/source/lambda/blueprintgovernanceservice/src/common/MainHandler.ts index 15e6b0a..b80cfbd 100644 --- a/source/lambda/blueprintgovernanceservice/src/common/MainHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/common/MainHandler.ts @@ -42,7 +42,7 @@ export class MainHandler { appConfig.applicationName, container, appConfig.runningLocally, - appConfig.logLevel + appConfig.logLevel, ), responseFormatter(), errorLogger(), @@ -52,14 +52,14 @@ export class MainHandler { // main lambda handler this.lambdaHandler = new MiddlewareChain( router, - middlewares + middlewares, ).lambdaHandler; } } function errorLogger(): middy.MiddlewareObj { const onError: middy.MiddlewareFn = async ( - request + request, ): Promise => { const logger = getLogger('ErrorLoggingMiddleware'); diff --git a/source/lambda/blueprintgovernanceservice/src/common/common-types.ts b/source/lambda/blueprintgovernanceservice/src/common/common-types.ts index 014bc98..82a099f 100644 --- a/source/lambda/blueprintgovernanceservice/src/common/common-types.ts +++ b/source/lambda/blueprintgovernanceservice/src/common/common-types.ts @@ -31,7 +31,7 @@ export class BasicHttpResponse implements APIGatewayProxyResult { public constructor( public statusCode: number, public body: string = '', - public headers?: Record + public headers?: Record, ) { this.body = body; this.statusCode = statusCode; @@ -39,7 +39,7 @@ export class BasicHttpResponse implements APIGatewayProxyResult { } public addHeaders( - headers: Record + headers: Record, ): BasicHttpResponse { this.headers = Object.assign(this.headers || {}, headers); return this; @@ -52,18 +52,18 @@ export class BasicHttpResponse implements APIGatewayProxyResult { error: error.message, retryable: error.retryable, }), - jsonContentTypeHeader + jsonContentTypeHeader, ); } public static ofRecord( statusCode: number, - data: Record + data: Record, ): BasicHttpResponse { return new BasicHttpResponse( statusCode, JSON.stringify(data), - jsonContentTypeHeader + jsonContentTypeHeader, ); } @@ -75,7 +75,7 @@ export class BasicHttpResponse implements APIGatewayProxyResult { return new BasicHttpResponse( statusCode, JSON.stringify(value), - jsonContentTypeHeader + jsonContentTypeHeader, ); } } @@ -86,7 +86,7 @@ export class BasicHttpError implements Error { public constructor( public statusCode: number, public message: string = '', - public retryable: boolean = false + public retryable: boolean = false, ) { this.statusCode = statusCode; this.message = message; diff --git a/source/lambda/blueprintgovernanceservice/src/common/logging/context-logging-middleware.ts b/source/lambda/blueprintgovernanceservice/src/common/logging/context-logging-middleware.ts index e4614da..90a5f13 100644 --- a/source/lambda/blueprintgovernanceservice/src/common/logging/context-logging-middleware.ts +++ b/source/lambda/blueprintgovernanceservice/src/common/logging/context-logging-middleware.ts @@ -28,10 +28,10 @@ export function ContextLoggingMiddleware( additionalMetadata?: Record< string, (event: APIGatewayProxyEvent, context: Context) => string - > + >, ): middy.MiddlewareObj { const before: middy.MiddlewareFn = async ( - request + request, ): Promise => { const logMetadata: Record string> = { ...additionalMetadata, @@ -54,13 +54,13 @@ export function ContextLoggingMiddleware( request.context, runningLocally, logMetadata, - logLevel + logLevel, ); const loggingContextContainer = rootContainer.createChildContainer(); loggingContextContainer.registerInstance( 'LoggerFactory', - loggerFactory + loggerFactory, ); const loggingContext: LoggingContext = { ...request.context, @@ -71,13 +71,13 @@ export function ContextLoggingMiddleware( }; const after: middy.MiddlewareFn = async ( - request + request, ): Promise => { (request.context as LoggingContext).loggingContextContainer.clearInstances(); }; const onError: middy.MiddlewareFn = async ( - request + request, ): Promise => { (request.context as LoggingContext).loggingContextContainer.clearInstances(); }; diff --git a/source/lambda/blueprintgovernanceservice/src/common/logging/logger-factory.ts b/source/lambda/blueprintgovernanceservice/src/common/logging/logger-factory.ts index a8a1ccf..abc1627 100644 --- a/source/lambda/blueprintgovernanceservice/src/common/logging/logger-factory.ts +++ b/source/lambda/blueprintgovernanceservice/src/common/logging/logger-factory.ts @@ -33,7 +33,7 @@ export class LambdaLoggerFactory implements LoggerFactory { string, (event: TEvent, context: TContext) => string >, - private readonly logLevel?: LogLevelType + private readonly logLevel?: LogLevelType, ) {} public static customTransports(): Transport[] { @@ -60,7 +60,7 @@ export class LambdaLoggerFactory implements LoggerFactory { winston.format.splat(), this.runLocally ? winston.format.prettyPrint({ colorize: true }) - : winston.format.json() + : winston.format.json(), ), level: logLevel ?? this.logLevel ?? DEFAULT_LOG_LEVEL, }); @@ -75,7 +75,7 @@ export class StaticLoggerFactory implements LoggerFactory { winston.format.label({ label: name }), winston.format.timestamp(), winston.format.splat(), - winston.format.json() + winston.format.json(), ), level: logLevel ?? DEFAULT_LOG_LEVEL, }); diff --git a/source/lambda/blueprintgovernanceservice/src/common/metrics/operational-metric.ts b/source/lambda/blueprintgovernanceservice/src/common/metrics/operational-metric.ts index 7ce7bdb..ab6bea2 100644 --- a/source/lambda/blueprintgovernanceservice/src/common/metrics/operational-metric.ts +++ b/source/lambda/blueprintgovernanceservice/src/common/metrics/operational-metric.ts @@ -48,7 +48,7 @@ export async function sendAnonymousMetric(payload: MetricsPayload): Promise = ( event: T, context: C, - callback: Callback + callback: Callback, // eslint-disable-next-line @typescript-eslint/no-invalid-void-type ) => void | Promise; @@ -33,10 +33,10 @@ export class MiddlewareChain { public readonly lambdaHandler: LambdaHandler; public constructor( asyncHandlerObj: AsyncHandlerObj, - middlewares: middy.MiddlewareObj[] + middlewares: middy.MiddlewareObj[], ) { const middyHandler = middy( - asyncHandlerObj.handle.bind(asyncHandlerObj) as AsyncHandler + asyncHandlerObj.handle.bind(asyncHandlerObj) as AsyncHandler, ); middyHandler.use(middlewares); // eslint-disable-next-line @typescript-eslint/no-invalid-void-type diff --git a/source/lambda/blueprintgovernanceservice/src/common/providers/DependencyConfigurationProvider.ts b/source/lambda/blueprintgovernanceservice/src/common/providers/DependencyConfigurationProvider.ts index 16e9567..375d8c6 100644 --- a/source/lambda/blueprintgovernanceservice/src/common/providers/DependencyConfigurationProvider.ts +++ b/source/lambda/blueprintgovernanceservice/src/common/providers/DependencyConfigurationProvider.ts @@ -27,37 +27,37 @@ export class DependencyConfigurationProvider { public constructor( @inject('AppConfiguration') private readonly applicationConfig: AppConfiguration, @inject('SecretsManager') - private readonly secretsManager: SecretsManager + private readonly secretsManager: SecretsManager, ) {} public getMandatoryDependency( - depedencyServiceName: DependencyServiceName + depedencyServiceName: DependencyServiceName, ): Dependency { const dependency = this.applicationConfig.getDepdencyFor(depedencyServiceName); if (!dependency?.githubTokenSecretId) { // eslint-disable-next-line @typescript-eslint/no-throw-literal throw new BlueprintError( `Invalid configuration - No ${depedencyServiceName} dependency configured - githubTokenSecretId needs to be configured`, - 503 + 503, ); } return dependency; } public async getBlueprintServiceRepoCredentials( - depedencyServiceName: DependencyServiceName + depedencyServiceName: DependencyServiceName, ): Promise { try { const dependency = this.getMandatoryDependency(depedencyServiceName); return await this.getSecretsValue( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - dependency.githubTokenSecretId! + dependency.githubTokenSecretId!, ); } catch (e) { // eslint-disable-next-line @typescript-eslint/no-throw-literal throw new BlueprintError( `Invalid configuration - Error while retrieve getBlueprintServiceRepoCredentials on ${depedencyServiceName} dependency configured from secrets manager`, - 503 + 503, ); } } diff --git a/source/lambda/blueprintgovernanceservice/src/common/response-formatter.ts b/source/lambda/blueprintgovernanceservice/src/common/response-formatter.ts index 67dc68c..c1dbd82 100644 --- a/source/lambda/blueprintgovernanceservice/src/common/response-formatter.ts +++ b/source/lambda/blueprintgovernanceservice/src/common/response-formatter.ts @@ -23,18 +23,18 @@ const defaultConfig: ConfigType = { headers: {}, }; const responseFormatter = ( - config: ConfigType = defaultConfig + config: ConfigType = defaultConfig, ): middy.MiddlewareObj => { const addHeaders = ( request: middy.Request, - additonalHeaders?: Record + additonalHeaders?: Record, ): void => { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion request.response.headers = Object.assign( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition request?.response?.headers || {}, - additonalHeaders + additonalHeaders, ); }; @@ -50,7 +50,7 @@ const responseFormatter = ( // other exceptions, respond with 500 - Internal Server Error request.response = BasicHttpResponse.ofError( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - BasicHttpError.internalServerError(request.error!.message) + BasicHttpError.internalServerError(request.error!.message), ) as unknown as R; } }; diff --git a/source/lambda/blueprintgovernanceservice/src/common/router/RouteData.ts b/source/lambda/blueprintgovernanceservice/src/common/router/RouteData.ts index ffd1da9..35ddf7b 100644 --- a/source/lambda/blueprintgovernanceservice/src/common/router/RouteData.ts +++ b/source/lambda/blueprintgovernanceservice/src/common/router/RouteData.ts @@ -20,7 +20,7 @@ import { InjectionToken } from 'tsyringe'; export interface RouteData< TResponse extends BasicHttpResponse, - THandler extends AsyncHandlerObj + THandler extends AsyncHandlerObj, > { predicate: (event: APIGatewayProxyEvent) => boolean; handlerToken: InjectionToken; diff --git a/source/lambda/blueprintgovernanceservice/src/common/router/Router.ts b/source/lambda/blueprintgovernanceservice/src/common/router/Router.ts index 314fb49..32616b5 100644 --- a/source/lambda/blueprintgovernanceservice/src/common/router/Router.ts +++ b/source/lambda/blueprintgovernanceservice/src/common/router/Router.ts @@ -30,7 +30,7 @@ export class Router public addRoute>( predicate: (event: APIGatewayProxyEvent) => boolean, - handlerToken: InjectionToken + handlerToken: InjectionToken, ): Router { this.routes.push({ predicate, handlerToken: handlerToken }); return this; @@ -38,7 +38,7 @@ export class Router public handle( event: APIGatewayProxyEvent, - context: Context + context: Context, ): Promise { const route = this.routes.find((r) => r.predicate(event)); @@ -53,9 +53,9 @@ export class Router new BasicHttpError( 404, `Could not find a matching route for ${event.httpMethod} ${event.resource} ${event.path}`, - false - ) - ) + false, + ), + ), ); } } diff --git a/source/lambda/blueprintgovernanceservice/src/common/validator/AttributePayloadValidator.ts b/source/lambda/blueprintgovernanceservice/src/common/validator/AttributePayloadValidator.ts index 60954a9..07d6b6c 100644 --- a/source/lambda/blueprintgovernanceservice/src/common/validator/AttributePayloadValidator.ts +++ b/source/lambda/blueprintgovernanceservice/src/common/validator/AttributePayloadValidator.ts @@ -42,7 +42,7 @@ const maxAttributeMetaLength = 8000 - 1000; // 1000 reserved for key and value export const payloadValidator = ( event: APIGatewayProxyEvent, // eslint-disable-next-line @typescript-eslint/naming-convention - _context: Context + _context: Context, ): InputValidationResult => { const payload = JSON.parse(event.body || '{}'); let validated = true; @@ -62,7 +62,7 @@ export const payloadValidator = ( if (payload.description && isInvalidArgument(regDescription, payload.description)) { validated &&= false; errors.push( - `The description is optional but if specified it must match '${regDescription.toString()}'.` + `The description is optional but if specified it must match '${regDescription.toString()}'.`, ); } diff --git a/source/lambda/blueprintgovernanceservice/src/email-sender/index.ts b/source/lambda/blueprintgovernanceservice/src/email-sender/index.ts index ec525e2..7c7bd98 100644 --- a/source/lambda/blueprintgovernanceservice/src/email-sender/index.ts +++ b/source/lambda/blueprintgovernanceservice/src/email-sender/index.ts @@ -59,14 +59,14 @@ export interface RAPMMessage { export async function handler( event: lambda.SNSEvent, - context: lambda.Context + context: lambda.Context, ): Promise { const logger = getLogger('email-sender'); logger.debug( `Processing event ${JSON.stringify(event)} with context ${JSON.stringify( - context - )}` + context, + )}`, ); // parsing the sns message @@ -93,7 +93,7 @@ export async function handler( if (x.serviceCatalog) { const serviceCatalogProducts = x.serviceCatalog.products.map( (p) => `
  • Service Catalog product name: ${p}
  • - ` + `, ); patternDestination = `
      @@ -133,10 +133,10 @@ export async function handler( `Sending an email from ${fromEmail} to ${recipients .map((x) => x) .join( - ', ' + ', ', )} using teamplate name ${templateName} with teampate data ${JSON.stringify( - templateData - )}` + templateData, + )}`, ); const batches = splitIntoBatches(recipients, 50); // making sure the list of recipients is within SES limit @@ -150,14 +150,14 @@ export async function handler( Source: fromEmail, Destination: { ToAddresses: b }, TemplateData: JSON.stringify(templateData), - }) + }), ); /* eslint-enable @typescript-eslint/naming-convention */ logger.debug(`Send email result ${JSON.stringify(sendResult)}`); - }) + }), ); - }) + }), ); } @@ -183,7 +183,7 @@ async function getRecipientsForPattern(patternId: string): Promise { ExpressionAttributeValues: { ':patternId': { S: patternId }, }, - }) + }), /* eslint-enable @typescript-eslint/naming-convention */ ); diff --git a/source/lambda/blueprintgovernanceservice/src/handlers/AttributeCreateHandler.ts b/source/lambda/blueprintgovernanceservice/src/handlers/AttributeCreateHandler.ts index f401d26..b6dc3ec 100644 --- a/source/lambda/blueprintgovernanceservice/src/handlers/AttributeCreateHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/handlers/AttributeCreateHandler.ts @@ -80,7 +80,7 @@ export class AttributeCreateHandler extends AttributeBaseHandler { public constructor( @inject('LoggerFactory') loggerFactory: LoggerFactory, @inject('BlueprintDBService') - private readonly blueprintDBService: BlueprintDBService + private readonly blueprintDBService: BlueprintDBService, ) { super(); this.logger = loggerFactory.getLogger(handlerName); @@ -91,7 +91,7 @@ export class AttributeCreateHandler extends AttributeBaseHandler { public async process( event: APIGatewayProxyEvent, // eslint-disable-next-line @typescript-eslint/naming-convention - _context: Context + _context: Context, ): Promise { const id = await this.getEntityId(event); this.logger.info(`${handlerName} Create Entity id:${id}`); @@ -123,14 +123,14 @@ export class AttributeCreateHandler extends AttributeBaseHandler { return ServerlessResponse.ofObject( 201, - await this.transformResult({ ...data, id }) + await this.transformResult({ ...data, id }), ); } public validateInputParameters( event: APIGatewayProxyEvent, // eslint-disable-next-line @typescript-eslint/naming-convention - _context: Context + _context: Context, ): InputValidationResult { let validated = true; const errors: string[] = []; @@ -138,7 +138,7 @@ export class AttributeCreateHandler extends AttributeBaseHandler { if (!event?.body || !isValidJSON(event.body)) { validated &&= false; errors.push( - 'Valid JSON payload is required in the body of the create request.' + 'Valid JSON payload is required in the body of the create request.', ); } return { validated, errors }; @@ -154,7 +154,7 @@ export class AttributeCreateHandler extends AttributeBaseHandler { // eslint-disable-next-line @typescript-eslint/no-throw-literal throw new BasicHttpError( 400, - `An attribute with the specific key and value already exists.` + `An attribute with the specific key and value already exists.`, ); } return id; diff --git a/source/lambda/blueprintgovernanceservice/src/handlers/AttributeDeleteHandler.ts b/source/lambda/blueprintgovernanceservice/src/handlers/AttributeDeleteHandler.ts index 2971173..f3447e2 100644 --- a/source/lambda/blueprintgovernanceservice/src/handlers/AttributeDeleteHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/handlers/AttributeDeleteHandler.ts @@ -59,7 +59,7 @@ export class AttributeDeleteHandler extends AttributeBaseHandler { public constructor( @inject('LoggerFactory') loggerFactory: LoggerFactory, @inject('BlueprintDBService') - private readonly blueprintDBService: BlueprintDBService + private readonly blueprintDBService: BlueprintDBService, ) { super(); this.logger = loggerFactory.getLogger(handlerName); @@ -68,7 +68,7 @@ export class AttributeDeleteHandler extends AttributeBaseHandler { public async process( event: APIGatewayProxyEvent, // eslint-disable-next-line @typescript-eslint/naming-convention - _context: Context + _context: Context, ): Promise { const id = await this.getEntityId(event); this.logger.info(`${handlerName} Delete Entity id:${id}`); @@ -97,7 +97,7 @@ export class AttributeDeleteHandler extends AttributeBaseHandler { do { const { results, nextToken } = await this.blueprintDBService.listBlueprints( 100, - nextTokenValue + nextTokenValue, ); patternsList = patternsList.concat(results); nextTokenValue = nextToken; @@ -107,14 +107,14 @@ export class AttributeDeleteHandler extends AttributeBaseHandler { (pattern) => pattern.attributes && Object.entries(pattern.attributes).find( - ([key, value]) => key === item.key && value === item.value - ) + ([key, value]) => key === item.key && value === item.value, + ), ); if (patternAlreadyAssociated) { // eslint-disable-next-line @typescript-eslint/no-throw-literal throw new BasicHttpError( 400, - `Specified attribute is in use and can not be deleted. id: ${id}` + `Specified attribute is in use and can not be deleted. id: ${id}`, ); } return id; diff --git a/source/lambda/blueprintgovernanceservice/src/handlers/AttributeGetDetailsHandler.ts b/source/lambda/blueprintgovernanceservice/src/handlers/AttributeGetDetailsHandler.ts index 9476ff2..fc3e99a 100644 --- a/source/lambda/blueprintgovernanceservice/src/handlers/AttributeGetDetailsHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/handlers/AttributeGetDetailsHandler.ts @@ -70,7 +70,7 @@ export class AttributeGetDetailsHandler extends AttributeBaseHandler { public constructor( @inject('LoggerFactory') loggerFactory: LoggerFactory, @inject('BlueprintDBService') - private readonly blueprintDBService: BlueprintDBService + private readonly blueprintDBService: BlueprintDBService, ) { super(); this.logger = loggerFactory.getLogger(handlerName); @@ -81,7 +81,7 @@ export class AttributeGetDetailsHandler extends AttributeBaseHandler { public async process( event: APIGatewayProxyEvent, // eslint-disable-next-line @typescript-eslint/naming-convention - _context: Context + _context: Context, ): Promise { const id = await this.getEntityId(event); this.logger.info(`${handlerName} Get Entity Details id:${id}`); diff --git a/source/lambda/blueprintgovernanceservice/src/handlers/AttributeListHandler.ts b/source/lambda/blueprintgovernanceservice/src/handlers/AttributeListHandler.ts index f11daad..c6da991 100644 --- a/source/lambda/blueprintgovernanceservice/src/handlers/AttributeListHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/handlers/AttributeListHandler.ts @@ -93,7 +93,7 @@ export class AttributeListHandler extends AttributeBaseHandler { public constructor( @inject('LoggerFactory') loggerFactory: LoggerFactory, @inject('BlueprintDBService') - private readonly blueprintDBService: BlueprintDBService + private readonly blueprintDBService: BlueprintDBService, ) { super(); this.logger = loggerFactory.getLogger(handlerName); @@ -101,7 +101,7 @@ export class AttributeListHandler extends AttributeBaseHandler { public validateInputParameters = ( event: APIGatewayProxyEvent, - context: Context + context: Context, ): InputValidationResult => { let validated = true; const errors: string[] = []; @@ -118,8 +118,8 @@ export class AttributeListHandler extends AttributeBaseHandler { validated &&= false; errors.push( `Unsupported query parameter. Query Parameters: ${invalidParams.join( - ',' - )}` + ',', + )}`, ); } } @@ -130,7 +130,7 @@ export class AttributeListHandler extends AttributeBaseHandler { public validateQueryParameters( event: APIGatewayProxyEvent, // eslint-disable-next-line @typescript-eslint/naming-convention - _context: Context + _context: Context, ): InputValidationResult { let validated = true; const errors: string[] = []; @@ -143,7 +143,7 @@ export class AttributeListHandler extends AttributeBaseHandler { ) { validated &&= false; errors.push( - 'The maxRow must be an integer between 1 and 1000. If not specified, the default value is 100.' + 'The maxRow must be an integer between 1 and 1000. If not specified, the default value is 100.', ); } } @@ -151,12 +151,12 @@ export class AttributeListHandler extends AttributeBaseHandler { if (event.queryStringParameters?.nextToken) { const nextToken = decodeURIComponent( // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - event.queryStringParameters.nextToken ?? '' + event.queryStringParameters.nextToken ?? '', ); if (nextToken.trim().length === 0) { validated &&= false; errors.push( - 'The nextToken must be the value from the last response received.' + 'The nextToken must be the value from the last response received.', ); } } @@ -165,7 +165,7 @@ export class AttributeListHandler extends AttributeBaseHandler { private async transformResults( results: Attribute[], - nextToken: string | undefined + nextToken: string | undefined, ): Promise>> { return { results: results.map((item) => ({ @@ -178,11 +178,11 @@ export class AttributeListHandler extends AttributeBaseHandler { public async process( event: APIGatewayProxyEvent, // eslint-disable-next-line @typescript-eslint/naming-convention - _context: Context + _context: Context, ): Promise { const maxRow = Math.min( +(event.queryStringParameters?.['maxRow'] || defaultMaxRow.toString()), - defaultMaxRow + defaultMaxRow, ); const previousToken = event.queryStringParameters?.['nextToken'] ? decodeURIComponent(event.queryStringParameters['nextToken']) @@ -194,13 +194,13 @@ export class AttributeListHandler extends AttributeBaseHandler { return BasicHttpResponse.ofObject( 200, - await this.transformResults(data[0], data[1]) + await this.transformResults(data[0], data[1]), ); } private async doFetchAttributes( maxRow: number, - previousToken?: string + previousToken?: string, ): Promise<[Attribute[], string]> { this.logger.info(`${defaultMaxRow} fetch page starts from ${previousToken}`); return this.blueprintDBService.listAttributes(maxRow, previousToken); diff --git a/source/lambda/blueprintgovernanceservice/src/handlers/AttributeUpdateHandler.ts b/source/lambda/blueprintgovernanceservice/src/handlers/AttributeUpdateHandler.ts index d693f0b..6e4eeb2 100644 --- a/source/lambda/blueprintgovernanceservice/src/handlers/AttributeUpdateHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/handlers/AttributeUpdateHandler.ts @@ -78,7 +78,7 @@ export class AttributeUpdateHandler extends AttributeBaseHandler { public constructor( @inject('LoggerFactory') loggerFactory: LoggerFactory, @inject('BlueprintDBService') - private readonly blueprintDBService: BlueprintDBService + private readonly blueprintDBService: BlueprintDBService, ) { super(); this.logger = loggerFactory.getLogger(handlerName); @@ -98,13 +98,13 @@ export class AttributeUpdateHandler extends AttributeBaseHandler { this.logger.info(`${handlerName} Update Entity Success id:${id}`); return BasicHttpResponse.ofObject( 200, - await this.transformResult({ ...data, id }) + await this.transformResult({ ...data, id }), ); } public validateInputParameters( event: APIGatewayProxyEvent, - context: Context + context: Context, ): InputValidationResult { let validated = true; const errors: string[] = []; @@ -112,13 +112,13 @@ export class AttributeUpdateHandler extends AttributeBaseHandler { if (!event?.body || !isValidJSON(event.body)) { validated &&= false; errors.push( - 'Valid JSON payload is required in the body of the update request.' + 'Valid JSON payload is required in the body of the update request.', ); } const { validated: validatedId, errors: errorsId } = this.validateIdParameter( event, - context + context, ); validated &&= validatedId; errors.push(...errorsId); @@ -133,7 +133,7 @@ export class AttributeUpdateHandler extends AttributeBaseHandler { public async prepareData( event: APIGatewayProxyEvent, - id: string + id: string, ): Promise { // retrieve the item to update const checkItem = await this.blueprintDBService.getAttributeById(id); @@ -153,7 +153,7 @@ export class AttributeUpdateHandler extends AttributeBaseHandler { // eslint-disable-next-line @typescript-eslint/no-throw-literal throw new BasicHttpError( 404, - `The key and value are not allowed to be updated. Current Key: ${checkItem.key}, Value: ${checkItem.value}` + `The key and value are not allowed to be updated. Current Key: ${checkItem.key}, Value: ${checkItem.value}`, ); } diff --git a/source/lambda/blueprintgovernanceservice/src/handlers/CreateBlueprintRequestHandler.ts b/source/lambda/blueprintgovernanceservice/src/handlers/CreateBlueprintRequestHandler.ts index 1bf215b..1cafedd 100644 --- a/source/lambda/blueprintgovernanceservice/src/handlers/CreateBlueprintRequestHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/handlers/CreateBlueprintRequestHandler.ts @@ -110,13 +110,13 @@ export class CreateBlueprintRequestHandler @inject('BlueprintRepoBuilderService') private readonly blueprintRepoBuilderService: IBlueprintRepoBuilderService, @inject('BlueprintPipelineBuilderService') - private readonly blueprintPipelineBuilderService: BlueprintPipelineBuilderService + private readonly blueprintPipelineBuilderService: BlueprintPipelineBuilderService, ) { this.logger = loggerFactory.getLogger('CreateBlueprintRequestHandler'); } private async validateInputData( - input: CreateBlueprintRequest + input: CreateBlueprintRequest, ): Promise { if (input.name.length > 40 || input.name.match(/[^a-z0-9-_]/g)) { return ServerlessResponse.ofObject(400, { @@ -163,7 +163,7 @@ export class CreateBlueprintRequestHandler */ public async handle( event: APIGatewayProxyEvent, - _context: Context + _context: Context, ): Promise { this.logger.debug(`Processing create pattern request ${JSON.stringify(event)}`); @@ -188,13 +188,13 @@ export class CreateBlueprintRequestHandler blueprintCodeRepoDetails = await this.blueprintRepoBuilderService.createAndInitializeRepo( blueprintName, - input.patternType + input.patternType, ); } catch (e) { this.logger.error( `Error in creating/initialising pattern repo ${blueprintName}, failed with error: ${JSON.stringify( - e - )}` + e, + )}`, ); return ServerlessResponse.ofObject(500, { @@ -227,21 +227,21 @@ export class CreateBlueprintRequestHandler try { this.logger.debug( - 'blueprintPipelineBuilderService invokeCodeBuildProject initialization' + 'blueprintPipelineBuilderService invokeCodeBuildProject initialization', ); await this.blueprintPipelineBuilderService.invokeCodeBuildProject( - blueprintObject + blueprintObject, ); this.logger.debug( - 'blueprintPipelineBuilderService invokeCodeBuildProject successful' + 'blueprintPipelineBuilderService invokeCodeBuildProject successful', ); } catch (e) { blueprintObject.infrastructureStackStatus = StackStatus.CREATE_FAILED; this.logger.error( `blueprintPipelineBuilderService invokeCodeBuildProject failed ${JSON.stringify( - e - )}` + e, + )}`, ); await this.blueprintDBService.createBlueprint(blueprintObject); @@ -269,7 +269,7 @@ export class CreateBlueprintRequestHandler } private async validateAttributes( - attributes: Record + attributes: Record, ): Promise { const invalidAttributeName: string[] = []; @@ -291,7 +291,7 @@ export class CreateBlueprintRequestHandler if (invalidAttributeName.length > 0) { return ServerlessResponse.ofObject(400, { 'Error Message': `Some attributes specified are not valid. Invalid Attributes: ${invalidAttributeName.join( - ',' + ',', )}`, }); } diff --git a/source/lambda/blueprintgovernanceservice/src/handlers/GetAllBlueprintsRequestHandler.ts b/source/lambda/blueprintgovernanceservice/src/handlers/GetAllBlueprintsRequestHandler.ts index 02fc9a8..7fc4aaf 100644 --- a/source/lambda/blueprintgovernanceservice/src/handlers/GetAllBlueprintsRequestHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/handlers/GetAllBlueprintsRequestHandler.ts @@ -132,7 +132,7 @@ export class GetAllBlueprintsRequestHandler public constructor( @inject('LoggerFactory') loggerFactory: LoggerFactory, @inject('BlueprintDBService') - private readonly blueprintDBService: BlueprintDBService + private readonly blueprintDBService: BlueprintDBService, ) { this.logger = loggerFactory.getLogger('GetBlueprintsRequestHandler'); } @@ -146,7 +146,7 @@ export class GetAllBlueprintsRequestHandler public async handle( event: APIGatewayProxyEvent, // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-unused-vars - _context: Context + _context: Context, ): Promise { this.logger.debug('Processing list pattern request'); @@ -157,7 +157,7 @@ export class GetAllBlueprintsRequestHandler this.logger.debug(`Listing patterns, up to ${limit} patterns will be returned.`); const patterns = await this.blueprintDBService.listBlueprints( limit, - event.queryStringParameters?.nextToken + event.queryStringParameters?.nextToken, ); this.logger.debug(`Found ${patterns.results.length} patterns.`); @@ -169,7 +169,7 @@ export class GetAllBlueprintsRequestHandler lastCommitPublishData = await this.blueprintDBService.getBlueprintPublishDataByCommitId( patternMetaData.patternId, - patternMetaData.lastCommitId + patternMetaData.lastCommitId, ); } patternsList.push({ diff --git a/source/lambda/blueprintgovernanceservice/src/handlers/GetBlueprintInfoHandler.ts b/source/lambda/blueprintgovernanceservice/src/handlers/GetBlueprintInfoHandler.ts index 5cafed5..a1179dd 100644 --- a/source/lambda/blueprintgovernanceservice/src/handlers/GetBlueprintInfoHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/handlers/GetBlueprintInfoHandler.ts @@ -111,7 +111,7 @@ export class GetBlueprintInfoHandler public constructor( @inject('LoggerFactory') loggerFactory: LoggerFactory, @inject('BlueprintDBService') - private readonly blueprintDBService: BlueprintDBService + private readonly blueprintDBService: BlueprintDBService, ) { this.logger = loggerFactory.getLogger('GetBlueprintRequestHandler'); } @@ -125,7 +125,7 @@ export class GetBlueprintInfoHandler public async handle( event: APIGatewayProxyEvent, // eslint-disable-next-line @typescript-eslint/naming-convention - _context: Context + _context: Context, ): Promise { this.logger.debug('Processing get pattern details request'); @@ -136,7 +136,7 @@ export class GetBlueprintInfoHandler }); } const patternMetaData = await this.blueprintDBService.getBlueprintById( - event.pathParameters.id + event.pathParameters.id, ); // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -149,7 +149,7 @@ export class GetBlueprintInfoHandler blueprintLastCommitPublishData = await this.blueprintDBService.getBlueprintPublishDataByCommitId( event.pathParameters.id, - patternMetaData.lastCommitId + patternMetaData.lastCommitId, ); responseObject['lastCommitPublishData'] = blueprintLastCommitPublishData; } diff --git a/source/lambda/blueprintgovernanceservice/src/handlers/GetSubscriptionHandler.ts b/source/lambda/blueprintgovernanceservice/src/handlers/GetSubscriptionHandler.ts index da1602e..64ca585 100644 --- a/source/lambda/blueprintgovernanceservice/src/handlers/GetSubscriptionHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/handlers/GetSubscriptionHandler.ts @@ -41,13 +41,13 @@ export class GetSubscriptionHandler implements AsyncRequestHandler { public constructor( - @inject('BlueprintDBService') private readonly db: BlueprintDBService + @inject('BlueprintDBService') private readonly db: BlueprintDBService, ) {} public async handle( event: APIGatewayProxyEvent, // eslint-disable-next-line @typescript-eslint/naming-convention - _context: Context + _context: Context, ): Promise { const patternId = event.queryStringParameters?.['patternId']; const email = event.queryStringParameters?.['email']; @@ -55,7 +55,7 @@ export class GetSubscriptionHandler if (!patternId || !email) { return ServerlessResponse.ofObject( 400, - 'patternId and email must not be null or empty.' + 'patternId and email must not be null or empty.', ); } diff --git a/source/lambda/blueprintgovernanceservice/src/handlers/InitialiseBlueprintPipelineHandler.ts b/source/lambda/blueprintgovernanceservice/src/handlers/InitialiseBlueprintPipelineHandler.ts index c8ed6b2..8bcb207 100644 --- a/source/lambda/blueprintgovernanceservice/src/handlers/InitialiseBlueprintPipelineHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/handlers/InitialiseBlueprintPipelineHandler.ts @@ -76,7 +76,7 @@ export class InitialiseBlueprintPipelineHandler @inject('BlueprintDBService') private readonly blueprintDBService: BlueprintDBService, @inject('BlueprintPipelineBuilderService') - private readonly blueprintPipelineBuilderService: BlueprintPipelineBuilderService + private readonly blueprintPipelineBuilderService: BlueprintPipelineBuilderService, ) { this.logger = loggerFactory.getLogger('InitialiseBlueprintPipelineHandler'); } @@ -91,7 +91,7 @@ export class InitialiseBlueprintPipelineHandler event: APIGatewayProxyEvent, // eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/naming-convention - _context: Context + _context: Context, ): Promise { this.logger.debug("Initialise Pattern's Pipeline request"); @@ -107,14 +107,14 @@ export class InitialiseBlueprintPipelineHandler try { await this.blueprintPipelineBuilderService.invokeCodeBuildProject( - pattern + pattern, ); } catch (e) { pattern.infrastructureStackStatus = StackStatus.CREATE_FAILED; await this.blueprintDBService.updateStatusBlueprintById( pattern.patternId, - pattern.infrastructureStackStatus + pattern.infrastructureStackStatus, ); return ServerlessResponse.ofObject(500, { @@ -128,7 +128,7 @@ export class InitialiseBlueprintPipelineHandler await this.blueprintDBService.updateStatusBlueprintById( pattern.patternId, - pattern.infrastructureStackStatus + pattern.infrastructureStackStatus, ); return ServerlessResponse.ofObject(201, pattern); } diff --git a/source/lambda/blueprintgovernanceservice/src/handlers/SubscribeHandler.ts b/source/lambda/blueprintgovernanceservice/src/handlers/SubscribeHandler.ts index 46462f8..759b8a9 100644 --- a/source/lambda/blueprintgovernanceservice/src/handlers/SubscribeHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/handlers/SubscribeHandler.ts @@ -56,19 +56,19 @@ export class SubscribeHandler implements AsyncRequestHandler { public constructor( - @inject('BlueprintDBService') private readonly db: BlueprintDBService + @inject('BlueprintDBService') private readonly db: BlueprintDBService, ) {} public async handle( event: APIGatewayProxyEvent, // eslint-disable-next-line @typescript-eslint/naming-convention - _context: Context + _context: Context, ): Promise { try { if (!event.body) { return ServerlessResponse.ofObject( 400, - 'Request body must contain valid JSON.' + 'Request body must contain valid JSON.', ); } @@ -77,7 +77,7 @@ export class SubscribeHandler if (!input.patternId) { return ServerlessResponse.ofObject( 400, - 'patternId must not be null or empty.' + 'patternId must not be null or empty.', ); } @@ -90,13 +90,13 @@ export class SubscribeHandler case 'POST': await this.db.createNotificationSubscription( input.patternId, - input.email + input.email, ); return ServerlessResponse.ofObject(201, {}); case 'DELETE': await this.db.deleteNotificationSubscription( input.patternId, - input.email + input.email, ); return ServerlessResponse.ofObject(200, {}); default: @@ -107,7 +107,7 @@ export class SubscribeHandler // json parse error return ServerlessResponse.ofObject( 400, - 'Request body must contain valid JSON.' + 'Request body must contain valid JSON.', ); } throw error; diff --git a/source/lambda/blueprintgovernanceservice/src/handlers/UpdateBlueprintInfraStatusHandler.ts b/source/lambda/blueprintgovernanceservice/src/handlers/UpdateBlueprintInfraStatusHandler.ts index 95bf3d4..afe4a42 100644 --- a/source/lambda/blueprintgovernanceservice/src/handlers/UpdateBlueprintInfraStatusHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/handlers/UpdateBlueprintInfraStatusHandler.ts @@ -46,10 +46,10 @@ const logger = getLogger('UpdateBlueprintListStatusHandler'); */ export async function updateBlueprintInfrastructureStackStatus( patternId: string, - status: string + status: string, ): Promise { logger.info( - `Updating pattern ${patternId} with infrastructure stack status ${status}` + `Updating pattern ${patternId} with infrastructure stack status ${status}`, ); await ddbDocClient.update({ Key: { @@ -69,11 +69,11 @@ export async function updateBlueprintInfrastructureStackStatus( * @returns */ const getBlueprintIdFromInfrastructureStackName = async ( - stackName: string + stackName: string, ): Promise => { const stack = await cfnClient.send( // eslint-disable-next-line @typescript-eslint/naming-convention - new DescribeStacksCommand({ StackName: stackName }) + new DescribeStacksCommand({ StackName: stackName }), ); return stack.Stacks?.[0].Tags?.find((tag) => tag.Key == 'blueprintId')?.Value; }; @@ -91,7 +91,7 @@ export async function handler(event: SNSEvent, _context: unknown): Promise (record: SNSEventRecord) => { // Transform the sns message to an array of lines return record.Sns.Message.split('\n'); - } + }, ).filter((messagesLines: string[]) => { // Apply filter to only keep cloudformation stack update messages return messagesLines.includes("ResourceType='AWS::CloudFormation::Stack'"); @@ -110,23 +110,23 @@ export async function handler(event: SNSEvent, _context: unknown): Promise [key]: value?.slice(1, -1), // Remove quotes around the value string }; }, {}); - } + }, ); // Update the infrastructure stack status of each blueprint for (const cfStackNotification of cfStackNotifications) { const blueprintId = await getBlueprintIdFromInfrastructureStackName( - cfStackNotification.StackName + cfStackNotification.StackName, ); if (blueprintId) { await updateBlueprintInfrastructureStackStatus( blueprintId, - cfStackNotification['ResourceStatus'] + cfStackNotification['ResourceStatus'], ); } else { logger.info( - `Could not find the blueprint ID for stack ${cfStackNotification.StackName}` + `Could not find the blueprint ID for stack ${cfStackNotification.StackName}`, ); } } diff --git a/source/lambda/blueprintgovernanceservice/src/handlers/UpdateBlueprintMetaInfoHandler.ts b/source/lambda/blueprintgovernanceservice/src/handlers/UpdateBlueprintMetaInfoHandler.ts index 6d0dab2..8073872 100644 --- a/source/lambda/blueprintgovernanceservice/src/handlers/UpdateBlueprintMetaInfoHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/handlers/UpdateBlueprintMetaInfoHandler.ts @@ -81,7 +81,7 @@ export class UpdateBlueprintMetaInfoHandler public constructor( @inject('LoggerFactory') loggerFactory: LoggerFactory, @inject('BlueprintDBService') - private readonly blueprintDBService: BlueprintDBService + private readonly blueprintDBService: BlueprintDBService, ) { this.logger = loggerFactory.getLogger('UpdateBlueprintHandler'); } @@ -95,13 +95,13 @@ export class UpdateBlueprintMetaInfoHandler public async handle( event: APIGatewayProxyEvent, // eslint-disable-next-line @typescript-eslint/naming-convention - _context: Context + _context: Context, ): Promise { this.logger.debug('Processing update pattern request'); if (!event.body) { return ServerlessResponse.ofObject( 400, - 'Request body must contain valid JSON.' + 'Request body must contain valid JSON.', ); } @@ -118,11 +118,11 @@ export class UpdateBlueprintMetaInfoHandler await this.blueprintDBService.updateBlueprintMetaData( event.pathParameters.id, input.description, - input.attributes + input.attributes, ); const patternObject = await this.blueprintDBService.getBlueprintById( - event.pathParameters.id + event.pathParameters.id, ); return ServerlessResponse.ofObject(200, { patternObject }); diff --git a/source/lambda/blueprintgovernanceservice/src/metrics/OperationalMetricHandler.ts b/source/lambda/blueprintgovernanceservice/src/metrics/OperationalMetricHandler.ts index 8ef1be5..dcd7183 100644 --- a/source/lambda/blueprintgovernanceservice/src/metrics/OperationalMetricHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/metrics/OperationalMetricHandler.ts @@ -22,7 +22,7 @@ import { sendAnonymousMetric } from '../common/metrics/operational-metric'; import { v4 as uuidv4 } from 'uuid'; export async function handler( - event: CloudFormationCustomResourceEvent + event: CloudFormationCustomResourceEvent, ): Promise { const { awsSolutionId, diff --git a/source/lambda/blueprintgovernanceservice/src/service/AppRegistryIntegrationService.ts b/source/lambda/blueprintgovernanceservice/src/service/AppRegistryIntegrationService.ts index e3ee74a..88663e4 100644 --- a/source/lambda/blueprintgovernanceservice/src/service/AppRegistryIntegrationService.ts +++ b/source/lambda/blueprintgovernanceservice/src/service/AppRegistryIntegrationService.ts @@ -66,8 +66,8 @@ export async function checkAttributeExist(name: string): Promise { } else { logger.error( `Error read attribute group ${attributeGroupName} from AppRegistry. Error: ${JSON.stringify( - err - )}` + err, + )}`, ); throw err; } @@ -97,13 +97,13 @@ export async function updateAttribute(data: Attribute): Promise { if (err.code === 'ResourceNotFoundException') { doCreate = true; logger.info( - `attribute group ${attributeGroupName} not found, create a new one` + `attribute group ${attributeGroupName} not found, create a new one`, ); } else { logger.error( `Error read attribute group ${attributeGroupName} from AppRegistry. Error: ${JSON.stringify( - err - )}` + err, + )}`, ); throw err; } @@ -131,7 +131,7 @@ export async function updateAttribute(data: Attribute): Promise { // check if attribute group actually need to be updated const tagsMatch = Object.entries(tags).filter( - ([key, value]) => existingAttributeGroup?.tags?.[key] === value + ([key, value]) => existingAttributeGroup?.tags?.[key] === value, ).length === Object.keys(tags).length; if ( @@ -157,12 +157,12 @@ export async function updateAttribute(data: Attribute): Promise { logger.info('attribute group tags updated.'); } else { logger.error( - `updateAttributeGroup does not return valid response. attributeGroupName: ${attributeGroupName}` + `updateAttributeGroup does not return valid response. attributeGroupName: ${attributeGroupName}`, ); // eslint-disable-next-line @typescript-eslint/no-throw-literal throw new BasicHttpError( 500, - `Failed to update tags on attribute group. attributeGroupName: ${attributeGroupName}` + `Failed to update tags on attribute group. attributeGroupName: ${attributeGroupName}`, ); } } else { @@ -194,8 +194,8 @@ export async function deleteAttribute(id: string): Promise { } else { logger.error( `Error read attribute group ${attributeGroupName} from AppRegistry. Error: ${JSON.stringify( - err - )}` + err, + )}`, ); throw err; } diff --git a/source/lambda/blueprintgovernanceservice/src/service/BlueprintDBService.ts b/source/lambda/blueprintgovernanceservice/src/service/BlueprintDBService.ts index a689fb4..b244a6d 100644 --- a/source/lambda/blueprintgovernanceservice/src/service/BlueprintDBService.ts +++ b/source/lambda/blueprintgovernanceservice/src/service/BlueprintDBService.ts @@ -51,7 +51,7 @@ export class BlueprintDBService { */ public constructor( @inject('DocumentClient') - private readonly documentClient: AWS.DynamoDB.DocumentClient + private readonly documentClient: AWS.DynamoDB.DocumentClient, ) { this.rapmMetaDataTableName = // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -83,7 +83,7 @@ export class BlueprintDBService { */ public async listBlueprints( limit?: number, - nextToken?: string + nextToken?: string, ): Promise> { const params = { TableName: this.rapmMetaDataTableName, @@ -122,7 +122,7 @@ export class BlueprintDBService { */ public async getBlueprintPublishDataByCommitId( patternId: string, - commitId: string + commitId: string, // eslint-disable-next-line @typescript-eslint/no-explicit-any ): Promise { const params = { @@ -148,7 +148,7 @@ export class BlueprintDBService { */ public async updateStatusBlueprintById( id: string, - patternPipelineInfraStatus: string + patternPipelineInfraStatus: string, ): Promise { const params = { TableName: this.rapmMetaDataTableName, @@ -175,7 +175,7 @@ export class BlueprintDBService { public async updateBlueprintMetaData( id: string, description: string, - attributes?: Record + attributes?: Record, ): Promise { const params = { TableName: this.rapmMetaDataTableName, @@ -240,7 +240,7 @@ export class BlueprintDBService { */ public async listAttributes( limit?: number, - nextToken?: string + nextToken?: string, ): Promise<[Attribute[], string]> { const params = { TableName: this.rapmAttributesTableName, @@ -269,7 +269,7 @@ export class BlueprintDBService { public async createNotificationSubscription( patternId: string, - email: string + email: string, ): Promise { await this.documentClient .put({ @@ -281,7 +281,7 @@ export class BlueprintDBService { public async deleteNotificationSubscription( patternId: string, - email: string + email: string, ): Promise { await this.documentClient .delete({ @@ -293,7 +293,7 @@ export class BlueprintDBService { public async getNotificationSubscription( patternId: string, - email: string + email: string, ): Promise | undefined> { const item = await this.documentClient .get({ diff --git a/source/lambda/blueprintgovernanceservice/src/service/BlueprintPipelineBuilderService.ts b/source/lambda/blueprintgovernanceservice/src/service/BlueprintPipelineBuilderService.ts index 46e0f2f..24b74e7 100644 --- a/source/lambda/blueprintgovernanceservice/src/service/BlueprintPipelineBuilderService.ts +++ b/source/lambda/blueprintgovernanceservice/src/service/BlueprintPipelineBuilderService.ts @@ -55,7 +55,7 @@ export class BlueprintPipelineBuilderService { */ public constructor( @inject('LoggerFactory') loggerFactory: LoggerFactory, - @inject('CodeBuildClient') private readonly codeBuildClient: CodeBuildClient + @inject('CodeBuildClient') private readonly codeBuildClient: CodeBuildClient, ) { this.logger = loggerFactory.getLogger('BlueprintPipelineBuilderService'); } diff --git a/source/lambda/blueprintgovernanceservice/src/service/blueprint-repo-builder/BlueprintCodeCommitRepoBuilderService.ts b/source/lambda/blueprintgovernanceservice/src/service/blueprint-repo-builder/BlueprintCodeCommitRepoBuilderService.ts index bea9246..811bf8b 100644 --- a/source/lambda/blueprintgovernanceservice/src/service/blueprint-repo-builder/BlueprintCodeCommitRepoBuilderService.ts +++ b/source/lambda/blueprintgovernanceservice/src/service/blueprint-repo-builder/BlueprintCodeCommitRepoBuilderService.ts @@ -48,7 +48,7 @@ export class BlueprintCodeCommitRepoBuilderService private readonly codeCommitClient: CodeCommitClient; public constructor( @inject('LoggerFactory') loggerFactory: LoggerFactory, - @inject('CodeCommitClient') codeCommitClient: CodeCommitClient + @inject('CodeCommitClient') codeCommitClient: CodeCommitClient, ) { this.logger = loggerFactory.getLogger('BlueprintRepoBuilderService'); this.codeCommitClient = codeCommitClient; @@ -60,18 +60,18 @@ export class BlueprintCodeCommitRepoBuilderService await this.codeCommitClient.send( new DeleteRepositoryCommand({ repositoryName: repoName, - }) + }), ); } catch (e) { this.logger.error( - `Unable to delete the repo: ${repoName}: ${JSON.stringify(e, null, 4)}` + `Unable to delete the repo: ${repoName}: ${JSON.stringify(e, null, 4)}`, ); throw e; } } public async createAndInitializeRepo( repoName: string, - patternType: PatternType + patternType: PatternType, ): Promise { // Create repo let createRepoResponse: CreateRepositoryCommandOutput; @@ -79,23 +79,22 @@ export class BlueprintCodeCommitRepoBuilderService createRepoResponse = await this.codeCommitClient.send( new CreateRepositoryCommand({ repositoryName: repoName, - }) + }), ); } catch (e) { this.logger.error( - `Error creating repo: ${repoName}, ${JSON.stringify(e, null, 4)}` + `Error creating repo: ${repoName}, ${JSON.stringify(e, null, 4)}`, ); // eslint-disable-next-line @typescript-eslint/no-throw-literal throw new BlueprintError(`Error creating repo: ${repoName}`, 500); } if ( createRepoResponse.$metadata.httpStatusCode == 200 && - createRepoResponse.repositoryMetadata && - createRepoResponse.repositoryMetadata.cloneUrlHttp && + createRepoResponse.repositoryMetadata?.cloneUrlHttp && createRepoResponse.repositoryMetadata.repositoryName ) { this.logger.debug( - `Create Repo Response: ${JSON.stringify(createRepoResponse, null, 4)}` + `Create Repo Response: ${JSON.stringify(createRepoResponse, null, 4)}`, ); // initialise repo @@ -103,7 +102,7 @@ export class BlueprintCodeCommitRepoBuilderService await this.initialiseRepo(repoName, patternType); } catch (e) { this.logger.error( - `Error initialising repo: ${repoName}: ${JSON.stringify(e, null, 4)}` + `Error initialising repo: ${repoName}: ${JSON.stringify(e, null, 4)}`, ); // rollback the repo creation await this.deleteRepo(repoName); @@ -119,19 +118,19 @@ export class BlueprintCodeCommitRepoBuilderService }; } else { this.logger.error( - `Repo details not returned from create repo API: ${repoName}` + `Repo details not returned from create repo API: ${repoName}`, ); // eslint-disable-next-line @typescript-eslint/no-throw-literal throw new BlueprintError( `Repo details not returned from create repo API: ${repoName}`, - 500 + 500, ); } } private async initialiseRepo( repoName: string, - patternType: PatternType + patternType: PatternType, ): Promise { // first commit having readme file await this.codeCommitClient.send( @@ -140,20 +139,20 @@ export class BlueprintCodeCommitRepoBuilderService branchName: defaultBranchName, filePath: 'README.md', fileContent: Buffer.from(`# ${repoName}`), - }) + }), ); const getBranchRes = await this.codeCommitClient.send( new GetBranchCommand({ repositoryName: repoName, branchName: defaultBranchName, - }) + }), ); // initialise repo const putFilesArr: PutFileEntry[] = []; const dirPath = path.resolve( __dirname, blueprintRepoBuilderServiceConstants.rootInitialRepoDir, - patternType.toLowerCase() + patternType.toLowerCase(), ); this.buildPutFilesArr(patternType, dirPath, defaultBranchName, putFilesArr); await this.codeCommitClient.send( @@ -163,7 +162,7 @@ export class BlueprintCodeCommitRepoBuilderService parentCommitId: getBranchRes.branch?.commitId, commitMessage: 'Initialise repository', putFiles: putFilesArr, - }) + }), ); } @@ -171,7 +170,7 @@ export class BlueprintCodeCommitRepoBuilderService patternType: PatternType, dirPath: string, branchName: string, - putFileEntryArr: PutFileEntry[] + putFileEntryArr: PutFileEntry[], ): void { const list = fs.readdirSync(dirPath); for (const fname of list) { @@ -183,15 +182,15 @@ export class BlueprintCodeCommitRepoBuilderService } else { /* Is a file */ const template = handlebars.compile( - fs.existsSync(file) ? fs.readFileSync(file).toString() : '' + fs.existsSync(file) ? fs.readFileSync(file).toString() : '', ); const fileContent = template({ branchName }); const fileRelativePath = file.substring( path.resolve( __dirname, blueprintRepoBuilderServiceConstants.rootInitialRepoDir, - patternType.toLowerCase() - ).length + 1 + patternType.toLowerCase(), + ).length + 1, ); putFileEntryArr.push({ filePath: fileRelativePath, diff --git a/source/lambda/blueprintgovernanceservice/src/service/blueprint-repo-builder/BlueprintGitHubRepoBuilderService.ts b/source/lambda/blueprintgovernanceservice/src/service/blueprint-repo-builder/BlueprintGitHubRepoBuilderService.ts index 764ff4f..e34a4dd 100644 --- a/source/lambda/blueprintgovernanceservice/src/service/blueprint-repo-builder/BlueprintGitHubRepoBuilderService.ts +++ b/source/lambda/blueprintgovernanceservice/src/service/blueprint-repo-builder/BlueprintGitHubRepoBuilderService.ts @@ -46,7 +46,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS public constructor( @inject('LoggerFactory') loggerFactory: LoggerFactory, @inject('DependencyConfigurationProvider') - private readonly dependencyConfigurationProvider: DependencyConfigurationProvider + private readonly dependencyConfigurationProvider: DependencyConfigurationProvider, ) { this.logger = loggerFactory.getLogger('BlueprintRepoBuilderService'); const githubUrl = process.env.GITHUB_URL; @@ -67,7 +67,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS }); } catch (e) { this.logger.error( - `Unable to delete the repo: ${repoName}: ${JSON.stringify(e, null, 4)}` + `Unable to delete the repo: ${repoName}: ${JSON.stringify(e, null, 4)}`, ); throw e; } @@ -80,7 +80,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS private async getBlueprintGithubToken(): Promise { this.logger.info('getBlueprintGithubToken'); return this.dependencyConfigurationProvider.getBlueprintServiceRepoCredentials( - 'BLUEPRINTGOVERNANCE' + 'BLUEPRINTGOVERNANCE', ); } @@ -96,7 +96,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS public async createAndInitializeRepo( repoName: string, - patternType: PatternType + patternType: PatternType, ): Promise { // Create pattern repo const blueprintRepoDetails = await this.createRepo(repoName); @@ -106,7 +106,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS await this.initialiseRepo( blueprintRepoDetails.branchName, blueprintRepoDetails.repoName, - patternType + patternType, ); // Enable branch protection on main branch @@ -121,7 +121,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS } } catch (e) { this.logger.error( - `Error initialising repo: ${repoName}: ${JSON.stringify(e, null, 4)}` + `Error initialising repo: ${repoName}: ${JSON.stringify(e, null, 4)}`, ); // rollback the repo creation await this.deleteRepo(repoName); @@ -151,7 +151,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS private: true, is_template: true, auto_init: true, - } + }, ); if (createRepoResponse.status == 201) { return { @@ -191,7 +191,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS public async initialiseRepo( branch: string, repoName: string, - patternType: PatternType + patternType: PatternType, ): Promise { const octokit = await this.getOctokit(); const maxRetries = 3; @@ -204,7 +204,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS try { this.logger.debug('Attempt: ' + retryGetlatestShaCount); latestSHAResp = await octokit.request( - `GET /repos/${this.org}/${repoName}/branches/${branch}` + `GET /repos/${this.org}/${repoName}/branches/${branch}`, ); if (latestSHAResp.status >= 200 && latestSHAResp.status <= 299) { retry = false; @@ -215,7 +215,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS } catch (e) { this.logger.error( 'Error when initializing repo, could not get latestSHA', - e + e, ); retryGetlatestShaCount++; await new Promise((resolve) => setTimeout(resolve, 1000)); @@ -226,7 +226,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS // eslint-disable-next-line @typescript-eslint/no-throw-literal throw new BlueprintError( `Error when initializing repo, could not get latestSHA`, - 500 + 500, ); } const latestSHA = latestSHAResp.data.commit.sha; @@ -238,10 +238,10 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS __dirname, `./${ blueprintRepoBuilderServiceConstants.rootInitialRepoDir - }/${patternType.toLowerCase()}` + }/${patternType.toLowerCase()}`, ), latestSHA, - branch + branch, ); // 3. Create the commit @@ -252,7 +252,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS message: 'chore: initial repo setup', parents: [latestSHA], tree: createTreeResp.data.sha, - } + }, ); // 4. Update the reference of your branch to point to the new commit SHA (on master branch example) @@ -262,7 +262,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS accept: 'application/vnd.github.v3+json', ref: `refs/heads/${branch}`, sha: createCommitResp.data.sha, - } + }, ); } @@ -273,7 +273,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS repoName: string, dirPath: string, latestSHA: string, - branchName: string + branchName: string, // eslint-disable-next-line @typescript-eslint/no-explicit-any ): Promise { const octokit = await this.getOctokit(); @@ -298,7 +298,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS repoName: string, dirPath: string, branchName: string, - gitTreeArray?: GitTree[] + gitTreeArray?: GitTree[], ): Promise { if (!gitTreeArray) { gitTreeArray = []; @@ -316,7 +316,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS const treeObjForCommit = await this.getTreeObjectForCommit( repoName, file, - branchName + branchName, ); gitTreeArray.push(treeObjForCommit); } @@ -331,11 +331,11 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS private async getTreeObjectForCommit( repoName: string, filePath: string, - branchName: string + branchName: string, ): Promise { const octokit = await this.getOctokit(); const template = handlebars.compile( - fs.existsSync(filePath) ? fs.readFileSync(filePath).toString() : '' + fs.existsSync(filePath) ? fs.readFileSync(filePath).toString() : '', ); const content = template({ branchName }); const createBlob = await octokit.request( @@ -344,7 +344,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS accept: 'application/vnd.github.v3+json', content, encoding: 'utf-8', - } + }, ); const relativePathFromRoot = this.getRelativePathFromRoot(filePath); return this.getTreeObject(relativePathFromRoot, createBlob.data.sha); @@ -353,7 +353,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS private getRelativePathFromRoot(filePath: string): string { const templateRootDir = `/${blueprintRepoBuilderServiceConstants.rootInitialRepoDir}`; return filePath.substring( - filePath.lastIndexOf(templateRootDir) + templateRootDir.length + 5 + filePath.lastIndexOf(templateRootDir) + templateRootDir.length + 5, ); } @@ -371,7 +371,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS public async enableBranchProtection( repoName: string, - branchName: string + branchName: string, // eslint-disable-next-line @typescript-eslint/no-explicit-any ): Promise { try { @@ -392,7 +392,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS }, // Let anyone push to the protected branch restrictions: null, - } + }, ); } catch (e) { this.logger.error('Error when enabling branch protection', e); @@ -403,7 +403,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS public async addCodeowners( repoName: string, - codeowners: string[] + codeowners: string[], // eslint-disable-next-line @typescript-eslint/no-explicit-any ): Promise { try { @@ -416,7 +416,7 @@ export class BlueprintGitHubRepoBuilderService implements IBlueprintRepoBuilderS accept: 'application/vnd.github.v3+json', message: 'Add CODEOWNERS', content: Buffer.from(codeOwnersContent).toString('base64'), - } + }, ); } catch (e) { this.logger.error('Error when adding codeowners', e); diff --git a/source/lambda/blueprintgovernanceservice/src/service/blueprint-repo-builder/IBlueprintRepoBuilderService.ts b/source/lambda/blueprintgovernanceservice/src/service/blueprint-repo-builder/IBlueprintRepoBuilderService.ts index 2cb92ca..ed2b4cf 100644 --- a/source/lambda/blueprintgovernanceservice/src/service/blueprint-repo-builder/IBlueprintRepoBuilderService.ts +++ b/source/lambda/blueprintgovernanceservice/src/service/blueprint-repo-builder/IBlueprintRepoBuilderService.ts @@ -28,7 +28,7 @@ export interface IBlueprintRepoBuilderService { */ createAndInitializeRepo( repoName: string, - patternType: PatternType + patternType: PatternType, ): Promise; /** diff --git a/source/lambda/blueprintgovernanceservice/src/timed-synchroniser/MainHandler.ts b/source/lambda/blueprintgovernanceservice/src/timed-synchroniser/MainHandler.ts index 3595156..4ea928c 100644 --- a/source/lambda/blueprintgovernanceservice/src/timed-synchroniser/MainHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/timed-synchroniser/MainHandler.ts @@ -34,7 +34,7 @@ export class MainHandler { appConfig.applicationName, container, appConfig.runningLocally, - appConfig.logLevel + appConfig.logLevel, ), responseFormatter(), errorLogger(), @@ -43,14 +43,14 @@ export class MainHandler { // main lambda handler this.lambdaHandler = new MiddlewareChain( handler, - middlewares + middlewares, ).lambdaHandler; } } function errorLogger(): middy.MiddlewareObj { const onError: middy.MiddlewareFn = async ( - request + request, ): Promise => { const logger = getLogger('ErrorLoggingMiddleware'); logger.error('Error received - ', request.error); diff --git a/source/lambda/blueprintgovernanceservice/src/timed-synchroniser/SyncEventHandler.ts b/source/lambda/blueprintgovernanceservice/src/timed-synchroniser/SyncEventHandler.ts index 16a4e3a..3260b8e 100644 --- a/source/lambda/blueprintgovernanceservice/src/timed-synchroniser/SyncEventHandler.ts +++ b/source/lambda/blueprintgovernanceservice/src/timed-synchroniser/SyncEventHandler.ts @@ -33,7 +33,7 @@ export class SyncEventHandler // eslint-disable-next-line @typescript-eslint/naming-convention _event: EventType, // eslint-disable-next-line @typescript-eslint/naming-convention - _context: Context + _context: Context, ): Promise { this.logger.info('Timed Synchroniser Started.'); // sync attributes @@ -62,7 +62,7 @@ export class SyncEventHandler } export async function getAttributes( - nextToken: string | undefined + nextToken: string | undefined, ): Promise<[Attribute[], string]> { const blueprintDBService = container.resolve('BlueprintDBService'); diff --git a/source/lambda/blueprintgovernanceservice/test/unit/App.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/App.test.ts index 6483f3f..fab0acc 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/App.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/App.test.ts @@ -40,7 +40,7 @@ describe('Test compliance event', () => { resource: '/patterns', } as APIGatewayProxyEvent, {} as Context, - () => ({}) + () => ({}), ); expect(CreateBlueprintRequestHandler.prototype.handle).toHaveBeenCalled(); }); @@ -57,7 +57,7 @@ describe('Test compliance event', () => { resource: '/patterns', } as APIGatewayProxyEvent, {} as Context, - () => ({}) + () => ({}), ); expect(GetAllBlueprintsRequestHandler.prototype.handle).toHaveBeenCalled(); }); @@ -73,7 +73,7 @@ describe('Test compliance event', () => { resource: '/patterns/{id}', } as APIGatewayProxyEvent, {} as Context, - () => ({}) + () => ({}), ); expect(GetBlueprintInfoHandler.prototype.handle).toHaveBeenCalled(); }); @@ -91,7 +91,7 @@ describe('Test compliance event', () => { resource: '/patterns/pipeline/{id}', } as APIGatewayProxyEvent, {} as Context, - () => ({}) + () => ({}), ); expect(InitialiseBlueprintPipelineHandler.prototype.handle).toHaveBeenCalled(); }); @@ -108,7 +108,7 @@ describe('Test compliance event', () => { resource: '/attributes', } as APIGatewayProxyEvent, {} as Context, - () => ({}) + () => ({}), ); expect(AttributeCreateHandler.prototype.handle).toHaveBeenCalled(); }); @@ -123,7 +123,7 @@ describe('Test compliance event', () => { resource: '/attributes', } as APIGatewayProxyEvent, {} as Context, - () => ({}) + () => ({}), ); expect(AttributeListHandler.prototype.handle).toHaveBeenCalled(); }); @@ -139,7 +139,7 @@ describe('Test compliance event', () => { resource: '/attributes/{id}', } as APIGatewayProxyEvent, {} as Context, - () => ({}) + () => ({}), ); expect(AttributeGetDetailsHandler.prototype.handle).toHaveBeenCalled(); }); @@ -155,7 +155,7 @@ describe('Test compliance event', () => { resource: '/attributes/{id}', } as APIGatewayProxyEvent, {} as Context, - () => ({}) + () => ({}), ); expect(AttributeUpdateHandler.prototype.handle).toHaveBeenCalled(); }); @@ -171,7 +171,7 @@ describe('Test compliance event', () => { resource: '/attributes/{id}', } as APIGatewayProxyEvent, {} as Context, - () => ({}) + () => ({}), ); expect(AttributeDeleteHandler.prototype.handle).toHaveBeenCalled(); }); diff --git a/source/lambda/blueprintgovernanceservice/test/unit/Container.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/Container.test.ts index cf85b4f..8a6960f 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/Container.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/Container.test.ts @@ -23,7 +23,7 @@ import { IBlueprintRepoBuilderService } from '../../src/service/blueprint-repo-b const router = new Router().addRoute( (e) => e.httpMethod === 'POST' && e.resource == '/blueprints', - CreateBlueprintRequestHandler + CreateBlueprintRequestHandler, ); describe('test request handler registration', () => { @@ -58,9 +58,9 @@ describe('test request handler registration', () => { expect( ( container.resolve( - 'BlueprintRepoBuilderService' + 'BlueprintRepoBuilderService', ) as IBlueprintRepoBuilderService - ).constructor.name + ).constructor.name, ).toBe('BlueprintCodeCommitRepoBuilderService'); }); test('resolve to GitHub repo builder', () => { @@ -69,9 +69,9 @@ describe('test request handler registration', () => { expect( ( container.resolve( - 'BlueprintRepoBuilderService' + 'BlueprintRepoBuilderService', ) as IBlueprintRepoBuilderService - ).constructor.name + ).constructor.name, ).toBe('BlueprintGitHubRepoBuilderService'); }); }); diff --git a/source/lambda/blueprintgovernanceservice/test/unit/codecommit/trigger-security-scan.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/codecommit/trigger-security-scan.test.ts index b2898ca..7028310 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/codecommit/trigger-security-scan.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/codecommit/trigger-security-scan.test.ts @@ -47,7 +47,7 @@ describe('Trigger Security check codebuild handler tests', () => { }, ], } as unknown as SNSEvent, - {} as unknown as Context + {} as unknown as Context, ); expect(codeBuildClientMock.calls()).toHaveLength(1); expect(codeBuildClientMock.call(0).firstArg).toBeInstanceOf(StartBuildCommand); diff --git a/source/lambda/blueprintgovernanceservice/test/unit/common/AppRegistrySyncRequestQueue.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/common/AppRegistrySyncRequestQueue.test.ts index 2f7ef50..d1f5f97 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/common/AppRegistrySyncRequestQueue.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/common/AppRegistrySyncRequestQueue.test.ts @@ -44,7 +44,7 @@ describe('test AppRegistrySyncRequestQueue', () => { beforeAll(() => { when(mockAppConfiguration.appRegistryUpdaterQueueUrl).thenReturn( - 'test-sqs-queue' + 'test-sqs-queue', ); container.register('LoggerFactory', { useClass: StaticLoggerFactory, diff --git a/source/lambda/blueprintgovernanceservice/test/unit/common/Attribute.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/common/Attribute.test.ts index f4a9933..784d1fc 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/common/Attribute.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/common/Attribute.test.ts @@ -138,8 +138,8 @@ describe('attribute helper tests', () => { await expect(syncAttribute('TEST_ATTR_1_KEY:TEST_ATTR_1_VALUE')).rejects.toEqual( new Error( - `Specified attribute is not found. id: TEST_ATTR_1_KEY:TEST_ATTR_1_VALUE` - ) + `Specified attribute is not found. id: TEST_ATTR_1_KEY:TEST_ATTR_1_VALUE`, + ), ); }); }); diff --git a/source/lambda/blueprintgovernanceservice/test/unit/common/LoggerFactory.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/common/LoggerFactory.test.ts index b7ae61d..fbbae15 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/common/LoggerFactory.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/common/LoggerFactory.test.ts @@ -42,7 +42,7 @@ describe('LoggerFactory', () => { // So we test it again below // https://github.com/facebook/jest/issues/6466 }), - expect.anything() + expect.anything(), ); // can't match the entire string due to timestamp being random @@ -50,8 +50,8 @@ describe('LoggerFactory', () => { logConsole.mock.calls[0][0][Symbol.for('message')] .toString() .startsWith( - '{"message":"test message","level":"error","label":"foo","timestamp":"' - ) + '{"message":"test message","level":"error","label":"foo","timestamp":"', + ), ).toBe(false); }); @@ -61,7 +61,7 @@ describe('LoggerFactory', () => { {} as Context, undefined, // eslint-disable-next-line @typescript-eslint/naming-convention - { path: (e, _): string => e.path } + { path: (e, _): string => e.path }, ); const log = loggerFactory.getLogger('foo', 'info'); expect((log).level).toBe('info'); @@ -77,7 +77,7 @@ describe('LoggerFactory', () => { // So we test it again below // https://github.com/facebook/jest/issues/6466 }), - expect.anything() + expect.anything(), ); // can't match the entire string due to timestamp being random @@ -85,8 +85,8 @@ describe('LoggerFactory', () => { logConsole.mock.calls[0][0][Symbol.for('message')] .toString() .startsWith( - '{"message":"test message","level":"error","path":"/test","label":"foo","timestamp":"' - ) + '{"message":"test message","level":"error","path":"/test","label":"foo","timestamp":"', + ), ).toBe(false); }); diff --git a/source/lambda/blueprintgovernanceservice/test/unit/common/providers/DependencyConfigurationProvider.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/common/providers/DependencyConfigurationProvider.test.ts index 8180cf3..a02463a 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/common/providers/DependencyConfigurationProvider.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/common/providers/DependencyConfigurationProvider.test.ts @@ -38,7 +38,7 @@ describe('DependencyConfigurationProvider - getSecret and getSSM mock', () => { const dependencyConfigurationProvider: DependencyConfigurationProvider = new DependencyConfigurationProvider( instance(testingAppConfiguration), - new AWS.SecretsManager() + new AWS.SecretsManager(), ); when(testingAppConfiguration.getDepdencyFor('BLUEPRINTGOVERNANCE')).thenReturn({ name: 'BLUEPRINTGOVERNANCE', @@ -46,7 +46,7 @@ describe('DependencyConfigurationProvider - getSecret and getSSM mock', () => { }); const value = await dependencyConfigurationProvider.getBlueprintServiceRepoCredentials( - 'BLUEPRINTGOVERNANCE' + 'BLUEPRINTGOVERNANCE', ); expect(value).toEqual('testSecret'); diff --git a/source/lambda/blueprintgovernanceservice/test/unit/common/response-formatter.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/common/response-formatter.test.ts index b0085ff..30277ff 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/common/response-formatter.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/common/response-formatter.test.ts @@ -38,14 +38,14 @@ describe('response format tests', () => { const mockHandler: ( _event: typeof event, - _context: Context + _context: Context, ) => Promise = jest.fn().mockResolvedValueOnce(response); const lambdaHandler = middy(mockHandler).use(respFormatter); const result = await lambdaHandler( event, {} as Context, - (null) as Callback + (null) as Callback, ); expect(result).toEqual({ @@ -68,14 +68,14 @@ describe('response format tests', () => { const mockHandler: ( _event: typeof event, - _context: Context + _context: Context, ) => Promise = jest.fn().mockResolvedValueOnce(response); const lambdaHandler = middy(mockHandler).use(respFormatter); const result = await lambdaHandler( event, {} as Context, - (null) as Callback + (null) as Callback, ); expect(result).toEqual(response); @@ -99,7 +99,7 @@ describe('response format tests', () => { const mockHandler: ( _event: typeof event, - _context: Context + _context: Context, ) => Promise = jest .fn() .mockRejectedValueOnce(new BasicHttpError(400, 'Error occurs')); @@ -108,7 +108,7 @@ describe('response format tests', () => { const result = await lambdaHandler( event, {} as Context, - (null) as Callback + (null) as Callback, ); expect(result).toEqual({ @@ -141,7 +141,7 @@ describe('response format tests', () => { const mockHandler: ( _event: typeof event, - _context: Context + _context: Context, ) => Promise = jest.fn(() => { throw Error('Something is wrong'); }); @@ -150,7 +150,7 @@ describe('response format tests', () => { const result = await lambdaHandler( event, {} as Context, - (null) as Callback + (null) as Callback, ); expect(result).toEqual({ diff --git a/source/lambda/blueprintgovernanceservice/test/unit/configuration/AppConfiguration.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/configuration/AppConfiguration.test.ts index ec9acf4..52d7051 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/configuration/AppConfiguration.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/configuration/AppConfiguration.test.ts @@ -32,14 +32,14 @@ describe('Test AppConfiguration.test', () => { process.env.githubTokenSecretId = 'githubTokenSecretId'; const objectUnderTest = new AppConfiguration('test-app'); expect( - objectUnderTest.getDepdencyFor('BLUEPRINTGOVERNANCE')?.githubTokenSecretId + objectUnderTest.getDepdencyFor('BLUEPRINTGOVERNANCE')?.githubTokenSecretId, ).toEqual('githubTokenSecretId'); }); test('no default key when configuration missing', () => { const objectUnderTest = new AppConfiguration('test-app'); expect(objectUnderTest.getDepdencyFor('BLUEPRINTGOVERNANCE')?.name).toEqual( - 'BLUEPRINTGOVERNANCE' + 'BLUEPRINTGOVERNANCE', ); }); @@ -47,7 +47,7 @@ describe('Test AppConfiguration.test', () => { process.env.ATTESTATION_ENDPOINT_KEY = undefined; const objectUnderTest = new AppConfiguration('test-app'); expect( - objectUnderTest.getDepdencyFor('BLUEPRINTGOVERNANCE')?.githubTokenSecretId + objectUnderTest.getDepdencyFor('BLUEPRINTGOVERNANCE')?.githubTokenSecretId, ).toBeUndefined(); }); }); diff --git a/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeCreateHandler.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeCreateHandler.test.ts index 7300dd2..bc3ab7f 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeCreateHandler.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeCreateHandler.test.ts @@ -41,7 +41,7 @@ describe('attribute create handler tests', () => { const handler = new AttributeCreateHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const event = { @@ -83,7 +83,7 @@ describe('attribute create handler tests', () => { const handler = new AttributeCreateHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const event = { @@ -101,7 +101,7 @@ describe('attribute create handler tests', () => { resource: '/attributes', body: JSON.stringify(event), }) as APIGatewayProxyEvent, - {} as Context + {} as Context, ); expect(data).toEqual({ @@ -128,7 +128,7 @@ describe('attribute create handler tests', () => { const handler = new AttributeCreateHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const event = { @@ -147,8 +147,8 @@ describe('attribute create handler tests', () => { resource: '/attributes', body: JSON.stringify(event), }) as APIGatewayProxyEvent, - {} as Context - ) + {} as Context, + ), ).rejects.toEqual({ message: "The key must be specified and match '/^[-\\w]{1,120}$/'.", name: 'BasicHttpError', @@ -167,7 +167,7 @@ describe('attribute create handler tests', () => { const handler = new AttributeCreateHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const event = { @@ -186,8 +186,8 @@ describe('attribute create handler tests', () => { resource: '/attributes', body: JSON.stringify(event), }) as APIGatewayProxyEvent, - {} as Context - ) + {} as Context, + ), ).rejects.toEqual({ message: "The value must be specified and match '/^[-\\w]{1,120}$/'.", name: 'BasicHttpError', @@ -206,7 +206,7 @@ describe('attribute create handler tests', () => { const handler = new AttributeCreateHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const event = { @@ -223,8 +223,8 @@ describe('attribute create handler tests', () => { resource: '/attributes', body: JSON.stringify(event), }) as APIGatewayProxyEvent, - {} as Context - ) + {} as Context, + ), ).rejects.toEqual({ message: "The key must be specified and match '/^[-\\w]{1,120}$/'.; The value must be specified and match '/^[-\\w]{1,120}$/'.", @@ -244,7 +244,7 @@ describe('attribute create handler tests', () => { const handler = new AttributeCreateHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); await expect( handler.handle( @@ -253,8 +253,8 @@ describe('attribute create handler tests', () => { resource: '/attributes', body: '', }) as APIGatewayProxyEvent, - {} as Context - ) + {} as Context, + ), ).rejects.toEqual({ message: 'Valid JSON payload is required in the body of the create request.', name: 'BasicHttpError', @@ -286,7 +286,7 @@ describe('attribute create handler tests', () => { const handler = new AttributeCreateHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const event = { @@ -305,8 +305,8 @@ describe('attribute create handler tests', () => { resource: '/attributes', body: JSON.stringify(event), }) as APIGatewayProxyEvent, - {} as Context - ) + {} as Context, + ), ).rejects.toEqual({ message: 'An attribute with the specific key and value already exists.', name: 'BasicHttpError', diff --git a/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeDeleteHandler.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeDeleteHandler.test.ts index e061901..48a05d0 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeDeleteHandler.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeDeleteHandler.test.ts @@ -84,7 +84,7 @@ describe('attribute delete handler tests', () => { const handler = new AttributeDeleteHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const id = 'TESTKEY:TESTVALUE'; @@ -97,7 +97,7 @@ describe('attribute delete handler tests', () => { }, body: '', }) as APIGatewayProxyEvent, - {} as Context + {} as Context, ); expect(data).toEqual({ @@ -131,7 +131,7 @@ describe('attribute delete handler tests', () => { const handler = new AttributeDeleteHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const id = 'TESTKEY:TESTVALUE'; @@ -145,8 +145,8 @@ describe('attribute delete handler tests', () => { }, body: '', }) as APIGatewayProxyEvent, - {} as Context - ) + {} as Context, + ), ).rejects.toEqual({ message: `Specified attribute is not found. id: ${id}`, name: 'BasicHttpError', @@ -187,7 +187,7 @@ describe('attribute delete handler tests', () => { const handler = new AttributeDeleteHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); await expect( @@ -200,8 +200,8 @@ describe('attribute delete handler tests', () => { }, body: '', }) as APIGatewayProxyEvent, - {} as Context - ) + {} as Context, + ), ).rejects.toEqual({ message: 'Specified attribute is in use and can not be deleted. id: TESTKEY:TESTVALUE', diff --git a/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeGetDetailHandler.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeGetDetailHandler.test.ts index 746e09b..41a0ff7 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeGetDetailHandler.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeGetDetailHandler.test.ts @@ -51,7 +51,7 @@ describe('attribute get details handler tests', () => { const handler = new AttributeGetDetailsHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const data = await handler.handle( @@ -63,7 +63,7 @@ describe('attribute get details handler tests', () => { }, body: '', }) as APIGatewayProxyEvent, - {} as Context + {} as Context, ); expect(data).toEqual({ @@ -97,7 +97,7 @@ describe('attribute get details handler tests', () => { const handler = new AttributeGetDetailsHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const id = 'TESTKEY:TESTVALUE'; @@ -111,8 +111,8 @@ describe('attribute get details handler tests', () => { }, body: '', }) as APIGatewayProxyEvent, - {} as Context - ) + {} as Context, + ), ).rejects.toEqual({ message: `Specified item is not found. id: ${id}`, name: 'BasicHttpError', diff --git a/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeListHandler.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeListHandler.test.ts index 7ec5b4a..9bca61e 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeListHandler.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeListHandler.test.ts @@ -90,7 +90,7 @@ describe('attribute list handler tests', () => { const handler = new AttributeListHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const data = await handler.handle( @@ -99,7 +99,7 @@ describe('attribute list handler tests', () => { resource: '/attributes', body: '', }) as APIGatewayProxyEvent, - {} as Context + {} as Context, ); expect(data).toEqual({ @@ -171,7 +171,7 @@ describe('attribute list handler tests', () => { const handler = new AttributeListHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); await expect( @@ -184,8 +184,8 @@ describe('attribute list handler tests', () => { }, body: '', }) as APIGatewayProxyEvent, - {} as Context - ) + {} as Context, + ), ).rejects.toEqual({ message: 'The maxRow must be an integer between 1 and 1000. If not specified, the default value is 100.', @@ -204,7 +204,7 @@ describe('attribute list handler tests', () => { const handler = new AttributeListHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); await expect( @@ -217,8 +217,8 @@ describe('attribute list handler tests', () => { }, body: '', }) as APIGatewayProxyEvent, - {} as Context - ) + {} as Context, + ), ).rejects.toEqual({ message: 'Unsupported query parameter. Query Parameters: xyz', name: 'BasicHttpError', diff --git a/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeUpdateHandler.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeUpdateHandler.test.ts index d4de1e0..2448964 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeUpdateHandler.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/handlers/AttributeUpdateHandler.test.ts @@ -58,7 +58,7 @@ describe('attribute update handler tests', () => { const handler = new AttributeUpdateHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const event = { @@ -78,7 +78,7 @@ describe('attribute update handler tests', () => { }, body: JSON.stringify(event), }) as APIGatewayProxyEvent, - id + id, ); expect(data).toEqual({ @@ -107,7 +107,7 @@ describe('attribute update handler tests', () => { const handler = new AttributeUpdateHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const event = { @@ -130,8 +130,8 @@ describe('attribute update handler tests', () => { }, body: JSON.stringify(event), }) as APIGatewayProxyEvent, - {} as Context - ) + {} as Context, + ), ).rejects.toEqual({ message: 'Specified attribute is not found. id: TESTKEY:TESTVALUE', name: 'BasicHttpError', @@ -166,7 +166,7 @@ describe('attribute update handler tests', () => { const handler = new AttributeUpdateHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const event = { @@ -188,7 +188,7 @@ describe('attribute update handler tests', () => { }, body: JSON.stringify(event), }) as APIGatewayProxyEvent, - {} as Context + {} as Context, ); expect(data).toEqual({ @@ -244,7 +244,7 @@ describe('attribute update handler tests', () => { const handler = new AttributeUpdateHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const event = { @@ -266,8 +266,8 @@ describe('attribute update handler tests', () => { }, body: JSON.stringify(event), }) as APIGatewayProxyEvent, - {} as Context - ) + {} as Context, + ), ).rejects.toEqual({ message: 'The key and value are not allowed to be updated. Current Key: TestKey, Value: TestValue', @@ -302,7 +302,7 @@ describe('attribute update handler tests', () => { const handler = new AttributeUpdateHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const event = { @@ -324,8 +324,8 @@ describe('attribute update handler tests', () => { }, body: JSON.stringify(event), }) as APIGatewayProxyEvent, - {} as Context - ) + {} as Context, + ), ).rejects.toEqual({ message: 'The key and value are not allowed to be updated. Current Key: TestKey, Value: TestValue', @@ -360,7 +360,7 @@ describe('attribute update handler tests', () => { const handler = new AttributeUpdateHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const event = { key: 'TestKey1', @@ -381,8 +381,8 @@ describe('attribute update handler tests', () => { }, body: JSON.stringify(event), }) as APIGatewayProxyEvent, - {} as Context - ) + {} as Context, + ), ).rejects.toEqual({ message: 'The key and value are not allowed to be updated. Current Key: TestKey, Value: TestValue', diff --git a/source/lambda/blueprintgovernanceservice/test/unit/handlers/CreateBlueprintRequestHandler.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/handlers/CreateBlueprintRequestHandler.test.ts index b49e2ae..efeb0bb 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/handlers/CreateBlueprintRequestHandler.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/handlers/CreateBlueprintRequestHandler.test.ts @@ -96,7 +96,7 @@ describe('test CreateBlueprintRequestHandler', () => { blueprintRepoBuilderService.createAndInitializeRepo = blueprintRepoBuilderServiceHandle; blueprintRepoBuilderServiceHandle.mockReturnValue( - githubCreateAndInitialiseRepoResponse + githubCreateAndInitialiseRepoResponse, ); const blueprintPipelineBuilderService = mock(BlueprintPipelineBuilderService); @@ -114,7 +114,7 @@ describe('test CreateBlueprintRequestHandler', () => { new StaticLoggerFactory(), blueprintDBService, blueprintRepoBuilderService, - blueprintPipelineBuilderService + blueprintPipelineBuilderService, ); // act const output = await objectUnderTest.handle( @@ -122,7 +122,7 @@ describe('test CreateBlueprintRequestHandler', () => { body: JSON.stringify(testInputRequest), headers: { ttl: new Date().getTime().toString() }, } as unknown as APIGatewayProxyEvent, - {} as Context + {} as Context, ); expect(sendAnonymousMetricSpy).toBeCalledWith({ anonymousDataUUID: 'c0cc07de-d239-4ed9-92b6-cf7c82027aeb', @@ -147,7 +147,7 @@ describe('test CreateBlueprintRequestHandler', () => { new StaticLoggerFactory(), blueprintDBService, blueprintRepoBuilderService, - blueprintPipelineBuilderService + blueprintPipelineBuilderService, ); // act const output = await objectUnderTest.handle( @@ -155,7 +155,7 @@ describe('test CreateBlueprintRequestHandler', () => { body: JSON.stringify(inputRequest), headers: { ttl: new Date().getTime().toString() }, } as unknown as APIGatewayProxyEvent, - {} as Context + {} as Context, ); expect(output).toBeDefined(); // assert @@ -173,7 +173,7 @@ describe('test CreateBlueprintRequestHandler', () => { blueprintRepoBuilderService.createAndInitializeRepo = blueprintRepoBuilderServiceCreateRepoAndInit; blueprintRepoBuilderServiceCreateRepoAndInit.mockRejectedValueOnce( - new Error('Unable to create repo') + new Error('Unable to create repo'), ); const blueprintPipelineBuilderService = mock(BlueprintPipelineBuilderService); @@ -181,7 +181,7 @@ describe('test CreateBlueprintRequestHandler', () => { new StaticLoggerFactory(), blueprintDBService, blueprintRepoBuilderService, - blueprintPipelineBuilderService + blueprintPipelineBuilderService, ); // act const output = await objectUnderTest.handle( @@ -190,7 +190,7 @@ describe('test CreateBlueprintRequestHandler', () => { pathParameters: { id: '123' }, headers: { ttl: new Date().getTime().toString() }, } as unknown as APIGatewayProxyEvent, - {} as Context + {} as Context, ); expect(output).toBeDefined(); // assert @@ -237,7 +237,7 @@ describe('test CreateBlueprintRequestHandler error flow', () => { blueprintRepoBuilderService.createAndInitializeRepo = blueprintRepoBuilderServiceHandle; blueprintRepoBuilderServiceHandle.mockReturnValue( - githubCreateAndInitialiseRepoResponse + githubCreateAndInitialiseRepoResponse, ); const blueprintPipelineBuilderService = mock(BlueprintPipelineBuilderService); @@ -251,7 +251,7 @@ describe('test CreateBlueprintRequestHandler error flow', () => { new StaticLoggerFactory(), blueprintDBService, blueprintRepoBuilderService, - blueprintPipelineBuilderService + blueprintPipelineBuilderService, ); // act const output = await objectUnderTest.handle( @@ -259,7 +259,7 @@ describe('test CreateBlueprintRequestHandler error flow', () => { body: JSON.stringify(testInputRequest), headers: { ttl: new Date().getTime().toString() }, } as unknown as APIGatewayProxyEvent, - {} as Context + {} as Context, ); expect(output).toBeDefined(); expect(output.statusCode).toBe(400); @@ -274,7 +274,7 @@ describe('test CreateBlueprintRequestHandler error flow', () => { blueprintRepoBuilderService.createAndInitializeRepo = blueprintRepoBuilderServiceHandle; blueprintRepoBuilderServiceHandle.mockReturnValue( - githubCreateAndInitialiseRepoResponse + githubCreateAndInitialiseRepoResponse, ); const createBlueprintHandle = jest.fn(); blueprintDBService.createBlueprint = createBlueprintHandle; @@ -286,14 +286,14 @@ describe('test CreateBlueprintRequestHandler error flow', () => { new StaticLoggerFactory(), blueprintDBService, blueprintRepoBuilderService, - blueprintPipelineBuilderService + blueprintPipelineBuilderService, ); // act const output = await objectUnderTest.handle( { headers: { ttl: new Date().getTime().toString() }, } as unknown as APIGatewayProxyEvent, - {} as Context + {} as Context, ); expect(output).toBeDefined(); // assert @@ -310,7 +310,7 @@ describe('test CreateBlueprintRequestHandler error flow', () => { blueprintRepoBuilderService.createAndInitializeRepo = blueprintRepoBuilderServiceHandle; blueprintRepoBuilderServiceHandle.mockReturnValue( - githubCreateAndInitialiseRepoResponse + githubCreateAndInitialiseRepoResponse, ); const createBlueprintHandle = jest.fn(); blueprintDBService.createBlueprint = createBlueprintHandle; @@ -321,14 +321,14 @@ describe('test CreateBlueprintRequestHandler error flow', () => { blueprintPipelineBuilderService.invokeCodeBuildProject = blueprintPipelineBuilderServiceHandle; blueprintPipelineBuilderServiceHandle.mockRejectedValueOnce( - new Error('Error invoking codebuild') + new Error('Error invoking codebuild'), ); const objectUnderTest = new CreateBlueprintRequestHandler( new StaticLoggerFactory(), blueprintDBService, blueprintRepoBuilderService, - blueprintPipelineBuilderService + blueprintPipelineBuilderService, ); // act const output = await objectUnderTest.handle( @@ -336,7 +336,7 @@ describe('test CreateBlueprintRequestHandler error flow', () => { body: JSON.stringify(inputRequest), headers: { ttl: new Date().getTime().toString() }, } as unknown as APIGatewayProxyEvent, - {} as Context + {} as Context, ); expect(output).toBeDefined(); expect(blueprintPipelineBuilderService.invokeCodeBuildProject).toHaveBeenCalled(); @@ -361,7 +361,7 @@ describe('test CreateBlueprintRequestHandler error flow', () => { blueprintDBService, blueprintRepoBuilderService, - blueprintPipelineBuilderService + blueprintPipelineBuilderService, ); // act const output = await objectUnderTest.handle( @@ -369,7 +369,7 @@ describe('test CreateBlueprintRequestHandler error flow', () => { body: JSON.stringify(blueprintRequest), headers: { ttl: new Date().getTime().toString() }, } as unknown as APIGatewayProxyEvent, - {} as Context + {} as Context, ); // assert diff --git a/source/lambda/blueprintgovernanceservice/test/unit/handlers/GetAllBlueprintsRequestHandler.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/handlers/GetAllBlueprintsRequestHandler.test.ts index db86736..160313e 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/handlers/GetAllBlueprintsRequestHandler.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/handlers/GetAllBlueprintsRequestHandler.test.ts @@ -115,7 +115,7 @@ describe('test GetAllBlueprintsRequestHandler', () => { const objectUnderTest = new GetAllBlueprintsRequestHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); expect( await objectUnderTest.handle( @@ -124,8 +124,8 @@ describe('test GetAllBlueprintsRequestHandler', () => { // pathParameters: { id: '123' }, headers: { ttl: new Date().getTime().toString() }, } as unknown as APIGatewayProxyEvent, - {} as Context - ) + {} as Context, + ), ).toBeDefined(); }); @@ -140,14 +140,14 @@ describe('test GetAllBlueprintsRequestHandler', () => { const objectUnderTest = new GetAllBlueprintsRequestHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const results = await objectUnderTest.handle( { body: JSON.stringify('inputRequest'), headers: { ttl: new Date().getTime().toString() }, } as unknown as APIGatewayProxyEvent, - {} as Context + {} as Context, ); const statusCode = results.statusCode; @@ -164,19 +164,19 @@ describe('test GetAllBlueprintsRequestHandler', () => { blueprintDBService.getBlueprintPublishDataByCommitId = getPatternPublishDataHandle; getPatternPublishDataHandle.mockReturnValue( - dbGetPatternPublishDataByLastCommitIdResponse + dbGetPatternPublishDataByLastCommitIdResponse, ); const objectUnderTest = new GetAllBlueprintsRequestHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const response = await objectUnderTest.handle( { body: JSON.stringify('inputRequest'), headers: { ttl: new Date().getTime().toString() }, } as unknown as APIGatewayProxyEvent, - {} as Context + {} as Context, ); const statusCode = response.statusCode; @@ -191,7 +191,7 @@ describe('test GetAllBlueprintsRequestHandler', () => { dbGetPatternPublishDataByLastCommitIdResponse, }, ], - }) + }), ); }); @@ -205,12 +205,12 @@ describe('test GetAllBlueprintsRequestHandler', () => { blueprintDBService.getBlueprintPublishDataByCommitId = getPatternPublishDataHandle; getPatternPublishDataHandle.mockReturnValue( - dbGetPatternPublishDataByLastCommitIdResponse + dbGetPatternPublishDataByLastCommitIdResponse, ); const objectUnderTest = new GetAllBlueprintsRequestHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const response = await objectUnderTest.handle( { @@ -218,7 +218,7 @@ describe('test GetAllBlueprintsRequestHandler', () => { pathParameters: { limit: '2' }, headers: { ttl: new Date().getTime().toString() }, } as unknown as APIGatewayProxyEvent, - {} as Context + {} as Context, ); const statusCode = response.statusCode; @@ -233,7 +233,7 @@ describe('test GetAllBlueprintsRequestHandler', () => { dbGetPatternPublishDataByLastCommitIdResponse, }, ], - }) + }), ); }); }); diff --git a/source/lambda/blueprintgovernanceservice/test/unit/handlers/GetBlueprintInfoHandler.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/handlers/GetBlueprintInfoHandler.test.ts index 4a70760..21ef656 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/handlers/GetBlueprintInfoHandler.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/handlers/GetBlueprintInfoHandler.test.ts @@ -102,7 +102,7 @@ describe('test GetBlueprintInfoHandler', () => { const objectUnderTest = new GetBlueprintInfoHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const output = await objectUnderTest.handle( { @@ -110,7 +110,7 @@ describe('test GetBlueprintInfoHandler', () => { pathParameters: { id: '123' }, headers: { ttl: new Date().getTime().toString() }, } as unknown as APIGatewayProxyEvent, - {} as Context + {} as Context, ); expect(output).toBeDefined(); expect(output).not.toBeUndefined(); @@ -143,14 +143,14 @@ describe('test GetBlueprintInfoHandler', () => { const objectUnderTest = new GetBlueprintInfoHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); const output = await objectUnderTest.handle( { body: JSON.stringify('inputRequest'), headers: { ttl: new Date().getTime().toString() }, } as unknown as APIGatewayProxyEvent, - {} as Context + {} as Context, ); expect(output).toBeDefined(); diff --git a/source/lambda/blueprintgovernanceservice/test/unit/handlers/GetSubscriptionHandler.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/handlers/GetSubscriptionHandler.test.ts index 10e723d..7222f01 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/handlers/GetSubscriptionHandler.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/handlers/GetSubscriptionHandler.test.ts @@ -34,7 +34,7 @@ describe('Get subscription handler tests', () => { test('returns 404 if not found', async () => { // arrange when(db.getNotificationSubscription(anything(), anything())).thenResolve( - undefined + undefined, ); // act @@ -42,7 +42,7 @@ describe('Get subscription handler tests', () => { { queryStringParameters: { patternId: '1234', email: 'test' }, } as unknown as APIGatewayProxyEvent, - {} as Context + {} as Context, ); // assert @@ -58,7 +58,7 @@ describe('Get subscription handler tests', () => { { queryStringParameters: { patternId: '1234', email: 'test' }, } as unknown as APIGatewayProxyEvent, - {} as Context + {} as Context, ); // assert diff --git a/source/lambda/blueprintgovernanceservice/test/unit/handlers/InitialiseBlueprintPipelineHandler.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/handlers/InitialiseBlueprintPipelineHandler.test.ts index 42b7384..f33252b 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/handlers/InitialiseBlueprintPipelineHandler.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/handlers/InitialiseBlueprintPipelineHandler.test.ts @@ -87,7 +87,7 @@ describe('test GetBlueprintInfoHandler', () => { const objectUnderTest = new InitialiseBlueprintPipelineHandler( new StaticLoggerFactory(), blueprintDBService, - blueprintPipelineBuilderService + blueprintPipelineBuilderService, ); expect( await objectUnderTest.handle( @@ -96,8 +96,8 @@ describe('test GetBlueprintInfoHandler', () => { pathParameters: { id: '123' }, headers: { ttl: new Date().getTime().toString() }, } as unknown as APIGatewayProxyEvent, - {} as Context - ) + {} as Context, + ), ).toBeDefined(); }); }); diff --git a/source/lambda/blueprintgovernanceservice/test/unit/handlers/SubscribeHandler.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/handlers/SubscribeHandler.test.ts index 9d3b120..db728d7 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/handlers/SubscribeHandler.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/handlers/SubscribeHandler.test.ts @@ -35,7 +35,7 @@ describe('Subscribe and Unsubscribe handler tests', () => { // act const result = await handler.handle( { body: '' } as APIGatewayProxyEvent, - {} as Context + {} as Context, ); // assert @@ -46,7 +46,7 @@ describe('Subscribe and Unsubscribe handler tests', () => { // act const result = await handler.handle( { body: JSON.stringify({ test: 'value' }) } as APIGatewayProxyEvent, - {} as Context + {} as Context, ); // assert @@ -59,7 +59,7 @@ describe('Subscribe and Unsubscribe handler tests', () => { { body: JSON.stringify({ patternId: 'value', email: 'invalid email' }), } as APIGatewayProxyEvent, - {} as Context + {} as Context, ); // assert @@ -75,7 +75,7 @@ describe('Subscribe and Unsubscribe handler tests', () => { email: 'mytestemail@test.com', }), } as APIGatewayProxyEvent, - {} as Context + {} as Context, ); // assert @@ -85,7 +85,7 @@ describe('Subscribe and Unsubscribe handler tests', () => { test('can create new notification subscription', async () => { // arrange when( - db.createNotificationSubscription('1234', 'mytestemail@test.com') + db.createNotificationSubscription('1234', 'mytestemail@test.com'), ).thenResolve(); // act @@ -97,7 +97,7 @@ describe('Subscribe and Unsubscribe handler tests', () => { }), httpMethod: 'POST', } as APIGatewayProxyEvent, - {} as Context + {} as Context, ); // assert @@ -107,7 +107,7 @@ describe('Subscribe and Unsubscribe handler tests', () => { test('can delete notification subscription', async () => { // arrange when( - db.deleteNotificationSubscription('1234', 'mytestemail@test.com') + db.deleteNotificationSubscription('1234', 'mytestemail@test.com'), ).thenResolve(); // act @@ -119,7 +119,7 @@ describe('Subscribe and Unsubscribe handler tests', () => { }), httpMethod: 'DELETE', } as APIGatewayProxyEvent, - {} as Context + {} as Context, ); // assert diff --git a/source/lambda/blueprintgovernanceservice/test/unit/handlers/UpdateBlueprintInfraStatusHandler.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/handlers/UpdateBlueprintInfraStatusHandler.test.ts index a32aa0b..b453ab7 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/handlers/UpdateBlueprintInfraStatusHandler.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/handlers/UpdateBlueprintInfraStatusHandler.test.ts @@ -74,7 +74,7 @@ describe('Update blueprint infrastructure status handler tests', () => { { Records: [], }, - {} + {}, ); expect(ddbMock.calls()).toHaveLength(0); }); @@ -90,7 +90,7 @@ describe('Update blueprint infrastructure status handler tests', () => { } as SNSEventRecord, ], }, - {} + {}, ); expect(ddbMock.calls()).toHaveLength(0); }); @@ -106,7 +106,7 @@ describe('Update blueprint infrastructure status handler tests', () => { } as SNSEventRecord, ], }, - {} + {}, ); expect(ddbMock.calls()).toHaveLength(0); }); @@ -122,7 +122,7 @@ describe('Update blueprint infrastructure status handler tests', () => { } as SNSEventRecord, ], }, - {} + {}, ); expect(ddbMock.calls()).toHaveLength(1); console.log(ddbMock.call(0).args[0].input); diff --git a/source/lambda/blueprintgovernanceservice/test/unit/handlers/UpdateBlueprintMetaInfoHandler.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/handlers/UpdateBlueprintMetaInfoHandler.test.ts index b627838..c9e8acc 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/handlers/UpdateBlueprintMetaInfoHandler.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/handlers/UpdateBlueprintMetaInfoHandler.test.ts @@ -79,7 +79,7 @@ describe('test CreateBlueprintRequestHandler', () => { const objectUnderTest = new UpdateBlueprintMetaInfoHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); // act const output = await objectUnderTest.handle( @@ -90,7 +90,7 @@ describe('test CreateBlueprintRequestHandler', () => { body: JSON.stringify(inputRequestPayload), headers: { ttl: new Date().getTime().toString() }, } as unknown as APIGatewayProxyEvent, - {} as Context + {} as Context, ); // assert @@ -101,7 +101,7 @@ describe('test CreateBlueprintRequestHandler', () => { expect(updateBlueprintMetaDataHandle).toHaveBeenCalledWith( 'test-pattern', inputRequestPayload.description, - inputRequestPayload.attributes + inputRequestPayload.attributes, ); }); @@ -109,7 +109,7 @@ describe('test CreateBlueprintRequestHandler', () => { const blueprintDBService = mock(BlueprintDBService); const objectUnderTest = new UpdateBlueprintMetaInfoHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); // act const output = await objectUnderTest.handle( @@ -120,7 +120,7 @@ describe('test CreateBlueprintRequestHandler', () => { body: undefined, headers: { ttl: new Date().getTime().toString() }, } as unknown as APIGatewayProxyEvent, - {} as Context + {} as Context, ); // assert @@ -131,7 +131,7 @@ describe('test CreateBlueprintRequestHandler', () => { const blueprintDBService = mock(BlueprintDBService); const objectUnderTest = new UpdateBlueprintMetaInfoHandler( new StaticLoggerFactory(), - blueprintDBService + blueprintDBService, ); // act const output = await objectUnderTest.handle( @@ -139,7 +139,7 @@ describe('test CreateBlueprintRequestHandler', () => { body: JSON.stringify(inputRequestPayload), headers: { ttl: new Date().getTime().toString() }, } as unknown as APIGatewayProxyEvent, - {} as Context + {} as Context, ); // assert diff --git a/source/lambda/blueprintgovernanceservice/test/unit/services/BlueprintDBService.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/services/BlueprintDBService.test.ts index 2123a03..6efe7b0 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/services/BlueprintDBService.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/services/BlueprintDBService.test.ts @@ -257,7 +257,7 @@ describe('test BlueprintDBService', () => { await dataStore.updateStatusBlueprintById( bluePrintObject.patternId, - StackStatus.ROLLBACK_FAILED + StackStatus.ROLLBACK_FAILED, ); expect(mockDocumentClientUpdate).toBeCalledTimes(1); @@ -286,8 +286,8 @@ describe('test BlueprintDBService', () => { expect( await dataStore.getBlueprintPublishDataByCommitId( blueprintPublishObject.patternId, - blueprintPublishObject.commitId - ) + blueprintPublishObject.commitId, + ), ).toMatchObject(blueprintPublishObject); expect(mockDocumentClientGet).toBeCalledTimes(1); @@ -311,8 +311,8 @@ describe('test BlueprintDBService', () => { expect( await dataStore.getBlueprintPublishDataByCommitId( blueprintPublishObject.patternId, - blueprintPublishObject.commitId - ) + blueprintPublishObject.commitId, + ), ).not.toBeDefined(); }); diff --git a/source/lambda/blueprintgovernanceservice/test/unit/services/BlueprintPipelineBuilderService.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/services/BlueprintPipelineBuilderService.test.ts index b291270..5776fb2 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/services/BlueprintPipelineBuilderService.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/services/BlueprintPipelineBuilderService.test.ts @@ -87,10 +87,10 @@ describe('test GetBlueprintInfoHandler', () => { s3.putObject = s3putObjectHandle; const objectUnderTest = new BlueprintPipelineBuilderService( new StaticLoggerFactory(), - codeBuildClient + codeBuildClient, ); expect( - await objectUnderTest.invokeCodeBuildProject(blueprintObject) + await objectUnderTest.invokeCodeBuildProject(blueprintObject), ).toBeDefined(); }); }); diff --git a/source/lambda/blueprintgovernanceservice/test/unit/services/blueprint-repo-builder/BlueprintCodeCommitRepoBuilderService.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/services/blueprint-repo-builder/BlueprintCodeCommitRepoBuilderService.test.ts index b5e19a2..11e1833 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/services/blueprint-repo-builder/BlueprintCodeCommitRepoBuilderService.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/services/blueprint-repo-builder/BlueprintCodeCommitRepoBuilderService.test.ts @@ -34,10 +34,10 @@ jest.mock('path', () => ({ resolve: jest .fn() .mockImplementationOnce(() => - path.join(__dirname, '../../../../initialRepoTemplates/cfn/images') + path.join(__dirname, '../../../../initialRepoTemplates/cfn/images'), ) .mockImplementationOnce(() => - path.join(__dirname, '../../../../initialRepoTemplates/cfn/images/.gitkeep') + path.join(__dirname, '../../../../initialRepoTemplates/cfn/images/.gitkeep'), ), })); @@ -67,11 +67,11 @@ describe('test BlueprintCodeCommitRepoBuilderService', () => { }); const objectUnderTest = new BlueprintCodeCommitRepoBuilderService( new StaticLoggerFactory(), - codeCommitMockClient as unknown as CodeCommitClient + codeCommitMockClient as unknown as CodeCommitClient, ); const response = await objectUnderTest.createAndInitializeRepo( repositoryName, - 'CFN' + 'CFN', ); expect(response.branchName).toBe('master'); expect(response.patternRepoURL).toBe(cloneUrlHttp); @@ -83,11 +83,11 @@ describe('test BlueprintCodeCommitRepoBuilderService', () => { codeCommitMockClient.on(CreateRepositoryCommand).rejects('error creating repo'); const objectUnderTest = new BlueprintCodeCommitRepoBuilderService( new StaticLoggerFactory(), - codeCommitMockClient as unknown as CodeCommitClient + codeCommitMockClient as unknown as CodeCommitClient, ); await expect( - objectUnderTest.createAndInitializeRepo(repositoryName, 'CFN') + objectUnderTest.createAndInitializeRepo(repositoryName, 'CFN'), ).rejects.toBeInstanceOf(BlueprintError); }); @@ -99,11 +99,11 @@ describe('test BlueprintCodeCommitRepoBuilderService', () => { }); const objectUnderTest = new BlueprintCodeCommitRepoBuilderService( new StaticLoggerFactory(), - codeCommitMockClient as unknown as CodeCommitClient + codeCommitMockClient as unknown as CodeCommitClient, ); await expect( - objectUnderTest.createAndInitializeRepo(repositoryName, 'CFN') + objectUnderTest.createAndInitializeRepo(repositoryName, 'CFN'), ).rejects.toBeInstanceOf(BlueprintError); }); @@ -127,10 +127,10 @@ describe('test BlueprintCodeCommitRepoBuilderService', () => { .rejects('error creating initial commit'); const objectUnderTest = new BlueprintCodeCommitRepoBuilderService( new StaticLoggerFactory(), - codeCommitMockClient as unknown as CodeCommitClient + codeCommitMockClient as unknown as CodeCommitClient, ); await expect( - objectUnderTest.createAndInitializeRepo(repositoryName, 'CFN') + objectUnderTest.createAndInitializeRepo(repositoryName, 'CFN'), ).rejects.toBeInstanceOf(BlueprintError); expect(codeCommitMockClient).toHaveReceivedCommand(DeleteRepositoryCommand); }); diff --git a/source/lambda/blueprintgovernanceservice/test/unit/services/blueprint-repo-builder/BlueprintGitHubRepoBuilderService.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/services/blueprint-repo-builder/BlueprintGitHubRepoBuilderService.test.ts index f527fc4..5647ff9 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/services/blueprint-repo-builder/BlueprintGitHubRepoBuilderService.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/services/blueprint-repo-builder/BlueprintGitHubRepoBuilderService.test.ts @@ -151,10 +151,10 @@ describe('test BlueprintGitHubRepoBuilderService', () => { mockRequestFunc.mockRejectedValueOnce('test err in creating repo'); const objectUnderTest = new BlueprintGitHubRepoBuilderService( new StaticLoggerFactory(), - dependencyConfigurationProvider + dependencyConfigurationProvider, ); await expect( - objectUnderTest.createAndInitializeRepo('repo', 'CFN') + objectUnderTest.createAndInitializeRepo('repo', 'CFN'), ).rejects.toEqual(new BlueprintError(`Error in creating a repo`, 500)); }); @@ -162,21 +162,21 @@ describe('test BlueprintGitHubRepoBuilderService', () => { process.env.GITHUB_URL = 'http://testurl/'; let objectUnderTest = new BlueprintGitHubRepoBuilderService( new StaticLoggerFactory(), - dependencyConfigurationProvider + dependencyConfigurationProvider, ); expect(objectUnderTest.apiBaseUrl).toBe('http://testurl/api/v3'); process.env.GITHUB_URL = 'http://testgithuburl\\'; objectUnderTest = new BlueprintGitHubRepoBuilderService( new StaticLoggerFactory(), - dependencyConfigurationProvider + dependencyConfigurationProvider, ); expect(objectUnderTest.apiBaseUrl).toBe('http://testgithuburl/api/v3'); process.env.GITHUB_URL = 'http://testgithuburl'; objectUnderTest = new BlueprintGitHubRepoBuilderService( new StaticLoggerFactory(), - dependencyConfigurationProvider + dependencyConfigurationProvider, ); expect(objectUnderTest.apiBaseUrl).toBe('http://testgithuburl/api/v3'); }); @@ -184,7 +184,7 @@ describe('test BlueprintGitHubRepoBuilderService', () => { test('test createRepo', async () => { const objectUnderTest = new BlueprintGitHubRepoBuilderService( new StaticLoggerFactory(), - dependencyConfigurationProvider + dependencyConfigurationProvider, ); mockRequestFunc.mockResolvedValue(githubResponseStub); await objectUnderTest.createRepo(repo.name); @@ -196,19 +196,19 @@ describe('test BlueprintGitHubRepoBuilderService', () => { private: true, is_template: true, auto_init: true, - } + }, ); }); test('test createGitTreeArray', async () => { const objectUnderTest = new BlueprintGitHubRepoBuilderService( new StaticLoggerFactory(), - dependencyConfigurationProvider + dependencyConfigurationProvider, ); when(mockRequestFunc) .calledWith( `POST /repos/${repo.organization}/${repo.name}/git/blobs`, - expect.anything() + expect.anything(), ) .mockResolvedValue({ data: { @@ -220,9 +220,9 @@ describe('test BlueprintGitHubRepoBuilderService', () => { repo.name, path.resolve( __dirname, - `../../../../${ROOT_INITIAL_REPO_DIR}/${'cdk'.toLowerCase()}` + `../../../../${ROOT_INITIAL_REPO_DIR}/${'cdk'.toLowerCase()}`, ), - branch + branch, ); expect(gitTreeArray).toEqual( expect.arrayContaining( @@ -232,21 +232,21 @@ describe('test BlueprintGitHubRepoBuilderService', () => { path: expect.stringContaining(p.path), type: p.type, sha: p.sha, - }) - ) - ) + }), + ), + ), ); }); test('test getGitTree', async () => { const objectUnderTest = new BlueprintGitHubRepoBuilderService( new StaticLoggerFactory(), - dependencyConfigurationProvider + dependencyConfigurationProvider, ); when(mockRequestFunc) .calledWith( `POST /repos/${repo.organization}/${repo.name}/git/blobs`, - expect.anything() + expect.anything(), ) .mockResolvedValue({ data: { @@ -258,10 +258,10 @@ describe('test BlueprintGitHubRepoBuilderService', () => { repo.name, path.resolve( __dirname, - `../../../../${ROOT_INITIAL_REPO_DIR}/${'cdk'.toLowerCase()}` + `../../../../${ROOT_INITIAL_REPO_DIR}/${'cdk'.toLowerCase()}`, ), 'latest-sha-test', - branch + branch, ); expect(mockRequestFunc).toHaveBeenLastCalledWith( `POST /repos/${repo.organization}/${repo.name}/git/trees`, @@ -270,14 +270,14 @@ describe('test BlueprintGitHubRepoBuilderService', () => { // eslint-disable-next-line @typescript-eslint/naming-convention base_tree: 'latest-sha-test', tree: expect.anything(), - } + }, ); }); test('test initialiseRepo', async () => { const objectUnderTest = new BlueprintGitHubRepoBuilderService( new StaticLoggerFactory(), - dependencyConfigurationProvider + dependencyConfigurationProvider, ); when(mockRequestFunc) .calledWith(`GET /repos/${repo.organization}/${repo.name}/branches/${branch}`) @@ -291,7 +291,7 @@ describe('test BlueprintGitHubRepoBuilderService', () => { when(mockRequestFunc) .calledWith( `POST /repos/${repo.organization}/${repo.name}/git/commits`, - expect.anything() + expect.anything(), ) .mockResolvedValue({ data: { @@ -310,7 +310,7 @@ describe('test BlueprintGitHubRepoBuilderService', () => { accept: 'application/vnd.github.v3+json', ref: `refs/heads/${branch}`, sha: 'sha-abc', - } + }, ); }); @@ -318,7 +318,7 @@ describe('test BlueprintGitHubRepoBuilderService', () => { process.env.GITHUB_ORGANIZATION = repo.owner; const objectUnderTest = new BlueprintGitHubRepoBuilderService( new StaticLoggerFactory(), - dependencyConfigurationProvider + dependencyConfigurationProvider, ); await objectUnderTest.enableBranchProtection(repo.name, branch); expect(mockRequestFunc).toBeCalledWith( @@ -333,7 +333,7 @@ describe('test BlueprintGitHubRepoBuilderService', () => { }, required_status_checks: null, restrictions: null, - } + }, ); }); @@ -341,7 +341,7 @@ describe('test BlueprintGitHubRepoBuilderService', () => { process.env.GITHUB_ORGANIZATION = repo.owner; const objectUnderTest = new BlueprintGitHubRepoBuilderService( new StaticLoggerFactory(), - dependencyConfigurationProvider + dependencyConfigurationProvider, ); await objectUnderTest.addCodeowners(repo.name, ['testuser1']); expect(mockRequestFunc).toBeCalledWith( @@ -350,7 +350,7 @@ describe('test BlueprintGitHubRepoBuilderService', () => { accept: 'application/vnd.github.v3+json', message: 'Add CODEOWNERS', content: Buffer.from('* testuser1').toString('base64'), - } + }, ); }); }); diff --git a/source/lambda/blueprintgovernanceservice/test/unit/timed-synchroniser/SyncEventHandler.test.ts b/source/lambda/blueprintgovernanceservice/test/unit/timed-synchroniser/SyncEventHandler.test.ts index f892f1d..111ffb4 100644 --- a/source/lambda/blueprintgovernanceservice/test/unit/timed-synchroniser/SyncEventHandler.test.ts +++ b/source/lambda/blueprintgovernanceservice/test/unit/timed-synchroniser/SyncEventHandler.test.ts @@ -27,7 +27,7 @@ class BlueprintDbServiceMockWithAttributes { // eslint-disable-next-line @typescript-eslint/no-unused-vars limit?: number, // eslint-disable-next-line @typescript-eslint/no-unused-vars - nextToken?: string + nextToken?: string, ): Promise<[Attribute[], string]> { return [ [ @@ -62,7 +62,7 @@ class BlueprintDbServiceMockWithNoAttributes { // eslint-disable-next-line @typescript-eslint/no-unused-vars limit?: number, // eslint-disable-next-line @typescript-eslint/no-unused-vars - nextToken?: string + nextToken?: string, ): Promise<[Attribute[], string]> { return [[], '']; } @@ -86,7 +86,7 @@ describe('SyncEventHandler test', () => { mockAddSyncRequestToQueue.mockResolvedValue({}); const result = await handler.handle( {} as EventBridgeEvent, - {} as Context + {} as Context, ); expect(result).toEqual({ body: 'SUCCEED', @@ -107,7 +107,7 @@ describe('SyncEventHandler test', () => { const result = await handler.handle( {} as EventBridgeEvent, - {} as Context + {} as Context, ); expect(result).toEqual({ diff --git a/source/lib/app-registry-aspect.ts b/source/lib/app-registry-aspect.ts index c2233a1..f682d58 100644 --- a/source/lib/app-registry-aspect.ts +++ b/source/lib/app-registry-aspect.ts @@ -30,7 +30,7 @@ export class AppRegistry extends Construct implements cdk.IAspect { public constructor( scope: Construct, id: string, - private readonly props: AppRegistryProps + private readonly props: AppRegistryProps, ) { super(scope, id); } @@ -71,11 +71,11 @@ export class AppRegistry extends Construct implements cdk.IAspect { cdk.Tags.of(application).add('Solutions:SolutionName', this.props.solutionName); cdk.Tags.of(application).add( 'Solutions:SolutionVersion', - this.props.solutionVersion + this.props.solutionVersion, ); cdk.Tags.of(application).add( 'Solutions:ApplicationType', - this.props.applicationType + this.props.applicationType, ); } diff --git a/source/lib/blueprint-artifact-api-definition.ts b/source/lib/blueprint-artifact-api-definition.ts index fa42e4c..1ff138e 100644 --- a/source/lib/blueprint-artifact-api-definition.ts +++ b/source/lib/blueprint-artifact-api-definition.ts @@ -31,7 +31,7 @@ export class BlueprintArtifactApiDefinition extends Construct { public constructor( scope: Construct, id: string, - props: BlueprintArtifactApiDefinitionProps + props: BlueprintArtifactApiDefinitionProps, ) { super(scope, id); diff --git a/source/lib/blueprint-authentication.ts b/source/lib/blueprint-authentication.ts index affe987..dddfac0 100644 --- a/source/lib/blueprint-authentication.ts +++ b/source/lib/blueprint-authentication.ts @@ -17,8 +17,10 @@ import { Aws, CfnOutput, RemovalPolicy, SecretValue } from 'aws-cdk-lib'; import { CfnIdentityPool, CfnIdentityPoolRoleAttachment, + CfnUserPoolGroup, CfnUserPoolIdentityProvider, CfnUserPoolUser, + CfnUserPoolUserToGroupAttachment, StringAttribute, UserPool, UserPoolClient, @@ -50,7 +52,7 @@ export class BlueprintAuthentication extends Construct { public constructor( scope: Construct, id: string, - props: BlueprintAuthenticationProps + props: BlueprintAuthenticationProps, ) { super(scope, id); @@ -88,7 +90,10 @@ export class BlueprintAuthentication extends Construct { autoVerify: { email: true, }, - customAttributes: { roles: new StringAttribute({ mutable: true }) }, + customAttributes: { + roles: new StringAttribute({ mutable: true }), + groups: new StringAttribute({ mutable: true }), + }, removalPolicy: props.removalPolicy, }); @@ -120,7 +125,7 @@ export class BlueprintAuthentication extends Construct { let clientSecret = undefined; if (identityProviderInfo.clientSecretArn) { clientSecret = SecretValue.secretsManager( - identityProviderInfo.clientSecretArn + identityProviderInfo.clientSecretArn, ); } identityProvider = new CfnUserPoolIdentityProvider(this, 'IdentityProvider', { @@ -162,7 +167,7 @@ export class BlueprintAuthentication extends Construct { ...(props.identityProviderInfo?.providerName ? [ UserPoolClientIdentityProvider.custom( - props.identityProviderInfo.providerName + props.identityProviderInfo.providerName, ), ] : []), @@ -183,7 +188,7 @@ export class BlueprintAuthentication extends Construct { { name: 'email', value: props.adminEmail }, ]; - new CfnUserPoolUser(this, 'AdminUser', { + const adminUser = new CfnUserPoolUser(this, 'AdminUser', { userPoolId: userPool.userPoolId, desiredDeliveryMediums: ['EMAIL'], forceAliasCreation: true, @@ -191,6 +196,36 @@ export class BlueprintAuthentication extends Construct { username: props.adminEmail, }); + // Sys Admin user group + const systemAdminUserGroup = new CfnUserPoolGroup(this, 'SysAdminUserGroup', { + userPoolId: userPool.userPoolId, + description: 'System admin user group', + groupName: 'SYSTEM_ADMIN', + }); + + // Pattern publisher user group + new CfnUserPoolGroup(this, 'PatternPublisherUserGroup', { + userPoolId: userPool.userPoolId, + description: 'Pattern publisher user group', + groupName: 'PATTERN_PUBLISHER', + }); + + // By default admin user to be part of SYS_ADMIN group + const userPoolUserToGroupAttachment = new CfnUserPoolUserToGroupAttachment( + this, + 'AdminUserToSystemAdminGroupAttachment', + { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + groupName: systemAdminUserGroup.groupName!, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + username: adminUser.username!, + userPoolId: userPool.userPoolId, + }, + ); + + userPoolUserToGroupAttachment.addDependency(adminUser); + userPoolUserToGroupAttachment.addDependency(systemAdminUserGroup); + const identityPool = this.buildIdentityPool(userPool, client); identityPool.cfnOptions.metadata = { @@ -242,7 +277,7 @@ export class BlueprintAuthentication extends Construct { private buildIdentityPool( userPool: UserPool, - client: UserPoolClient + client: UserPoolClient, ): CfnIdentityPool { return new CfnIdentityPool(this, 'IdentityPool', { allowUnauthenticatedIdentities: false, @@ -260,7 +295,7 @@ export class BlueprintAuthentication extends Construct { const publicRole = this.buildIdentityPoolRole( 'CognitoPublicRole', 'unauthenticated', - identityPool + identityPool, ); return publicRole; } @@ -269,11 +304,11 @@ export class BlueprintAuthentication extends Construct { const authRole = this.buildIdentityPoolRole( 'CognitoAuthRole', 'authenticated', - identityPool + identityPool, ); authRole.addManagedPolicy( - ManagedPolicy.fromAwsManagedPolicyName('AmazonAPIGatewayInvokeFullAccess') + ManagedPolicy.fromAwsManagedPolicyName('AmazonAPIGatewayInvokeFullAccess'), ); NagSuppressions.addResourceSuppressions(authRole, [ { @@ -288,7 +323,7 @@ export class BlueprintAuthentication extends Construct { private buildIdentityPoolRole( name: string, type: 'authenticated' | 'unauthenticated', - identityPool: CfnIdentityPool + identityPool: CfnIdentityPool, ): Role { return new Role(this, name, { assumedBy: new FederatedPrincipal( @@ -305,7 +340,7 @@ export class BlueprintAuthentication extends Construct { 'cognito-identity.amazonaws.com:amr': type, }, }, - 'sts:AssumeRoleWithWebIdentity' + 'sts:AssumeRoleWithWebIdentity', ), }); } @@ -316,7 +351,7 @@ export class BlueprintAuthentication extends Construct { if (!this.isValidIssuerUri(identityProviderInfo.oidcIssuer)) { throw new Error( - 'Invalid issuerUri. Please specify a valid issuerUri in cdk.json.' + 'Invalid issuerUri. Please specify a valid issuerUri in cdk.json.', ); } @@ -324,7 +359,7 @@ export class BlueprintAuthentication extends Construct { const mustHaveScopes: OidcAuthorizeScope[] = ['openid', 'profile']; if (!mustHaveScopes.every((scope) => authorizeScopes.includes(scope))) { throw new Error( - 'Invalid authorize scopes. Please specify valid authorize scopes which should contain openid and profile in cdk.json.' + 'Invalid authorize scopes. Please specify valid authorize scopes which should contain openid and profile in cdk.json.', ); } } diff --git a/source/lib/blueprint-backend.ts b/source/lib/blueprint-backend.ts index d3c2d08..3383a43 100644 --- a/source/lib/blueprint-backend.ts +++ b/source/lib/blueprint-backend.ts @@ -44,7 +44,13 @@ import { addCfnNagSuppression, CfnNagResourcePathEndingWithSuppressionAspect, } from './cfn-nag-suppression'; -import { GithubConfig, LogLevelType, PatternType, WafInfo } from './blueprint-types'; +import { + GithubConfig, + LogLevelType, + PatternType, + SecurityScanTool, + WafInfo, +} from './blueprint-types'; import { NagSuppressions } from 'cdk-nag'; export interface BlueprintBackendProps { @@ -64,6 +70,7 @@ export interface BlueprintBackendProps { readonly wafInfo?: WafInfo; readonly removalPolicy: RemovalPolicy; readonly logLevel: LogLevelType; + readonly securityScanTool: SecurityScanTool; } const serviceCatalogPolicy = new PolicyStatement({ @@ -103,7 +110,7 @@ export class BlueprintBackend extends Construct { props.vpc, rapmAttributesTable.tableName, props.removalPolicy, - props.logLevel + props.logLevel, ); this.appRegistryCfnNagSuppressions(appRegistryUpdatedLambda); @@ -112,7 +119,7 @@ export class BlueprintBackend extends Construct { const timedSynchroniserLambda = this.setupTimedSynchronizor( props.vpc, rapmAttributesTable.tableName, - props.logLevel + props.logLevel, ); this.timedSynchCfnNagSupressions(timedSynchroniserLambda); rapmAttributesTable.grantReadWriteData(timedSynchroniserLambda.lambdaFunction); @@ -125,7 +132,7 @@ export class BlueprintBackend extends Construct { removalPolicy: props.removalPolicy, autoDeleteObjects: props.removalPolicy === RemovalPolicy.DESTROY, encryptionKeyArn: this.kmsKeys.blueprintBucket.keyArn, - } + }, ); const blueprintInfrastructureSetupProps: BlueprintInfrastructureSetupProps = { @@ -144,6 +151,7 @@ export class BlueprintBackend extends Construct { solutionTradeMarkName: props.solutionTradeMarkName, removalPolicy: props.removalPolicy, logLevel: props.logLevel, + securityScanTool: props.securityScanTool, }; if (props.githubConfig) { @@ -153,7 +161,7 @@ export class BlueprintBackend extends Construct { this.blueprintInfrastructureSetup = new BlueprintInfrastructureSetup( this, 'BlueprintInfrastructureSetup', - blueprintInfrastructureSetupProps + blueprintInfrastructureSetupProps, ); this.blueprintPortalService = new BlueprintPortalService(this, id, { @@ -186,7 +194,7 @@ export class BlueprintBackend extends Construct { } private timedSynchCfnNagSupressions( - timedSynchroniserLambda: AWSLambdaFunction + timedSynchroniserLambda: AWSLambdaFunction, ): void { Aspects.of(timedSynchroniserLambda).add( new CfnNagResourcePathEndingWithSuppressionAspect( @@ -200,8 +208,8 @@ export class BlueprintBackend extends Construct { id: 'W5', reason: 'Security group is created by CDK and is egress only', }, - ] - ) + ], + ), ); addCfnNagSuppression( timedSynchroniserLambda.lambdaExecutionRole, @@ -215,7 +223,7 @@ export class BlueprintBackend extends Construct { reason: 'Permissions are added by CDK. Only servicecatalog permissions are added from code', }, ], - 'DefaultPolicy' + 'DefaultPolicy', ); addCfnNagSuppression( timedSynchroniserLambda, @@ -225,7 +233,7 @@ export class BlueprintBackend extends Construct { reason: 'The policy is generated by CDK. Also servicecatalog permissions needs to use *', }, ], - 'ExecutionRole' + 'ExecutionRole', ); addCfnNagSuppression(timedSynchroniserLambda.lambdaFunction, [ { @@ -240,7 +248,7 @@ export class BlueprintBackend extends Construct { } private appRegistryCfnNagSuppressions( - appRegistryUpdatedLambda: AWSLambdaFunction + appRegistryUpdatedLambda: AWSLambdaFunction, ): void { addCfnNagSuppression( appRegistryUpdatedLambda.lambdaExecutionRole, @@ -254,7 +262,7 @@ export class BlueprintBackend extends Construct { reason: 'Permissions are added by CDK. Only servicecatalog permissions are added from code', }, ], - 'DefaultPolicy' + 'DefaultPolicy', ); Aspects.of(appRegistryUpdatedLambda).add( new CfnNagResourcePathEndingWithSuppressionAspect( @@ -268,8 +276,8 @@ export class BlueprintBackend extends Construct { id: 'W5', reason: 'Security group is created by CDK and is egress only', }, - ] - ) + ], + ), ); addCfnNagSuppression(appRegistryUpdatedLambda.lambdaExecutionRole, [ { @@ -293,7 +301,7 @@ export class BlueprintBackend extends Construct { vpc: IVpc, attributeTableName: string, removalPolicy: RemovalPolicy, - logLevel: LogLevelType + logLevel: LogLevelType, ): [AWSLambdaFunction, string] { // Dead Letter Queue for failed updating messages const deadLetterQueue = new Queue(this, 'RapmAppRegistryPendingUpdateDLQ', { @@ -346,8 +354,8 @@ export class BlueprintBackend extends Construct { code: Code.fromAsset( path.resolve( __dirname, - `../lambda/blueprintgovernanceservice/dist/appRegistryUpdater` - ) + `../lambda/blueprintgovernanceservice/dist/appRegistryUpdater`, + ), ), description: `RAPM AppRegistry Updater lambda function`, timeout: Duration.seconds(45), @@ -356,7 +364,7 @@ export class BlueprintBackend extends Construct { initialPolicy: [serviceCatalogPolicy], vpc, environment: lambdaEnvironmentVariables, - } + }, ); NagSuppressions.addResourceSuppressions( @@ -367,11 +375,11 @@ export class BlueprintBackend extends Construct { reason: 'This is for DescribeNetworkInterfaces permission', }, ], - true + true, ); // link update Queue to lambda appRegistryUpdaterLambda.lambdaFunction.addEventSource( - new lambdaEventSource.SqsEventSource(this.appRegistryUpdateQueue) + new lambdaEventSource.SqsEventSource(this.appRegistryUpdateQueue), ); return [appRegistryUpdaterLambda, deadLetterQueue.queueName]; @@ -380,7 +388,7 @@ export class BlueprintBackend extends Construct { private setupTimedSynchronizor( vpc: IVpc, attributesTableName: string, - logLevel: LogLevelType + logLevel: LogLevelType, ): AWSLambdaFunction { const lambdaEnvironmentVariables = { [envConfig.environmentVariables.APPREGISTRY_UPDATER_QUEUE_URL]: @@ -399,8 +407,8 @@ export class BlueprintBackend extends Construct { code: Code.fromAsset( path.resolve( __dirname, - `../lambda/blueprintgovernanceservice/dist/timedSynchroniser` - ) + `../lambda/blueprintgovernanceservice/dist/timedSynchroniser`, + ), ), memorySize: 1024, initialPolicy: [serviceCatalogPolicy], @@ -417,11 +425,11 @@ export class BlueprintBackend extends Construct { reason: 'This is for DescribeNetworkInterfaces permission', }, ], - true + true, ); this.appRegistryUpdateQueue.grantSendMessages( - timedSynchroniserLambda.lambdaFunction + timedSynchroniserLambda.lambdaFunction, ); const scheduleExpression = @@ -503,27 +511,27 @@ export class BlueprintBackend extends Construct { blueprintBucket: this.createCMK('blueprintBucket', removalPolicy), blueprintSecretsManager: this.createCMK( 'blueprintSecretsManager', - removalPolicy + removalPolicy, ), rapmMetaDataTableEncryptionKey: this.createCMK( 'rapmMetaDataTableEncryptionKey', - removalPolicy + removalPolicy, ), rapmPublishDataTableEncryptionKey: this.createCMK( 'rapmPublishDataTableEncryptionKey', - removalPolicy + removalPolicy, ), rapmAttributesTableEncryptionKey: this.createCMK( 'rapmAttributesTableEncryptionKey', - removalPolicy + removalPolicy, ), blueprintsnsEncryptionKey: this.createCMK( 'blueprintsnsEncryptionKey', - removalPolicy + removalPolicy, ), blueprintLambdaEncryptionKey: this.createCMK( 'blueprintLambdaEncryptionKey', - removalPolicy + removalPolicy, ), }; return kmsKeys; diff --git a/source/lib/blueprint-base-infra.ts b/source/lib/blueprint-base-infra.ts index 70216b5..7dd1206 100644 --- a/source/lib/blueprint-base-infra.ts +++ b/source/lib/blueprint-base-infra.ts @@ -85,14 +85,14 @@ export class BlueprintBaseInfra extends Construct { if (props.githubDomain && props.githubDomainResolverIpAddresses) { this.createOutboundResolverEndpoint( props.githubDomain, - props.githubDomainResolverIpAddresses + props.githubDomainResolverIpAddresses, ); } } private createOutboundResolverEndpoint( githubDomain: string, - githubDomainResolverIpAddresses: string + githubDomainResolverIpAddresses: string, ): void { const subnets = this.vpc.selectSubnets({ subnetType: SubnetType.PRIVATE_WITH_EGRESS, @@ -121,13 +121,13 @@ export class BlueprintBaseInfra extends Construct { outboundResolverSg.addIngressRule( ec2.Peer.ipv4(this.vpc.vpcCidrBlock), ec2.Port.tcp(53), - 'Allow outbound TCP DNS queries from VPC peering' + 'Allow outbound TCP DNS queries from VPC peering', ); outboundResolverSg.addIngressRule( ec2.Peer.ipv4(this.vpc.vpcCidrBlock), ec2.Port.udp(53), - 'Allow outbound UDP DNS queries from VPC peering' + 'Allow outbound UDP DNS queries from VPC peering', ); const outboundResolver = new route53resolver.CfnResolverEndpoint( @@ -138,7 +138,7 @@ export class BlueprintBaseInfra extends Construct { ipAddresses: subnetIds, securityGroupIds: [outboundResolverSg.securityGroupId], name: 'outboundResolverEndpoint', - } + }, ); const targetIps = githubDomainResolverIpAddresses.split(',').map((targetIp) => ({ @@ -156,7 +156,7 @@ export class BlueprintBaseInfra extends Construct { { resolverRuleId: resolverRule.attrResolverRuleId, vpcId: this.vpc.vpcId, - } + }, ); } } @@ -288,7 +288,7 @@ export class InfraConfig extends Construct { 'kms:Decrypt', ], resources: ['*'], - }) + }), ); const logGroup = new LogGroup(this, 'VpcFlowLogs', { @@ -324,7 +324,7 @@ export class InfraConfig extends Construct { 'kms:Describe*', ], resources: [encryptionKey.keyArn], - }) + }), ); NagSuppressions.addResourceSuppressions(logGroupPolicy, [ diff --git a/source/lib/blueprint-frontend-config.ts b/source/lib/blueprint-frontend-config.ts index 5161d3c..a6a948a 100644 --- a/source/lib/blueprint-frontend-config.ts +++ b/source/lib/blueprint-frontend-config.ts @@ -39,7 +39,7 @@ export class BlueprintFrontendConfig extends Construct { public constructor( scope: Construct, id: string, - props: BlueprintFrontendConfigProps + props: BlueprintFrontendConfigProps, ) { super(scope, id); diff --git a/source/lib/blueprint-frontend.ts b/source/lib/blueprint-frontend.ts index 527a02e..adccbfe 100644 --- a/source/lib/blueprint-frontend.ts +++ b/source/lib/blueprint-frontend.ts @@ -83,7 +83,7 @@ export class BlueprintFrontend extends Construct { reason: 'This is false positive. Bucket policy has condition to block Non Https traffic', }, ], - true + true, ); /** @@ -141,7 +141,7 @@ export class BlueprintFrontend extends Construct { reason: 'This is false positive. Bucket policy has condition to block Non Https traffic', }, ], - true + true, ); addCfnNagSuppression(loggingBucket as Construct, [ { @@ -168,7 +168,7 @@ export class BlueprintFrontend extends Construct { prefix: '', }, webACLId: props.webAclArn, - } + }, ); const cfnDist: CfnDistribution = this.distribution.node @@ -219,7 +219,7 @@ export class BlueprintFrontend extends Construct { 'aws:SecureTransport': 'false', }, }, - }) + }), ); } } diff --git a/source/lib/blueprint-infrastructure-setup-construct.ts b/source/lib/blueprint-infrastructure-setup-construct.ts index e977f44..74e23df 100644 --- a/source/lib/blueprint-infrastructure-setup-construct.ts +++ b/source/lib/blueprint-infrastructure-setup-construct.ts @@ -59,6 +59,7 @@ import { LogLevelType, PatternRepoType, PatternType, + SecurityScanTool, } from './blueprint-types'; import { NagSuppressions } from 'cdk-nag'; import { Queue } from 'aws-cdk-lib/aws-sqs'; @@ -82,6 +83,7 @@ export interface BlueprintInfrastructureSetupProps { solutionTradeMarkName: string; removalPolicy: RemovalPolicy; logLevel: LogLevelType; + securityScanTool: SecurityScanTool; } export class BlueprintInfrastructureSetup extends Construct { @@ -97,7 +99,7 @@ export class BlueprintInfrastructureSetup extends Construct { public constructor( scope: Construct, id: string, - props: BlueprintInfrastructureSetupProps + props: BlueprintInfrastructureSetupProps, ) { super(scope, id); @@ -125,14 +127,14 @@ export class BlueprintInfrastructureSetup extends Construct { this.blueprintGovernanceNotificationTopic = new Topic( this, 'BlueprintGovernanceNotificationTopic', - { masterKey: props.blueprintsnsEncryptionKey } + { masterKey: props.blueprintsnsEncryptionKey }, ); // SNS topic that CloudFormation will notify with blueprint infrastructure stack related events const blueprintInfrastructureNotificationTopic = new Topic( this, 'BlueprintInfrastructureNotificationTopic', - { masterKey: props.blueprintsnsEncryptionKey } + { masterKey: props.blueprintsnsEncryptionKey }, ); // Copy blueprint infrastructure CDK code to a static bucket @@ -146,7 +148,7 @@ export class BlueprintInfrastructureSetup extends Construct { serverAccessLogsPrefix: 'access-log', autoDeleteObjects: props.removalPolicy === RemovalPolicy.DESTROY, removalPolicy: props.removalPolicy, - } + }, ); blueprintInfrastructureBucket.addToResourcePolicy( new PolicyStatement({ @@ -162,7 +164,7 @@ export class BlueprintInfrastructureSetup extends Construct { 'aws:SecureTransport': 'false', }, }, - }) + }), ); NagSuppressions.addResourceSuppressions( blueprintInfrastructureBucket, @@ -172,7 +174,7 @@ export class BlueprintInfrastructureSetup extends Construct { reason: 'This is false positive. Bucket policy has condition to block Non Https traffic', }, ], - true + true, ); const blueprintInfrastructureArchiveName = 'blueprint-infrastructure.zip'; @@ -180,7 +182,7 @@ export class BlueprintInfrastructureSetup extends Construct { new BucketDeployment(this, 'Assets', { sources: [ s3Source.Source.asset( - path.join(__dirname, '..', 'blueprint-infrastructure-asset') + path.join(__dirname, '..', 'blueprint-infrastructure-asset'), ), ], destinationBucket: blueprintInfrastructureBucket, @@ -191,7 +193,7 @@ export class BlueprintInfrastructureSetup extends Construct { 'UpdateBlueprintInfrastructureProjectRole', { assumedBy: new ServicePrincipal('codebuild.amazonaws.com'), - } + }, ); Aspects.of(updateBlueprintInfrastructureProjectRole).add( new CfnNagResourcePathEndingWithSuppressionAspect( @@ -201,8 +203,8 @@ export class BlueprintInfrastructureSetup extends Construct { id: 'W76', reason: 'The policy is implicitly generated by CDK.', }, - ] - ) + ], + ), ); const blueprintInfrastructureSecurityGroup = new SecurityGroup( @@ -212,7 +214,7 @@ export class BlueprintInfrastructureSetup extends Construct { vpc: props.vpc, allowAllOutbound: true, description: 'default security group for lambdas and codebuilds', - } + }, ); addCfnNagSuppression(blueprintInfrastructureSecurityGroup, [ { @@ -263,6 +265,7 @@ export class BlueprintInfrastructureSetup extends Construct { solutionName: props.solutionName, solutionTradeMarkName: props.solutionTradeMarkName, logLevel: props.logLevel, + securityScanTool: props.securityScanTool, }; if (props.githubConfig) { blueprintInfrastructureSharedConfig.githubConfig = { @@ -280,7 +283,7 @@ export class BlueprintInfrastructureSetup extends Construct { description: `KMS Key for CodeCommit PR notification topic`, alias: `APO-CodeCommit-Notification-Topic`, enableKeyRotation: true, - } + }, ); codeCommitNotificationTopicKey.addToResourcePolicy( new PolicyStatement({ @@ -297,7 +300,7 @@ export class BlueprintInfrastructureSetup extends Construct { 'kms:ViaService': `sns.${Aws.REGION}.amazonaws.com`, }, }, - }) + }), ); // CodeCommit notification SNS topic for PULL REQUEST event const codeCommitPatternRepoNotificationTopic = new Topic( @@ -305,10 +308,10 @@ export class BlueprintInfrastructureSetup extends Construct { 'CodeCommitRepoNotificationTopic', { masterKey: codeCommitNotificationTopicKey, - } + }, ); codeCommitPatternRepoNotificationTopic.grantPublish( - new ServicePrincipal('codestar-notifications.amazonaws.com') + new ServicePrincipal('codestar-notifications.amazonaws.com'), ); // DLQ for codecommit webhook lambda function @@ -341,7 +344,7 @@ export class BlueprintInfrastructureSetup extends Construct { runtime: Runtime.NODEJS_18_X, entry: path.join( __dirname, - '../lambda/blueprintgovernanceservice/src/codecommit/trigger-security-scan.ts' + '../lambda/blueprintgovernanceservice/src/codecommit/trigger-security-scan.ts', ), handler: 'handler', vpc: props.vpc, @@ -355,7 +358,7 @@ export class BlueprintInfrastructureSetup extends Construct { // eslint-disable-next-line @typescript-eslint/naming-convention LOG_LEVEL: props.logLevel, }, - } + }, ); addCfnNagSuppression(codeCommitWebhookFunction, [ { @@ -383,7 +386,7 @@ export class BlueprintInfrastructureSetup extends Construct { reason: 'It still has a namespace to restrict to only solution specific security check codebuild jobs', }, ], - true + true, ); // permission to invoke automated security check codebuild @@ -394,13 +397,13 @@ export class BlueprintInfrastructureSetup extends Construct { resources: [ `arn:aws:codebuild:${Aws.REGION}:${Aws.ACCOUNT_ID}:project/BlueprintChecks_*`, ], - }) + }), ); // Create lambda subscription to codecommit notification SNS topic so the lambda can trigger // the security check CodeBuild job on every PR create event codeCommitPatternRepoNotificationTopic.addSubscription( - new LambdaSubscription(codeCommitWebhookFunction) + new LambdaSubscription(codeCommitWebhookFunction), ); codeCommitNotificationTopicKey.grantDecrypt(codeCommitWebhookFunction); @@ -451,10 +454,10 @@ export class BlueprintInfrastructureSetup extends Construct { proxyUri, blueprintInfrastructureSharedConfig, blueprintInfrastructureNotificationTopic, - props.githubConfig - ) + props.githubConfig, + ), ), - } + }, ); NagSuppressions.addResourceSuppressions( this.updateBlueprintInfrastructureProject, @@ -468,7 +471,7 @@ export class BlueprintInfrastructureSetup extends Construct { reason: 'Add permission to all the pattern publishing keys via alias name. This is to prevent exceeding the policy size limit', }, ], - true + true, ); this.updateBlueprintInfraProjectCfnNagSuppressions(); @@ -490,7 +493,7 @@ export class BlueprintInfrastructureSetup extends Construct { Stack.of(this).account }-${Stack.of(this).region}`, ], - }) + }), ); // Add permission to all the pattern publishing keys via alias name // This is to prevent exceeding the policy size limit @@ -510,7 +513,7 @@ export class BlueprintInfrastructureSetup extends Construct { 'kms:ResourceAliases': 'alias/PatternPublishPipeline-*', }, }, - }) + }), ); // Add permission to all the pattern publish pipeline artifact buckets // This is to prevent exceeding the policy size limit @@ -522,7 +525,7 @@ export class BlueprintInfrastructureSetup extends Construct { 'arn:aws:s3:::blueprintinfrastructures-blueprintpublicationpipe*', 'arn:aws:s3:::blueprintinfrastructures-blueprintpublicationpipe*/*', ], - }) + }), ); if (props.githubConfig) { @@ -535,7 +538,7 @@ export class BlueprintInfrastructureSetup extends Construct { Stack.of(this).account }:parameter/${props.githubConfig.githubConnectionArnSsmParam}`, ], - }) + }), ); } @@ -547,7 +550,7 @@ export class BlueprintInfrastructureSetup extends Construct { handler: 'handler', entry: path.join( __dirname, - '../lambda/blueprintgovernanceservice/src/handlers/UpdateBlueprintInfraStatusHandler.ts' + '../lambda/blueprintgovernanceservice/src/handlers/UpdateBlueprintInfraStatusHandler.ts', ), timeout: Duration.minutes(1), vpc: props.vpc, @@ -560,7 +563,7 @@ export class BlueprintInfrastructureSetup extends Construct { // eslint-disable-next-line @typescript-eslint/naming-convention LOG_LEVEL: props.logLevel, }, - } + }, ); NagSuppressions.addResourceSuppressions( updateBlueprintInfraStatusLambda, @@ -570,10 +573,10 @@ export class BlueprintInfrastructureSetup extends Construct { reason: 'Need managed policy AWSLambdaBasicExecutionRole and AWSLambdaVPCAccessExecutionRole', }, ], - true + true, ); this.updateBlueprintInfraLambdaCfnNagSuppressions( - updateBlueprintInfraStatusLambda + updateBlueprintInfraStatusLambda, ); props.rapmMetaDataTable.grantWriteData(updateBlueprintInfraStatusLambda); @@ -582,24 +585,24 @@ export class BlueprintInfrastructureSetup extends Construct { new PolicyStatement({ actions: ['cloudformation:DescribeStacks'], resources: ['*'], - }) + }), ); // Grant permission to use encryption key to read from sns topic props.blueprintsnsEncryptionKey.grantEncryptDecrypt( - updateBlueprintInfraStatusLambda + updateBlueprintInfraStatusLambda, ); // Grant permission to use encryption key to write infrastructure status in dynamodb table props.rapmMetaDataTableEncryptionKey.grantEncryptDecrypt( - updateBlueprintInfraStatusLambda + updateBlueprintInfraStatusLambda, ); // Trigger the lambda that will update blueprint infra status when a infrastructure stack gets updated updateBlueprintInfraStatusLambda.addEventSource( new aws_lambda_event_sources.SnsEventSource( - blueprintInfrastructureNotificationTopic - ) + blueprintInfrastructureNotificationTopic, + ), ); } @@ -612,7 +615,7 @@ export class BlueprintInfrastructureSetup extends Construct { reason: 'The policy is generated by CDK. Also servicecatalog permissions needs to use *', }, ], - 'PolicyDocument' + 'PolicyDocument', ); Aspects.of(this.updateBlueprintInfrastructureProject).add( new CfnNagResourcePathEndingWithSuppressionAspect( @@ -626,13 +629,13 @@ export class BlueprintInfrastructureSetup extends Construct { id: 'W5', reason: 'Security group is created by CDK and is egress only', }, - ] - ) + ], + ), ); } private updateBlueprintInfraLambdaCfnNagSuppressions( - updateBlueprintInfraStatusLambda: aws_lambda_nodejs.NodejsFunction + updateBlueprintInfraStatusLambda: aws_lambda_nodejs.NodejsFunction, ): void { addCfnNagSuppression(updateBlueprintInfraStatusLambda, [ { @@ -656,8 +659,8 @@ export class BlueprintInfrastructureSetup extends Construct { id: 'W5', reason: 'Security group is created by CDK and is egress only', }, - ] - ) + ], + ), ); } @@ -665,7 +668,7 @@ export class BlueprintInfrastructureSetup extends Construct { proxyUri: string | undefined, blueprintInfrastructureSharedConfig: BlueprintInfraSharedConfig, blueprintInfrastructureNotificationTopic: Topic, - githubConfig?: GithubConfig + githubConfig?: GithubConfig, // eslint-disable-next-line @typescript-eslint/no-explicit-any ): any { const buildSpec = { @@ -685,7 +688,7 @@ export class BlueprintInfrastructureSetup extends Construct { `${this.generateBuildSpecCdkDeployCommand( githubConfig ? 'GitHub' : 'CodeCommit', blueprintInfrastructureNotificationTopic.topicArn, - blueprintInfrastructureSharedConfig + blueprintInfrastructureSharedConfig, )}`, ], }, @@ -706,7 +709,7 @@ export class BlueprintInfrastructureSetup extends Construct { // Configure npm to use http proxy buildSpec.phases.install.commands.unshift( `npm config set proxy http://${proxyUri}`, - `npm config set https-proxy http://${proxyUri}` + `npm config set https-proxy http://${proxyUri}`, ); } @@ -716,14 +719,14 @@ export class BlueprintInfrastructureSetup extends Construct { private generateBuildSpecCdkDeployCommand( patternRepoType: PatternRepoType, blueprintInfrastructureNotificationTopicArn: string, - blueprintInfrastructureSharedConfig: BlueprintInfraSharedConfig + blueprintInfrastructureSharedConfig: BlueprintInfraSharedConfig, ): string { let cdkDeployCommand = 'npm run cdk deploy -- --require-approval never' + // ARNs of SNS topic that CloudFormation will notify with stack related events ` --notification-arns="${blueprintInfrastructureNotificationTopicArn}"` + ` --context blueprintInfrastructureSharedConfigJson='${JSON.stringify( - blueprintInfrastructureSharedConfig + blueprintInfrastructureSharedConfig, )}'` + // Get blueprint specific stack context from the codebuild project environment variables ' --context blueprintId=${BLUEPRINT_ID}' + diff --git a/source/lib/blueprint-notification.ts b/source/lib/blueprint-notification.ts index 18a87cc..71d9add 100644 --- a/source/lib/blueprint-notification.ts +++ b/source/lib/blueprint-notification.ts @@ -91,7 +91,7 @@ export class BlueprintNotification extends Construct { {{patternDestination}} `, }, - } + }, ); const dlq = new sqs.Queue(this, 'email-sender-dlq', { @@ -115,14 +115,14 @@ export class BlueprintNotification extends Construct { reason: 'It is a dead letter queue configured for lambda.', }, ], - true + true, ); this.emailSenderFn = new nodeJsLambda.NodejsFunction(this, 'email-sender-fn', { description: 'Sends RAPM pattern lifecycle event notifications', entry: path.join( __dirname, - '../lambda/blueprintgovernanceservice/src/email-sender/index.ts' + '../lambda/blueprintgovernanceservice/src/email-sender/index.ts', ), handler: 'handler', vpc: props.vpc, @@ -162,7 +162,7 @@ export class BlueprintNotification extends Construct { reason: 'Need to use * for sending emails using AWS SES', }, ], - true + true, ); props.patternEmailTable.grantReadData(this.emailSenderFn); @@ -188,7 +188,7 @@ export class BlueprintNotification extends Construct { id: 'W5', reason: 'Security group is created by CDK and is egress only', }, - ]) + ]), ); } } diff --git a/source/lib/blueprint-portal-service.ts b/source/lib/blueprint-portal-service.ts index 81c697e..06a36f8 100644 --- a/source/lib/blueprint-portal-service.ts +++ b/source/lib/blueprint-portal-service.ts @@ -136,7 +136,7 @@ export class BlueprintPortalService extends Construct { 'codecommit:DeleteRepository', ], resources: [`arn:aws:codecommit:${Aws.REGION}:${Aws.ACCOUNT_ID}:*`], - }) + }), ); } const lambdaEnvironmentVariables: Record = { @@ -201,8 +201,8 @@ export class BlueprintPortalService extends Construct { code: Code.fromAsset( path.resolve( __dirname, - `../lambda/${bgsFunctionName}/dist/${bgsFunctionName}` - ) + `../lambda/${bgsFunctionName}/dist/${bgsFunctionName}`, + ), ), description: 'Blueprint Governance Runtime Governance Lambda', timeout: Duration.seconds(60), @@ -282,7 +282,7 @@ export class BlueprintPortalService extends Construct { { resourceArn: `arn:aws:apigateway:${Aws.REGION}::/restapis/${this.blueprintapi.api.restApiId}/stages/${this.blueprintapi.api.deploymentStage.stageName}`, webAclArn: wafRegionalWebAcl.webAcl.attrArn, - } + }, ); cfnWebACLAssociation.node.addDependency(this.blueprintapi); @@ -301,7 +301,7 @@ export class BlueprintPortalService extends Construct { reason: 'Most Permissions are added by CDK implicitly.', }, ], - 'DefaultPolicy' + 'DefaultPolicy', ); addCfnNagSuppression(this.bgsFunction.lambdaExecutionRole, [ { @@ -331,8 +331,8 @@ export class BlueprintPortalService extends Construct { id: 'W5', reason: 'Security group is created by CDK and is egress only', }, - ] - ) + ], + ), ); } } diff --git a/source/lib/blueprint-stack.ts b/source/lib/blueprint-stack.ts index d218aa1..5e5d4af 100644 --- a/source/lib/blueprint-stack.ts +++ b/source/lib/blueprint-stack.ts @@ -28,6 +28,7 @@ import { IdentityProviderInfo, LogLevelType, PatternType, + SecurityScanTool, WafInfo, } from './blueprint-types'; import { BlueprintFrontendConfig } from './blueprint-frontend-config'; @@ -47,6 +48,7 @@ export interface BlueprintStackProps extends StackProps { readonly customUserAgent: string; readonly removalPolicy: RemovalPolicy; readonly logLevel: LogLevelType; + readonly securityScanTool: SecurityScanTool; readonly cognitoDomainPrefix?: string; readonly identityProviderInfo?: IdentityProviderInfo; readonly vpcCidr?: string; @@ -96,7 +98,7 @@ export class BlueprintStack extends Stack { if (props.githubConfig) { this.setupSourceCredentials( props.githubConfig.githubTokenSecretId, - props.githubConfig.githubUrl + props.githubConfig.githubUrl, ); } @@ -111,7 +113,7 @@ export class BlueprintStack extends Stack { const blueprintInfra = new BlueprintBaseInfra( this, 'RapmBaseInfra', - blueprintBaseInfraProps + blueprintBaseInfraProps, ); const anonymousDataUUID = this.createOperationalMetrics( @@ -119,7 +121,7 @@ export class BlueprintStack extends Stack { blueprintInfra.vpc, patternTypeParam.valueAsString as PatternType, props.removalPolicy, - props.logLevel + props.logLevel, ); const blueprintFrontend = new BlueprintFrontend(this, 'RapmFrontend', { @@ -166,6 +168,7 @@ export class BlueprintStack extends Stack { wafInfo: props.wafInfo, removalPolicy: props.removalPolicy, logLevel: props.logLevel, + securityScanTool: props.securityScanTool, }); new BlueprintFrontendConfig(this, 'RapmFrontendConfig', { @@ -222,7 +225,7 @@ export class BlueprintStack extends Stack { private setupSourceCredentials( githubTokenSecretId: string, - githubUrl?: string + githubUrl?: string, ): void { githubUrl ? new GitHubEnterpriseSourceCredentials( @@ -230,7 +233,7 @@ export class BlueprintStack extends Stack { 'GitHubEnterpriseSourceCredentials', { accessToken: SecretValue.secretsManager(githubTokenSecretId), - } + }, ) : new GitHubSourceCredentials(this, 'GitHubSourceCredentials', { accessToken: SecretValue.secretsManager(githubTokenSecretId), @@ -242,7 +245,7 @@ export class BlueprintStack extends Stack { vpc: IVpc, patternType: PatternType, removalPolicy: RemovalPolicy, - logLevel: LogLevelType + logLevel: LogLevelType, ): string { const opMetrics = new OperationalMetricsCollection( this, @@ -258,7 +261,7 @@ export class BlueprintStack extends Stack { }, patternType: patternType, logLevel, - } + }, ); return opMetrics.anonymousDataUUID; diff --git a/source/lib/blueprint-types.ts b/source/lib/blueprint-types.ts index 3c72ff4..9895458 100644 --- a/source/lib/blueprint-types.ts +++ b/source/lib/blueprint-types.ts @@ -104,6 +104,7 @@ export interface BlueprintInfraSharedConfig { solutionName: string; solutionTradeMarkName: string; logLevel: LogLevelType; + securityScanTool: SecurityScanTool; githubConfig?: GithubConfigBlueprintInfraSharedConfig; codeCommitConfig?: CodeCommitConfig; } @@ -125,3 +126,10 @@ export interface WafInfo { } export type PatternRepoType = 'CodeCommit' | 'GitHub'; + +export interface SecurityScanTool { + name: SecurityScanToolName; + cfnGuardManagedRuleSets?: string[]; +} + +export type SecurityScanToolName = 'CfnGuard' | 'CfnNag' | 'Checkov'; diff --git a/source/lib/cfn-nag-suppression.ts b/source/lib/cfn-nag-suppression.ts index b43ded1..9ed7785 100644 --- a/source/lib/cfn-nag-suppression.ts +++ b/source/lib/cfn-nag-suppression.ts @@ -30,7 +30,7 @@ export interface CfnNagRuleSuppression { */ export const addCfnNagSuppressionMeta = ( construct: CfnResource, - rulesToSuppress: CfnNagRuleSuppression[] + rulesToSuppress: CfnNagRuleSuppression[], ): void => { construct.cfnOptions.metadata = { ...construct.cfnOptions.metadata, @@ -47,7 +47,7 @@ export const addCfnNagSuppressionMeta = ( export const addCfnNagSuppression = ( construct: Construct, rulesToSuppress: CfnNagRuleSuppression[], - resourceName?: string + resourceName?: string, ): void => { const child = resourceName ? construct.node.findChild(resourceName) : construct; // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition @@ -60,11 +60,11 @@ export class CfnNagCustomResourceSuppressionAspect implements IAspect { public visit(construct: Construct): void { if ( construct.node.path.endsWith( - '/Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler' + '/Custom::S3AutoDeleteObjectsCustomResourceProvider/Handler', ) || construct.node.path.endsWith('Provider/framework-onEvent/Resource') || construct.node.path.match( - /\/Custom::CDKBucketDeployment[0-9A-Za-z]+\/Resource$/ + /\/Custom::CDKBucketDeployment[0-9A-Za-z]+\/Resource$/, ) || construct.node.path.match(/\/LogRetention[0-9A-Za-z]+\/Resource$/) ) { @@ -103,7 +103,7 @@ export class CfnNagServiceRoleDefaultPolicyResourceSuppressionAspect implements export class CfnNagResourcePathEndingWithSuppressionAspect implements IAspect { public constructor( private readonly resourcePathEndingWith: string, - private readonly rulesToSuppress: CfnNagRuleSuppression[] + private readonly rulesToSuppress: CfnNagRuleSuppression[], ) {} public visit(construct: Construct): void { @@ -116,7 +116,7 @@ export class CfnNagResourcePathEndingWithSuppressionAspect implements IAspect { export class CfnNagResourcePathRegexSuppressionAspect implements IAspect { public constructor( private readonly resourcePathEndingWith: RegExp, - private readonly rulesToSuppress: CfnNagRuleSuppression[] + private readonly rulesToSuppress: CfnNagRuleSuppression[], ) {} public visit(construct: Construct): void { diff --git a/source/lib/infra-utils/ags-synthetics-canary.ts b/source/lib/infra-utils/ags-synthetics-canary.ts index 855e649..58ef009 100644 --- a/source/lib/infra-utils/ags-synthetics-canary.ts +++ b/source/lib/infra-utils/ags-synthetics-canary.ts @@ -167,11 +167,11 @@ export class AWSSyntheticsCanary extends Construct { assumedBy: new iam.ServicePrincipal('lambda'), managedPolicies: [ iam.ManagedPolicy.fromAwsManagedPolicyName( - 'service-role/AWSLambdaBasicExecutionRole' + 'service-role/AWSLambdaBasicExecutionRole', ), // must to have this one for lambda to run in VPC iam.ManagedPolicy.fromAwsManagedPolicyName( - 'service-role/AWSLambdaVPCAccessExecutionRole' + 'service-role/AWSLambdaVPCAccessExecutionRole', ), ], inlinePolicies: { @@ -216,14 +216,14 @@ export class AWSSyntheticsCanary extends Construct { id: 'W5', reason: 'Security group is created by CDK and is egress only', }, - ] - ) + ], + ), ); } private getCanaryRolePolicyDoc( artifactsBucket: s3.IBucket, - prefix: string + prefix: string, ): iam.PolicyDocument { const { partition } = Stack.of(this); const policy = new iam.PolicyDocument({ diff --git a/source/lib/infra-utils/aws-lambda-function.ts b/source/lib/infra-utils/aws-lambda-function.ts index 3710969..227a4a6 100644 --- a/source/lib/infra-utils/aws-lambda-function.ts +++ b/source/lib/infra-utils/aws-lambda-function.ts @@ -164,7 +164,7 @@ export class AWSLambdaFunction extends Construct { reason: 'The wildcard is used as suffix with specific IAM permissions', }, ], - true + true, ); } } diff --git a/source/lib/infra-utils/aws-rest-api.ts b/source/lib/infra-utils/aws-rest-api.ts index 5c1fbeb..77ddf6e 100644 --- a/source/lib/infra-utils/aws-rest-api.ts +++ b/source/lib/infra-utils/aws-rest-api.ts @@ -199,7 +199,7 @@ export class AWSRestApi extends Construct { reason: 'Its a false positive.', }, ], - true + true, ); NagSuppressions.addResourceSuppressions( this.api, @@ -209,7 +209,7 @@ export class AWSRestApi extends Construct { reason: 'CloudWatchRole needs managed policy AmazonAPIGatewayPushToCloudWatchLogs', }, ], - true + true, ); const authorizer = new CfnAuthorizer(scope, 'CognitoAuth', { @@ -252,7 +252,7 @@ export class AWSRestApi extends Construct { reason: 'The REST API does not have request validation enabled - This is configured at Lambda layer level', }, ], - true + true, ); if (props.enableProxyAll !== false) { @@ -277,7 +277,7 @@ export class AWSRestApi extends Construct { { resourceArn: `arn:${Aws.PARTITION}:apigateway:${Aws.REGION}::/restapis/${this.api.restApiId}/stages/prod`, webAclArn: props.apiGatewayWebAclArn, - } + }, ); webACLAssociation.node.addDependency(this.api); } @@ -301,19 +301,19 @@ export class AWSRestApi extends Construct { function addResourceThrows(): Resource { throw new Error( - "Cannot call 'addResource' on a proxying AGSRestApi; set 'enableProxyAll' to false" + "Cannot call 'addResource' on a proxying AGSRestApi; set 'enableProxyAll' to false", ); } function addMethodThrows(): Method { throw new Error( - "Cannot call 'addMethod' on a proxying AGSRestApi; set 'enableProxyAll' to false" + "Cannot call 'addMethod' on a proxying AGSRestApi; set 'enableProxyAll' to false", ); } function addProxyThrows(): ProxyResource { throw new Error( - "Cannot call 'addProxy' on a proxying AGSRestApi; set 'enableProxyAll' to false" + "Cannot call 'addProxy' on a proxying AGSRestApi; set 'enableProxyAll' to false", ); } diff --git a/source/lib/infra-utils/aws-secure-bucket.ts b/source/lib/infra-utils/aws-secure-bucket.ts index 006b0b7..648f4f3 100644 --- a/source/lib/infra-utils/aws-secure-bucket.ts +++ b/source/lib/infra-utils/aws-secure-bucket.ts @@ -72,7 +72,7 @@ export class AWSSecureBucket extends Construct { 'aws:SecureTransport': 'false', }, }, - }) + }), ); addCfnNagSuppression(serverAccessLogBucket as Construct, [ @@ -96,7 +96,7 @@ export class AWSSecureBucket extends Construct { 'aws:SecureTransport': 'false', }, }, - }) + }), ); NagSuppressions.addResourceSuppressions( this.bucket, @@ -106,7 +106,7 @@ export class AWSSecureBucket extends Construct { reason: 'This is false positive. Bucket policy has condition to block Non Https traffic', }, ], - true + true, ); NagSuppressions.addResourceSuppressions( serverAccessLogBucket, @@ -116,7 +116,7 @@ export class AWSSecureBucket extends Construct { reason: 'This is false positive. Bucket policy has condition to block Non Https traffic', }, ], - true + true, ); } } diff --git a/source/lib/infra-utils/aws-service-dashboard.ts b/source/lib/infra-utils/aws-service-dashboard.ts index 0275371..99b2250 100644 --- a/source/lib/infra-utils/aws-service-dashboard.ts +++ b/source/lib/infra-utils/aws-service-dashboard.ts @@ -57,7 +57,7 @@ export class AWSServiceDashboard extends Construct { // canary and api gateway widgets if (props.apiGateway) { dashboard.addWidgets( - ...this.createApiWidgets(props.apiGateway, props.canaryName) + ...this.createApiWidgets(props.apiGateway, props.canaryName), ); } @@ -65,7 +65,7 @@ export class AWSServiceDashboard extends Construct { dashboard.addWidgets( ...props.lambdas .map((lambda) => this.createLambdaWidgets(lambda)) - .reduce((previous, current) => previous.concat(current)) + .reduce((previous, current) => previous.concat(current)), ); // dynamo db @@ -73,7 +73,7 @@ export class AWSServiceDashboard extends Construct { dashboard.addWidgets( ...props.dynamoDbTables .map((table) => this.createDynamoDbWidgets(table)) - .reduce((previous, current) => previous.concat(current)) + .reduce((previous, current) => previous.concat(current)), ); } @@ -91,21 +91,21 @@ export class AWSServiceDashboard extends Construct { 'Maximum', 'Duration', cw.Statistic.MAXIMUM, - cw.Unit.MILLISECONDS + cw.Unit.MILLISECONDS, ); const averageDurationMetrics = this.lambdaMetric( lambda, 'Average', 'Duration', cw.Statistic.AVERAGE, - cw.Unit.MILLISECONDS + cw.Unit.MILLISECONDS, ); const minDurationMetrics = this.lambdaMetric( lambda, 'Minimum', 'Duration', cw.Statistic.MINIMUM, - cw.Unit.MILLISECONDS + cw.Unit.MILLISECONDS, ); this.keyMetrics.set('SUCESS_RATE', successRateMetrics); @@ -129,7 +129,7 @@ export class AWSServiceDashboard extends Construct { 'Invocations', 'Invocations', cw.Statistic.SUM, - cw.Unit.COUNT + cw.Unit.COUNT, ); const errorCount: cw.IMetric = this.lambdaMetric( @@ -137,7 +137,7 @@ export class AWSServiceDashboard extends Construct { 'Error', 'Errors', cw.Statistic.SUM, - cw.Unit.COUNT + cw.Unit.COUNT, ); const successRateMetrics = new cw.MathExpression({ @@ -155,7 +155,7 @@ export class AWSServiceDashboard extends Construct { private createApiWidgets( apg: ApiGatewayWidgetProps, - canaryName?: string + canaryName?: string, ): cw.IWidget[] { const metrics = []; @@ -170,7 +170,7 @@ export class AWSServiceDashboard extends Construct { unit: cw.Unit.PERCENT, dimensionsMap: { CanaryName: canaryName }, }), - ]) + ]), ); } @@ -185,9 +185,9 @@ export class AWSServiceDashboard extends Construct { cw.Statistic.SUM, cw.Unit.COUNT, api.method, - api.resource - ) - ) + api.resource, + ), + ), ), this.apiGatewayWidget( 'API Latency', @@ -199,9 +199,9 @@ export class AWSServiceDashboard extends Construct { cw.Statistic.AVERAGE, cw.Unit.MILLISECONDS, api.method, - api.resource - ) - ) + api.resource, + ), + ), ), this.apiGatewayWidget( 'API Errors', @@ -213,8 +213,8 @@ export class AWSServiceDashboard extends Construct { cw.Statistic.SUM, cw.Unit.COUNT, api.method, - api.resource - ) + api.resource, + ), ), apg.endpoints.map((api) => this.apiGatewayMetric( @@ -224,12 +224,12 @@ export class AWSServiceDashboard extends Construct { cw.Statistic.SUM, cw.Unit.COUNT, api.method, - api.resource - ) + api.resource, + ), ), '4XX Errors', - '5XX Errors' - ) + '5XX Errors', + ), ); return metrics; @@ -244,7 +244,7 @@ export class AWSServiceDashboard extends Construct { label: string, metricName: string, statistic: cw.Statistic, - unit?: cw.Unit + unit?: cw.Unit, ): cw.IMetric { return this.createGraphMetric({ label, @@ -265,28 +265,28 @@ export class AWSServiceDashboard extends Construct { 'Provisioned Read', 'ProvisionedReadCapacityUnits', cw.Statistic.AVERAGE, - cw.Unit.COUNT + cw.Unit.COUNT, ), this.ddbMetric( dynamoDbTable.tableName, 'Consumed Read', 'ConsumedReadCapacityUnits', cw.Statistic.AVERAGE, - cw.Unit.COUNT + cw.Unit.COUNT, ), this.ddbMetric( dynamoDbTable.tableName, 'Provisioned Read', 'ProvisionedWriteCapacityUnits', cw.Statistic.AVERAGE, - cw.Unit.COUNT + cw.Unit.COUNT, ), this.ddbMetric( dynamoDbTable.tableName, 'Consumed Read', 'ConsumedWriteCapacityUnits', cw.Statistic.AVERAGE, - cw.Unit.COUNT + cw.Unit.COUNT, ), ]), this.ddbWidget(`${prefix} - Latency`, [ @@ -296,7 +296,7 @@ export class AWSServiceDashboard extends Construct { 'SuccessfulRequestLatency', cw.Statistic.AVERAGE, cw.Unit.MILLISECONDS, - { Operation: 'GetItem' } + { Operation: 'GetItem' }, ), this.ddbMetric( dynamoDbTable.tableName, @@ -304,7 +304,7 @@ export class AWSServiceDashboard extends Construct { 'SuccessfulRequestLatency', cw.Statistic.AVERAGE, cw.Unit.MILLISECONDS, - { Operation: 'PutItem' } + { Operation: 'PutItem' }, ), this.ddbMetric( dynamoDbTable.tableName, @@ -312,7 +312,7 @@ export class AWSServiceDashboard extends Construct { 'SuccessfulRequestLatency', cw.Statistic.AVERAGE, cw.Unit.MILLISECONDS, - { Operation: 'Scan' } + { Operation: 'Scan' }, ), this.ddbMetric( dynamoDbTable.tableName, @@ -320,7 +320,7 @@ export class AWSServiceDashboard extends Construct { 'SuccessfulRequestLatency', cw.Statistic.AVERAGE, cw.Unit.MILLISECONDS, - { Operation: 'Query' } + { Operation: 'Query' }, ), ]), this.ddbWidget(`${prefix} - Errors`, [ @@ -332,7 +332,7 @@ export class AWSServiceDashboard extends Construct { cw.Unit.COUNT, { Operation: 'GetItem', - } + }, ), this.ddbMetric( dynamoDbTable.tableName, @@ -342,7 +342,7 @@ export class AWSServiceDashboard extends Construct { cw.Unit.COUNT, { Operation: 'BatchGetItem', - } + }, ), this.ddbMetric( dynamoDbTable.tableName, @@ -352,7 +352,7 @@ export class AWSServiceDashboard extends Construct { cw.Unit.COUNT, { Operation: 'Scan', - } + }, ), this.ddbMetric( dynamoDbTable.tableName, @@ -362,7 +362,7 @@ export class AWSServiceDashboard extends Construct { cw.Unit.COUNT, { Operation: 'Query', - } + }, ), this.ddbMetric( dynamoDbTable.tableName, @@ -372,7 +372,7 @@ export class AWSServiceDashboard extends Construct { cw.Unit.COUNT, { Operation: 'PutItem', - } + }, ), this.ddbMetric( dynamoDbTable.tableName, @@ -382,7 +382,7 @@ export class AWSServiceDashboard extends Construct { cw.Unit.COUNT, { Operation: 'BatchWriteItem', - } + }, ), this.ddbMetric( dynamoDbTable.tableName, @@ -392,7 +392,7 @@ export class AWSServiceDashboard extends Construct { cw.Unit.COUNT, { Operation: 'UpdateItem', - } + }, ), this.ddbMetric( dynamoDbTable.tableName, @@ -402,7 +402,7 @@ export class AWSServiceDashboard extends Construct { cw.Unit.COUNT, { Operation: 'DeleteItem', - } + }, ), ]), this.ddbWidget(`${prefix} - Throttled Requests`, [ @@ -411,7 +411,7 @@ export class AWSServiceDashboard extends Construct { 'Throttled Requests', 'ThrottledRequests', cw.Statistic.SUM, - cw.Unit.COUNT + cw.Unit.COUNT, ), ]), ]; @@ -424,7 +424,7 @@ export class AWSServiceDashboard extends Construct { statistic: cw.Statistic, unit?: cw.Unit, // eslint-disable-next-line @typescript-eslint/no-explicit-any - dimensions?: Record + dimensions?: Record, ): cw.IMetric { return this.createGraphMetric({ label, @@ -445,7 +445,7 @@ export class AWSServiceDashboard extends Construct { leftMetrics: cw.IMetric[], rightMetrics?: cw.IMetric[], leftLabel?: string, - rightLabel?: string + rightLabel?: string, ): cw.IWidget { return this.createGraphWidget({ title, @@ -465,7 +465,7 @@ export class AWSServiceDashboard extends Construct { method: string, resource: string, // eslint-disable-next-line @typescript-eslint/no-explicit-any - dimensions?: Record + dimensions?: Record, ): cw.IMetric { return this.createGraphMetric({ label, diff --git a/source/lib/infra-utils/aws-waf-web-acl.ts b/source/lib/infra-utils/aws-waf-web-acl.ts index 5797d10..e389b49 100644 --- a/source/lib/infra-utils/aws-waf-web-acl.ts +++ b/source/lib/infra-utils/aws-waf-web-acl.ts @@ -96,7 +96,7 @@ export class AWSWafWebACL extends Construct { if (props.customBodySize) { //Add SizeRestrictions_BODY in to set const excludedManagedRules = new Set(props.excludedManagedRules).add( - 'SizeRestrictions_BODY' + 'SizeRestrictions_BODY', ); // convert set to array props.excludedManagedRules = [...excludedManagedRules]; diff --git a/source/lib/infra-utils/zip-bundle.ts b/source/lib/infra-utils/zip-bundle.ts index 24dd3c3..b915dff 100644 --- a/source/lib/infra-utils/zip-bundle.ts +++ b/source/lib/infra-utils/zip-bundle.ts @@ -27,8 +27,8 @@ const output = fs.createWriteStream( process.cwd(), '..', 'blueprint-infrastructure-asset', - 'blueprint-infrastructure.zip' - ) + 'blueprint-infrastructure.zip', + ), ); const archive = archiver('zip'); diff --git a/source/lib/operational-metrics-construct.ts b/source/lib/operational-metrics-construct.ts index d81e7a7..ca5618d 100644 --- a/source/lib/operational-metrics-construct.ts +++ b/source/lib/operational-metrics-construct.ts @@ -46,14 +46,14 @@ export class OperationalMetricsCollection extends Construct { public constructor( scope: Construct, id: string, - props: OperationalMetricsCollectionProps + props: OperationalMetricsCollectionProps, ) { super(scope, id); const lambda = new NodejsFunction(this, 'operational-metrics-handler', { entry: path.join( __dirname, - '../lambda/blueprintgovernanceservice/src/metrics/OperationalMetricHandler.ts' + '../lambda/blueprintgovernanceservice/src/metrics/OperationalMetricHandler.ts', ), handler: 'handler', description: 'Lambda for Operational Metrics collection', @@ -73,7 +73,7 @@ export class OperationalMetricsCollection extends Construct { reason: 'Uses service role - AWSLambdaVPCAccessExecutionRole and AWSLambdaBasicExecutionRole', }, ], - true + true, ); addCfnNagSuppression(lambda, [ @@ -96,7 +96,7 @@ export class OperationalMetricsCollection extends Construct { id: 'W5', reason: 'Security group is created by CDK and is egress only', }, - ]) + ]), ); const provider = new cr.Provider(this, 'Provider', { @@ -119,7 +119,7 @@ export class OperationalMetricsCollection extends Construct { reason: 'This lambda runtime is implicitly selected by AWS CDK', }, ], - true + true, ); const { @@ -142,7 +142,7 @@ export class OperationalMetricsCollection extends Construct { retainData, patternType, }, - } + }, ); this.anonymousDataUUID = customResource.getAttString('anonymousDataUUID'); diff --git a/source/package-lock.json b/source/package-lock.json index 62a16ff..6529ccf 100644 --- a/source/package-lock.json +++ b/source/package-lock.json @@ -1,17 +1,17 @@ { "name": "rapm-solution", - "version": "1.0.0", + "version": "1.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "rapm-solution", - "version": "1.0.0", + "version": "1.2.0", "license": "Apache-2.0", "dependencies": { "@aws-cdk/aws-servicecatalogappregistry-alpha": "^2.85.0-alpha.0", "@aws-cdk/aws-synthetics-alpha": "^2.85.0-alpha.0", - "@types/node": "^18.7.23", + "@types/node": "^20.4.5", "aws-cdk-lib": "^2.85.0", "aws-sdk": "^2.1354.0", "cdk-nag": "^2.15.51", @@ -26,11 +26,11 @@ "@aws-sdk/client-dynamodb": "^3.264.0", "@aws-sdk/client-service-catalog": "^3.264.0", "@aws-sdk/client-ssm": "^3.264.0", - "@octokit/rest": "^19.0.7", + "@octokit/rest": "^20.0.1", "@types/archiver": "^5.3.1", "@types/jest": "^29.1.0", - "@typescript-eslint/eslint-plugin": "^5.31.0", - "@typescript-eslint/parser": "^5.31.0", + "@typescript-eslint/eslint-plugin": "^6.2.0", + "@typescript-eslint/parser": "^6.2.0", "archiver": "^5.3.0", "aws-amplify": "^5.0.12", "aws-cdk": "^2.85.0", @@ -42,9 +42,10 @@ "eslint-config-prettier": "^8.5.0", "eslint-config-typescript": "^3.0.0", "eslint-plugin-header": "^3.1.1", - "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-prettier": "^5.0.0", "jest": "^29.3.1", - "prettier": "^2.7.1", + "prettier": "^3.0.0", "standard-version": "^9.3.1", "ts-jest": "^29.0.3", "typescript": "^5.0.4" @@ -19413,9 +19414,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -20012,162 +20013,225 @@ } }, "node_modules/@octokit/auth-token": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz", - "integrity": "sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0" - }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/core": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz", - "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.0.tgz", + "integrity": "sha512-YbAtMWIrbZ9FCXbLwT9wWB8TyLjq9mxpKdgB3dUNxQcIVTf9hJ70gRPwAcqGZdY6WdJPZ0I7jLaaNDCiloGN2A==", "dev": true, "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.0.0", + "@octokit/request": "^8.0.2", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^11.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/endpoint": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz", - "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz", + "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==", "dev": true, "dependencies": { - "@octokit/types": "^9.0.0", + "@octokit/types": "^11.0.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/graphql": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz", - "integrity": "sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.1.tgz", + "integrity": "sha512-T5S3oZ1JOE58gom6MIcrgwZXzTaxRnxBso58xhozxHpOqSTgDS6YNeEUvZ/kRvXgPrRz/KHnZhtb7jUMRi9E6w==", "dev": true, "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", + "@octokit/request": "^8.0.1", + "@octokit/types": "^11.0.0", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/openapi-types": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz", - "integrity": "sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA==", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==", "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz", - "integrity": "sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-8.0.0.tgz", + "integrity": "sha512-2xZ+baZWUg+qudVXnnvXz7qfrTmDeYPCzangBVq/1gXxii/OiS//4shJp9dnCCvj1x+JAm9ji1Egwm1BA47lPQ==", "dev": true, "dependencies": { - "@octokit/types": "^9.0.0" + "@octokit/types": "^11.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=4" + "@octokit/core": ">=5" } }, "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz", + "integrity": "sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA==", "dev": true, + "engines": { + "node": ">= 18" + }, "peerDependencies": { - "@octokit/core": ">=3" + "@octokit/core": ">=5" } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz", - "integrity": "sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-9.0.0.tgz", + "integrity": "sha512-KquMF/VB1IkKNiVnzJKspY5mFgGyLd7HzdJfVEGTJFzqu9BRFNWt+nwTCMuUiWc72gLQhRWYubTwOkQj+w/1PA==", "dev": true, "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.3.1" + "@octokit/types": "^11.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=3" + "@octokit/core": ">=5" } }, "node_modules/@octokit/request": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.3.tgz", - "integrity": "sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz", + "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==", "dev": true, "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", + "@octokit/endpoint": "^9.0.0", + "@octokit/request-error": "^5.0.0", + "@octokit/types": "^11.1.0", "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz", + "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==", "dev": true, "dependencies": { - "@octokit/types": "^9.0.0", + "@octokit/types": "^11.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/rest": { - "version": "19.0.7", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz", - "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==", + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.0.1.tgz", + "integrity": "sha512-wROV21RwHQIMNb2Dgd4+pY+dVy1Dwmp85pBrgr6YRRDYRBu9Gb+D73f4Bl2EukZSj5hInq2Tui9o7gAQpc2k2Q==", "dev": true, "dependencies": { - "@octokit/core": "^4.1.0", - "@octokit/plugin-paginate-rest": "^6.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.0.0" + "@octokit/core": "^5.0.0", + "@octokit/plugin-paginate-rest": "^8.0.0", + "@octokit/plugin-request-log": "^4.0.0", + "@octokit/plugin-rest-endpoint-methods": "^9.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@octokit/types": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz", - "integrity": "sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz", + "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@pkgr/utils/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@pkgr/utils/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^16.0.0" + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@pkgr/utils/node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@react-native-community/cli": { @@ -21491,9 +21555,15 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "node_modules/@types/minimist": { @@ -21503,9 +21573,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==" + "version": "20.4.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.5.tgz", + "integrity": "sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -21529,9 +21599,9 @@ } }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "node_modules/@types/sinonjs__fake-timers": { @@ -21583,32 +21653,34 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.58.0.tgz", - "integrity": "sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.2.0.tgz", + "integrity": "sha512-rClGrMuyS/3j0ETa1Ui7s6GkLhfZGKZL3ZrChLeAiACBE/tRc1wq8SNZESUuluxhLj9FkUefRs2l6bCIArWBiQ==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/type-utils": "5.58.0", - "@typescript-eslint/utils": "5.58.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.2.0", + "@typescript-eslint/type-utils": "6.2.0", + "@typescript-eslint/utils": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -21617,25 +21689,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz", - "integrity": "sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.2.0.tgz", + "integrity": "sha512-igVYOqtiK/UsvKAmmloQAruAdUHihsOCvplJpplPZ+3h4aDkC/UKZZNKgB6h93ayuYLuEymU3h8nF1xMRbh37g==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", + "@typescript-eslint/scope-manager": "6.2.0", + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/typescript-estree": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -21644,16 +21717,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz", - "integrity": "sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.2.0.tgz", + "integrity": "sha512-1ZMNVgm5nnHURU8ZSJ3snsHzpFeNK84rdZjluEVBGNu7jDymfqceB3kdIZ6A4xCfEFFhRIB6rF8q/JIqJd2R0Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0" + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -21661,25 +21734,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.58.0.tgz", - "integrity": "sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.2.0.tgz", + "integrity": "sha512-DnGZuNU2JN3AYwddYIqrVkYW0uUQdv0AY+kz2M25euVNlujcN2u+rJgfJsBFlUEzBB6OQkUqSZPyuTLf2bP5mw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.58.0", - "@typescript-eslint/utils": "5.58.0", + "@typescript-eslint/typescript-estree": "6.2.0", + "@typescript-eslint/utils": "6.2.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -21688,12 +21761,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz", - "integrity": "sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.2.0.tgz", + "integrity": "sha512-1nRRaDlp/XYJQLvkQJG5F3uBTno5SHPT7XVcJ5n1/k2WfNI28nJsvLakxwZRNY5spuatEKO7d5nZWsQpkqXwBA==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -21701,21 +21774,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz", - "integrity": "sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.2.0.tgz", + "integrity": "sha512-Mts6+3HQMSM+LZCglsc2yMIny37IhUgp1Qe8yJUYVyO6rHP7/vN0vajKu3JvHCBIy8TSiKddJ/Zwu80jhnGj1w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0", + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/visitor-keys": "6.2.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -21728,42 +21801,41 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.58.0.tgz", - "integrity": "sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.2.0.tgz", + "integrity": "sha512-RCFrC1lXiX1qEZN8LmLrxYRhOkElEsPKTVSNout8DMzf8PeWoQG7Rxz2SadpJa3VSh5oYKGwt7j7X/VRg+Y3OQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.2.0", + "@typescript-eslint/types": "6.2.0", + "@typescript-eslint/typescript-estree": "6.2.0", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz", - "integrity": "sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.2.0.tgz", + "integrity": "sha512-QbaYUQVKKo9bgCzpjz45llCfwakyoxHetIy8CAvYCtd16Zu1KrpzNHofwF8kGkpPOxZB2o6kz+0nqH8ZkIzuoQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.58.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.2.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -22220,12 +22292,44 @@ "node": ">=0.10.0" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -22245,6 +22349,62 @@ "node": ">=0.10.0" } }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -23081,6 +23241,15 @@ "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", "dev": true }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -23134,6 +23303,18 @@ "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", "dev": true }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -23229,6 +23410,21 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -24589,6 +24785,162 @@ "node": ">=0.10.0" } }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-browser/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/default-browser/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -24602,6 +24954,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -24949,6 +25329,99 @@ "node": ">= 0.8" } }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/esbuild": { "version": "0.14.54", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", @@ -25414,6 +25887,52 @@ "typescript": "*" } }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/eslint-plugin-header": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", @@ -25423,44 +25942,89 @@ "eslint": ">=7.7.0" } }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", "dev": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=4" }, "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } + "engines": { + "node": ">=0.10.0" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/eslint-plugin-prettier": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" }, "engines": { - "node": ">=8.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -25566,15 +26130,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -25952,9 +26507,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -26433,6 +26988,33 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -26452,12 +27034,13 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -26575,6 +27158,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -26728,6 +27327,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -26771,6 +27385,12 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/graphql": { "version": "15.8.0", "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.8.0.tgz", @@ -26821,6 +27441,15 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -26830,6 +27459,29 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -27169,6 +27821,20 @@ "node": ">=10" } }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -27214,12 +27880,54 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -27275,6 +27983,21 @@ "node": ">=0.10.0" } }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", @@ -27300,6 +28023,21 @@ "node": ">=0.10.0" } }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", @@ -27379,6 +28117,24 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-installed-globally": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", @@ -27405,6 +28161,18 @@ "node": ">=8" } }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -27414,6 +28182,21 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", @@ -27450,6 +28233,34 @@ "node": ">=0.10.0" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -27461,6 +28272,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-text-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", @@ -27509,6 +28350,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -30538,6 +31391,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -30551,6 +31413,24 @@ "node": ">=0.10.0" } }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -30564,6 +31444,23 @@ "node": ">=0.10.0" } }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/obliterator": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz", @@ -30989,15 +31886,15 @@ } }, "node_modules/prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -31182,6 +32079,12 @@ "node": ">=0.4.x" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -31694,6 +32597,23 @@ "node": ">=0.10.0" } }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexpu-core": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", @@ -31780,6 +32700,12 @@ "dev": true, "peer": true }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, "node_modules/resolve": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", @@ -31898,6 +32824,65 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -31930,6 +32915,30 @@ "tslib": "^2.1.0" } }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -31959,6 +32968,20 @@ "ret": "~0.1.10" } }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-stable-stringify": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", @@ -32991,6 +34014,51 @@ "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/stringify-package": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", @@ -33102,6 +34170,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", @@ -33230,6 +34314,18 @@ "readable-stream": "3" } }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -33322,16 +34418,27 @@ } }, "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { - "node": ">=0.8" + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" } }, "node_modules/tr46": { @@ -33354,6 +34461,18 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, + "node_modules/ts-api-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", + "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-jest": { "version": "29.1.0", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", @@ -33406,31 +34525,43 @@ "node": ">=12" } }, - "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { - "tslib": "^1.8.1" + "minimist": "^1.2.0" }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "node": ">=4" } }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", "dev": true }, "node_modules/tunnel-agent": { @@ -33484,6 +34615,71 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -33550,6 +34746,21 @@ "ulid": "bin/cli.js" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/unfetch": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", @@ -33775,6 +34986,16 @@ "querystring": "0.2.0" } }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/url/node_modules/punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", @@ -33955,6 +35176,22 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -33963,16 +35200,15 @@ "peer": true }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -34016,9 +35252,9 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" diff --git a/source/package.json b/source/package.json index a9208e0..01b5308 100644 --- a/source/package.json +++ b/source/package.json @@ -1,6 +1,6 @@ { "name": "rapm-solution", - "version": "1.0.0", + "version": "1.2.0", "description": "Reusable Application Patterns Manager Solution", "author": { "name": "Amazon Web Services", @@ -30,15 +30,15 @@ "devDependencies": { "@aws-sdk/client-cloudformation": "^3.264.0", "@aws-sdk/client-codeartifact": "^3.264.0", + "@aws-sdk/client-codecommit": "^3.264.0", "@aws-sdk/client-dynamodb": "^3.264.0", "@aws-sdk/client-service-catalog": "^3.264.0", "@aws-sdk/client-ssm": "^3.264.0", - "@aws-sdk/client-codecommit": "^3.264.0", - "@octokit/rest": "^19.0.7", + "@octokit/rest": "^20.0.1", "@types/archiver": "^5.3.1", "@types/jest": "^29.1.0", - "@typescript-eslint/eslint-plugin": "^5.31.0", - "@typescript-eslint/parser": "^5.31.0", + "@typescript-eslint/eslint-plugin": "^6.2.0", + "@typescript-eslint/parser": "^6.2.0", "archiver": "^5.3.0", "aws-amplify": "^5.0.12", "aws-cdk": "^2.85.0", @@ -50,9 +50,10 @@ "eslint-config-prettier": "^8.5.0", "eslint-config-typescript": "^3.0.0", "eslint-plugin-header": "^3.1.1", - "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-prettier": "^5.0.0", "jest": "^29.3.1", - "prettier": "^2.7.1", + "prettier": "^3.0.0", "standard-version": "^9.3.1", "ts-jest": "^29.0.3", "typescript": "^5.0.4" @@ -60,7 +61,7 @@ "dependencies": { "@aws-cdk/aws-servicecatalogappregistry-alpha": "^2.85.0-alpha.0", "@aws-cdk/aws-synthetics-alpha": "^2.85.0-alpha.0", - "@types/node": "^18.7.23", + "@types/node": "^20.4.5", "aws-cdk-lib": "^2.85.0", "aws-sdk": "^2.1354.0", "cdk-nag": "^2.15.51", @@ -70,6 +71,8 @@ }, "overrides": { "fast-xml-parser": "^4.2.5", - "semver": "^7.5.3" + "semver": "^7.5.3", + "word-wrap": "^1.2.5", + "tough-cookie": "^4.1.3" } }