diff --git a/.yarnrc.yml b/.yarnrc.yml index 964557a9..69bbd873 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -1,9 +1,9 @@ npmScopes: cloudgraph: + npmAlwaysAuth: true + npmAuthToken: $NPM_TOKEN npmPublishRegistry: "https://registry.npmjs.com/" npmRegistryServer: "https://registry.npmjs.com/" - npmAlwaysAuth: true - npmAuthToken: "$NPM_TOKEN" plugins: - path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs diff --git a/package.json b/package.json index e3981007..89e60658 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,22 @@ { "name": "policy-packs", + "version": "0.0.0", + "description": "CloudGraph CSPM policy packs monorepo", "packageManager": "yarn@3.2.0", "private": true, + "repository": { + "type": "git", + "url": "git+https://github.com/cloudgraphdev/cloudgraph-policy-packs.git" + }, "workspaces": [ "src/**/*" ], "devDependencies": { - "@qiwi/multi-semantic-release": "^6.0.2", + "@qiwi/multi-semantic-release": "^6.1.1", "@semantic-release/changelog": "^6.0.1", "@semantic-release/git": "^10.0.1", - "@semantic-release/gitlab": "^8.0.1", + "@semantic-release/github": "^8.0.1", + "@semantic-release/npm": "^9.0.1", "@semrel-extra/npm": "^1.2.0", "semantic-release": "^19.0.2" }, @@ -24,6 +31,14 @@ "singleQuote": true }, "scripts": { - "release": "multi-semantic-release" + "release": "NPM_CONFIG_IGNORE_SCRIPTS='true' NODE_JQ_SKIP_INSTALL_BINARY='true' multi-semantic-release", + "clean": "yarn workspaces foreach -p run clean", + "lint": "yarn workspaces foreach run lint", + "lint:fix": "yarn workspaces foreach run lint:fix", + "prebuild": "tsc -b", + "build": "yarn workspaces foreach run build" + }, + "dependencies": { + "lodash": "^4.17.21" } } diff --git a/src/aws/cis-1.2.0/.releaserc.yml b/src/aws/cis-1.2.0/.releaserc.yml index 70788a7a..cba7db8c 100644 --- a/src/aws/cis-1.2.0/.releaserc.yml +++ b/src/aws/cis-1.2.0/.releaserc.yml @@ -1,10 +1,13 @@ --- branches: - - name: main - - name: beta - prerelease: true - name: alpha + channel: alpha prerelease: true + - name: beta + channel: beta + prerelease: true + - name: main + plugins: - "@semantic-release/commit-analyzer" - "@semantic-release/release-notes-generator" @@ -12,24 +15,23 @@ plugins: - changelogFile: CHANGELOG.md - - "@semantic-release/git" - assets: - - CHANGELOG.md - - package.json - - - "@semantic-release/npm" - - npmPublish: false - - "@semantic-release/gitlab" + - CHANGELOG.md + - package.json + - - "@semrel-extra/npm" + - npmPublish: true + - "@semantic-release/github" verifyConditions: - "@semantic-release/changelog" - - "@semantic-release/gitlab" + - "@semantic-release/github" + - "@semrel-extra/npm" prepare: - "@semantic-release/changelog" - - "@semantic-release/npm" + - "@semrel-extra/npm" - - "@semantic-release/git" - - message: "chore(publish): ${nextRelease.version} \n\n${nextRelease.notes}" + - message: "chore(release): ${nextRelease.version} \n\n${nextRelease.notes}" publish: - - "@semantic-release/gitlab" -release: - noCi: true + - "@semantic-release/github" + - "@semrel-extra/npm" success: false fail: false -repositoryUrl: https://gitlab.com/auto-cloud/cloudgraph/policy-packs.git tagFormat: "${version}" diff --git a/src/aws/cis-1.2.0/CHANGELOG.md b/src/aws/cis-1.2.0/CHANGELOG.md index 82cc3237..568d602e 100644 --- a/src/aws/cis-1.2.0/CHANGELOG.md +++ b/src/aws/cis-1.2.0/CHANGELOG.md @@ -1,3 +1,18 @@ +# @cloudgraph/policy-pack-aws-cis-1.2.0 [0.11.0-alpha.1](https://github.com/cloudgraphdev/cloudgraph-policy-packs/compare/@cloudgraph/policy-pack-aws-cis-1.2.0@0.10.1-alpha.1...@cloudgraph/policy-pack-aws-cis-1.2.0@0.11.0-alpha.1) (2022-04-27) + + +### Features + +* Included 6.x rules for aws nist 800-53 ([b51f652](https://github.com/cloudgraphdev/cloudgraph-policy-packs/commit/b51f6522e7721928ea8dc30d009ac5530f6e86eb)) + +## @cloudgraph/policy-pack-aws-cis-1.2.0 [0.10.1-alpha.1](https://github.com/cloudgraphdev/cloudgraph-policy-packs/compare/@cloudgraph/policy-pack-aws-cis-1.2.0@0.10.0...@cloudgraph/policy-pack-aws-cis-1.2.0@0.10.1-alpha.1) (2022-04-26) + + +### Bug Fixes + +* rename vpc flowLogs connection to FlowLog ([c31e985](https://github.com/cloudgraphdev/cloudgraph-policy-packs/commit/c31e985b4a2623fb01f8a29a4c5897becb2e4905)) +* Updated policy field for S3 schema ([dc3d6c8](https://github.com/cloudgraphdev/cloudgraph-policy-packs/commit/dc3d6c8b4b7e22ba58c1394d0b64e866ab3de519)) + # @cloudgraph/policy-pack-aws-cis-1.2.0 [0.10.0](https://gitlab.com/auto-cloud/cloudgraph/policy-packs/compare/@cloudgraph/policy-pack-aws-cis-1.2.0@0.9.3...@cloudgraph/policy-pack-aws-cis-1.2.0@0.10.0) (2022-04-01) diff --git a/src/aws/cis-1.2.0/package.json b/src/aws/cis-1.2.0/package.json index dca46d5c..7e735008 100644 --- a/src/aws/cis-1.2.0/package.json +++ b/src/aws/cis-1.2.0/package.json @@ -1,7 +1,7 @@ { "name": "@cloudgraph/policy-pack-aws-cis-1.2.0", "description": "Policy pack implementing CIS Amazon Web Services Foundations 1.2.0 Benchmark", - "version": "0.10.0", + "version": "0.11.0-alpha.1", "author": "AutoCloud", "license": "MPL-2.0", "main": "dist/index.js", @@ -43,7 +43,7 @@ "typescript": "^4.3.5" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" }, "homepage": "https://www.cloudgraph.dev/", "keywords": [ @@ -54,10 +54,10 @@ "singleQuote": true }, "scripts": { - "build": "yarn prepublish", + "build": "yarn prepack", + "clean": "rm -rf dist", "lint": "eslint", - "prepack": "rm -rf dist && tsc -b", - "prepublish": "rm -rf dist && tsc", + "prepack": "yarn clean && tsc -b", "publish": "yarn npm publish", "test": "NODE_ENV=test jest" } diff --git a/src/aws/cis-1.2.0/rules/aws-cis-1.2.0-2.3.ts b/src/aws/cis-1.2.0/rules/aws-cis-1.2.0-2.3.ts index 3af56f3f..ddf11cb4 100644 --- a/src/aws/cis-1.2.0/rules/aws-cis-1.2.0-2.3.ts +++ b/src/aws/cis-1.2.0/rules/aws-cis-1.2.0-2.3.ts @@ -64,14 +64,12 @@ export default { accountId __typename s3 { - bucketPolicies { - policy { - statement { - effect - principal { - key - value - } + policy { + statement { + effect + principal { + key + value } } } @@ -84,32 +82,29 @@ export default { not: { path: '@.s3', array_any: { - path: '[*].bucketPolicies', + path: '[*].policy.statement', array_any: { - path: '[*].policy.statement', - array_any: { - and: [ - { - path: '[*].effect', - equal: 'Allow', + and: [ + { + path: '[*].effect', + equal: 'Allow', + }, + { + path: '[*].principal', + array_any: { + and: [ + { + path: '[*].key', + in: ['', 'AWS'], + }, + { + path: '[*].value', + contains: '*', + }, + ], }, - { - path: '[*].principal', - array_any: { - and: [ - { - path: '[*].key', - in: ['', 'AWS'], - }, - { - path: '[*].value', - contains: '*', - }, - ], - }, - }, - ], - }, + }, + ], }, }, }, diff --git a/src/aws/cis-1.2.0/rules/aws-cis-1.2.0-2.4.ts b/src/aws/cis-1.2.0/rules/aws-cis-1.2.0-2.4.ts index 79cae70c..94e2d62b 100644 --- a/src/aws/cis-1.2.0/rules/aws-cis-1.2.0-2.4.ts +++ b/src/aws/cis-1.2.0/rules/aws-cis-1.2.0-2.4.ts @@ -75,10 +75,10 @@ export default { resource: 'queryawsCloudtrail[*]', severity: 'medium', conditions: { - or: [ + and: [ { path: '@.cloudWatchLogsLogGroupArn', - equal: null, + notEqual: null, }, { value: { diff --git a/src/aws/cis-1.2.0/rules/aws-cis-1.2.0-2.9.ts b/src/aws/cis-1.2.0/rules/aws-cis-1.2.0-2.9.ts index f472d39e..4ceedd2b 100644 --- a/src/aws/cis-1.2.0/rules/aws-cis-1.2.0-2.9.ts +++ b/src/aws/cis-1.2.0/rules/aws-cis-1.2.0-2.9.ts @@ -41,7 +41,7 @@ export default { arn accountId __typename - flowLogs { + flowLog { resourceId } } @@ -49,7 +49,7 @@ export default { resource: 'queryawsVpc[*]', severity: 'medium', conditions: { - path: '@.flowLogs', + path: '@.flowLog', isEmpty: false, }, } diff --git a/src/aws/cis-1.2.0/tests/aws-cis-1.2.0-2.x.test.ts b/src/aws/cis-1.2.0/tests/aws-cis-1.2.0-2.x.test.ts index 4fd4655c..da42b4f6 100644 --- a/src/aws/cis-1.2.0/tests/aws-cis-1.2.0-2.x.test.ts +++ b/src/aws/cis-1.2.0/tests/aws-cis-1.2.0-2.x.test.ts @@ -210,23 +210,19 @@ describe('CIS Amazon Web Services Foundations: 1.2.0', () => { id: cuid(), s3: [ { - bucketPolicies: [ - { - policy: { - statement: [ + policy: { + statement: [ + { + effect: 'Allow', + principal: [ { - effect: 'Allow', - principal: [ - { - key: 'Service', - value: ['cloudtrail.amazonaws.com'], - }, - ], + key: 'Service', + value: ['cloudtrail.amazonaws.com'], }, ], }, - }, - ], + ], + }, }, ], }, @@ -248,23 +244,19 @@ describe('CIS Amazon Web Services Foundations: 1.2.0', () => { id: cuid(), s3: [ { - bucketPolicies: [ - { - policy: { - statement: [ + policy: { + statement: [ + { + effect: 'Allow', + principal: [ { - effect: 'Allow', - principal: [ - { - key: '', - value: ['*'], - }, - ], + key: '', + value: ['*'], }, ], }, - }, - ], + ], + }, }, ], }, @@ -286,23 +278,19 @@ describe('CIS Amazon Web Services Foundations: 1.2.0', () => { id: cuid(), s3: [ { - bucketPolicies: [ - { - policy: { - statement: [ + policy: { + statement: [ + { + effect: 'Allow', + principal: [ { - effect: 'Allow', - principal: [ - { - key: 'AWS', - value: ['*'], - }, - ], + key: 'AWS', + value: ['*'], }, ], }, - }, - ], + ], + }, }, ], }, @@ -360,7 +348,7 @@ describe('CIS Amazon Web Services Foundations: 1.2.0', () => { expect(processedRule.result).toBe(Result.FAIL) }) - test('Should pass when a trail does not have cloudwatch logs integrated', async () => { + test('Should fail when a trail does not have cloudwatch logs integrated', async () => { const data = { queryawsCloudtrail: [ { @@ -375,7 +363,7 @@ describe('CIS Amazon Web Services Foundations: 1.2.0', () => { { ...data } as any ) - expect(processedRule.result).toBe(Result.PASS) + expect(processedRule.result).toBe(Result.FAIL) }) }) @@ -712,7 +700,7 @@ describe('CIS Amazon Web Services Foundations: 1.2.0', () => { queryawsVpc: [ { id: cuid(), - flowLogs: [ + flowLog: [ { resourceId: cuid(), }, @@ -734,7 +722,7 @@ describe('CIS Amazon Web Services Foundations: 1.2.0', () => { queryawsVpc: [ { id: cuid(), - flowLogs: [], + flowLog: [], }, ], } diff --git a/src/aws/nist-800-53-rev4/.releaserc.yml b/src/aws/nist-800-53-rev4/.releaserc.yml index 70788a7a..cba7db8c 100644 --- a/src/aws/nist-800-53-rev4/.releaserc.yml +++ b/src/aws/nist-800-53-rev4/.releaserc.yml @@ -1,10 +1,13 @@ --- branches: - - name: main - - name: beta - prerelease: true - name: alpha + channel: alpha prerelease: true + - name: beta + channel: beta + prerelease: true + - name: main + plugins: - "@semantic-release/commit-analyzer" - "@semantic-release/release-notes-generator" @@ -12,24 +15,23 @@ plugins: - changelogFile: CHANGELOG.md - - "@semantic-release/git" - assets: - - CHANGELOG.md - - package.json - - - "@semantic-release/npm" - - npmPublish: false - - "@semantic-release/gitlab" + - CHANGELOG.md + - package.json + - - "@semrel-extra/npm" + - npmPublish: true + - "@semantic-release/github" verifyConditions: - "@semantic-release/changelog" - - "@semantic-release/gitlab" + - "@semantic-release/github" + - "@semrel-extra/npm" prepare: - "@semantic-release/changelog" - - "@semantic-release/npm" + - "@semrel-extra/npm" - - "@semantic-release/git" - - message: "chore(publish): ${nextRelease.version} \n\n${nextRelease.notes}" + - message: "chore(release): ${nextRelease.version} \n\n${nextRelease.notes}" publish: - - "@semantic-release/gitlab" -release: - noCi: true + - "@semantic-release/github" + - "@semrel-extra/npm" success: false fail: false -repositoryUrl: https://gitlab.com/auto-cloud/cloudgraph/policy-packs.git tagFormat: "${version}" diff --git a/src/aws/nist-800-53-rev4/CHANGELOG.md b/src/aws/nist-800-53-rev4/CHANGELOG.md index d3342a15..e94d412e 100644 --- a/src/aws/nist-800-53-rev4/CHANGELOG.md +++ b/src/aws/nist-800-53-rev4/CHANGELOG.md @@ -1,3 +1,23 @@ +# @cloudgraph/policy-pack-aws-nist-800-53-rev4 [1.4.0-alpha.1](https://github.com/cloudgraphdev/cloudgraph-policy-packs/compare/@cloudgraph/policy-pack-aws-nist-800-53-rev4@1.3.0...@cloudgraph/policy-pack-aws-nist-800-53-rev4@1.4.0-alpha.1) (2022-04-27) + + +### Bug Fixes + +* Added missing fields for aws benchmarks ([dfd5874](https://github.com/cloudgraphdev/cloudgraph-policy-packs/commit/dfd5874e7d015ec5e6ab82fc419faf82a0b8cd4b)) +* Updated policy field for S3 schema ([dc3d6c8](https://github.com/cloudgraphdev/cloudgraph-policy-packs/commit/dc3d6c8b4b7e22ba58c1394d0b64e866ab3de519)) + + +### Features + +* Included 6.x rules for aws nist 800-53 ([ab399f0](https://github.com/cloudgraphdev/cloudgraph-policy-packs/commit/ab399f01ba04db767d71a49d4b74d6c0b24923ba)) +* Included 6.x rules for aws nist 800-53 ([b51f652](https://github.com/cloudgraphdev/cloudgraph-policy-packs/commit/b51f6522e7721928ea8dc30d009ac5530f6e86eb)) +* Included 6.x rules for aws nist 800-53 ([03b9889](https://github.com/cloudgraphdev/cloudgraph-policy-packs/commit/03b9889416e58165214b12fd772c116ce971644b)) +* Included 7.x rules for aws nist 800-53 rev4 ([4ab8b83](https://github.com/cloudgraphdev/cloudgraph-policy-packs/commit/4ab8b834f08cec9558d339d0f4540b9146adfe8c)) +* Included 7.x rules for aws nist 800-53 rev4 ([bfc130c](https://github.com/cloudgraphdev/cloudgraph-policy-packs/commit/bfc130c587e206cebf1784e14a1b9e43f900a47c)) +* Included 8.x rules for aws nist 800-53 ([3720e97](https://github.com/cloudgraphdev/cloudgraph-policy-packs/commit/3720e976e70196277186a764becb663d9afc39b2)) +* Included 8.x rules for aws nist 800-53 rev4 ([d597677](https://github.com/cloudgraphdev/cloudgraph-policy-packs/commit/d5976779f8a803cfd5c831ffb769d10065c62374)) +* Support rules that overlaps with AWS CIS checks [NETWORK ACCESS RULES] ([b96e357](https://github.com/cloudgraphdev/cloudgraph-policy-packs/commit/b96e357099696691f61f06a2d484be7c2f6c7c22)) + # @cloudgraph/policy-pack-aws-nist-800-53-rev4 [1.3.0](https://gitlab.com/auto-cloud/cloudgraph/policy-packs/compare/@cloudgraph/policy-pack-aws-nist-800-53-rev4@1.2.0...@cloudgraph/policy-pack-aws-nist-800-53-rev4@1.3.0) (2022-04-01) diff --git a/src/aws/nist-800-53-rev4/README.md b/src/aws/nist-800-53-rev4/README.md index 9cae08cc..f2a8e78e 100644 --- a/src/aws/nist-800-53-rev4/README.md +++ b/src/aws/nist-800-53-rev4/README.md @@ -56,37 +56,114 @@ Policy Pack based on the [800-53 Rev. 4](https://csrc.nist.gov/publications/deta ## Available Ruleset -| Rule | Description | -| ------------ | -------------------------------------------------------------------------------------------------------- | -| AWS NIS 1.1 | IAM role trust policies should not allow all principals to assume the role | -| AWS NIS 1.2 | IAM roles attached to instance profiles should not allow broad list actions on S3 buckets | -| AWS NIS 1.3 | S3 bucket ACLs should not have public access on S3 buckets that store CloudTrail log files | -| AWS NIS 2.1 | Auto Scaling groups should span two or more availability zones | -| AWS NIS 2.2 | ELBv1 load balancer cross zone load balancing should be enabled | -| AWS NIS 2.3 | RDS Aurora cluster multi-AZ should be enabled | -| AWS NIS 2.4 | Require Multi Availability Zones turned on for RDS Instances | -| AWS NIS 2.5 | S3 bucket replication (cross-region or same-region) should be enabled | -| AWS NIS 3.1 | CloudTrail log files should be encrypted with customer managed KMS keys | -| AWS NIS 3.2 | CloudWatch log groups should be encrypted with customer managed KMS keys | -| AWS NIS 3.3 | DynamoDB tables should be encrypted with AWS or customer managed KMS keys | -| AWS NIS 3.4 | EBS volume encryption should be enabled | -| AWS NIS 3.5 | RDS instances should be encrypted | -| AWS NIS 3.6 | S3 bucket server-side encryption should be enabled | -| AWS NIS 3.7 | SQS queue server-side encryption should be enabled with KMS keys | -| AWS NIS 4.1 | CloudFront distribution origin should be set to S3 or origin protocol policy should be set to https-only | -| AWS NIS 4.2 | CloudFront viewer protocol policy should be set to https-only or redirect-to-https | -| AWS NIS 4.3 | ElastiCache transport encryption should be enabled | -| AWS NIS 4.4 | ELBv1 listener protocol should not be set to http | -| AWS NIS 4.5 | S3 bucket policies should only allow requests that use HTTPS | -| AWS NIS 4.6 | SNS subscriptions should deny access via HTTP | -| AWS NIS 6.1 | CloudFront access logging should be enabled | -| AWS NIS 6.4 | CloudTrail should have at least one CloudTrail trail set to a multi-region trail | -| AWS NIS 6.6 | CloudTrail trails should be configured to log management events | -| AWS NIS 6.8 | Exactly one CloudTrail trail should monitor global services | -| AWS NIS 6.9 | Load balancer access logging should be enabled | -| AWS NIS 6.12 | S3 bucket object-level logging for read events should be enabled | -| AWS NIS 6.13 | S3 bucket object-level logging for write events should be enabled | -| AWS NIS 11.1 | ECS task definitions should limit memory usage for containers | -| AWS NIS 11.2 | ECS task definitions should set CPU limit for containers | - - \ No newline at end of file +| Rule | Description | +| ------------- | ---------------------------------------------------------------------------------------------------------------------------------- | +| AWS NIST 1.1 | IAM role trust policies should not allow all principals to assume the role | +| AWS NIST 1.2 | IAM roles attached to instance profiles should not allow broad list actions on S3 buckets | +| AWS NIST 1.3 | S3 bucket ACLs should not have public access on S3 buckets that store CloudTrail log files | +| AWS NIST 2.1 | Auto Scaling groups should span two or more availability zones | +| AWS NIST 2.2 | ELBv1 load balancer cross zone load balancing should be enabled | +| AWS NIST 2.3 | RDS Aurora cluster multi-AZ should be enabled | +| AWS NIST 2.4 | Require Multi Availability Zones turned on for RDS Instances | +| AWS NIST 2.5 | S3 bucket replication (cross-region or same-region) should be enabled | +| AWS NIST 3.1 | CloudTrail log files should be encrypted with customer managed KMS keys | +| AWS NIST 3.2 | CloudWatch log groups should be encrypted with customer managed KMS keys | +| AWS NIST 3.3 | DynamoDB tables should be encrypted with AWS or customer managed KMS keys | +| AWS NIST 3.4 | EBS volume encryption should be enabled | +| AWS NIST 3.5 | RDS instances should be encrypted | +| AWS NIST 3.6 | S3 bucket server-side encryption should be enabled | +| AWS NIST 3.7 | SQS queue server-side encryption should be enabled with KMS keys | +| AWS NIST 4.1 | CloudFront distribution origin should be set to S3 or origin protocol policy should be set to https-only | +| AWS NIST 4.2 | CloudFront viewer protocol policy should be set to https-only or redirect-to-https | +| AWS NIST 4.3 | ElastiCache transport encryption should be enabled | +| AWS NIST 4.4 | ELBv1 listener protocol should not be set to http | +| AWS NIST 4.5 | S3 bucket policies should only allow requests that use HTTPS | +| AWS NIST 4.6 | SNS subscriptions should deny access via HTTP | +| AWS NIST 6.1 | CloudFront access logging should be enabled | +| AWS NIST 6.2 | CloudTrail log file validation should be enabled | +| AWS NIST 6.3 | CloudTrail should be enabled in all regions | +| AWS NIST 6.4 | CloudTrail should have at least one CloudTrail trail set to a multi-region trail | +| AWS NIST 6.5 | CloudTrail trails should be configured to log data events for S3 buckets | +| AWS NIST 6.6 | CloudTrail trails should be configured to log management events | +| AWS NIST 6.7 | CloudTrail trails should have CloudWatch log integration enabled | +| AWS NIST 6.8 | Exactly one CloudTrail trail should monitor global services | +| AWS NIST 6.9 | Load balancer access logging should be enabled | +| AWS NIST 6.10 | S3 bucket access logging should be enabled | +| AWS NIST 6.11 | S3 bucket access logging should be enabled on S3 buckets that store CloudTrail log files | +| AWS NIST 6.12 | S3 bucket object-level logging for read events should be enabled | +| AWS NIST 6.13 | S3 bucket object-level logging for write events should be enabled | +| AWS NIST 6.14 | VPC flow logging should be enabled | +| AWS NIST 7.1 | Alarm for denied connections in CloudFront logs should be configured | +| AWS NIST 7.3 | CloudWatch log metric filter and alarm for AWS Organizations changes should be configured for the master account | +| AWS NIST 7.3 | CloudWatch log metric filter and alarm for changes to VPC NACLs should be configured | +| AWS NIST 7.4 | CloudWatch log metric filter and alarm for changes to VPC network gateways should be configured | +| AWS NIST 7.5 | CloudWatch log metric filter and alarm for CloudTrail configuration changes should be configured | +| AWS NIST 7.7 | CloudWatch log metric filter and alarm for IAM policy changes should be configured | +| AWS NIST 7.8 | CloudWatch log metric filter and alarm for Management Console authentication failures should be configured | +| AWS NIST 7.9 | CloudWatch log metric filter and alarm for Management Console sign-in without MFA should be configured | +| AWS NIST 7.10 | CloudWatch log metric filter and alarm for unauthorized API calls should be configured | +| AWS NIST 7.11 | CloudWatch log metric filter and alarm for usage of root account should be configured | +| AWS NIST 7.12 | CloudWatch log metric filter and alarm for VPC changes should be configured | +| AWS NIST 7.13 | CloudWatch log metric filter and alarm for VPC route table changes should be configured | +| AWS NIST 7.14 | CloudWatch log metric filter and alarm for VPC security group changes should be configured | +| AWS NIST 8.1 | ELB listener security groups should not be set to TCP all | +| AWS NIST 8.2 | VPC default security group should restrict all traffic | +| AWS NIST 8.3 | VPC network ACLs should not allow ingress from 0.0.0.0/0 to TCP/UDP port 22 | +| AWS NIST 8.4 | AWS NIST 8.4 VPC network ACLs should not allow ingress from 0.0.0.0/0 to TCP/UDP port 3389 | +| AWS NIST 8.5 | VPC security group inbound rules should not permit ingress from ‘0.0.0.0/0’ to all ports and protocols | +| AWS NIST 8.6 | VPC security group inbound rules should not permit ingress from a public address to all ports and protocols | +| AWS NIST 8.7 | VPC security group inbound rules should not permit ingress from any address to all ports and protocols | +| AWS NIST 8.8 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ except to ports 80 and 443 | +| AWS NIST 8.9 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to port 3389 (Remote Desktop Protocol) | +| AWS NIST 8.10 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 61621 (Cassandra OpsCenter Agent) | +| AWS NIST 8.11 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 636 (LDAP SSL) | +| AWS NIST 8.12 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 7001 (Cassandra) | +| AWS NIST 8.13 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 11214 (Memcached SSL) | +| AWS NIST 8.14 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 11215 (Memcached SSL) | +| AWS NIST 8.15 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 135 (MSSQL Debugger) | +| AWS NIST 8.16 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 137 (NetBIOS Name Service) | +| AWS NIST 8.17 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 138 (NetBios Datagram Service) | +| AWS NIST 8.18 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 139 (NetBios Session Service) | +| AWS NIST 8.19 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 1433 (MSSQL Server) | +| AWS NIST 8.20 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 1434 (MSSQL Admin) | +| AWS NIST 8.21 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to port 22 (SSH) | +| AWS NIST 8.22 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 23 (Telnet) | +| AWS NIST 8.23 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 2379 (etcd) | +| AWS NIST 8.24 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 2382 (SQL Server Analysis Services browser) | +| AWS NIST 8.25 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 2383 (SQL Server Analysis Services) | +| AWS NIST 8.26 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 2484 (Oracle DB SSL) | +| AWS NIST 8.27 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 27017 (MongoDB) | +| AWS NIST 8.28 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 27018 (MongoDB) | +| AWS NIST 8.29 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 27019 (MongoDB) | +| AWS NIST 8.30 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 3000 (Ruby on Rails web server) | +| AWS NIST 8.31 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 3020 (CIFS / SMB) | +| AWS NIST 8.32 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 3306 (MySQL) | +| AWS NIST 8.33 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 4505 (SaltStack Master) | +| AWS NIST 8.34 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 4506 (SaltStack Master) | +| AWS NIST 8.35 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 5432 (PostgreSQL) | +| AWS NIST 8.36 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 5500 (Virtual Network Computing) | +| AWS NIST 8.37 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 5800 (Virtual Network Computing), unless from ELBs | +| AWS NIST 8.38 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 5900 (Virtual Network Computing) | +| AWS NIST 8.39 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 80 (HTTP), unless from ELBs | +| AWS NIST 8.40 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 8000 (HTTP Alternate) | +| AWS NIST 8.41 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 9200 (Elasticsearch) | +| AWS NIST 8.42 | VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 9300 (Elasticsearch) | +| AWS NIST 8.43 | VPC security groups attached to EC2 instances should not permit ingress from ‘0.0.0.0/0’ to all ports | +| AWS NIST 8.44 | VPC security groups attached to EC2 instances should not permit ingress from ‘0.0.0.0/0’ to TCP port 389 (LDAP) | +| AWS NIST 8.45 | VPC security groups attached to RDS instances should not permit ingress from ‘0.0.0.0/0’ to all ports | +| AWS NIST 10.1 | IAM password policies should expire passwords within 90 days | +| AWS NIST 10.2 | IAM password policies should have a minimum length of 7 and include both alphabetic and numeric characters | +| AWS NIST 10.3 | IAM password policies should prevent reuse of previously used passwords | +| AWS NIST 10.4 | IAM password policies should prevent reuse of the four previously used passwords | +| AWS NIST 10.5 | IAM password policies should require at least one lowercase character | +| AWS NIST 10.6 | IAM password policies should require at least one number | +| AWS NIST 10.7 | IAM password policies should require at least one symbol | +| AWS NIST 10.8 | IAM password policies should require at least one uppercase character | +| AWS NIST 11.1 | ECS task definitions should limit memory usage for containers | +| AWS NIST 11.2 | ECS task definitions should set CPU limit for containers | +| AWS NIST 13.1 | IAM multi-factor authentication should be enabled for all IAM users that have a console password | +| AWS NIST 13.2 | IAM should have hardware MFA enabled for the root account | +| AWS NIST 13.3 | IAM should have MFA enabled for the root account | +| AWS NIST 13.4 | IAM users should have MFA (virtual or hardware) enabled | +| AWS NIST 15.3 | IAM root user access key should not exist | +| AWS NIST 15.4 | IAM root user should not be used | diff --git a/src/aws/nist-800-53-rev4/index.ts b/src/aws/nist-800-53-rev4/index.ts index 2dbda72f..0cce75ee 100644 --- a/src/aws/nist-800-53-rev4/index.ts +++ b/src/aws/nist-800-53-rev4/index.ts @@ -4,4 +4,5 @@ export default { provider: 'aws', entity: 'NIST', rules: PolicyPacksRules, + extraFields: ['arn', 'accountId'] } diff --git a/src/aws/nist-800-53-rev4/package-lock.json b/src/aws/nist-800-53-rev4/package-lock.json deleted file mode 100644 index 38eb6c94..00000000 --- a/src/aws/nist-800-53-rev4/package-lock.json +++ /dev/null @@ -1,15359 +0,0 @@ -{ - "name": "@cloudgraph/policy-pack-aws-nist-800-53-rev4", - "version": "1.3.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@cloudgraph/policy-pack-aws-nist-800-53-rev4", - "version": "1.3.0", - "license": "MPL-2.0", - "devDependencies": { - "@autocloud/eslint-config": "^0.1.0", - "@cloudgraph/sdk": "^0.18.1", - "@types/jest": "^27.4.0", - "@types/node": "^15.12.4", - "@types/pino": "^6.3.11", - "@typescript-eslint/eslint-plugin": "^4.28.5", - "@typescript-eslint/parser": "^4.28.5", - "cpx": "^1.5.0", - "cuid": "^2.1.8", - "eslint": "^7.25.0", - "eslint-config-airbnb-base": "14.2.1", - "eslint-config-prettier": "^6.11.0", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-prettier": "^3.4.0", - "jest": "^27.0.6", - "prettier": "^2.4.1", - "shx": "^0.3.3", - "ts-jest": "^27.0.4", - "tslib": "^1", - "typescript": "^4.3.5" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@autocloud/eslint-config": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@autocloud/eslint-config/-/eslint-config-0.1.0.tgz", - "integrity": "sha512-1zn5DKp1BWgpoQ1oxqatIRRUMHlOy46KhupUU/NOHjPCkTE1z/GjtD9f7przoFrLhL0uqw4/vw7aMCCAeDjyew==", - "dev": true, - "dependencies": { - "@typescript-eslint/eslint-plugin": "^4.28.5", - "@typescript-eslint/parser": "^4.28.5", - "eslint": "^7.2.0", - "eslint-config-airbnb-base": "14.2.1", - "eslint-config-prettier": "^6.11.0", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-prettier": "^3.4.0" - }, - "peerDependencies": { - "eslint": ">= 7" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", - "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.8", - "@babel/parser": "^7.17.8", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, - "dependencies": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", - "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", - "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cloudgraph/sdk": { - "version": "0.18.1", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@graphql-tools/load-files": "^6.5.3", - "@graphql-tools/merge": "^8.2.1", - "chalk": "^4.1.1", - "date-fns": "^2.25.0", - "graphql": "^16.2.0", - "inquirer": "^8.1.2", - "jsonpath": "^1.1.1", - "lodash": "^4.17.21", - "node-jq": "2.1.0", - "ora": "^5.4.1" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", - "dev": true, - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", - "dev": true, - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", - "dev": true, - "dependencies": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "27.4.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.1.tgz", - "integrity": "sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==", - "dev": true, - "dependencies": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" - } - }, - "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==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "node_modules/@types/node": { - "version": "15.14.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.9.tgz", - "integrity": "sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==", - "dev": true - }, - "node_modules/@types/pino": { - "version": "6.3.12", - "resolved": "https://registry.npmjs.org/@types/pino/-/pino-6.3.12.tgz", - "integrity": "sha512-dsLRTq8/4UtVSpJgl9aeqHvbh6pzdmjYD3C092SYgLD2TyoCqHpTJk6vp8DvCTGGc7iowZ2MoiYiVUUCcu7muw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/pino-pretty": "*", - "@types/pino-std-serializers": "*", - "sonic-boom": "^2.1.0" - } - }, - "node_modules/@types/pino-pretty": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/@types/pino-pretty/-/pino-pretty-4.7.5.tgz", - "integrity": "sha512-rfHe6VIknk14DymxGqc9maGsRe8/HQSvM2u46EAz2XrS92qsAJnW16dpdFejBuZKD8cRJX6Aw6uVZqIQctMpAg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/pino": "6.3" - } - }, - "node_modules/@types/pino-std-serializers": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/pino-std-serializers/-/pino-std-serializers-2.4.1.tgz", - "integrity": "sha512-17XcksO47M24IVTVKPeAByWUd3Oez7EbIjXpSbzMPhXVzgjGtrOa49gKBwxH9hb8dKv58OelsWQ+A1G1l9S3wQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/prettier": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz", - "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", - "dev": true, - "dependencies": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", - "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/@typescript-eslint/experimental-utils/node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", - "dev": true, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "dependencies": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "dependencies": { - "arr-flatten": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "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", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", - "dev": true, - "dependencies": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "dependencies": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "dependencies": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cache-base/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001322", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001322.tgz", - "integrity": "sha512-neRmrmIrCGuMnxGSoh+x7zYtQFFgnSY2jaomjU56sCkTA6JINqQrxutF459JpWcWRajvoyn95sOXq4Pqrnyjew==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", - "dev": true, - "dependencies": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - }, - "optionalDependencies": { - "fsevents": "^1.0.0" - } - }, - "node_modules/chokidar/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chokidar/node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", - "dev": true - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/convert-source-map/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", - "dev": true, - "hasInstallScript": true - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cpx": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cpx/-/cpx-1.5.0.tgz", - "integrity": "sha1-GFvgGFEdhycN7czCkxceN2VauI8=", - "dev": true, - "dependencies": { - "babel-runtime": "^6.9.2", - "chokidar": "^1.6.0", - "duplexer": "^0.1.1", - "glob": "^7.0.5", - "glob2base": "^0.0.12", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "resolve": "^1.1.7", - "safe-buffer": "^5.0.1", - "shell-quote": "^1.6.1", - "subarg": "^1.0.0" - }, - "bin": { - "cpx": "bin/index.js" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/cuid": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/cuid/-/cuid-2.1.8.tgz", - "integrity": "sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==", - "dev": true - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "dev": true - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "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-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.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/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "node_modules/electron-to-chromium": { - "version": "1.4.99", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.99.tgz", - "integrity": "sha512-YXMzbvlo6pW12KWw0bj6cIGCJi1Moy8PLCuuzgRzg6WYIcHILK3szU+HHnHFx2b373qRv+cfmHhbmRbatyAbPA==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", - "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-airbnb-base": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", - "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", - "dev": true, - "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.2" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0", - "eslint-plugin-import": "^2.22.1" - } - }, - "node_modules/eslint-config-prettier": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", - "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", - "dev": true, - "dependencies": { - "get-stdin": "^6.0.0" - }, - "bin": { - "eslint-config-prettier-check": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=3.14.1" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - } - }, - "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.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "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-import": { - "version": "2.25.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", - "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.2", - "has": "^1.0.3", - "is-core-module": "^2.8.0", - "is-glob": "^4.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.12.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "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-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/eslint-plugin-prettier": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", - "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "eslint": ">=5.0.0", - "prettier": ">=1.13.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "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==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "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", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "dependencies": { - "is-posix-bracket": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "dependencies": { - "fill-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-glob/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "node_modules/filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "dependencies": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true - }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "dependencies": { - "for-in": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/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", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "dependencies": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-base/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-base/node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "dependencies": { - "is-glob": "^2.0.0" - } - }, - "node_modules/glob-parent/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-parent/node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", - "dev": true, - "dependencies": { - "find-index": "^0.1.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "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", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-value/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "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/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "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-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "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", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "dependencies": { - "is-primitive": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true, - "engines": { - "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.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true, - "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", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "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-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "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", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", - "dev": true, - "dependencies": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "dev": true, - "dependencies": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-haste-map/node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/jest-haste-map/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-haste-map/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-haste-map/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/jest-haste-map/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/jest-haste-map/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/jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", - "dev": true, - "dependencies": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-message-util/node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/jest-message-util/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util/node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "dev": true, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", - "dev": true, - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "dev": true, - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "dev": true, - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "dependencies": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "dev": true, - "optional": true - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "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/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "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-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-visit/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "dependencies": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "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", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "dependencies": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-glob/node_modules/is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-glob/node_modules/is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "dependencies": { - "is-extglob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prettier": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.1.tgz", - "integrity": "sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "dependencies": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/randomatic/node_modules/is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/randomatic/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/readdirp/node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/readdirp/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "node_modules/regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "dependencies": { - "is-equal-shallow": "^0.1.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "node_modules/resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", - "dev": true - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/shx": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", - "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", - "dev": true, - "dependencies": { - "minimist": "^1.2.3", - "shelljs": "^0.8.5" - }, - "bin": { - "shx": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "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", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sonic-boom": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.6.0.tgz", - "integrity": "sha512-6xYZFRmDEtxGqfOKcDQ4cPLrNa0SPEDI+wlzDAHowXE6YV42NeXqg9mP2KkiM8JVu3lHfZ2iQKYlGOz+kTpphg==", - "dev": true, - "dependencies": { - "atomic-sleep": "^1.0.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "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", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "dependencies": { - "minimist": "^1.1.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", - "dev": true - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/to-regex-range/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-jest": { - "version": "27.1.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.4.tgz", - "integrity": "sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^27.0.0", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@types/jest": "^27.0.0", - "babel-jest": ">=27.0.0 <28", - "jest": "^27.0.0", - "typescript": ">=3.8 <5.0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@types/jest": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "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": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true, - "engines": { - "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==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "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_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "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/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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.0" - } - }, - "@autocloud/eslint-config": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@autocloud/eslint-config/-/eslint-config-0.1.0.tgz", - "integrity": "sha512-1zn5DKp1BWgpoQ1oxqatIRRUMHlOy46KhupUU/NOHjPCkTE1z/GjtD9f7przoFrLhL0uqw4/vw7aMCCAeDjyew==", - "dev": true, - "requires": { - "@typescript-eslint/eslint-plugin": "^4.28.5", - "@typescript-eslint/parser": "^4.28.5", - "eslint": "^7.2.0", - "eslint-config-airbnb-base": "14.2.1", - "eslint-config-prettier": "^6.11.0", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-prettier": "^3.4.0" - } - }, - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", - "dev": true - }, - "@babel/core": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", - "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.7", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.8", - "@babel/parser": "^7.17.8", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", - "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", - "dev": true, - "requires": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true - }, - "@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dev": true, - "requires": { - "@babel/types": "^7.17.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true - }, - "@babel/helpers": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", - "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", - "dev": true, - "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" - } - }, - "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.17.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", - "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", - "dev": true - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", - "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.16.7" - } - }, - "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - } - } - }, - "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cloudgraph/sdk": { - "version": "0.18.1", - "dev": true, - "requires": { - "@graphql-tools/load-files": "^6.5.3", - "@graphql-tools/merge": "^8.2.1", - "chalk": "^4.1.1", - "date-fns": "^2.25.0", - "graphql": "^16.2.0", - "inquirer": "^8.1.2", - "jsonpath": "^1.1.1", - "lodash": "^4.17.21", - "node-jq": "2.1.0", - "ora": "^5.4.1" - } - }, - "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" - } - }, - "@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", - "dev": true, - "requires": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "dev": true, - "requires": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - } - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - } - } - }, - "@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - } - }, - "@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - } - }, - "@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" - } - }, - "@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - } - }, - "@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", - "dev": true, - "requires": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", - "dev": true, - "requires": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" - } - }, - "@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - } - } - }, - "@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", - "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz", - "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.14.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", - "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/jest": { - "version": "27.4.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.1.tgz", - "integrity": "sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==", - "dev": true, - "requires": { - "jest-matcher-utils": "^27.0.0", - "pretty-format": "^27.0.0" - } - }, - "@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==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "@types/node": { - "version": "15.14.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.9.tgz", - "integrity": "sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==", - "dev": true - }, - "@types/pino": { - "version": "6.3.12", - "resolved": "https://registry.npmjs.org/@types/pino/-/pino-6.3.12.tgz", - "integrity": "sha512-dsLRTq8/4UtVSpJgl9aeqHvbh6pzdmjYD3C092SYgLD2TyoCqHpTJk6vp8DvCTGGc7iowZ2MoiYiVUUCcu7muw==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/pino-pretty": "*", - "@types/pino-std-serializers": "*", - "sonic-boom": "^2.1.0" - } - }, - "@types/pino-pretty": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/@types/pino-pretty/-/pino-pretty-4.7.5.tgz", - "integrity": "sha512-rfHe6VIknk14DymxGqc9maGsRe8/HQSvM2u46EAz2XrS92qsAJnW16dpdFejBuZKD8cRJX6Aw6uVZqIQctMpAg==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/pino": "6.3" - } - }, - "@types/pino-std-serializers": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/pino-std-serializers/-/pino-std-serializers-2.4.1.tgz", - "integrity": "sha512-17XcksO47M24IVTVKPeAByWUd3Oez7EbIjXpSbzMPhXVzgjGtrOa49gKBwxH9hb8dKv58OelsWQ+A1G1l9S3wQ==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/prettier": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz", - "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/yargs": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", - "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", - "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - } - }, - "@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - } - }, - "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", - "dev": true - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-includes": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", - "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "array.prototype.flat": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz", - "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0" - } - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", - "dev": true - }, - "babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", - "dev": true, - "requires": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - } - }, - "bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "requires": { - "fast-json-stable-stringify": "2.x" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001322", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001322.tgz", - "integrity": "sha512-neRmrmIrCGuMnxGSoh+x7zYtQFFgnSY2jaomjU56sCkTA6JINqQrxutF459JpWcWRajvoyn95sOXq4Pqrnyjew==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "dev": true - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cpx": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cpx/-/cpx-1.5.0.tgz", - "integrity": "sha1-GFvgGFEdhycN7czCkxceN2VauI8=", - "dev": true, - "requires": { - "babel-runtime": "^6.9.2", - "chokidar": "^1.6.0", - "duplexer": "^0.1.1", - "glob": "^7.0.5", - "glob2base": "^0.0.12", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "resolve": "^1.1.7", - "safe-buffer": "^5.0.1", - "shell-quote": "^1.6.1", - "subarg": "^1.0.0" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "cuid": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/cuid/-/cuid-2.1.8.tgz", - "integrity": "sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==", - "dev": true - }, - "data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true - }, - "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 - }, - "diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "dev": true - }, - "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, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dev": true, - "requires": { - "webidl-conversions": "^5.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true - } - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.99", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.99.tgz", - "integrity": "sha512-YXMzbvlo6pW12KWw0bj6cIGCJi1Moy8PLCuuzgRzg6WYIcHILK3szU+HHnHFx2b373qRv+cfmHhbmRbatyAbPA==", - "dev": true - }, - "emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.2.tgz", - "integrity": "sha512-gfSBJoZdlL2xRiOCy0g8gLMryhoe1TlimjzU99L/31Z8QEGIhVQI+EWwt5lT+AuU9SnorVupXFqqOGqGfsyO6w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - } - }, - "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, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "eslint-config-airbnb-base": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", - "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.2" - } - }, - "eslint-config-prettier": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz", - "integrity": "sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==", - "dev": true, - "requires": { - "get-stdin": "^6.0.0" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", - "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "find-up": "^2.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-import": { - "version": "2.25.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz", - "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==", - "dev": true, - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.2", - "has": "^1.0.3", - "is-core-module": "^2.8.0", - "is-glob": "^4.0.3", - "minimatch": "^3.0.4", - "object.values": "^1.1.5", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.12.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-plugin-prettier": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", - "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "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==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "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" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - } - }, - "expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "find-index": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", - "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stdin": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", - "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", - "dev": true - }, - "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 - }, - "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, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "glob2base": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", - "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", - "dev": true, - "requires": { - "find-index": "^0.1.1" - } - }, - "globals": { - "version": "13.13.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", - "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dev": true, - "requires": { - "whatwg-encoding": "^1.0.5" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "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 - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "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, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true - }, - "is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "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, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "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 - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "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, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "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, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "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, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", - "dev": true, - "requires": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" - } - }, - "jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" - } - }, - "jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - } - }, - "jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "dev": true, - "requires": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "dev": true, - "requires": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - } - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - } - } - }, - "jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - } - }, - "jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" - } - }, - "jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" - } - }, - "jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - } - }, - "jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "dev": true - }, - "jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - }, - "dependencies": { - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "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 - } - } - }, - "jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" - } - }, - "jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", - "dev": true, - "requires": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - } - }, - "jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - } - }, - "jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - } - } - }, - "jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "dev": true - }, - "jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - } - }, - "jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" - } - }, - "jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", - "dev": true, - "requires": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - } - }, - "jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "dev": true, - "requires": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - } - }, - "jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "dev": true, - "requires": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - } - }, - "jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "dev": true, - "requires": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - } - }, - "jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - } - }, - "jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", - "dev": true, - "requires": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } - } - }, - "jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", - "dev": true, - "requires": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" - } - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "requires": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", - "dev": true - } - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", - "dev": true - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "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, - "requires": { - "path-key": "^3.0.0" - } - }, - "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - } - } - }, - "object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "dev": true - }, - "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 - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "prettier": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.1.tgz", - "integrity": "sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "resolve.exports": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz", - "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shell-quote": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", - "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", - "dev": true - }, - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "shx": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.4.tgz", - "integrity": "sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==", - "dev": true, - "requires": { - "minimist": "^1.2.3", - "shelljs": "^0.8.5" - } - }, - "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, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - } - }, - "sonic-boom": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.6.0.tgz", - "integrity": "sha512-6xYZFRmDEtxGqfOKcDQ4cPLrNa0SPEDI+wlzDAHowXE6YV42NeXqg9mP2KkiM8JVu3lHfZ2iQKYlGOz+kTpphg==", - "dev": true, - "requires": { - "atomic-sleep": "^1.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "requires": { - "minimist": "^1.1.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "table": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", - "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "throat": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", - "integrity": "sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==", - "dev": true - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - }, - "dependencies": { - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - } - } - }, - "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", - "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.1.2" - } - }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "ts-jest": { - "version": "27.1.4", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.4.tgz", - "integrity": "sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==", - "dev": true, - "requires": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^27.0.0", - "json5": "2.x", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - } - }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - } - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" - } - }, - "w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dev": true, - "requires": { - "xml-name-validator": "^3.0.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dev": true, - "requires": { - "iconv-lite": "0.4.24" - } - }, - "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true - }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "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, - "requires": { - "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" - } - }, - "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==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "dev": true, - "requires": {} - }, - "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } - } -} diff --git a/src/aws/nist-800-53-rev4/package.json b/src/aws/nist-800-53-rev4/package.json index b24fd3d9..5f1a35c4 100644 --- a/src/aws/nist-800-53-rev4/package.json +++ b/src/aws/nist-800-53-rev4/package.json @@ -1,14 +1,14 @@ { "name": "@cloudgraph/policy-pack-aws-nist-800-53-rev4", "description": "Policy pack implementing The National Institute of Standards and Technology 800-53 Rev. 4 Benchmark for Amazon Web Services", - "version": "1.3.0", + "version": "1.4.0-alpha.1", "author": "AutoCloud", "license": "MPL-2.0", "main": "dist/index.js", "types": "dist/index.d.ts", "repository": { "type": "git", - "url": "https://github.com/cloudgraphdev/cloudgraph-policy-packs.git", + "url": "git+https://github.com/cloudgraphdev/cloudgraph-policy-packs.git", "directory": "src/aws/nist-800-53-rev4" }, "bugs": { @@ -43,7 +43,7 @@ "typescript": "^4.3.5" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" }, "homepage": "https://www.cloudgraph.dev/", "keywords": [ @@ -54,10 +54,10 @@ "singleQuote": true }, "scripts": { - "build": "yarn prepublish", + "build": "yarn prepack", + "clean": "rm -rf dist", "lint": "eslint", - "prepack": "rm -rf dist && tsc -b", - "prepublish": "rm -rf dist && tsc", + "prepack": "yarn clean && tsc -b", "publish": "yarn npm publish", "test": "NODE_ENV=test jest" } diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-1.3.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-1.3.ts index 8eebb32b..4d307239 100644 --- a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-1.3.ts +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-1.3.ts @@ -1,15 +1,15 @@ export default { - id: 'aws-nist-800-53-rev4-1.3', + id: 'aws-nist-800-53-rev4-1.3', title: 'AWS NIST 1.3 S3 bucket ACLs should not have public access on S3 buckets that store CloudTrail log files', - + description: 'CloudTrail logs a record of every API call made in your AWS account to S3 buckets. It is recommended that the bucket policy, or access control list (ACL), applied to these S3 buckets should prevent public access. Allowing public access to CloudTrail log data may aid an adversary in identifying weaknesses in the affected account’s use or configuration.', - + audit: '', - + rationale: '', - + remediation: `**AWS Console** - + - Navigate to [S3](https://console.aws.amazon.com/s3/home). - Click the target S3 bucket. - Select the Permissions tab. @@ -19,29 +19,29 @@ export default { - Select the Bucket Policy tab. - Ensure the policy does not contain a Statement having an Effect set to Allow and a Principal set to "*" or {"AWS" : "*"} - Note: Principal set to "*" or {"AWS" : "*"} allows anonymous access. - - **AWS CLI** - + + **AWS CLI** + Get the name of the S3 bucket that CloudTrail is logging to: - + aws cloudtrail describe-trails --query 'trailList[*].S3BucketName' - + Ensure the AllUsers principal is not granted privileges to that : - + aws s3api get-bucket-acl --bucket --query 'Grants[?Grantee.URI== http://acs.amazonaws.com/groups/global/AllUsers]' - + Ensure the AuthenticatedUsers principal is not granted privileges to that : - + aws s3api get-bucket-acl --bucket --query 'Grants[?Grantee.URI== http://acs.amazonaws.com/groups/global/Authenticated Users]' - + Get the S3 Bucket Policy: - + aws s3api get-bucket-policy --bucket - + Ensure the policy does not contain a Statement having an Effect set to Allow and a Principal set to "*" or {"AWS" : "*"} - + Note: Principal set to "*" or {"AWS" : "*"} allows anonymous access`, - + references: [ 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html', 'https://docs.aws.amazon.com/AmazonS3/latest/user-guide/set-bucket-permissions.html', @@ -55,14 +55,12 @@ export default { accountId __typename s3 { - bucketPolicies { - policy { - statement { - effect - principal { - key - value - } + policy { + statement { + effect + principal { + key + value } } } @@ -75,32 +73,29 @@ export default { not: { path: '@.s3', array_any: { - path: '[*].bucketPolicies', + path: '[*].policy.statement', array_any: { - path: '[*].policy.statement', - array_any: { - and: [ - { - path: '[*].effect', - equal: 'Allow', + and: [ + { + path: '[*].effect', + equal: 'Allow', + }, + { + path: '[*].principal', + array_any: { + and: [ + { + path: '[*].key', + in: ['', 'AWS'], + }, + { + path: '[*].value', + contains: '*', + }, + ], }, - { - path: '[*].principal', - array_any: { - and: [ - { - path: '[*].key', - in: ['', 'AWS'], - }, - { - path: '[*].value', - contains: '*', - }, - ], - }, - }, - ], - }, + }, + ], }, }, }, diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.1.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.1.ts new file mode 100644 index 00000000..0b34e4f3 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.1.ts @@ -0,0 +1,66 @@ +export default { + id: 'aws-nist-800-53-rev4-10.1', + title: 'AWS NIST 10.1 IAM password policies should expire passwords within 90 days', + + description: 'IAM password policies can require passwords to be rotated or expired after a given number of days. Reducing the password lifetime increases account resiliency against brute force login attempts.', + + audit: `Perform the following to ensure the password policy is configured as prescribed: + Via AWS Console + + 1. Login to AWS Console (with appropriate permissions to View Identity Access Management Account Settings) + 2. Go to IAM Service on the AWS Console + 3. Click on Account Settings on the Left Pane + 4. Ensure "Expire passwords in" is set to 90 day(s). + + Via CLI + + aws iam get-account-password-policy + + Ensure the output of the above command includes "maxPasswordAge": 90`, + + rationale: 'Setting a password complexity policy increases account resiliency against brute force login attempts.', + + remediation: `**AWS Console** + + - Navigate to [IAM](https://console.aws.amazon.com/iam). + - In the left navigation, select Account settings. + - Check the Enable password expiration checkbox. + - In the Password expiration period (days) field, enter 90 days or less. + - Click the Apply password policy button. + + **AWS CLI** + + Set IAM password policy to expire passwords in 90 days. + + This operation does not support partial updates. No parameters are required, but if you do not specify a parameter, that parameter’s value reverts to its default value. + + aws iam update-account-password-policy --max-password-age 90`, + + references: [ + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_passwords_account-policy.html#IAMPasswordPolicy', + 'https://docs.aws.amazon.com/cli/latest/reference/iam/update-account-password-policy.html', + ], + gql: `{ + queryawsIamPasswordPolicy { + id + accountId + __typename + expirePasswords + maxPasswordAge + } + }`, + resource: 'queryawsIamPasswordPolicy[*]', + severity: 'medium', + conditions: { + and: [ + { + path: '@.expirePasswords', + equal: true, + }, + { + path: '@.maxPasswordAge', + lessThanInclusive: 90, + }, + ] + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.2.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.2.ts new file mode 100644 index 00000000..8147c200 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.2.ts @@ -0,0 +1,68 @@ +export default { + id: 'aws-nist-800-53-rev4-10.2', + title: 'AWS NIST 10.2 IAM password policies should have a minimum length of 7 and include both alphabetic and numeric characters', + + description: 'IAM password policies are used to enforce password complexity requirements and increase account resiliency against brute force login attempts. Password policies should require passwords to be at least 7 characters long and include both alphabetic and numeric characters.', + + audit: `Perform the following to ensure the password policy is configured as prescribed: + + **Via AWS Console** + + 1. Login to AWS Console (with appropriate permissions to View Identity Access Management Account Settings) + 2. Go to IAM Service on the AWS Console + 3. Click on Account Settings on the Left Pane + 4. Ensure "Minimum password length" is set to 7 or greater + 5. Ensure "Require at least one number " is checked under "Password Policy" + + **Via CLI** + + aws iam get-account-password-policy + + Ensure the output of the above command includes "MinimumPasswordLength": 14 (or higher)`, + + rationale: 'Setting a password complexity policy increases account resiliency against brute force login attempts.', + + remediation: `**AWS Console** + + - Navigate to Identity and Access Management. + - In the left navigation, select Account Settings. + - In the Minimum password length field, enter 7. + - Check Require at least one number. + - Click Apply password policy. + + **AWS CLI** + + Set password policy to have a minimum length of 7 and include both alphabetic and numeric characters. + + This operation does not support partial updates. No parameters are required, but if you do not specify a parameter, that parameter’s value reverts to its default value. + + aws iam update-account-password-policy --require-numbers --minimum-password-length 7`, + + references: [ + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_passwords_account-policy.html#IAMPasswordPolicy', + 'https://docs.aws.amazon.com/cli/latest/reference/iam/update-account-password-policy.html', + ], + gql: `{ + queryawsIamPasswordPolicy { + id + accountId + __typename + minimumPasswordLength + requireNumbers + } + }`, + resource: 'queryawsIamPasswordPolicy[*]', + severity: 'medium', + conditions: { + and: [ + { + path: '@.minimumPasswordLength', + greaterThanInclusive: 7, + }, + { + path: '@.requireNumbers', + equal: true, + }, + ] + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.3.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.3.ts new file mode 100644 index 00000000..0c7a9577 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.3.ts @@ -0,0 +1,60 @@ +// AWS CIS 1.2.0 Rule equivalent 1.10 +export default { + id: 'aws-nist-800-53-rev4-10.3', + title: 'AWS NIST 10.3 IAM password policies should prevent reuse of previously used passwords', + + description: 'IAM password policies can prevent the reuse of a given password by the same user. It is recommended that the password policy prevent the reuse of passwords.', + + audit: `Perform the following to ensure the password policy is configured as prescribed: + + **Via AWS Console** + + 1. Login to AWS Console (with appropriate permissions to View Identity Access Management Account Settings) + 2. Go to IAM Service on the AWS Console + 3. Click on Account Settings on the Left Pane + 4. Ensure "Prevent password reuse" is checked + 5. Ensure "Number of passwords to remember" is set to 24 + + **Via CLI** + + aws iam get-account-password-policy + + Ensure the output of the above command includes "PasswordReusePrevention": 24`, + + rationale: 'Preventing password reuse increases account resiliency against brute force login attempts.', + + remediation: `Perform the following to set the password policy as prescribed: + + **Via AWS Console** + + 1. Login to AWS Console (with appropriate permissions to View Identity Access Management Account Settings) + 2. Go to IAM Service on the AWS Console + 3. Click on Account Settings on the Left Pane + 4. Check "Prevent password reuse" + 5. Set "Number of passwords to remember" is set to 24 + + **Via CLI** + + aws iam update-account-password-policy --password-reuse-prevention 24 + + Note: All commands starting with "aws iam update-account-password-policy" can be combined into a single command.`, + + references: [ + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_passwords_account-policy.html#IAMPasswordPolicy', + 'https://docs.aws.amazon.com/cli/latest/reference/iam/update-account-password-policy.html', + ], + gql: `{ + queryawsIamPasswordPolicy { + id + accountId + __typename + passwordReusePrevention + } + }`, + resource: 'queryawsIamPasswordPolicy[*]', + severity: 'medium', + conditions: { + path: '@.passwordReusePrevention', + greaterThanInclusive: 24, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.4.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.4.ts new file mode 100644 index 00000000..a2f4a624 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.4.ts @@ -0,0 +1,59 @@ +export default { + id: 'aws-nist-800-53-rev4-10.4', + title: 'AWS NIST 10.4 IAM password policies should prevent reuse of the four previously used passwords', + + description: 'IAM password policies should prevent users from reusing any of their previous 4 passwords. Preventing password reuse increases account resiliency against brute force login attempts.', + + audit: `Perform the following to ensure the password policy is configured as prescribed: + + **Via AWS Console** + + 1. Login to AWS Console (with appropriate permissions to View Identity Access Management Account Settings) + 2. Go to IAM Service on the AWS Console + 3. Click on Account Settings on the Left Pane + 4. Ensure "Prevent password reuse" is checked + 5. Ensure "Number of passwords to remember" is set to 4 + + **Via CLI** + + aws iam get-account-password-policy + + Ensure the output of the above command includes "PasswordReusePrevention": 4`, + + rationale: 'Preventing password reuse increases account resiliency against brute force login attempts.', + + remediation: `Perform the following to set the password policy as prescribed: + + **Via AWS Console** + + 1. Login to AWS Console (with appropriate permissions to View Identity Access Management Account Settings) + 2. Go to IAM Service on the AWS Console + 3. Click on Account Settings on the Left Pane + 4. Check "Prevent password reuse" + 5. Set "Number of passwords to remember" is set to 4 + + **Via CLI** + + aws iam update-account-password-policy --password-reuse-prevention 4 + + Note: All commands starting with "aws iam update-account-password-policy" can be combined into a single command.`, + + references: [ + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_passwords_account-policy.html#IAMPasswordPolicy', + 'https://docs.aws.amazon.com/cli/latest/reference/iam/update-account-password-policy.html', + ], + gql: `{ + queryawsIamPasswordPolicy { + id + accountId + __typename + passwordReusePrevention + } + }`, + resource: 'queryawsIamPasswordPolicy[*]', + severity: 'medium', + conditions: { + path: '@.passwordReusePrevention', + equal: 4, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.5.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.5.ts new file mode 100644 index 00000000..454a173e --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.5.ts @@ -0,0 +1,59 @@ +// AWS CIS 1.2.0 Rule equivalent 1.6 +export default { + id: 'aws-nist-800-53-rev4-10.5', + title: 'AWS NIST 10.5 IAM password policies should require at least one lowercase character', + + description: `Password policies are, in part, used to enforce password complexity requirements. IAM + password policies can be used to ensure password are comprised of different character + sets. It is recommended that the password policy require at least one lowercase letter.`, + + audit: `Perform the following to ensure the password policy is configured as prescribed: + Via the AWS Console + + 1. Login to AWS Console (with appropriate permissions to View Identity Access Management Account Settings) + 2. Go to IAM Service on the AWS Console + 3. Click on Account Settings on the Left Pane + 4. Ensure "Requires at least one lowercase letter" is checked under "Password Policy" + + Via CLI + + aws iam get-account-password-policy + + Ensure the output of the above command includes "RequireLowercaseCharacters": true`, + + rationale: 'Setting a password complexity policy increases account resiliency against brute force login attempts.', + + remediation: `Perform the following to set the password policy as prescribed: + Via the AWS Console + + 1. Login to AWS Console (with appropriate permissions to View Identity Access Management Account Settings) + 2. Go to IAM Service on the AWS Console + 3. Click on Account Settings on the Left Pane + 4. Check "Requires at least one lowercase letter" + 5. Click "Apply password policy" + + Via CLI + + aws iam update-account-password-policy --require-lowercase-characters + + Note: All commands starting with "aws iam update-account-password-policy" can be combined into a single command.`, + + references: [ + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_passwords_account-policy.html#IAMPasswordPolicy', + 'https://docs.aws.amazon.com/cli/latest/reference/iam/update-account-password-policy.html', + ], + gql: `{ + queryawsIamPasswordPolicy { + id + accountId + __typename + requireLowercaseCharacters + } + }`, + resource: 'queryawsIamPasswordPolicy[*]', + severity: 'medium', + conditions: { + path: '@.requireLowercaseCharacters', + equal: true, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.6.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.6.ts new file mode 100644 index 00000000..1017e8ca --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.6.ts @@ -0,0 +1,59 @@ +// AWS CIS 1.2.0 Rule equivalent 1.8 +export default { + id: 'aws-nist-800-53-rev4-10.6', + title: 'AWS NIST 10.6 IAM password policies should require at least one number', + + description: `Password policies are, in part, used to enforce password complexity requirements. IAM + password policies can be used to ensure password are comprised of different character + sets. It is recommended that the password policy require at least one number.`, + + audit: `Perform the following to ensure the password policy is configured as prescribed: + Via AWS Console + + 1. Login to AWS Console (with appropriate permissions to View Identity Access Management Account Settings) + 2. Go to IAM Service on the AWS Console + 3. Click on Account Settings on the Left Pane + 4. Ensure "Require at least one number " is checked under "Password Policy" + + Via CLI + + aws iam get-account-password-policy + + Ensure the output of the above command includes "RequireNumbers": true`, + + rationale: 'Setting a password complexity policy increases account resiliency against brute force login attempts.', + + remediation: `Perform the following to set the password policy as prescribed: + Via AWS Console + + 1. Login to AWS Console (with appropriate permissions to View Identity Access Management Account Settings) + 2. Go to IAM Service on the AWS Console + 3. Click on Account Settings on the Left Pane + 4. Check "Require at least one number" + 5. Click "Apply password policy" + + + Via CLI + + aws iam update-account-password-policy --require-numbers + + Note: All commands starting with "aws iam update-account-password-policy" can be combined into a single command.`, + references: [ + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_passwords_account-policy.html#IAMPasswordPolicy', + 'https://docs.aws.amazon.com/cli/latest/reference/iam/update-account-password-policy.html', + ], + gql: `{ + queryawsIamPasswordPolicy { + id + accountId + __typename + requireNumbers + } + }`, + resource: 'queryawsIamPasswordPolicy[*]', + severity: 'medium', + conditions: { + path: '@.requireNumbers', + equal: true, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.7.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.7.ts new file mode 100644 index 00000000..b6e82c06 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.7.ts @@ -0,0 +1,59 @@ +// AWS CIS 1.2.0 Rule equivalent 1.7 +export default { + id: 'aws-nist-800-53-rev4-10.7', + title: 'AWS NIST 10.7 IAM password policies should require at least one symbol', + + description: `Password policies are, in part, used to enforce password complexity requirements. IAM + password policies can be used to ensure password are comprised of different character + sets. It is recommended that the password policy require at least one symbol.`, + + audit: `Perform the following to ensure the password policy is configured as prescribed: + Via AWS Console + + 1. Login to AWS Console (with appropriate permissions to View Identity Access Management Account Settings) + 2. Go to IAM Service on the AWS Console + 3. Click on Account Settings on the Left Pane + 4. Ensure "Require at least one non-alphanumeric character" is checked under + "Password Policy" + + Via CLI + + aws iam get-account-password-policy + + Ensure the output of the above command includes "RequireSymbols": true`, + + rationale: 'Setting a password complexity policy increases account resiliency against brute force login attempts.', + + remediation: `Perform the following to set the password policy as prescribed: + Via AWS Console + + 1. Login to AWS Console (with appropriate permissions to View Identity Access Management Account Settings) + 2. Go to IAM Service on the AWS Console + 3. Click on Account Settings on the Left Pane + 4. Check "Require at least one non-alphanumeric character" + 5. Click "Apply password policy" + + Via CLI + + aws iam update-account-password-policy --require-symbols + + Note: All commands starting with "aws iam update-account-password-policy" can be combined into a single command.`, + references: [ + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_passwords_account-policy.html#IAMPasswordPolicy', + 'https://docs.aws.amazon.com/cli/latest/reference/iam/update-account-password-policy.html', + ], + gql: `{ + queryawsIamPasswordPolicy { + id + accountId + __typename + requireSymbols + } + }`, + resource: 'queryawsIamPasswordPolicy[*]', + severity: 'medium', + conditions: { + path: '@.requireSymbols', + equal: true, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.8.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.8.ts new file mode 100644 index 00000000..587833ed --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-10.8.ts @@ -0,0 +1,59 @@ +// AWS CIS 1.2.0 Rule equivalent 1.5 +export default { + id: 'aws-nist-800-53-rev4-10.8', + title: 'AWS NIST 10.8 IAM password policies should require at least one uppercase character', + + description: `Password policies are, in part, used to enforce password complexity requirements. IAM + password policies can be used to ensure password are comprised of different character + sets. It is recommended that the password policy require at least one uppercase letter.`, + + audit: `Perform the following to ensure the password policy is configured as prescribed: + Via AWS Console + + 1. Login to AWS Console (with appropriate permissions to View Identity Access Management Account Settings) + 2. Go to IAM Service on the AWS Console + 3. Click on Account Settings on the Left Pane + 4. Ensure "Requires at least one uppercase letter" is checked under "Password Policy" + + Via CLI + + aws iam get-account-password-policy + + Ensure the output of the above command includes "RequireUppercaseCharacters": true`, + + rationale: 'Setting a password complexity policy increases account resiliency against brute force login attempts.', + + remediation: `Perform the following to set the password policy as prescribed: + Via AWS Console + + 1. Login to AWS Console (with appropriate permissions to View Identity Access Management Account Settings) + 2. Go to IAM Service on the AWS Console + 3. Click on Account Settings on the Left Pane + 4. Check "Requires at least one uppercase letter" + 5. Click "Apply password policy" + + Via CLI + + aws iam update-account-password-policy --require-uppercase-characters + + Note: All commands starting with "aws iam update-account-password-policy" can be combined into a single command. + `, + references: [ + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_passwords_account-policy.html#IAMPasswordPolicy', + 'https://docs.aws.amazon.com/cli/latest/reference/iam/update-account-password-policy.html', + ], + gql: `{ + queryawsIamPasswordPolicy { + id + accountId + __typename + requireUppercaseCharacters + } + }`, + resource: 'queryawsIamPasswordPolicy[*]', + severity: 'medium', + conditions: { + path: '@.requireUppercaseCharacters', + equal: true, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-13.1.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-13.1.ts new file mode 100644 index 00000000..be7b4d56 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-13.1.ts @@ -0,0 +1,108 @@ +// AWS CIS 1.2.0 Rule equivalent 1.2 +export default { + id: 'aws-nist-800-53-rev4-13.1', + title: 'AWS NIST 13.1 IAM multi-factor authentication should be enabled for all IAM users that have a console password', + + description: `Multi-Factor Authentication (MFA) adds an extra layer of protection on top of a user name + and password. With MFA enabled, when a user signs in to an AWS website, they will be + prompted for their user name and password as well as for an authentication code from + their AWS MFA device. It is recommended that MFA be enabled for all accounts that have a + console password.`, + + audit: `Perform the following to determine if a MFA device is enabled for all IAM users having a console password: + +
+ + Via Management Console + +
+ + 1. Open the IAM console at https://console.aws.amazon.com/iam/. + 2. In the left pane, select *Users* + 3. If the *MFA Device* or *Password* columns are not visible in the table, click the gear icon at the upper right corner of the table and ensure a checkmark is next to both, then click *Close*. + 4. Ensure each user having a checkmark in the *Password* column also has a value in the *MFA Device* column. + +
+ Via the CLI + +
+ + 1. Run the following command (OSX/Linux/UNIX) to generate a list of all IAM users along with their password and MFA status: + + aws iam generate-credential-report + + aws iam get-credential-report --query 'Content' --output text | base64 -d | cut -d, -f1,4,8 + + 2. The output of this command will produce a table similar to the following: + + user,password_enabled,mfa_active + elise,false,false + brandon,true,true + rakesh,false,false + helene,false,false + paras,true,true + anitha,false,false + + 3. For any column having password_enabled set to true , ensure mfa_active is also set to true.`, + + rationale: 'Enabling MFA provides increased security for console access as it requires the authenticating principal to possess a device that emits a time-sensitive key and have knowledge of a credential.', + + remediation: `Perform the following to enable MFA: + + 1. Sign in to the AWS Management Console and open the IAM console at https://console.aws.amazon.com/iam/. + 2. In the navigation pane, choose Users. + 3. In the User Name list, choose the name of the intended MFA user. + 4. Choose the Security Credentials tab, and then choose Manage MFA Device. + 5. In the Manage MFA Device wizard, choose A virtual MFA device, and then choose Next Step. + +
+ + IAM generates and displays configuration information for the virtual MFA device, including a QR code graphic. The graphic is a representation of the 'secret configuration key' that is available for manual entry on devices that do not support QR codes. + +
+ + 6. Open your virtual MFA application. (For a list of apps that you can use for hosting virtual MFA devices, see Virtual MFA Applications.) If the virtual MFA application supports multiple accounts (multiple virtual MFA devices), choose the option to create a new account (a new virtual MFA device). + 7. Determine whether the MFA app supports QR codes, and then do one of the following: + + + - Use the app to scan the QR code. For example, you might choose the camera icon or choose an option similar to Scan code, and then use the device's camera to scan the code. + - In the Manage MFA Device wizard, choose Show secret key for manual configuration, and then type the secret configuration key into your MFA application. + + + When you are finished, the virtual MFA device starts generating one-time passwords. + + 8. In the Manage MFA Device wizard, in the Authentication Code 1 box, type the one-time password that currently appears in the virtual MFA device. Wait up to 30 seconds for the device to generate a new one-time password. Then type the second one-time password into the Authentication Code 2 box. Choose Active Virtual MFA. + **Forced IAM User Self-Service Remediation** + Amazon has published a pattern that forces users to self-service setup MFA before they have access to their complete permissions set. Until they complete this step, they cannot access their full permissions. This pattern can be used on new AWS accounts. It can also be used on existing accounts - it is recommended users are given instructions and a grace period to accomplish MFA enrollment before active enforcement on existing AWS accounts. [How to Delegate Management of Multi-Factor Authentication to AWS IAM Users](https://aws.amazon.com/blogs/security/how-to-delegate-management-of-multi-factor-authentication-to-aws-iam-users/)`, + + references: [ + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_enable_virtual.html#enable-virt-mfa-for-iam-user', + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_enable_cliapi.html', + 'https://docs.aws.amazon.com/cli/latest/reference/iam/create-virtual-mfa-device.html', + 'https://docs.aws.amazon.com/cli/latest/reference/iam/enable-mfa-device.html', + ], + gql: `{ + queryawsIamUser { + id + arn + accountId + __typename + passwordEnabled + mfaActive + } + }`, + resource: 'queryawsIamUser[*]', + severity: 'high', + conditions: { + or: [ + { + path: '@.passwordEnabled', + equal: false, + }, + { + path: '@.mfaActive', + equal: true, + }, + ], + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-13.2.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-13.2.ts new file mode 100644 index 00000000..277fccda --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-13.2.ts @@ -0,0 +1,87 @@ +// AWS CIS 1.2.0 Rule equivalent 1.14 +export default { + id: 'aws-nist-800-53-rev4-13.2', + title: 'AWS NIST 13.2 IAM should have hardware MFA enabled for the root account', + + description: `The root account is the most privileged user in an AWS account. MFA adds an extra layer of + protection on top of a user name and password. With MFA enabled, when a user signs in to + an AWS website, they will be prompted for their user name and password as well as for an + authentication code from their AWS MFA device. For Level 2, it is recommended that the + root account be protected with a hardware MFA.`, + + audit: `Perform the following to determine if the root account has a hardware MFA setup: + + 1. Run the following command to determine if the root account has MFA setup: + + aws iam get-account-summary | grep "AccountMFAEnabled" + + The *AccountMFAEnabled* property is set to 1 will ensure that the root account has MFA (Virtual or Hardware) Enabled. + If *AccountMFAEnabled* property is set to 0 the account is not compliant with this recommendation. + +
+ + 2. If *AccountMFAEnabled* property is set to 1, determine root account has Hardware MFA enabled. Run the following command to list all virtual MFA devices: + + aws iam list-virtual-mfa-devices + + If the output contains one MFA with the following Serial Number, it means the MFA is virtual, not hardware and the account is not compliant with this recommendation: *"SerialNumber": "arn:aws:iam::__:mfa/root-account-mfa-device"*`, + + rationale: `A hardware MFA has a smaller attack surface than a virtual MFA. For example, a hardware MFA does not suffer the attack surface introduced by the mobile smartphone on which a virtual MFA resides. + + **Note**: Using hardware MFA for many, many AWS accounts may create a logistical device management issue. If this is the case, consider implementing this Level 2 recommendation selectively to the highest security AWS accounts and the Level 1 recommendation applied to the remaining accounts. + + Link to order AWS compatible hardware MFA device: [http://onlinenoram.gemalto.com/](http://onlinenoram.gemalto.com/)`, + + remediation: `Perform the following to establish a hardware MFA for the root account: + + 1. Sign in to the AWS Management Console and open the IAM console at https://console.aws.amazon.com/iam/. + + Note: to manage MFA devices for the root AWS account, you must use your root account credentials to sign in to AWS. You cannot manage MFA devices for the root account using other credentials. + + 2. Choose *Dashboard* , and under *Security Status* , expand *Activate MFA* on your root account. + 3. Choose *Activate MFA* + 4. In the wizard, choose *A hardware MFA* device and then choose *Next Step*. + 5. In the *Serial Number* box, enter the serial number that is found on the back of the MFA device. + 6. In the *Authentication Code 1* box, enter the six-digit number displayed by the MFA device. You might need to press the button on the front of the device to display the number. + 7. Wait 30 seconds while the device refreshes the code, and then enter the next six-digit number into the *Authentication Code 2* box. You might need to press the button on the front of the device again to display the second number. + 8. Choose *Next Step*. The MFA device is now associated with the AWS account. The next time you use your AWS account credentials to sign in, you must type a code from the hardware MFA device.`, + + references: [ + 'Order Hardware MFA: http://onlinenoram.gemalto.com/', + 'http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_enable_virtual.html', + 'http://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_enable_physical.html#enable-hw-mfa-for-root', + ], + gql: `{ + queryawsIamUser(filter: { name: { eq: "root" } }) { + id + arn + accountId + __typename + name + mfaActive + virtualMfaDevices { + serialNumber + } + } + }`, + resource: 'queryawsIamUser[*]', + severity: 'high', + conditions: { + and: [ + { + path: '@.mfaActive', + equal: true, + }, + { + jq: '[select("arn:aws:iam::" + .accountId + ":mfa/root-account-mfa-device" == .virtualMfaDevices[].serialNumber)] | { "mfaIsVirtual" : (length > 0) }', + path: '@', + and: [ + { + path: '@.mfaIsVirtual', + notEqual: true, + }, + ], + }, + ], + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-13.3.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-13.3.ts new file mode 100644 index 00000000..251b178f --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-13.3.ts @@ -0,0 +1,72 @@ +// AWS CIS 1.2.0 Rule equivalent 1.13 +export default { + id: 'aws-nist-800-53-rev4-13.3', + title: 'AWS NIST 13.3 IAM should have MFA enabled for the root account', + + description: `The root account is the most privileged user in an AWS account. MFA adds an extra layer of + protection on top of a user name and password. With MFA enabled, when a user signs in to + an AWS website, they will be prompted for their user name and password as well as for an + authentication code from their AWS MFA device. + + **Note:** When virtual MFA is used for root accounts, it is recommended that the device used + is NOT a personal device, but rather a dedicated mobile device (tablet or phone) that is + managed to be kept charged and secured independent of any individual personal devices. + ("non-personal virtual MFA") This lessens the risks of losing access to the MFA due to + device loss, device trade-in or if the individual owning the device is no longer employed at + the company.`, + + audit: `Perform the following to determine if the root account has MFA setup: + + 1. Run the following command: + + aws iam get-account-summary | grep "AccountMFAEnabled" + + 2. Ensure the AccountMFAEnabled property is set to 1`, + + rationale: 'Enabling MFA provides increased security for console access as it requires the authenticating principal to possess a device that emits a time-sensitive key and have knowledge of a credential.', + + remediation: `Perform the following to establish MFA for the root account: + + 1. Sign in to the AWS Management Console and open the IAM console at https://console.aws.amazon.com/iam/. + + + Note: to manage MFA devices for the root AWS account, you must use your root account credentials to sign in to AWS. You cannot manage MFA devices for the root account using other credentials. + + 2. Choose *Dashboard*, and under *Security Status*, expand *Activate MFA* on your root account. + 3. Choose *Activate MFA* + 4. In the wizard, choose *A virtual MFA* device and then choose *Next Step*. + 5. IAM generates and displays configuration information for the virtual MFA device, including a QR code graphic. The graphic is a representation of the 'secret configuration key' that is available for manual entry on devices that do not support QR codes. + 6. Open your virtual MFA application. (For a list of apps that you can use for hosting virtual MFA devices, see Virtual MFA Applications.) If the virtual MFA application supports multiple accounts (multiple virtual MFA devices), choose the option to create a new account (a new virtual MFA device). + 7. Determine whether the MFA app supports QR codes, and then do one of the following: + + + - Use the app to scan the QR code. For example, you might choose the camera icon or choose an option similar to Scan code, and then use the device's camera to scan the code. + - In the Manage MFA Device wizard, choose Show secret key for manual configuration, and then type the secret configuration key into your MFA application. + + When you are finished, the virtual MFA device starts generating one-time passwords. + + 1. In the Manage MFA Device wizard, in the Authentication Code 1 box, type the one-time password that currently appears in the virtual MFA device. Wait up to 30 seconds for the device to generate a new one-time password. Then type the second one-time password into the Authentication Code 2 box. Choose Active Virtual MFA.`, + + references: [ + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_enable_virtual.html#enable-virt-mfa-for-root', + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_enable_u2f.html#enable-u2f-mfa-for-root', + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_enable_physical.html#enable-hw-mfa-for-root', + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_enable_cliapi.html', + ], + gql: `{ + queryawsIamUser(filter: { name: { eq: "root" } }) { + id + arn + accountId + __typename + name + mfaActive + } + }`, + resource: 'queryawsIamUser[*]', + severity: 'high', + conditions: { + path: '@.mfaActive', + equal: true, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-13.4.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-13.4.ts new file mode 100644 index 00000000..a1380c01 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-13.4.ts @@ -0,0 +1,88 @@ +// AWS CIS 1.2.0 Rule equivalent 1.2 +export default { + id: 'aws-nist-800-53-rev4-13.4', + title: 'AWS NIST 13.4 IAM users should have MFA (virtual or hardware) enabled', + + description: 'Enabling MFA provides increased security as it requires the authenticating principal to possess a device that emits a time-sensitive key (for hardware MFA) and have knowledge of a credential (virtual MFA).', + + audit: `Perform the following to determine if IAM users has MFA setup: + + 1. Run the following command: + + aws iam get-account-summary | grep "AccountMFAEnabled" + + 2. Ensure the AccountMFAEnabled property is set to 1`, + + rationale: 'Enabling MFA provides increased security for console access as it requires the authenticating principal to possess a device that emits a time-sensitive key and have knowledge of a credential.', + + remediation: `**Console Remediation Steps** + + To enable a virtual MFA device: + + - Navigate to [IAM](https://console.aws.amazon.com/iam/). + - In the navigation pane, choose Users. + - In the User Name list, choose the name of the intended MFA user. + - Choose the Security credentials tab. Next to Assigned MFA device, choose Manage. + - In the Manage MFA Device wizard, choose Virtual MFA device, and then choose Continue. IAM generates and displays configuration information for the virtual MFA device, including a QR code graphic. + - Open your virtual MFA app. See AWS’s list of supported MFA apps. + - Determine whether the MFA app supports QR codes, and then do one of the following: + - From the wizard, choose Show QR code, and then use the app to scan the QR code. + - In the Manage MFA Device wizard, choose Show secret key, and then type the secret key into your MFA app. + - In the Manage MFA Device wizard, in the MFA code 1 box, type the one-time password that currently appears in the virtual MFA device. Wait up to 30 seconds for the device to generate a new one-time password. Then type the second one-time password into the MFA code 2 box. Choose Assign MFA. + + To enable a hardware MFA device: + + - Navigate to [IAM](https://console.aws.amazon.com/iam/). + - In the navigation bar in the upper right, choose your user name, then My Security Credentials. + - On the AWS IAM credentials tab, in the Multi-factor authentication section, choose Manage MFA device. + - In the Manage MFA device wizard, choose Hardware MFA device and then choose Continue. + - Type the device serial number. The serial number is usually on the back of the device. + - In the MFA code 1 box, type the six-digit number displayed by the MFA device. You might need to press the button on the front of the device to display the number. + - Wait 30 seconds while the device refreshes the code, and then type the next six-digit number into the MFA code 2 box. You might need to press the button on the front of the device again to display the second number. + - Choose Assign MFA. + + **CLI Remediation Steps** + + To enable a virtual MFA device, you must first create a virtual device entity in IAM to represent a virtual MFA device. Replace MY_MFA_DEVICE_NAME with your desired device name and path/to/QRCode.png with the path where you want the QR code to be saved:, + + aws iam create-virtual-mfa-device --virtual-mfa-device-name MY_MFA_DEVICE_NAME --outfile path/to/QRCode.png --bootstrap-method QRCodePNG + + To enable a virtual MFA device after creating the entity in IAM, replace MY_USER_NAME with your username, specify the ARN of the virtual MFA device you created, and specify two consecutive codes from the device: + + aws iam enable-mfa-device \ + --user-name MY_USER_NAME \ + --serial-number arn:aws:iam::123456789012:mfa/MY_MFA_DEVICE_NAME \ + --authentication-code1 123456 \ + --authentication-code2 789012 + + To enable a hardware MFA device, replace MY_USER_NAME with your username, specify the serial number of the hardware MFA device, and specify two consecutive codes from the device: + + aws iam enable-mfa-device \ + --user-name MY_USER_NAME \ + --serial-number 12345678 \ + --authentication-code1 123456 \ + --authentication-code2 789012`, + + references: [ + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_enable_virtual.html#enable-virt-mfa-for-iam-user', + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_enable_cliapi.html', + 'https://docs.aws.amazon.com/cli/latest/reference/iam/create-virtual-mfa-device.html', + 'https://docs.aws.amazon.com/cli/latest/reference/iam/enable-mfa-device.html', + 'https://aws.amazon.com/iam/features/mfa/?audit=2019q1', + ], + gql: `{ + queryawsIamUser { + id + arn + accountId + __typename + mfaActive + } + }`, + resource: 'queryawsIamUser[*]', + severity: 'high', + conditions: { + path: '@.mfaActive', + equal: true, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-15.3.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-15.3.ts new file mode 100644 index 00000000..8f1fa701 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-15.3.ts @@ -0,0 +1,62 @@ +// AWS CIS 1.2.0 Rule equivalent 1.12 +export default { + id: 'aws-nist-800-53-rev4-15.3', + title: 'AWS NIST 15.3 IAM root user access key should not exist', + + description: `The root account is the most privileged user in an AWS account. AWS Access Keys provide + programmatic access to a given AWS account. It is recommended that all access keys + associated with the root account be removed.`, + + audit: `Perform the following to determine if the root account has access keys: + Via the AWS Console + + 1. Login to the AWS Management Console + 2. Click *Services* + 3. Click *IAM* + 4. Click on *Credential Report* + 5. This will download an *.xls* file that contains credential usage for all IAM users within an AWS Account - open this file + 6. For the ** user, ensure the *access_key_1_active* and *access_key_2_active* fields are set to *FALSE*. + + Via CLI + + 1. Run the following commands: + + aws iam generate-credential-report + aws iam get-credential-report --query 'Content' --output text | base64 -d | cut -d, -f1,9,14 | grep -B1 '' + + 2. For the ** user, ensure the *access_key_1_active* and *access_key_2_active* fields are set to *FALSE*.`, + + rationale: 'Removing access keys associated with the root account limits vectors by which the account can be compromised. Additionally, removing the root access keys encourages the creation and use of role-based accounts that are least privileged.', + + remediation: `Perform the following to delete or disable active root access keys being + Via the AWS Console + + 1. Sign in to the AWS Management Console as Root and open the IAM console at https://console.aws.amazon.com/iam/. + 2. Click on ** at the top right and select *Security Credentials* from the drop-down list + 3. On the pop-out screen Click on *Continue to Security Credentials* + 4. Click on *Access Keys* *(Access Key ID and Secret Access Key)* + 5. Under the *Status* column if there are any Keys that are Active + 1. Click on *Make Inactive* - (Temporarily disable Key - may be needed again) + 2. Click *Delete* - (Deleted keys cannot be recovered)`, + + references: [ + 'http://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html', + 'http://docs.aws.amazon.com/general/latest/gr/managing-aws-access-keys.html', + 'http://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountSummary.html', + ], + gql: `{ + queryawsIamUser(filter: { name: { eq: "root" } }) { + id + arn + accountId + __typename + accessKeysActive + } + }`, + resource: 'queryawsIamUser[*]', + severity: 'high', + conditions: { + path: '@.accessKeysActive', + equal: false, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-15.4.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-15.4.ts new file mode 100644 index 00000000..924186ff --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-15.4.ts @@ -0,0 +1,88 @@ +// AWS CIS 1.2.0 Rule equivalent 1.1 +export default { + id: 'aws-nist-800-53-rev4-15.4', + title: 'AWS NIST 15.4 IAM root user should not be used', + + description: 'The "root" account has unrestricted access to all resources in the AWS account. It is highly recommended that the use of this account be avoided.', + + audit: `Implement the *Ensure a log metric filter and alarm exist for usage of "root" account* recommendation in the *Monitoring* section of this benchmark to receive notifications of root account usage. Additionally, executing the following commands will provide ad-hoc means for determining the last time the root account was used: + + aws iam generate-credential-report + +
+ + aws iam get-credential-report --query 'Content' --output text | base64 -d | cut -d, -f1,5,11,16 | grep -B1 '' + + Note: there are a few conditions under which the use of the root account is required, such as requesting a penetration test or creating a CloudFront private key.`, + + rationale: 'The "root" account is the most privileged AWS account. Minimizing the use of this account and adopting the principle of least privilege for access management will reduce the risk of accidental changes and unintended disclosure of highly privileged credentials.', + + remediation: `**Console Remediation Steps** + + AWS recommends that users do not use the root user for everyday tasks (even administrative ones). It is a best practice to only use the root user to create your first individual user or conduct tasks that require root. + + You can optionally [delete the root user’s access key or mark it as inactive.](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#id_root-user_manage_delete-key) + + To delete the root user’s access key: + + - Logged in as the root user, navigate to [IAM](https://console.aws.amazon.com/iam/home). + - From the top navigation, select your account name > My Security Credentials. + - If you see a warning about accessing the security credentials for your AWS account, choose Continue to Security Credentials. + - Expand Access keys (access key ID and secret access key). + - For any active access keys, select Make Inactive and Click Delete. A confirmation modal displays. Click Delete. + + To make the root user’s access key inactive: + + - Logged in as the root user, navigate to [IAM](https://console.aws.amazon.com/iam/home). + - From the top navigation, select your account name > My Security Credentials. + - If you see a warning about accessing the security credentials for your AWS account, choose Continue to Security Credentials. + - Expand Access keys (access key ID and secret access key). + - For any active access keys, select Make Inactive. + + **CLI Remediation Steps** + + AWS recommends that users do not use the root user for everyday tasks (even administrative ones). It is a best practice to only use the root user to create your first individual user or conduct tasks that require root. + + You can optionally delete the root user’s access key or mark it as inactive. + + To delete the root user’s access key: + + aws iam delete-access-key --access-key-id --user-name + + To make the root user’s access key inactive: + + aws iam update-access-key --access-key-id --status Inactive --user-name `, + + references: [ + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html', + 'https://docs.aws.amazon.com/general/latest/gr/aws_tasks-that-require-root.html', + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html', + 'https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#id_root-user_manage_delete-key', + ], + gql: `{ + queryawsIamUser(filter: { name: { eq: "root" } }) { + id + arn + accountId + __typename + passwordLastUsed + passwordEnabled + } + }`, + resource: 'queryawsIamUser[*]', + severity: 'high', + conditions: { + not: { + and: [ + { + path: '@.passwordEnabled', + equal: true, + }, + { + value: { daysAgo: {}, path: '@.passwordLastUsed' }, + lessThanInclusive: 30, + }, + ], + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-4.1.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-4.1.ts index 952f9345..92ff06b7 100644 --- a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-4.1.ts +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-4.1.ts @@ -1,5 +1,5 @@ export default { - id: 'aws-nist-800-53-rev4-4.', + id: 'aws-nist-800-53-rev4-4.1', title: 'AWS NIST 4.1 CloudFront distribution origin should be set to S3 or origin protocol policy should be set to https-only', description: 'CloudFront connections should be encrypted during transmission over networks that can be accessed by malicious individuals. If a CloudFront distribution uses a custom origin, CloudFront should only use HTTPS to communicate with it. This does not apply if the CloudFront distribution is configured to use S3 as origin.', diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-4.5.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-4.5.ts index b85f1fd6..0c2d614d 100644 --- a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-4.5.ts +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-4.5.ts @@ -1,51 +1,49 @@ export default { - id: 'aws-nist-800-53-rev4-4.5', + id: 'aws-nist-800-53-rev4-4.5', title: 'AWS NIST 4.5 S3 bucket policies should only allow requests that use HTTPS', - + description: 'To protect data in transit, an S3 bucket policy should deny all HTTP requests to its objects and allow only HTTPS requests. HTTPS uses Transport Layer Security (TLS) to encrypt data, which preserves integrity and prevents tampering.', - + audit: '', - + rationale: '', - + remediation: `**AWS Console** - + - Navigate to [S3](https://console.aws.amazon.com/s3/). - Select the S3 bucket. - Click the Permissions tab. - Select Bucket Policy. - In the bucket policy editor, enter the bucket policy that is compliant with the SSL AWS Config rule as documented [here](https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-ssl-requests-only.html). - + **AWS CLI** - + Set bucket policy to only allow HTTPS requests on an S3 Bucket: - + aws s3api put-bucket-policy --bucket --policy '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"AWS":[""]},"Action":"s3:Get*","Resource":"/*"},{"Effect":"Deny","Principal":"*","Action":"*","Resource":"/*","Condition":{"Bool":{"aws:SecureTransport":"false"}}}]}'`, - + references: [ 'https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-ssl-requests-only.html', 'https://docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-policy.html', - ], + ], gql: `{ queryawsS3 { id arn accountId __typename - bucketPolicies { - policy { - statement { - effect - action - principal { - key - value - } - condition { - key - operator - value - } + policy { + statement { + effect + action + principal { + key + value + } + condition { + key + operator + value } } } @@ -53,54 +51,51 @@ export default { }`, resource: 'queryawsS3[*]', severity: 'medium', - conditions: { - path: '@.bucketPolicies', - array_all: { - path: '[*].policy.statement', - array_any: { - or: [ - { - path: '[*].effect', - equal: 'Deny', - }, - { - and: [ - { - path: '[*].condition', - array_any: { + conditions: { + path: '@.policy.statement', + array_any: { + or: [ + { + path: '[*].effect', + equal: 'Deny', + }, + { + and: [ + { + path: '[*].condition', + array_any: { + and: [ + { + path: '[*].key', + equal: 'aws:SecureTransport', + }, + { + path: '[*].value', + contains: 'true', + }, + ], + }, + }, + { + path: '[*].principal', + array_any: { + not: { and: [ { path: '[*].key', - equal: 'aws:SecureTransport', + in: ['', 'AWS'], }, { path: '[*].value', - contains: 'true', + contains: '*', }, ], - }, - }, - { - path: '[*].principal', - array_any: { - not: { - and: [ - { - path: '[*].key', - in: ['', 'AWS'], - }, - { - path: '[*].value', - contains: '*', - }, - ], - } - }, + } }, - ], - }, - ], - }, + }, + ], + }, + ], }, }, } diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-6.10.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-6.10.ts new file mode 100644 index 00000000..50986c3f --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-6.10.ts @@ -0,0 +1,71 @@ +// AWS CIS 1.2.0 Rule equivalent 2.6 +export default { + id: 'aws-nist-800-53-rev4-6.10', + title: 'AWS NIST 6.10 S3 bucket access logging should be enabled', + + description: 'Enabling server access logging provides detailed records for the requests that are made to a S3 bucket. This information is useful for security and compliance auditing purposes.', + + audit: '', + + rationale: '', + + remediation: `**AWS Console** + + - Navigate to [S3](https://console.aws.amazon.com/s3/). + - In the Bucket name list, choose the name of the bucket that you want to enable server access logging for. + - Choose Properties. + - Choose Server access logging. + - Choose Enable Logging. For Target, choose the name of the bucket that you want to receive the log record objects. The target bucket must be in the same region as the source bucket and must not have a default retention period configuration. + - (Optional) For Target prefix, type a key name prefix for log objects, so that all of the log object names begin with the same string. + - Choose Save. + + **AWS CLI** + + To enable server access logging for an S3 bucket, first grant S3 permission. Replace MY_BUCKET_NAME with the bucket name: + + aws s3api put-bucket-acl --bucket MY_BUCKET_NAME --grant-write URI=http://acs.amazonaws.com/groups/s3/LogDelivery --grant-read-acp URI=http://acs.amazonaws.com/groups/s3/LogDelivery + + Then apply the logging policy. You’ll need to provide a JSON document with the policy; see below. Replace MY_BUCKET_NAME with the bucket name: + + aws s3api put-bucket-logging --bucket MY_BUCKET_NAME --bucket-logging-status file://logging.json + + logging.json is a JSON document containing the logging policy. The example below allows the AWS user associated with my_email@example.com to have full control over the log files. Replace MY_BUCKET_NAME, MY_PREFIX/, and my_email@example.com with the desired bucket name, log object key prefix, and email address: + + { + "LoggingEnabled": { + "TargetBucket": "MY_BUCKET_NAME", + "TargetPrefix": "MY_PREFIX/", + "TargetGrants": [ + { + "Grantee": { + "Type": "AmazonCustomerByEmail", + "EmailAddress": "my_email@example.com" + }, + "Permission": "FULL_CONTROL" + } + ] + } + }`, + + references: [ + 'https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerLogs.html', + 'https://docs.aws.amazon.com/AmazonS3/latest/user-guide/server-access-logging.html', + 'https://docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-acl.html', + 'https://docs.aws.amazon.com/cli/latest/reference/s3api/put-bucket-logging.html', + ], + gql: `{ + queryawsS3 { + id + arn + accountId + __typename + logging + } + }`, + resource: 'queryawsS3[*]', + severity: 'medium', + conditions: { + path: '@.logging', + equal: 'Enabled', + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-6.11.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-6.11.ts new file mode 100644 index 00000000..cfe345d9 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-6.11.ts @@ -0,0 +1,94 @@ +export default { + id: 'aws-nist-800-53-rev4-6.11', + title: 'AWS NIST 6.11 S3 bucket access logging should be enabled on S3 buckets that store CloudTrail log files', + + description: 'It is recommended that users enable bucket access logging on the S3 bucket storing CloudTrail log data. Such logging tracks access requests to this S3 bucket and can be useful in security and incident response workflows.', + + audit: `Perform the following ensure the CloudTrail S3 bucket has access logging is enabled: + Via the management Console + + 1. Go to the Amazon CloudTrail console at https://console.aws.amazon.com/cloudtrail/home + 2. In the API activity history pane on the left, click Trails + 3. In the Trails pane, note the bucket names in the S3 bucket column + 4. Sign in to the AWS Management Console and open the S3 console at https://console.aws.amazon.com/s3. + 5. Under *All Buckets* click on a target S3 bucket + 6. Click on *Properties* in the top right of the console + 7. Under *Bucket: * click on *Logging* + 8. Ensure *Enabled* is checked. + + Via CLI + + 1. Get the name of the S3 bucket that CloudTrail is logging to: + + aws cloudtrail describe-trails --query 'trailList[*].S3BucketName' + + 2. Ensure Bucket Logging is enabled: + + aws s3api get-bucket-logging --bucket + + Ensure command does not return empty output. + Sample Output for a bucket with logging enabled: + + { + "LoggingEnabled": { + "TargetPrefix": "", + "TargetBucket": "" + } + }`, + + rationale: 'By enabling S3 bucket logging on target S3 buckets, it is possible to capture all events which may affect objects within target buckets. Configuring logs to be placed in a separate bucket allows access to log information which can be useful in security and incident response workflows.', + + remediation: `**AWS Console** + + - Navigate to CloudTrail. + - Create a CloudTrail trail as specified here. + - In storage location, note the name of the S3 bucket. + - Navigate to S3. + - Select the S3 bucket that you attached to your CloudTrail trail from the previous step. + - Click Properties. + - Edit your S3 bucket to have Server access logging enabled as described here.* + + **AWS CLI** + + Get the name of the S3 bucket that CloudTrail is logging to: + + aws cloudtrail describe-trails --query 'trailList[*].S3BucketName' + + Ensure Bucket Logging is enabled: + + aws s3api get-bucket-logging --bucket + + Ensure command does not return empty output. Sample output for a bucket with logging enabled: + + { "LoggingEnabled": { "TargetPrefix": "", "TargetBucket": "" } } + + If the command returns an empty output, run the following command to enable logging: + + aws s3api put-bucket-logging --bucket --bucket-logging-status '{"LoggingEnabled":{"TargetBucket": ,"TargetPrefix":"/"}}'`, + + references: [ + 'https://docs.aws.amazon.com/AmazonS3/latest/user-guide/server-access-logging.html', + 'https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/index.html#cli-aws-cloudtrail', + 'https://docs.aws.amazon.com/cli/latest/reference/s3api/get-bucket-acl.html#description', + ], + gql: `{ + queryawsCloudtrail { + id + arn + accountId + __typename + s3 { + logging + } + } + }`, + resource: 'queryawsCloudtrail[*]', + severity: 'medium', + conditions: { + path: '@.s3', + array_all: { + path: '[*].logging', + equal: 'Enabled', + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-6.14.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-6.14.ts new file mode 100644 index 00000000..2891f659 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-6.14.ts @@ -0,0 +1,59 @@ +// AWS CIS 1.2.0 Rule equivalent 2.9 +export default { + id: 'aws-nist-800-53-rev4-6.14', + title: 'AWS NIST 6.14 VPC flow logging should be enabled', + + description: `VPC Flow Logs is a feature that enables you to capture information about the IP traffic + going to and from network interfaces in your VPC. After you've created a flow log, you can + view and retrieve its data in Amazon CloudWatch Logs. It is recommended that VPC Flow + Logs be enabled for packet "Rejects" for VPCs.`, + audit: `Perform the following to determine if VPC Flow logs is enabled: + Via the Management Console: + + 1. Sign into the management console + 2. Select *Services* then *VPC* + 3. In the left navigation pane, select *Your VPCs* + 4. Select a VPC + 5. In the right pane, select the *Flow Logs* tab. + 6. Ensure a Log Flow exists that has *Active* in the *Status* column.`, + + rationale: 'VPC Flow Logs provide visibility into network traffic that traverses the VPC and can be used to detect anomalous traffic or insight during security workflows.', + + remediation: `Perform the following to determine if VPC Flow logs is enabled: + Via the Management Console: + + 1. Sign into the management console + 2. Select *Services* then *VPC* + 3. In the left navigation pane, select *Your VPCs* + 4. Select a VPC + 5. In the right pane, select the *Flow Logs* tab. + 6. If no Flow Log exists, click *Create Flow Log* + 7. For Filter, select *Reject* + 8. Enter in a *Role* and *Destination Log Group* + 9. Click *Create Log Flow* + 10. Click on *CloudWatch Logs Group* + + **Note:** Setting the filter to "Reject" will dramatically reduce the logging data accumulation for this recommendation and provide sufficient information for the purposes of breach detection, research, and remediation. However, during periods of least privilege security group engineering, setting this filter to "All" can be very helpful in discovering existing traffic flows required for the proper operation of an already running environment.`, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs-cwl.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/create-flow-logs.html', + ], + gql: `{ + queryawsVpc { + id + arn + accountId + __typename + flowLog { + resourceId + } + } + }`, + resource: 'queryawsVpc[*]', + severity: 'medium', + conditions: { + path: '@.flowLog', + isEmpty: false, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-6.2.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-6.2.ts new file mode 100644 index 00000000..b869163d --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-6.2.ts @@ -0,0 +1,66 @@ +// AWS CIS 1.2.0 Rule equivalent 2.2 +export default { + id: 'aws-nist-800-53-rev4-6.2', + title: 'AWS NIST 6.2 CloudTrail log file validation should be enabled', + + description: `CloudTrail log file validation creates a digitally signed digest file containing a hash of each + log that CloudTrail writes to S3. These digest files can be used to determine whether a log + file was changed, deleted, or unchanged after CloudTrail delivered the log. It is + recommended that file validation be enabled on all CloudTrails.`, + + audit: `Perform the following on each trail to determine if log file validation is enabled: + Via the management Console + + 1. Sign in to the AWS Management Console and open the IAM console at https://console.aws.amazon.com/cloudtrail + 2. Click on *Trails* on the left navigation pane + 3. For Every Trail: + + - Click on a trail via the link in the Name column + - Under the *S3* section, ensure *Enable log file validation* is set to *Yes* + + Via CLI + + aws cloudtrail describe-trails + + Ensure *LogFileValidationEnabled* is set to *true* for each trail`, + rationale: 'Enabling log file validation will provide additional integrity checking of CloudTrail logs.', + + remediation: `**AWS Console** + + - Navigate to [CloudTrail](https://console.aws.amazon.com/cloudtrail/). + - In the left navigation, click Trails. + - Click the target trail. + - Within General details, click Edit. + - Scroll down to Additional settings, and enable Log file validation. + - Click Save changes. + + **AWS CLI** + + Get a list of all CloudTrail trails and view their configuration: + + aws cloudtrail describe-trails + + Update any trail that has “LogFileVaidationEnabled” set to false: + + aws cloudtrail update-trail --name --enable-log-file-validation`, + + references: [ + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-log-file-validation-enabling.html', + 'https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/update-trail.html' + ], + gql: `{ + queryawsCloudtrail { + id + arn + accountId + __typename + logFileValidationEnabled + } + }`, + resource: 'queryawsCloudtrail[*]', + severity: 'medium', + conditions: { + path: '@.logFileValidationEnabled', + equal: 'Yes', + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-6.3.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-6.3.ts new file mode 100644 index 00000000..a8e2982d --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-6.3.ts @@ -0,0 +1,120 @@ +// AWS CIS 1.2.0 Rule equivalent 2.1 +export default { + id: 'aws-nist-800-53-rev4-6.3', + title: 'AWS NIST 6.3 CloudTrail should be enabled in all regions', + + description: `AWS CloudTrail is a web service that records AWS API calls for your account and delivers + log files to you. The recorded information includes the identity of the API caller, the time of + the API call, the source IP address of the API caller, the request parameters, and the + response elements returned by the AWS service. CloudTrail provides a history of AWS API + calls for an account, including API calls made via the Management Console, SDKs, command + line tools, and higher-level AWS services (such as CloudFormation).`, + + audit: `Perform the following to determine if CloudTrail is enabled for all regions: + Via the management Console + + 1. Sign in to the AWS Management Console and open the CloudTrail console at https://console.aws.amazon.com/cloudtrail + 2. Click on *Trails* on the left navigation pane + + - You will be presented with a list of trails across all regions + + 3. Ensure at least one Trail has *All* specified in the *Region* column + 4. Click on a trail via the link in the *Name* column + 5. Ensure *Logging* is set to *ON* + 6. Ensure *Apply trail to all regions* is set to *Yes* + 7. In section *Management Events* ensure *Read/Write Events* set to *ALL* + + Via CLI + + aws cloudtrail describe-trails + + Ensure *IsMultiRegionTrail* is set to *true* + + aws cloudtrail get-trail-status --name + + Ensure *IsLogging* is set to *true* + + aws cloudtrail get-event-selectors --trail-name + + Ensure there is at least one Event Selector for a Trail with *IncludeManagementEvents* set to *true* and *ReadWriteType* set to *All*`, + + rationale: `The AWS API call history produced by CloudTrail enables security analysis, resource change tracking, and compliance auditing. Additionally, + + - ensuring that a multi-regions trail exists will ensure that unexpected activity occurring in otherwise unused regions is detected + - ensuring that a multi-regions trail exists will ensure that Global Service Logging is enabled for a trail by default to capture recording of events generated on AWS global services + - for a multi-regions trail, ensuring that management events configured for all type of Read/Writes ensures recording of management operations that are performed on all resources in an AWS account`, + + remediation: `Perform the following to enable global (Multi-region) CloudTrail logging: + Via the management Console + + 1. Sign in to the AWS Management Console and open the IAM console at https://console.aws.amazon.com/cloudtrail + 2. Click on *Trails* on the left navigation pane + 3. Click *Get Started Now*, if presented + + - Click *Add new trail* + - Enter a trail name in the *Trail* name box + - Set the *Apply trail to all regions* option to Yes + - Specify an S3 bucket name in the *S3 bucket* box + - Click *Create* + + 4. If 1 or more trails already exist, select the target trail to enable for global logging + 5. Click the edit icon (pencil) next to *Apply trail to all regions* , Click *Yes* and Click *Save*. + 6. Click the edit icon (pencil) next to *Management Events* click All for setting Read/Write Events and Click *Save*. + + Via CLI + + aws cloudtrail create-trail --name --bucket-name --is-multi-region-trail + aws cloudtrail update-trail --name --is-multi-region-trail + + Note: Creating CloudTrail via CLI without providing any overriding options configures *Management Events* to set *All* type of *Read/Writes* by default.`, + references: [ + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-concepts.html#cloudtrail-concepts-management-events', + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-management-and-data-events-with-cloudtrail.html?icmpid=docs_cloudtrail_console#logging-management-events', + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-aws-service-specific-topics.html#cloud-trail-supported-services-data-events', + ], + gql: `{ + queryawsAccount { + id + __typename + cloudtrail { + isMultiRegionTrail + status { + isLogging + } + eventSelectors { + readWriteType + includeManagementEvents + } + } + } + }`, + resource: 'queryawsAccount[*]', + severity: 'medium', + conditions: { + path: '@.cloudtrail', + array_any: { + and: [ + { + path: '[*].isMultiRegionTrail', + equal: 'Yes', + }, + { + path: '[*].status.isLogging', + equal: true, + }, + { + path: '[*].eventSelectors', + array_any: { + and: [ + { path: '[*].readWriteType', equal: 'All' }, + { + path: '[*].includeManagementEvents', + equal: true, + }, + ], + }, + }, + ], + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-6.7.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-6.7.ts new file mode 100644 index 00000000..0ad77bbe --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-6.7.ts @@ -0,0 +1,94 @@ +// AWS CIS 1.2.0 Rule equivalent 2.4 +export default { + id: 'aws-nist-800-53-rev4-6.7', + title: 'AWS NIST 6.7 CloudTrail trails should have CloudWatch log integration enabled', + + description: `AWS CloudTrail is a web service that records AWS API calls made in a given AWS account. + The recorded information includes the identity of the API caller, the time of the API call, the + source IP address of the API caller, the request parameters, and the response elements + returned by the AWS service. CloudTrail uses Amazon S3 for log file storage and delivery, + so log files are stored durably. In addition to capturing CloudTrail logs within a specified S3 + bucket for long term analysis, realtime analysis can be performed by configuring CloudTrail + to send logs to CloudWatch Logs. For a trail that is enabled in all regions in an account, + CloudTrail sends log files from all those regions to a CloudWatch Logs log group. It is + recommended that CloudTrail logs be sent to CloudWatch Logs. + + Note: The intent of this recommendation is to ensure AWS account activity is being + captured, monitored, and appropriately alarmed on. CloudWatch Logs is a native way to + accomplish this using AWS services but does not preclude the use of an alternate solution.`, + + audit: `Perform the following to ensure CloudTrail is configured as prescribed: + Via the AWS management Console + + 1. Sign in to the AWS Management Console and open the CloudTrail console at https://console.aws.amazon.com/cloudtrail/ + 2. Under *All Buckets* , click on the target bucket you wish to evaluate + 3. Click *Properties* on the top right of the console + 4. Click *Trails* in the left menu + 5. Ensure a *CloudWatch Logs* log group is configured and has a recent (~one day old) *Last log file delivered* timestamp. + + Via CLI + 1. Run the following command to get a listing of existing trails: + + aws cloudtrail describe-trails + + 2. Ensure *CloudWatchLogsLogGroupArn* is not empty and note the value of the Name property. + 3. Using the noted value of the *Name* property, run the following command: + + aws cloudtrail get-trail-status --name + + 4. Ensure the *LatestcloudwatchLogdDeliveryTime* property is set to a recent (~one day old) timestamp.`, + rationale: 'Sending CloudTrail logs to CloudWatch Logs will facilitate real-time and historic activity logging based on user, API, resource, and IP address, and provides the opportunity to establish alarms and notifications for anomalous or sensitivity account activity.', + + remediation: `Perform the following to establish the prescribed state: + Via the AWS management Console + + 1. Sign in to the AWS Management Console and open the CloudTrail console at https://console.aws.amazon.com/cloudtrail/ + 2. Under All Buckets, click on the target bucket you wish to evaluate + 3. Click Properties on the top right of the console + 4. Click *Trails* in the left menu + 5. Click on each trail where no *CloudWatch Logs* are defined + 6. Go to the *CloudWatch Logs* section and click on *Configure* + 7. Define a new or select an existing log group + 8. Click on *Continue* + 9. Configure IAM Role which will deliver CloudTrail events to CloudWatch Logs + o Create/Select an *IAM Role* and *Policy Name* + o Click *Allow* to continue + + Via CLI + + aws cloudtrail update-trail --name --cloudwatch-logs-log-group- + arn --cloudwatch-logs-role-arn `, + references: [ + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/send-cloudtrail-events-to-cloudwatch-logs.html#send-cloudtrail-events-to-cloudwatch-logs-console', + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/send-cloudtrail-events-to-cloudwatch-logs.html#send-cloudtrail-events-to-cloudwatch-logs-cli', + ], + gql: `{ + queryawsCloudtrail { + id + arn + accountId + __typename + cloudWatchLogsLogGroupArn + status { + latestCloudWatchLogsDeliveryTime + } + } + }`, + resource: 'queryawsCloudtrail[*]', + severity: 'medium', + conditions: { + and: [ + { + path: '@.cloudWatchLogsLogGroupArn', + notEqual: null, + }, + { + value: { + daysAgo: {}, + path: '@.status.latestCloudWatchLogsDeliveryTime', + }, + lessThanInclusive: 1, + }, + ], + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.1.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.1.ts new file mode 100644 index 00000000..a7ccbd1f --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.1.ts @@ -0,0 +1,62 @@ +export default { + id: 'aws-nist-800-53-rev4-7.1', + title: 'AWS NIST 7.1 Alarm for denied connections in CloudFront logs should be configured', + + description: 'Alarms should be configured to alert users to denied connections to CloudFront distributions so users can investigate anomalous traffic.', + + audit: '', + + rationale: '', + + remediation: `**Console Remediation Steps** + + - Navigate to [CloudFront](https://console.aws.amazon.com/cloudfront). + - Under Reports & analytics, select Alarms. + - Click Create Alarm. + - In the Metric drop-down, select 4xx Error Rate. + - In the Distribution drop-down, select your distribution. + - In the Name of alarm field, provide a name for your alarm. + - Determine if you wish to send a notification to an SNS topic and select the topic in the drop down menu. + - Use the Whenever Sum of Requests drop down and text box to set your threshold. + - Use the For at least text box and consecutive period(s) of drop-down to set your period. + - Click Create Alarm. + - Note you may also use [CloudWatch](https://console.aws.amazon.com/cloudwatch) to create alarms. + + **CLI Remediation Steps** + + Create a CloudWatch alarm to trigger on HTTP 4xx error codes to alert when client behavior is outside your expectations. + + aws cloudwatch put-metric-alarm --alarm-name --evaluation-periods --comparison-operator --metric-name 4xxErrorRate --namespace "AWS/CloudFront" --period --threshold --statistic --unit + + Similarly, create a CloudWatch alarm to trigger on HTTP 5xx error codes when your system internal errors are outside your expectations. + + aws cloudwatch put-metric-alarm --alarm-name --evaluation-periods --comparison-operator --metric-name 5xxErrorRate --namespace "AWS/CloudFront" --period --threshold --statistic --unit `, + + references: [ + 'https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html', + 'https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/put-metric-alarm.html', + ], + gql: `{ + queryawsCloudfront { + id + arn + accountId + __typename + cloudwatch { + metric + } + } + }`, + resource: 'queryawsCloudfront[*]', + severity: 'medium', + conditions: { + jq: '.cloudwatch | map(select(.metric == "4xxErrorRate" or .metric == "5xxErrorRate")) | { "twoOrMore" : (length >= 2) }', + path: '@', + and: [ + { + path: '@.twoOrMore', + equal: true, + }, + ], + } +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.10.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.10.ts new file mode 100644 index 00000000..5b09e3a9 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.10.ts @@ -0,0 +1,176 @@ +// AWS CIS 1.2.0 Rule equivalent 3.1 +export default { + id: 'aws-nist-800-53-rev4-7.10', + title: 'AWS NIST 7.10 CloudWatch log metric filter and alarm for unauthorized API calls should be configured', + + description: `Real-time monitoring of API calls can be achieved by directing CloudTrail Logs to + CloudWatch Logs and establishing corresponding metric filters and alarms. It is + recommended that a metric filter and alarm be established for unauthorized API calls.`, + + audit: `Perform the following to ensure that there is at least one active multi-region CloudTrail with prescribed metric filters and alarms configured: + + 1. Identify the log group name configured for use with active multi-region CloudTrail: + + - List all CloudTrails: *aws cloudtrail describe-trails* + - Identify Multi region Cloudtrails: *Trails with "IsMultiRegionTrail" set to true* + - From value associated with CloudWatchLogsLogGroupArn note ** + + Example: for CloudWatchLogsLogGroupArn that looks like *arn:aws:logs:::log-group:NewGroup:*, * would be *NewGroup* + + - Ensure Identified Multi region CloudTrail is active + + *aws cloudtrail get-trail-status --name * ensure *IsLogging* is set to *TRUE* + + - Ensure identified Multi-region Cloudtrail captures all Management Events + + *aws cloudtrail get-event-selectors --trail-name * + Ensure there is at least one Event Selector for a Trail with *IncludeManagementEvents* set to *true* and *ReadWriteType* set to *All* + + 2. Get a list of all associated metric filters for this **: + + aws logs describe-metric-filters --log-group-name "" + + 3. Ensure the output from the above command contains the following: + + "filterPattern": "{ ($.errorCode = "*UnauthorizedOperation") || ($.errorCode = "AccessDenied*") }" + + 4. Note the ** value associated with the filterPattern found in step 3. + 5. Get a list of CloudWatch alarms and filter on the ** captured in step 4. + + aws cloudwatch describe-alarms --query 'MetricAlarms[?MetricName== ""]' + + 6. Note the *AlarmActions* value - this will provide the SNS topic ARN value. + 7. Ensure there is at least one active subscriber to the SNS topic + + aws sns list-subscriptions-by-topic --topic-arn + + at least one subscription should have "SubscriptionArn" with valid aws ARN. + + Example of valid "SubscriptionArn": "arn:aws:sns::::"`, + + rationale: 'Monitoring unauthorized API calls will help reveal application errors and may reduce time to detect malicious activity.', + + remediation: `Perform the following to setup the metric filter, alarm, SNS topic, and subscription: + + 1. Create a metric filter based on the filter pattern provided which checks for unauthorized API calls and the ** taken from audit step 1. + + aws logs put-metric-filter --log-group-name -- filter-name "" --metric-transformations metricName= "",metricNamespace='CISBenchmark',metricValue=1 --filter-pattern '{ ($.errorCode = "*UnauthorizedOperation") || ($.errorCode = "AccessDenied*") }' + + **Note**: You can choose your own metricName and metricNamespace strings. Using the same metricNamespace for all Foundations Benchmark metrics will group them together. + + 2. Create an SNS topic that the alarm will notify + + aws sns create-topic --name + + **Note** : you can execute this command once and then re-use the same topic for all monitoring alarms. + + 3. Create an SNS subscription to the topic created in step 2 + + aws sns subscribe --topic-arn --protocol -- notification-endpoint + + **Note**: you can execute this command once and then re-use the SNS subscription for all monitoring alarms. + + 4. Create an alarm that is associated with the CloudWatch Logs Metric Filter created in step 1 and an SNS topic created in step 2 + + aws cloudwatch put-metric-alarm --alarm-name "" --metric-name "" --statistic Sum --period 300 --threshold 1 --comparison-operator GreaterThanOrEqualToThreshold --evaluation-periods 1 -- namespace 'CISBenchmark' --alarm-actions `, + references: [ + 'https://aws.amazon.com/sns/', + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html', + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudwatch-alarms-for-cloudtrail.html', + 'https://docs.aws.amazon.com/sns/latest/dg/SubscribeTopic.html', + ], + gql: `{ + queryawsAccount { + id + __typename + cloudtrail { + isMultiRegionTrail + status { + isLogging + } + eventSelectors { + id + readWriteType + includeManagementEvents + } + cloudwatchLog { + arn + metricFilters { + id + filterName + filterPattern + metricTransformations { + metricName + } + } + cloudwatch { + metric + arn + actions + sns { + arn + subscriptions { + arn + } + } + } + } + } + } + }`, + resource: 'queryawsAccount[*]', + severity: 'medium', + conditions: { + path: '@.cloudtrail', + array_any: { + and: [ + { + path: '[*].isMultiRegionTrail', + equal: 'Yes', + }, + { + path: '[*].status.isLogging', + equal: true, + }, + { + path: '[*].eventSelectors', + array_any: { + and: [ + { path: '[*].readWriteType', equal: 'All' }, + { + path: '[*].includeManagementEvents', + equal: true, + }, + ], + }, + }, + { + path: '[*].cloudwatchLog', + jq: '[.[].metricFilters[] + .[].cloudwatch[] | select(.metricTransformations[].metricName == .metric)]', + array_any: { + and: [ + { + path: '[*].filterPattern', + match: /(\$.errorCode)\s*=\s*"UnauthorizedOperation"/, + }, + { + path: '[*].filterPattern', + match: /(\$.errorCode)\s*=\s*"AccessDenied"/, + }, + { + path: '[*].sns', + array_any: { + path: '[*].subscriptions', + array_any: { + path: '[*].arn', + match: /^arn:aws:.*$/, + }, + }, + }, + ], + }, + }, + ], + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.11.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.11.ts new file mode 100644 index 00000000..11538119 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.11.ts @@ -0,0 +1,178 @@ +// AWS CIS 1.2.0 Rule equivalent 3.3 +export default { + id: 'aws-nist-800-53-rev4-7.11', + title: 'AWS NIST 7.11 CloudWatch log metric filter and alarm for usage of root account should be configured', + + description: `Real-time monitoring of API calls can be achieved by directing CloudTrail Logs to + CloudWatch Logs and establishing corresponding metric filters and alarms. It is + recommended that a metric filter and alarm be established for root login attempts.`, + + audit: `Perform the following to ensure that there is at least one active multi-region CloudTrail with prescribed metric filters and alarms configured: + + 1. Identify the log group name configured for use with active multi-region CloudTrail: + + - List all CloudTrails: + + aws cloudtrail describe-trails + + - Identify Multi region Cloudtrails: Trails with *"IsMultiRegionTrail" set to true* + - From value associated with CloudWatchLogsLogGroupArn note ** + +Example: for CloudWatchLogsLogGroupArn that looks like *arn:aws:logs:::log-group:NewGroup:\*, * would be *NewGroup* + + - Ensure Identified Multi region CloudTrail is active + +*aws cloudtrail get-trail-status --name * ensure *IsLogging* is set to *TRUE* + + - Ensure identified Multi-region Cloudtrail captures all Management Events + +*aws cloudtrail get-event-selectors --trail-name * + + Ensure there is at least one Event Selector for a Trail with *IncludeManagementEvents* set to *true* and *ReadWriteType* set to *All* + + 2. Get a list of all associated metric filters for this **: + + aws logs describe-metric-filters --log-group-name "" + + 3. Ensure the output from the above command contains the following: + + "filterPattern": "{ $.userIdentity.type = "Root" && $.userIdentity.invokedBy NOT EXISTS && $.eventType != "AwsServiceEvent" }" + + 4. Note the ** value associated with the *filterPattern* found in step 3. + 5. Get a list of CloudWatch alarms and filter on the ** captured in step 4. + + aws cloudwatch describe-alarms --query 'MetricAlarms[?MetricName== \`\`]' + + 6. Note the *AlarmActions* value - this will provide the SNS topic ARN value. + 7. Ensure there is at least one active subscriber to the SNS topic + + aws sns list-subscriptions-by-topic --topic-arn + + at least one subscription should have "SubscriptionArn" with valid aws ARN. + + Example of valid "SubscriptionArn": "arn:aws:sns::::"`, + + rationale: + 'Monitoring for root account logins will provide visibility into the use of a fully privileged account and an opportunity to reduce the use of it.', + + remediation: `Perform the following to setup the metric filter, alarm, SNS topic, and subscription: + + 1. Create a metric filter based on filter pattern provided which checks for "Root" account usage and the ** taken from audit step 1. + + aws logs put-metric-filter --log-group-name "" -- filter-name "" --metric-transformations metricName= "" ,metricNamespace='CISBenchmark',metricValue=1 --filter- pattern '{ $.userIdentity.type = "Root" && $.userIdentity.invokedBy NOT EXISTS && $.eventType != "AwsServiceEvent" }' + + + **Note**: You can choose your own metricName and metricNamespace strings. Using the same metricNamespace for all Foundations Benchmark metrics will group them together. + + 2. Create an SNS topic that the alarm will notify + + aws sns create-topic --name + + **Note**: you can execute this command once and then re-use the same topic for all monitoring alarms. + + 3. Create an SNS subscription to the topic created in step 2 + + aws sns subscribe --topic-arn --protocol - -notification-endpoint + + **Note** : you can execute this command once and then re-use the SNS subscription for all monitoring alarms. + + 4. Create an alarm that is associated with the CloudWatch Logs Metric Filter created in step 1 and an SNS topic created in step 2 + + aws cloudwatch put-metric-alarm --alarm-name "" --metric- name "" --statistic Sum --period 300 --threshold 1 -- comparison-operator GreaterThanOrEqualToThreshold --evaluation-periods 1 -- namespace 'CISBenchmark' --alarm-actions `, + references: [ + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html', + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudwatch-alarms-for-cloudtrail.html', + 'https://docs.aws.amazon.com/sns/latest/dg/SubscribeTopic.html', + ], + gql: `{ + queryawsAccount { + id + __typename + cloudtrail { + isMultiRegionTrail + status { + isLogging + } + eventSelectors { + id + readWriteType + includeManagementEvents + } + cloudwatchLog { + arn + metricFilters { + id + filterName + filterPattern + metricTransformations { + metricName + } + } + cloudwatch { + metric + arn + actions + sns { + arn + subscriptions { + arn + } + } + } + } + } + } + }`, + resource: 'queryawsAccount[*]', + severity: 'medium', + conditions: { + path: '@.cloudtrail', + array_any: { + and: [ + { + path: '[*].isMultiRegionTrail', + equal: 'Yes', + }, + { + path: '[*].status.isLogging', + equal: true, + }, + { + path: '[*].eventSelectors', + array_any: { + and: [ + { path: '[*].readWriteType', equal: 'All' }, + { + path: '[*].includeManagementEvents', + equal: true, + }, + ], + }, + }, + { + path: '[*].cloudwatchLog', + jq: '[.[].metricFilters[] + .[].cloudwatch[] | select(.metricTransformations[].metricName == .metric)]', + array_any: { + and: [ + { + path: '[*].filterPattern', + match: + /(\$.userIdentity.type)\s*=\s*"Root"*\s&&\s*(\$.userIdentity.invokedBy)\s*NOT\s*EXISTS\s*&&\s*(\$.eventType)\s*!=\s*"AwsServiceEvent"/, + }, + { + path: '[*].sns', + array_any: { + path: '[*].subscriptions', + array_any: { + path: '[*].arn', + match: /^arn:aws:.*$/, + }, + }, + }, + ], + }, + }, + ], + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.12.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.12.ts new file mode 100644 index 00000000..f31f593d --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.12.ts @@ -0,0 +1,178 @@ +// AWS CIS 1.2.0 Rule equivalent 3.14 +const filterPatternRegex = + /\$\.eventName\s*=\s*CreateVpc.+\$\.eventName\s*=\s*DeleteVpc.+\$\.eventName\s*=\s*ModifyVpcAttribute.+\$\.eventName\s*=\s*AcceptVpcPeeringConnection.+\$\.eventName\s*=\s*CreateVpcPeeringConnection.+\$\.eventName\s*=\s*DeleteVpcPeeringConnection.+\$\.eventName\s*=\s*RejectVpcPeeringConnection.+\$\.eventName\s*=\s*AttachClassicLinkVpc.+\$\.eventName\s*=\s*DetachClassicLinkVpc.+\$\.eventName\s*=\s*DisableVpcClassicLink.+\$\.eventName\s*=\s*EnableVpcClassicLink/ + +export default { + id: 'aws-nist-800-53-rev4-7.12', + title: 'AWS NIST 7.12 CloudWatch log metric filter and alarm for VPC changes should be configured', + + description: `Real-time monitoring of API calls can be achieved by directing CloudTrail Logs to + CloudWatch Logs and establishing corresponding metric filters and alarms. It is possible to + have more than 1 VPC within an account, in addition it is also possible to create a peer + connection between 2 VPCs enabling network traffic to route between VPCs. It is + recommended that a metric filter and alarm be established for changes made to VPCs.`, + audit: `Perform the following to ensure that there is at least one active multi-region CloudTrail with prescribed metric filters and alarms configured: + + 1. Identify the log group name configured for use with active multi-region CloudTrail: + + - List all CloudTrails: + + aws cloudtrail describe-trails + + - Identify Multi region Cloudtrails: *Trails with "IsMultiRegionTrail" set to true* + - From value associated with CloudWatchLogsLogGroupArn note ** + + Example: for CloudWatchLogsLogGroupArn that looks like *arn:aws:logs:::log-group:NewGroup:\*, * would be *NewGroup* + + - Ensure Identified Multi region CloudTrail is active + + *aws cloudtrail get-trail-status --name * ensure *IsLogging* is set to *TRUE* + + - Ensure identified Multi-region Cloudtrail captures all Management Events + + *aws cloudtrail get-event-selectors --trail-name * + Ensure there is at least one Event Selector for a Trail with *IncludeManagementEvents* set to *true* and *ReadWriteType* set to *All* + + 2. Get a list of all associated metric filters for this **: + + aws logs describe-metric-filters --log-group-name "" + + 3. Ensure the output from the above command contains the following: + + "filterPattern": "{ ($.eventName = CreateVpc) || ($.eventName = DeleteVpc) || ($.eventName = ModifyVpcAttribute) || ($.eventName = AcceptVpcPeeringConnection) || ($.eventName = CreateVpcPeeringConnection) || ($.eventName = DeleteVpcPeeringConnection) || ($.eventName = RejectVpcPeeringConnection) || ($.eventName = AttachClassicLinkVpc) || ($.eventName = DetachClassicLinkVpc) || ($.eventName = DisableVpcClassicLink) || ($.eventName = EnableVpcClassicLink) }" + + 4. Note the ** value associated with the *filterPattern* found in step 3. + 5. Get a list of CloudWatch alarms and filter on the ** captured in step 4. + + aws cloudwatch describe-alarms --query 'MetricAlarms[?MetricName== ""]' + + 6. Note the *AlarmActions* value - this will provide the SNS topic ARN value. + 7. Ensure there is at least one active subscriber to the SNS topic + + aws sns list-subscriptions-by-topic --topic-arn + + at least one subscription should have "SubscriptionArn" with valid aws ARN. + + Example of valid "SubscriptionArn": "arn:aws:sns::::"`, + + rationale: 'Monitoring changes to IAM policies will help ensure authentication and authorization controls remain intact.', + + remediation: `Perform the following to setup the metric filter, alarm, SNS topic, and subscription: + + 1. Create a metric filter based on filter pattern provided which checks for VPC changes and the ** taken from audit step 1. + + aws logs put-metric-filter --log-group-name -- filter-name "" --metric-transformations metricName= "" ,metricNamespace='CISBenchmark',metricValue=1 -- filter-pattern '{ ($.eventName = CreateVpc) || ($.eventName = DeleteVpc) || ($.eventName = ModifyVpcAttribute) || ($.eventName = AcceptVpcPeeringConnection) || ($.eventName = CreateVpcPeeringConnection) || ($.eventName = DeleteVpcPeeringConnection) || ($.eventName = RejectVpcPeeringConnection) || ($.eventName = AttachClassicLinkVpc) || ($.eventName = DetachClassicLinkVpc) || ($.eventName = DisableVpcClassicLink) || ($.eventName = EnableVpcClassicLink) }' + + **Note**: You can choose your own metricName and metricNamespace strings. Using the same metricNamespace for all Foundations Benchmark metrics will group them together. + + 2. Create an SNS topic that the alarm will notify + + aws sns create-topic --name + + **Note**: you can execute this command once and then re-use the same topic for all monitoring alarms. + + 3. Create an SNS subscription to the topic created in step 2 + + aws sns subscribe --topic-arn --protocol --notification-endpoint + + **Note**: you can execute this command once and then re-use the SNS subscription for all monitoring alarms. + + 4. Create an alarm that is associated with the CloudWatch Logs Metric Filter created in step 1 and an SNS topic created in step 2 + + aws cloudwatch put-metric-alarm --alarm-name "" -- metric-name "" --statistic Sum --period 300 --threshold 1 --comparison-operator GreaterThanOrEqualToThreshold --evaluation-periods 1 --namespace 'CISBenchmark' --alarm-actions `, + references: [ + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html', + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudwatch-alarms-for-cloudtrail.html', + 'https://docs.aws.amazon.com/sns/latest/dg/SubscribeTopic.html', + ], + gql: `{ + queryawsAccount { + id + __typename + cloudtrail { + isMultiRegionTrail + status { + isLogging + } + eventSelectors { + id + readWriteType + includeManagementEvents + } + cloudwatchLog { + arn + metricFilters { + id + filterName + filterPattern + metricTransformations { + metricName + } + } + cloudwatch { + metric + arn + actions + sns { + arn + subscriptions { + arn + } + } + } + } + } + } + }`, + resource: 'queryawsAccount[*]', + severity: 'medium', + conditions: { + path: '@.cloudtrail', + array_any: { + and: [ + { + path: '[*].isMultiRegionTrail', + equal: 'Yes', + }, + { + path: '[*].status.isLogging', + equal: true, + }, + { + path: '[*].eventSelectors', + array_any: { + and: [ + { path: '[*].readWriteType', equal: 'All' }, + { + path: '[*].includeManagementEvents', + equal: true, + }, + ], + }, + }, + { + path: '[*].cloudwatchLog', + jq: '[.[].metricFilters[] + .[].cloudwatch[] | select(.metricTransformations[].metricName == .metric)]', + array_any: { + and: [ + { + path: '[*].filterPattern', + match: filterPatternRegex, + }, + { + path: '[*].sns', + array_any: { + path: '[*].subscriptions', + array_any: { + path: '[*].arn', + match: /^arn:aws:.*$/, + }, + }, + }, + ], + }, + }, + ], + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.13.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.13.ts new file mode 100644 index 00000000..12213377 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.13.ts @@ -0,0 +1,172 @@ +// AWS CIS 1.2.0 Rule equivalent 3.13 +const filterPatternRegex = +/\$\.eventName\s*=\s*CreateRoute.+\$\.eventName\s*=\s*CreateRouteTable.+\$\.eventName\s*=\s*ReplaceRoute.+\$\.eventName\s*=\s*ReplaceRouteTableAssociation.+\$\.eventName\s*=\s*DeleteRouteTable.+\$\.eventName\s*=\s*DeleteRoute.+\$\.eventName\s*=\s*DisassociateRouteTable/ + +export default { + id: 'aws-nist-800-53-rev4-7.13', + title: 'AWS NIST 7.13 CloudWatch log metric filter and alarm for VPC route table changes should be configured', + + description: `Real-time monitoring of API calls can be achieved by directing CloudTrail Logs to + CloudWatch Logs and establishing corresponding metric filters and alarms. Routing tables + are used to route network traffic between subnets and to network gateways. It is + recommended that a metric filter and alarm be established for changes to route tables.`, + audit: `Perform the following to ensure that there is at least one active multi-region CloudTrail with prescribed metric filters and alarms configured: + + 1. Identify the log group name configured for use with active multi-region CloudTrail: + + - List all CloudTrails: *aws cloudtrail describe-trails* + - Identify Multi region Cloudtrails: *Trails with "IsMultiRegionTrail" set to true* + - From value associated with CloudWatchLogsLogGroupArn note ** + + Example: for CloudWatchLogsLogGroupArn that looks like *arn:aws:logs:::log-group:NewGroup:\*, * would be *NewGroup* + + - Ensure Identified Multi region CloudTrail is active + + *aws cloudtrail get-trail-status --name * ensure *IsLogging* is set to *TRUE* + + - Ensure identified Multi-region Cloudtrail captures all Management Events + + *aws cloudtrail get-event-selectors --trail-name * + Ensure there is at least one Event Selector for a Trail with *IncludeManagementEvents* set to *true* and *ReadWriteType* set to *All* + + 2. Get a list of all associated metric filters for this **: + + aws logs describe-metric-filters --log-group-name "" + + 3. Ensure the output from the above command contains the following: + + "filterPattern": "{ ($.eventName = CreateRoute) || ($.eventName = CreateRouteTable) || ($.eventName = ReplaceRoute) || ($.eventName = ReplaceRouteTableAssociation) || ($.eventName = DeleteRouteTable) || ($.eventName = DeleteRoute) || ($.eventName = DisassociateRouteTable) }" + + 4. Note the ** value associated with the *filterPattern* found in step 3. + 5. Get a list of CloudWatch alarms and filter on the ** captured in step 4. + + aws cloudwatch describe-alarms --query 'MetricAlarms[?MetricName== ""]' + + 6. Note the *AlarmActions* value - this will provide the SNS topic ARN value. + 7. Ensure there is at least one active subscriber to the SNS topic + + aws sns list-subscriptions-by-topic --topic-arn + + at least one subscription should have "SubscriptionArn" with valid aws ARN. + + Example of valid "SubscriptionArn": "arn:aws:sns::::"`, + rationale: 'Monitoring changes to route tables will help ensure that all VPC traffic flows through an expected path.', + remediation: `Perform the following to setup the metric filter, alarm, SNS topic, and subscription: + + 1. Create a metric filter based on filter pattern provided which checks for route table changes and the ** taken from audit step 1. + + aws logs put-metric-filter --log-group-name -- filter-name "" --metric-transformations metricName= "" ,metricNamespace='CISBenchmark',metricValue=1 --filter-pattern '{($.eventName = CreateRoute) || ($.eventName = CreateRouteTable) || ($.eventName = ReplaceRoute) || ($.eventName = ReplaceRouteTableAssociation) || ($.eventName = DeleteRouteTable) || ($.eventName = DeleteRoute) || ($.eventName = DisassociateRouteTable) }' + + **Note**: You can choose your own metricName and metricNamespace strings. Using the same metricNamespace for all Foundations Benchmark metrics will group them together. + + 2. Create an SNS topic that the alarm will notify + + aws sns create-topic --name + + **Note**: you can execute this command once and then re-use the same topic for all monitoring alarms. + + 3. Create an SNS subscription to the topic created in step 2 + + aws sns subscribe --topic-arn --protocol -- notification-endpoint + + **Note**: you can execute this command once and then re-use the SNS subscription for all monitoring alarms. + + 4. Create an alarm that is associated with the CloudWatch Logs Metric Filter created in step 1 and an SNS topic created in step 2 + + aws cloudwatch put-metric-alarm --alarm-name "" --metric-name "" --statistic Sum --period 300 - -threshold 1 --comparison-operator GreaterThanOrEqualToThreshold -- evaluation-periods 1 --namespace 'CISBenchmark' --alarm-actions `, + references: [ + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html', + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudwatch-alarms-for-cloudtrail.html', + 'https://docs.aws.amazon.com/sns/latest/dg/SubscribeTopic.html', + ], + gql: `{ + queryawsAccount { + id + __typename + cloudtrail { + isMultiRegionTrail + status { + isLogging + } + eventSelectors { + id + readWriteType + includeManagementEvents + } + cloudwatchLog { + arn + metricFilters { + id + filterName + filterPattern + metricTransformations { + metricName + } + } + cloudwatch { + metric + arn + actions + sns { + arn + subscriptions { + arn + } + } + } + } + } + } + }`, + resource: 'queryawsAccount[*]', + severity: 'medium', + conditions: { + path: '@.cloudtrail', + array_any: { + and: [ + { + path: '[*].isMultiRegionTrail', + equal: 'Yes', + }, + { + path: '[*].status.isLogging', + equal: true, + }, + { + path: '[*].eventSelectors', + array_any: { + and: [ + { path: '[*].readWriteType', equal: 'All' }, + { + path: '[*].includeManagementEvents', + equal: true, + }, + ], + }, + }, + { + path: '[*].cloudwatchLog', + jq: '[.[].metricFilters[] + .[].cloudwatch[] | select(.metricTransformations[].metricName == .metric)]', + array_any: { + and: [ + { + path: '[*].filterPattern', + match: filterPatternRegex, + }, + { + path: '[*].sns', + array_any: { + path: '[*].subscriptions', + array_any: { + path: '[*].arn', + match: /^arn:aws:.*$/, + }, + }, + }, + ], + }, + }, + ], + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.14.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.14.ts new file mode 100644 index 00000000..33843b92 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.14.ts @@ -0,0 +1,176 @@ +// AWS CIS 1.2.0 Rule equivalent 3.10 +const filterPatternRegex = + /\$\.eventName\s*=\s*AuthorizeSecurityGroupIngress.+\$\.eventName\s*=\s*AuthorizeSecurityGroupEgress.+\$\.eventName\s*=\s*RevokeSecurityGroupIngress.+\$\.eventName\s*=\s*RevokeSecurityGroupEgress.+\$\.eventName\s*=\s*CreateSecurityGroup.+\$\.eventName\s*=\s*DeleteSecurityGroup/ + +export default { + id: 'aws-nist-800-53-rev4-7.14', + title: 'AWS NIST 7.14 CloudWatch log metric filter and alarm for VPC security group changes should be configured', + + description: `Real-time monitoring of API calls can be achieved by directing CloudTrail Logs to + CloudWatch Logs and establishing corresponding metric filters and alarms. Security + Groups are a stateful packet filter that controls ingress and egress traffic within a VPC. It is + recommended that a metric filter and alarm be established changes to Security Groups.`, + + audit: `Perform the following to ensure that there is at least one active multi-region CloudTrail with prescribed metric filters and alarms configured: + + 1. Identify the log group name configured for use with active multi-region CloudTrail: + + - List all CloudTrails: *aws cloudtrail describe-trails* + - Identify Multi region Cloudtrails: *Trails with "IsMultiRegionTrail" set to true* + - From value associated with CloudWatchLogsLogGroupArn note ** + + Example: for CloudWatchLogsLogGroupArn that looks like *arn:aws:logs:::log-group:NewGroup:\*, * would be *NewGroup* + + - Ensure Identified Multi region CloudTrail is active + + *aws cloudtrail get-trail-status --name * ensure *IsLogging* is set to *TRUE* + + - Ensure identified Multi-region Cloudtrail captures all Management Events + + *aws cloudtrail get-event-selectors --trail-name * + Ensure there is at least one Event Selector for a Trail with *IncludeManagementEvents* set to *true* and *ReadWriteType* set to *All* + + 2. Get a list of all associated metric filters for this **: + + aws logs describe-metric-filters --log-group-name "" + + 3. Ensure the output from the above command contains the following: + + "filterPattern": "{ ($.eventName = AuthorizeSecurityGroupIngress) || ($.eventName = AuthorizeSecurityGroupEgress) || ($.eventName = RevokeSecurityGroupIngress) || ($.eventName = RevokeSecurityGroupEgress) || ($.eventName = CreateSecurityGroup) || ($.eventName = DeleteSecurityGroup) }" + + 4. Note the ** value associated with the *filterPattern* found in step 3. + 5. Get a list of CloudWatch alarms and filter on the ** captured in step 4. + + aws cloudwatch describe-alarms --query 'MetricAlarms[?MetricName== ""]' + + 6. Note the *AlarmActions* value - this will provide the SNS topic ARN value. + 7. Ensure there is at least one active subscriber to the SNS topic + + aws sns list-subscriptions-by-topic --topic-arn + + at least one subscription should have "SubscriptionArn" with valid aws ARN. + + Example of valid "SubscriptionArn": "arn:aws:sns::::"`, + + rationale: 'Monitoring changes to security group will help ensure that resources and services are not unintentionally exposed.', + + remediation: `Perform the following to setup the metric filter, alarm, SNS topic, and subscription: + + 1. Create a metric filter based on filter pattern provided which checks for security groups changes and the ** taken from audit step 1. + + aws logs put-metric-filter --log-group-name -- filter-name "" --metric-transformations metricName= "" ,metricNamespace='CISBenchmark',metricValue=1 --filter-pattern '{($.eventName = AuthorizeSecurityGroupIngress) || ($.eventName = AuthorizeSecurityGroupEgress) || ($.eventName = RevokeSecurityGroupIngress) || ($.eventName = RevokeSecurityGroupEgress) || ($.eventName = CreateSecurityGroup) || ($.eventName = DeleteSecurityGroup) }' + + **Note** : You can choose your own metricName and metricNamespace strings. Using the same metricNamespace for all Foundations Benchmark metrics will group them together. + + 2. Create an SNS topic that the alarm will notify + + aws sns create-topic --name + + **Note** : you can execute this command once and then re-use the same topic for all + monitoring alarms. + + 3. Create an SNS subscription to the topic created in step 2 + + aws sns subscribe --topic-arn --protocol -- notification-endpoint + + **Note**: you can execute this command once and then re-use the SNS subscription for all monitoring alarms. + + 4. Create an alarm that is associated with the CloudWatch Logs Metric Filter created in step 1 and an SNS topic created in step 2 + + aws cloudwatch put-metric-alarm --alarm-name "" --metric-name "" --statistic Sum --period 300 --threshold 1 --comparison-operator GreaterThanOrEqualToThreshold --evaluation-periods 1 -- namespace 'CISBenchmark' --alarm-actions `, + references: [ + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html', + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudwatch-alarms-for-cloudtrail.html', + 'https://docs.aws.amazon.com/sns/latest/dg/SubscribeTopic.html', + ], + gql: `{ + queryawsAccount { + id + __typename + cloudtrail { + isMultiRegionTrail + status { + isLogging + } + eventSelectors { + id + readWriteType + includeManagementEvents + } + cloudwatchLog { + arn + metricFilters { + id + filterName + filterPattern + metricTransformations { + metricName + } + } + cloudwatch { + metric + arn + actions + sns { + arn + subscriptions { + arn + } + } + } + } + } + } + }`, + resource: 'queryawsAccount[*]', + severity: 'medium', + conditions: { + path: '@.cloudtrail', + array_any: { + and: [ + { + path: '[*].isMultiRegionTrail', + equal: 'Yes', + }, + { + path: '[*].status.isLogging', + equal: true, + }, + { + path: '[*].eventSelectors', + array_any: { + and: [ + { path: '[*].readWriteType', equal: 'All' }, + { + path: '[*].includeManagementEvents', + equal: true, + }, + ], + }, + }, + { + path: '[*].cloudwatchLog', + jq: '[.[].metricFilters[] + .[].cloudwatch[] | select(.metricTransformations[].metricName == .metric)]', + array_any: { + and: [ + { + path: '[*].filterPattern', + match: filterPatternRegex, + }, + { + path: '[*].sns', + array_any: { + path: '[*].subscriptions', + array_any: { + path: '[*].arn', + match: /^arn:aws:.*$/, + }, + }, + }, + ], + }, + }, + ], + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.2.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.2.ts new file mode 100644 index 00000000..ce8ee642 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.2.ts @@ -0,0 +1,170 @@ +const filterPatternRegex = +/\(\$\.eventSource\s*=\s*organizations\.amazonaws\.com\)\s*&&\s*\(\(\$\.eventName\s*=\s*"AcceptHandshake"\)\s*\|\|\s*\(\$\.eventName\s*=\s*"AttachPolicy"\)\s*\|\|\s*\(\$\.eventName\s*=\s*"CreateAccount"\)\s*\|\|\s*\(\$\.eventName\s*=\s*\"CreateOrganizationalUnit"\)\s*\|\|\s*\(\$\.eventName\s*=\s*"CreatePolicy"\)\s*\|\|\s*\(\$\.eventName\s*=\s*"DeclineHandshake"\)\s*\|\|\s*\(\$\.eventName\s*=\s*"DeleteOrganization"\)\s*\|\|\s*\(\$\.eventName\s*=\s*"DeleteOrganizationalUnit"\)\s*\|\|\s*\(\$\.eventName\s*=\s*"DeletePolicy"\)\s*\|\|\s*\(\$\.eventName\s*=\s*"DetachPolicy"\)\s*\|\|\s*\(\$\.eventName\s*=\s*"DisablePolicyType"\)\s*\|\|\s*\(\$\.eventName\s*=\s*"EnablePolicyType"\)\s*\|\|\s*\(\$\.eventName\s*=\s*"InviteAccountToOrganization"\)\s*\|\|\s*\(\$\.eventName\s*=\s*"LeaveOrganization"\)\s*\|\|\s*\(\$\.eventName\s*=\s*"MoveAccount"\)\s*\|\|\s*\(\$\.eventName\s*=\s*"RemoveAccountFromOrganization"\)\s*\|\|\s*\(\$\.eventName\s*=\s*"UpdatePolicy"\)\s*\|\|\s*\(\$\.eventName\s*=\s*"UpdateOrganizationalUnit"\)\)/ + +export default { + id: 'aws-nist-800-53-rev4-7.2', + title: 'AWS NIST 7.2 CloudWatch log metric filter and alarm for AWS Organizations changes should be configured for the master account', + + description: 'Monitoring AWS Organizations changes can help you prevent any unwanted, accidental or intentional modifications that may lead to unauthorized access or other security breaches. This monitoring technique helps you to ensure that any unexpected changes performed within your AWS Organizations can be investigated and any unwanted changes can be rolled back.', + + audit: '', + + rationale: '', + + remediation: `**Console Remediation Steps** + + Create the Metric Filter: + + - Navigate to CloudWatch. + - In the left navigation, click Logs. + - Select the log group that you created for CloudTrail log events. + - Choose Actions > Create Metric Filter. + - On the Define Pattern screen, enter the following: + + { ($.eventSource = organizations.amazonaws.com) && (($.eventName = "AcceptHandshake") || ($.eventName = "AttachPolicy") || ($.eventName = "CreateAccount") || ($.eventName = "CreateOrganizationalUnit") || ($.eventName = "CreatePolicy") || ($.eventName = "DeclineHandshake") || ($.eventName = "DeleteOrganization") || ($.eventName = "DeleteOrganizationalUnit") || ($.eventName = "DeletePolicy") || ($.eventName = "DetachPolicy") || ($.eventName = "DisablePolicyType") || ($.eventName = "EnablePolicyType") || ($.eventName = "InviteAccountToOrganization") || ($.eventName = "LeaveOrganization") || ($.eventName = "MoveAccount") || ($.eventName = "RemoveAccountFromOrganization") || ($.eventName = "UpdatePolicy") || ($.eventName = "UpdateOrganizationalUnit")) } + + - Select Next. + - Enter a filter name. + - Enter a metric name. + - For Metric Value, type 1. + - Select Next. + - Select Create Metric Filter. + + Create an Alarm: + + - On the Metric Filters tab of the same log group, check the box for the filter you just created and click Create Alarm. + - On the Create Alarm page, provide the following values: + - Under Statistic, select Sum. + - Under Period, select 5 minutes. + - Under Threshold type, select Static. + - Under “Whenever is…” select Greater/Equal. + - Under “than…” enter 1. + - Set Datapoints to alarm to 1 out of 1. + - Select Next. + - On the Configure Actions page, provide the following values: + - Under Alarm state trigger, select In alarm. + - Under Select an SNS topic, click Select an existing SNS topic. + - Under Send a notification to… select the desired topic. + - Select next. + - Enter an alarm name and description. + - Click Create Alarm. + + **CLI Remediation Steps** + + To enable CloudWatch log metric filter and alarm for AWS Organizations changes for the master account: + + Create a metric filter: + + aws logs put-metric-filter --log-group-name --filter-name '' --metric-transformations metricName= '',metricNamespace='CISBenchmark',metricValue=1 --filter-pattern '{ ($.eventSource = organizations.amazonaws.com) && (($.eventName = "AcceptHandshake") || ($.eventName = "AttachPolicy") || ($.eventName = "CreateAccount") || ($.eventName = "CreateOrganizationalUnit") || ($.eventName = "CreatePolicy") || ($.eventName = "DeclineHandshake") || ($.eventName = "DeleteOrganization") || ($.eventName = "DeleteOrganizationalUnit") || ($.eventName = "DeletePolicy") || ($.eventName = "DetachPolicy") || ($.eventName = "DisablePolicyType") || ($.eventName = "EnablePolicyType") || ($.eventName = "InviteAccountToOrganization") || ($.eventName = "LeaveOrganization") || ($.eventName = "MoveAccount") || ($.eventName = "RemoveAccountFromOrganization") || ($.eventName = "UpdatePolicy") || ($.eventName = "UpdateOrganizationalUnit")) }' + + Create an SNS topic that the alarm will notify: + + aws sns create-topic --name + + Create an SNS subscription to the topic created in step 2: + + aws sns subscribe --topic-arn --protocol --notification-endpoint + + Create an alarm that is associated with the CloudWatch Logs Metric Filter created in step 1 and an SNS topic created in step 2:', + + aws cloudwatch put-metric-alarm --alarm-name '' --metric-name '' --statistic Sum --period 300 --threshold 1 --comparison-operator GreaterThanOrEqualToThreshold --evaluation-periods 1 --namespace 'CISBenchmark' --alarm-actions `, + + references: [ + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudwatch-alarms-for-cloudtrail.html', + 'https://docs.aws.amazon.com/organizations/latest/userguide/orgs_security_incident-response.html', + 'https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html', + 'https://docs.aws.amazon.com/organizations/latest/userguide/orgs_tutorials_cwe.html', + 'https://docs.aws.amazon.com/cli/latest/reference/logs/put-metric-filter.html', + 'https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/put-metric-alarm.html', + ], + gql: `{ + queryawsAccount { + id + __typename + cloudtrail { + isMultiRegionTrail + status { + isLogging + } + eventSelectors { + id + readWriteType + includeManagementEvents + } + cloudwatchLog { + arn + metricFilters { + id + filterName + filterPattern + metricTransformations { + metricName + } + } + cloudwatch { + metric + arn + actions + sns { + arn + subscriptions { + arn + } + } + } + } + } + } + }`, + resource: 'queryawsAccount[*]', + severity: 'medium', + conditions: { + path: '@.cloudtrail', + array_any: { + and: [ + { + path: '[*].isMultiRegionTrail', + equal: 'Yes', + }, + { + path: '[*].status.isLogging', + equal: true, + }, + { + path: '[*].eventSelectors', + array_any: { + and: [ + { path: '[*].readWriteType', equal: 'All' }, + { + path: '[*].includeManagementEvents', + equal: true, + }, + ], + }, + }, + { + path: '[*].cloudwatchLog', + jq: '[.[].metricFilters[] + .[].cloudwatch[] | select(.metricTransformations[].metricName == .metric)]', + array_any: { + and: [ + { + path: '[*].filterPattern', + match: filterPatternRegex, + }, + { + path: '[*].sns', + array_any: { + path: '[*].subscriptions', + array_any: { + path: '[*].arn', + match: /^arn:aws:.*$/, + }, + }, + }, + ], + }, + }, + ], + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.3.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.3.ts new file mode 100644 index 00000000..9165616b --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.3.ts @@ -0,0 +1,175 @@ +// AWS CIS 1.2.0 Rule equivalent 3.11 +const filterPatternRegex = + /\$\.eventName\s*=\s*CreateNetworkAcl.+\$\.eventName\s*=\s*CreateNetworkAclEntry.+\$\.eventName\s*=\s*DeleteNetworkAcl.+\$\.eventName\s*=\s*DeleteNetworkAclEntry.+\$\.eventName\s*=\s*ReplaceNetworkAclEntry.+\$\.eventName\s*=\s*ReplaceNetworkAclAssociation/ + +export default { + id: 'aws-nist-800-53-rev4-7.3', + title: 'AWS NIST 7.3 CloudWatch log metric filter and alarm for changes to VPC NACLs should be configured', + + description: `Real-time monitoring of API calls can be achieved by directing CloudTrail Logs to + CloudWatch Logs and establishing corresponding metric filters and alarms. NACLs are used + as a stateless packet filter to control ingress and egress traffic for subnets within a VPC. It is + recommended that a metric filter and alarm be established for changes made to NACLs.`, + + audit: `Perform the following to ensure that there is at least one active multi-region CloudTrail with prescribed metric filters and alarms configured: + + 1. Identify the log group name configured for use with active multi-region CloudTrail: + + - List all CloudTrails: *aws cloudtrail describe-trails* + - Identify Multi region Cloudtrails: *Trails with "IsMultiRegionTrail" set to true* + - From value associated with CloudWatchLogsLogGroupArn note ** + + Example: for CloudWatchLogsLogGroupArn that looks like *arn:aws:logs:::log-group:NewGroup:\*, * would be *NewGroup* + + - Ensure Identified Multi region CloudTrail is active + + *aws cloudtrail get-trail-status --name * ensure *IsLogging* is set to *TRUE* + + - Ensure identified Multi-region Cloudtrail captures all Management Events + + *aws cloudtrail get-event-selectors --trail-name * + Ensure there is at least one Event Selector for a Trail with *IncludeManagementEvents* set to *true* and *ReadWriteType* set to *All* + + 2. Get a list of all associated metric filters for this **: + + aws logs describe-metric-filters --log-group-name "" + + 3. Ensure the output from the above command contains the following: + + "filterPattern": "{ ($.eventName = CreateNetworkAcl) || ($.eventName = CreateNetworkAclEntry) || ($.eventName = DeleteNetworkAcl) || ($.eventName = DeleteNetworkAclEntry) || ($.eventName = ReplaceNetworkAclEntry) || ($.eventName = ReplaceNetworkAclAssociation) }" + + 4. Note the ** value associated with the *filterPattern* found in step 3. + 5. Get a list of CloudWatch alarms and filter on the ** captured in step 4. + + aws cloudwatch describe-alarms --query 'MetricAlarms[?MetricName== ""]' + + 6. Note the *AlarmActions* value - this will provide the SNS topic ARN value. + 7. Ensure there is at least one active subscriber to the SNS topic + + aws sns list-subscriptions-by-topic --topic-arn + + at least one subscription should have "SubscriptionArn" with valid aws ARN. + + Example of valid "SubscriptionArn": "arn:aws:sns::::"`, + + rationale: 'Monitoring changes to NACLs will help ensure that AWS resources and services are not unintentionally exposed.', + + remediation: `Perform the following to setup the metric filter, alarm, SNS topic, and subscription: + + 1. Create a metric filter based on filter pattern provided which checks for NACL changes and the ** taken from audit step 1. + + aws logs put-metric-filter --log-group-name -- filter-name "" --metric-transformations metricName= "" ,metricNamespace='CISBenchmark',metricValue=1 -- filter-pattern '{ ($.eventName = CreateNetworkAcl) || ($.eventName = CreateNetworkAclEntry) || ($.eventName = DeleteNetworkAcl) || ($.eventName = DeleteNetworkAclEntry) || ($.eventName = ReplaceNetworkAclEntry) || ($.eventName = ReplaceNetworkAclAssociation) }' + + **Note**: You can choose your own metricName and metricNamespace strings. Using the same metricNamespace for all Foundations Benchmark metrics will group them together. + + 2. Create an SNS topic that the alarm will notify + + aws sns create-topic --name + + **Note**: you can execute this command once and then re-use the same topic for all monitoring alarms. + + 3. Create an SNS subscription to the topic created in step 2 + + aws sns subscribe --topic-arn --protocol --notification-endpoint + + **Note**: you can execute this command once and then re-use the SNS subscription for all monitoring alarms. + + 4. Create an alarm that is associated with the CloudWatch Logs Metric Filter created in step 1 and an SNS topic created in step 2 + + aws cloudwatch put-metric-alarm --alarm-name "" -- metric-name "" --statistic Sum --period 300 -- threshold 1 --comparison-operator GreaterThanOrEqualToThreshold --evaluation- periods 1 --namespace 'CISBenchmark' --alarm-actions `, + references: [ + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html', + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudwatch-alarms-for-cloudtrail.html', + 'https://docs.aws.amazon.com/sns/latest/dg/SubscribeTopic.html', + ], + gql: `{ + queryawsAccount { + id + __typename + cloudtrail { + isMultiRegionTrail + status { + isLogging + } + eventSelectors { + id + readWriteType + includeManagementEvents + } + cloudwatchLog { + arn + metricFilters { + id + filterName + filterPattern + metricTransformations { + metricName + } + } + cloudwatch { + metric + arn + actions + sns { + arn + subscriptions { + arn + } + } + } + } + } + } + }`, + resource: 'queryawsAccount[*]', + severity: 'medium', + conditions: { + path: '@.cloudtrail', + array_any: { + and: [ + { + path: '[*].isMultiRegionTrail', + equal: 'Yes', + }, + { + path: '[*].status.isLogging', + equal: true, + }, + { + path: '[*].eventSelectors', + array_any: { + and: [ + { path: '[*].readWriteType', equal: 'All' }, + { + path: '[*].includeManagementEvents', + equal: true, + }, + ], + }, + }, + { + path: '[*].cloudwatchLog', + jq: '[.[].metricFilters[] + .[].cloudwatch[] | select(.metricTransformations[].metricName == .metric)]', + array_any: { + and: [ + { + path: '[*].filterPattern', + match: filterPatternRegex, + }, + { + path: '[*].sns', + array_any: { + path: '[*].subscriptions', + array_any: { + path: '[*].arn', + match: /^arn:aws:.*$/, + }, + }, + }, + ], + }, + }, + ], + } + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.4.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.4.ts new file mode 100644 index 00000000..78b38811 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.4.ts @@ -0,0 +1,175 @@ +// AWS CIS 1.2.0 Rule equivalent 3.12 +const filterPatternRegex = + /\$\.eventName\s*=\s*CreateCustomerGateway.+\$\.eventName\s*=\s*DeleteCustomerGateway.+\$\.eventName\s*=\s*AttachInternetGateway.+\$\.eventName\s*=\s*CreateInternetGateway.+\$\.eventName\s*=\s*DeleteInternetGateway.+\$\.eventName\s*=\s*DetachInternetGateway/ + +export default { + id: 'aws-nist-800-53-rev4-7.4', + title: 'AWS NIST 7.4 CloudWatch log metric filter and alarm for changes to VPC network gateways should be configured', + + description: `Real-time monitoring of API calls can be achieved by directing CloudTrail Logs to + CloudWatch Logs and establishing corresponding metric filters and alarms. Network + gateways are required to send/receive traffic to a destination outside of a VPC. It is + recommended that a metric filter and alarm be established for changes to network + gateways.`, + + audit: `Perform the following to ensure that there is at least one active multi-region CloudTrail with prescribed metric filters and alarms configured: + + 1. Identify the log group name configured for use with active multi-region CloudTrail: + + - List all CloudTrails: *aws cloudtrail describe-trails* + - Identify Multi region Cloudtrails: *Trails with "IsMultiRegionTrail" set to true* + - From value associated with CloudWatchLogsLogGroupArn note ** + + Example: for CloudWatchLogsLogGroupArn that looks like *arn:aws:logs:::log-group:NewGroup:\*, * would be *NewGroup* + + - Ensure Identified Multi region CloudTrail is active + + *aws cloudtrail get-trail-status --name * ensure *IsLogging* is set to *TRUE* + + - Ensure identified Multi-region Cloudtrail captures all Management Events + + *aws cloudtrail get-event-selectors --trail-name * + Ensure there is at least one Event Selector for a Trail with *IncludeManagementEvents* set to *true* and *ReadWriteType* set to *All* + + 2. Get a list of all associated metric filters for this **: + + aws logs describe-metric-filters --log-group-name "" + + 3. Ensure the output from the above command contains the following: + + "filterPattern": "{ ($.eventName = CreateCustomerGateway) || ($.eventName = DeleteCustomerGateway) || ($.eventName = AttachInternetGateway) || ($.eventName = CreateInternetGateway) || ($.eventName = DeleteInternetGateway) || ($.eventName = DetachInternetGateway) }" + + 4. Note the ** value associated with the *filterPattern* found in step 3. + 5. Get a list of CloudWatch alarms and filter on the ** captured in step 4. + + aws cloudwatch describe-alarms --query 'MetricAlarms[?MetricName== ""]' + + 6. Note the AlarmActions value - this will provide the SNS topic ARN value. + 7. Ensure there is at least one active subscriber to the SNS topic + + aws sns list-subscriptions-by-topic --topic-arn + + at least one subscription should have "SubscriptionArn" with valid aws ARN. + + Example of valid "SubscriptionArn": "arn:aws:sns::::"`, + rationale: 'Monitoring changes to network gateways will help ensure that all ingress/egress traffic traverses the VPC border via a controlled path.', + + remediation: `Perform the following to setup the metric filter, alarm, SNS topic, and subscription: + + 1. Create a metric filter based on filter pattern provided which checks for network gateways changes and the ** taken from audit step 1. + + aws logs put-metric-filter --log-group-name -- filter-name "" --metric-transformations metricName= "" ,metricNamespace='CISBenchmark',metricValue=1 --filter-pattern '{($.eventName = CreateCustomerGateway) || ($.eventName = DeleteCustomerGateway) || ($.eventName = AttachInternetGateway) || ($.eventName = CreateInternetGateway) || ($.eventName = DeleteInternetGateway) || ($.eventName = DetachInternetGateway) }' + + **Note**: You can choose your own metricName and metricNamespace strings. Using the same metricNamespace for all Foundations Benchmark metrics will group them together. + + 2. Create an SNS topic that the alarm will notify + + aws sns create-topic --name + + **Note**: you can execute this command once and then re-use the same topic for all monitoring alarms. + + 3. Create an SNS subscription to the topic created in step 2 + + aws sns subscribe --topic-arn --protocol -- notification-endpoint + + **Note**: you can execute this command once and then re-use the SNS subscription for all monitoring alarms. + + 4. Create an alarm that is associated with the CloudWatch Logs Metric Filter created in step 1 and an SNS topic created in step 2 + + aws cloudwatch put-metric-alarm --alarm-name "" - -metric-name "" --statistic Sum --period 300 -- threshold 1 --comparison-operator GreaterThanOrEqualToThreshold --evaluation- periods 1 --namespace 'CISBenchmark' --alarm-actions `, + references: [ + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html', + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudwatch-alarms-for-cloudtrail.html', + 'https://docs.aws.amazon.com/sns/latest/dg/SubscribeTopic.html', + ], + gql: `{ + queryawsAccount { + id + __typename + cloudtrail { + isMultiRegionTrail + status { + isLogging + } + eventSelectors { + id + readWriteType + includeManagementEvents + } + cloudwatchLog { + arn + metricFilters { + id + filterName + filterPattern + metricTransformations { + metricName + } + } + cloudwatch { + metric + arn + actions + sns { + arn + subscriptions { + arn + } + } + } + } + } + } + }`, + resource: 'queryawsAccount[*]', + severity: 'medium', + conditions: { + path: '@.cloudtrail', + array_any: { + and: [ + { + path: '[*].isMultiRegionTrail', + equal: 'Yes', + }, + { + path: '[*].status.isLogging', + equal: true, + }, + { + path: '[*].eventSelectors', + array_any: { + and: [ + { path: '[*].readWriteType', equal: 'All' }, + { + path: '[*].includeManagementEvents', + equal: true, + }, + ], + }, + }, + { + path: '[*].cloudwatchLog', + jq: '[.[].metricFilters[] + .[].cloudwatch[] | select(.metricTransformations[].metricName == .metric)]', + array_any: { + and: [ + { + path: '[*].filterPattern', + match: filterPatternRegex, + }, + { + path: '[*].sns', + array_any: { + path: '[*].subscriptions', + array_any: { + path: '[*].arn', + match: /^arn:aws:.*$/, + }, + }, + }, + ], + }, + }, + ], + } + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.5.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.5.ts new file mode 100644 index 00000000..30edb612 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.5.ts @@ -0,0 +1,190 @@ +// AWS CIS 1.2.0 Rule equivalent 3.5 +export default { + id: 'aws-nist-800-53-rev4-7.5', + title: 'AWS NIST 7.5 CloudWatch log metric filter and alarm for CloudTrail configuration changes should be configured', + + description: `Real-time monitoring of API calls can be achieved by directing CloudTrail Logs to + CloudWatch Logs and establishing corresponding metric filters and alarms. It is + recommended that a metric filter and alarm be established for detecting changes to + CloudTrail's configurations.`, + + audit: `Perform the following to ensure that there is at least one active multi-region CloudTrail with prescribed metric filters and alarms configured: + + 1. Identify the log group name configured for use with active multi-region CloudTrail: + + - List all CloudTrails: *aws cloudtrail describe-trails* + + - Identify Multi region Cloudtrails: *Trails with "IsMultiRegionTrail" set to true* + - From value associated with CloudWatchLogsLogGroupArn note ** + + Example: for CloudWatchLogsLogGroupArn that looks like *arn:aws:logs:::log-group:NewGroup:\*, * would be *NewGroup* + + - Ensure Identified Multi region CloudTrail is active + + *aws cloudtrail get-trail-status --name * ensure *IsLogging* is set to *TRUE* + + - Ensure identified Multi-region Cloudtrail captures all Management Events + + *aws cloudtrail get-event-selectors --trail-name * + + Ensure there is at least one Event Selector for a Trail with *IncludeManagementEvents* set to *true* and *ReadWriteType* set to *All* + + 2. Get a list of all associated metric filters for this **: + + aws logs describe-metric-filters --log-group-name "" + + 3. Ensure the output from the above command contains the following: + + "filterPattern": "{ ($.eventName = CreateTrail) || ($.eventName = UpdateTrail) || ($.eventName = DeleteTrail) || ($.eventName = StartLogging) || ($.eventName = StopLogging) }" + + 4. Note the ** value associated with the *filterPattern* found in step 3. + 5. Get a list of CloudWatch alarms and filter on the ** captured in step 4. + + aws cloudwatch describe-alarms --query 'MetricAlarms[?MetricName== ""]' + + 6. Note the *AlarmActions* value - this will provide the SNS topic ARN value. + 7. Ensure there is at least one active subscriber to the SNS topic + + aws sns list-subscriptions-by-topic --topic-arn + + at least one subscription should have "SubscriptionArn" with valid aws ARN. + + Example of valid "SubscriptionArn": "arn:aws:sns::::"`, + + rationale: 'Monitoring changes to CloudTrail\'s configuration will help ensure sustained visibility to activities performed in the AWS account.', + + remediation: `Perform the following to setup the metric filter, alarm, SNS topic, and subscription: + + 1. Create a metric filter based on filter pattern provided which checks for cloudtrail configuration changes and the ** taken from audit step 1. + + aws logs put-metric-filter --log-group-name -- filter-name "" --metric-transformations metricName= "" ,metricNamespace='CISBenchmark',metricValue=1 --filter-pattern '{($.eventName = CreateTrail) || ($.eventName = UpdateTrail) || ($.eventName = DeleteTrail) || ($.eventName = StartLogging) || ($.eventName = StopLogging) }' + + **Note**: You can choose your own metricName and metricNamespace strings. Using the same metricNamespace for all Foundations Benchmark metrics will group them together. + + 2. Create an SNS topic that the alarm will notify + + aws sns create-topic --name + + **Note**: you can execute this command once and then re-use the same topic for all monitoring alarms. + + 3. Create an SNS subscription to the topic created in step 2 + + aws sns subscribe --topic-arn --protocol -- notification-endpoint + + **Note** : you can execute this command once and then re-use the SNS subscription for all monitoring alarms. + + 4. Create an alarm that is associated with the CloudWatch Logs Metric Filter created in step 1 and an SNS topic created in step 2 + + aws cloudwatch put-metric-alarm --alarm-name "" --metric-name "" --statistic Sum --period 300 --threshold 1 --comparison-operator GreaterThanOrEqualToThreshold --evaluation-periods 1 -- namespace 'CISBenchmark' --alarm-actions `, + references: [ + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html', + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudwatch-alarms-for-cloudtrail.html', + 'https://docs.aws.amazon.com/sns/latest/dg/SubscribeTopic.html', + ], + gql: `{ + queryawsAccount { + id + __typename + cloudtrail { + isMultiRegionTrail + status { + isLogging + } + eventSelectors { + id + readWriteType + includeManagementEvents + } + cloudwatchLog { + arn + metricFilters { + id + filterName + filterPattern + metricTransformations { + metricName + } + } + cloudwatch { + metric + arn + actions + sns { + arn + subscriptions { + arn + } + } + } + } + } + } + }`, + resource: 'queryawsAccount[*]', + severity: 'medium', + conditions: { + path: '@.cloudtrail', + array_any: { + and: [ + { + path: '[*].isMultiRegionTrail', + equal: 'Yes', + }, + { + path: '[*].status.isLogging', + equal: true, + }, + { + path: '[*].eventSelectors', + array_any: { + and: [ + { path: '[*].readWriteType', equal: 'All' }, + { + path: '[*].includeManagementEvents', + equal: true, + }, + ], + }, + }, + { + path: '[*].cloudwatchLog', + jq: '[.[].metricFilters[] + .[].cloudwatch[] | select(.metricTransformations[].metricName == .metric)]', + array_any: { + and: [ + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*CreateTrail/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*UpdateTrail/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*DeleteTrail/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*StartLogging/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*StopLogging/, + }, + { + path: '[*].sns', + array_any: { + path: '[*].subscriptions', + array_any: { + path: '[*].arn', + match: /^arn:aws:.*$/, + }, + }, + }, + ], + }, + }, + ], + } + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.7.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.7.ts new file mode 100644 index 00000000..a602baa3 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.7.ts @@ -0,0 +1,237 @@ +// AWS CIS 1.2.0 Rule equivalent 3.4 +export default { + id: 'aws-nist-800-53-rev4-7.7', + title: 'AWS NIST 7.7 CloudWatch log metric filter and alarm for IAM policy changes should be configured', + + description: `Real-time monitoring of API calls can be achieved by directing CloudTrail Logs to + CloudWatch Logs and establishing corresponding metric filters and alarms. It is + recommended that a metric filter and alarm be established changes made to Identity and + Access Management (IAM) policies.`, + + audit: `Perform the following to ensure that there is at least one active multi-region CloudTrail with prescribed metric filters and alarms configured: + + 1. Identify the log group name configured for use with active multi-region CloudTrail: + + - List all CloudTrails: + + aws cloudtrail describe-trails + + - Identify Multi region Cloudtrails: *Trails with "IsMultiRegionTrail" set to true* + - From value associated with CloudWatchLogsLogGroupArn note ** + + Example: for CloudWatchLogsLogGroupArn that looks like + *arn:aws:logs:::log-group:NewGroup:\*, * would be *NewGroup* + + - Ensure Identified Multi region CloudTrail is active + + *aws cloudtrail get-trail-status --name * ensure *IsLogging* is set to *TRUE* + + - Ensure identified Multi-region Cloudtrail captures all Management Events + + *aws cloudtrail get-event-selectors --trail-name * + + Ensure there is at least one Event Selector for a Trail with *IncludeManagementEvents* set to *true* and *ReadWriteType* set to *All* + + 2. Get a list of all associated metric filters for this* *: + + aws logs describe-metric-filters --log-group-name "" + + 3. Ensure the output from the above command contains the following: + + "filterPattern": "{($.eventName=DeleteGroupPolicy)||($.eventName=DeleteRolePolicy)||($.eventNa me=DeleteUserPolicy)||($.eventName=PutGroupPolicy)||($.eventName=PutRolePolic y)||($.eventName=PutUserPolicy)||($.eventName=CreatePolicy)||($.eventName=Del etePolicy)||($.eventName=CreatePolicyVersion)||($.eventName=DeletePolicyVersi on)||($.eventName=AttachRolePolicy)||($.eventName=DetachRolePolicy)||($.event Name=AttachUserPolicy)||($.eventName=DetachUserPolicy)||($.eventName=AttachGr oupPolicy)||($.eventName=DetachGroupPolicy)}" + + 4. Note the ** value associated with the *filterPattern* found in step 3. + 5. Get a list of CloudWatch alarms and filter on the ** captured in step 4. + + aws cloudwatch describe-alarms --query 'MetricAlarms[?MetricName== ""]' + + 6. Note the *AlarmActions* value - this will provide the SNS topic ARN value. + 7. Ensure there is at least one active subscriber to the SNS topic + + aws sns list-subscriptions-by-topic --topic-arn + + at least one subscription should have "SubscriptionArn" with valid aws ARN. + + Example of valid "SubscriptionArn": "arn:aws:sns::::"`, + + rationale: 'Monitoring changes to IAM policies will help ensure authentication and authorization controls remain intact.', + + remediation: `Perform the following to setup the metric filter, alarm, SNS topic, and subscription: + + 1. Create a metric filter based on the filter pattern provided which checks for IAM policy changes and the ** taken from audit step 1. + + aws logs put-metric-filter --log-group-name "" -- filter-name "" --metric-transformations metricName= "" ,metricNamespace='CISBenchmark',metricValue=1 -- filter-pattern '{($.eventName=DeleteGroupPolicy)||($.eventName=DeleteRolePolicy)||($.eventNa me=DeleteUserPolicy)||($.eventName=PutGroupPolicy)||($.eventName=PutRolePolic y)||($.eventName=PutUserPolicy)||($.eventName=CreatePolicy)||($.eventName=Del etePolicy)||($.eventName=CreatePolicyVersion)||($.eventName=DeletePolicyVersi on)||($.eventName=AttachRolePolicy)||($.eventName=DetachRolePolicy)||($.event Name=AttachUserPolicy)||($.eventName=DetachUserPolicy)||($.eventName=AttachGr oupPolicy)||($.eventName=DetachGroupPolicy)}' + + **Note**: You can choose your own metricName and metricNamespace strings. Using the same metricNamespace for all Foundations Benchmark metrics will group them together. + + 2. Create an SNS topic that the alarm will notify + + aws sns create-topic --name + + **Note** : you can execute this command once and then re-use the same topic for all monitoring alarms. + + 3. Create an SNS subscription to the topic created in step 2 + + aws sns subscribe --topic-arn --protocol --notification-endpoint + + **Note** : you can execute this command once and then re-use the SNS subscription for all monitoring alarms. + + 4. Create an alarm that is associated with the CloudWatch Logs Metric Filter created in step 1 and an SNS topic created in step 2 + + aws cloudwatch put-metric-alarm --alarm-name "" -- metric-name "" --statistic Sum --period 300 --threshold 1 --comparison-operator GreaterThanOrEqualToThreshold --evaluation-periods 1 --namespace 'CISBenchmark' --alarm-actions `, + references: [ + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html', + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudwatch-alarms-for-cloudtrail.html', + 'https://docs.aws.amazon.com/sns/latest/dg/SubscribeTopic.html', + ], + gql: `{ + queryawsAccount { + id + __typename + cloudtrail { + isMultiRegionTrail + status { + isLogging + } + eventSelectors { + id + readWriteType + includeManagementEvents + } + cloudwatchLog { + arn + metricFilters { + id + filterName + filterPattern + metricTransformations { + metricName + } + } + cloudwatch { + metric + arn + actions + sns { + arn + subscriptions { + arn + } + } + } + } + } + } + }`, + resource: 'queryawsAccount[*]', + severity: 'medium', + conditions: { + path: '@.cloudtrail', + array_any: { + and: [ + { + path: '[*].isMultiRegionTrail', + equal: 'Yes', + }, + { + path: '[*].status.isLogging', + equal: true, + }, + { + path: '[*].eventSelectors', + array_any: { + and: [ + { path: '[*].readWriteType', equal: 'All' }, + { + path: '[*].includeManagementEvents', + equal: true, + }, + ], + }, + }, + { + path: '[*].cloudwatchLog', + jq: '[.[].metricFilters[] + .[].cloudwatch[] | select(.metricTransformations[].metricName == .metric)]', + array_any: { + and: [ + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*DeleteGroupPolicy/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*DeleteRolePolicy/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*DeleteUserPolicy/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*PutGroupPolicy/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*PutRolePolicy/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*PutUserPolicy/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*CreatePolicy/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*DeletePolicy/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*CreatePolicyVersion/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*DeletePolicyVersion/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*AttachRolePolicy/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*DetachRolePolicy/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*AttachUserPolicy/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*DetachUserPolicy/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*AttachGroupPolicy/, + }, + { + path: '[*].filterPattern', + match: /(\$.eventName)\s*=\s*DetachGroupPolicy/, + }, + { + path: '[*].sns', + array_any: { + path: '[*].subscriptions', + array_any: { + path: '[*].arn', + match: /^arn:aws:.*$/, + }, + }, + }, + ], + }, + }, + ], + } + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.8.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.8.ts new file mode 100644 index 00000000..24107b2b --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.8.ts @@ -0,0 +1,181 @@ +// AWS CIS 1.2.0 Rule equivalent 3.6 +export default { + id: 'aws-nist-800-53-rev4-7.8', + title: 'AWS NIST 7.8 CloudWatch log metric filter and alarm for Management Console authentication failures should be configured', + + description: `Real-time monitoring of API calls can be achieved by directing CloudTrail Logs to + CloudWatch Logs and establishing corresponding metric filters and alarms. It is + recommended that a metric filter and alarm be established for failed console + authentication attempts.`, + + audit: `Perform the following to ensure that there is at least one active multi-region CloudTrail with prescribed metric filters and alarms configured: + + 1. Identify the log group name configured for use with active multi-region CloudTrail: + + - List all CloudTrails: *aws cloudtrail describe-trails* + - Identify Multi region Cloudtrails: *Trails with "IsMultiRegionTrail" set to true* + - From value associated with CloudWatchLogsLogGroupArn note ** + + Example: for CloudWatchLogsLogGroupArn that looks like *arn:aws:logs:::log-group:NewGroup:\*, * would be *NewGroup* + + - Ensure Identified Multi region CloudTrail is active + + *aws cloudtrail get-trail-status --name * ensure *IsLogging* is set to *TRUE* + + - Ensure identified Multi-region Cloudtrail captures all Management Events + + *aws cloudtrail get-event-selectors --trail-name * + Ensure there is at least one Event Selector for a Trail with *IncludeManagementEvents* set to *true* and *ReadWriteType* set to *All* + + 2. Get a list of all associated metric filters for this **: + + aws logs describe-metric-filters --log-group-name "" + + 3. Ensure the output from the above command contains the following: + + "filterPattern": "{ ($.eventName = ConsoleLogin) && ($.errorMessage = "Failed authentication") }" + + 4. Note the ** value associated with the *filterPattern* found in step 3. + 5. Get a list of CloudWatch alarms and filter on the ** captured in step 4. + + aws cloudwatch describe-alarms --query 'MetricAlarms[?MetricName== ""]' + + 6. Note the AlarmActions value - this will provide the SNS topic ARN value. + 7. Ensure there is at least one active subscriber to the SNS topic + + aws sns list-subscriptions-by-topic --topic-arn + + at least one subscription should have "SubscriptionArn" with valid aws ARN. + + Example of valid "SubscriptionArn": "arn:aws:sns::::"`, + + rationale: 'Monitoring failed console logins may decrease lead time to detect an attempt to brute force a credential, which may provide an indicator, such as source IP, that can be used in other event correlations.', + + remediation: `Perform the following to setup the metric filter, alarm, SNS topic, and subscription: + + 1. Create a metric filter based on filter pattern provided which checks for AWS management Console Login Failures and the ** taken from audit step 1. + + aws logs put-metric-filter --log-group-name -- filter-name "" --metric-transformations metricName= "",metricNamespace='CISBenchmark',metricValue=1 --filter-pattern '{ ($.eventName = ConsoleLogin) && ($.errorMessage = "Failed authentication") }' + + **Note**: You can choose your own metricName and metricNamespace strings. Using the same metricNamespace for all Foundations Benchmark metrics will group them together. + + 2. Create an SNS topic that the alarm will notify + + aws sns create-topic --name + + **Note**: you can execute this command once and then re-use the same topic for all monitoring alarms. + + 3. Create an SNS subscription to the topic created in step 2 + + aws sns subscribe --topic-arn --protocol - -notification-endpoint + + **Note**: you can execute this command once and then re-use the SNS subscription for all + monitoring alarms. + + 4. Create an alarm that is associated with the CloudWatch Logs Metric Filter created in step 1 and an SNS topic created in step 2 + + aws cloudwatch put-metric-alarm --alarm-name "" --metric-name "" --statistic Sum --period 300 --threshold 1 --comparison-operator GreaterThanOrEqualToThreshold --evaluation-periods 1 -- namespace 'CISBenchmark' --alarm-actions `, + references: [ + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html', + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudwatch-alarms-for-cloudtrail.html', + 'https://docs.aws.amazon.com/sns/latest/dg/SubscribeTopic.html', + ], + gql: `{ + queryawsAccount { + id + __typename + cloudtrail { + isMultiRegionTrail + status { + isLogging + } + eventSelectors { + id + readWriteType + includeManagementEvents + } + cloudwatchLog { + arn + metricFilters { + id + filterName + filterPattern + metricTransformations { + metricName + } + } + cloudwatch { + metric + arn + actions + sns { + arn + subscriptions { + arn + } + } + } + } + } + } + }`, + resource: 'queryawsAccount[*]', + severity: 'medium', + conditions: { + path: '@.cloudtrail', + array_any: { + and: [ + { + path: '[*].isMultiRegionTrail', + equal: 'Yes', + }, + { + path: '[*].status.isLogging', + equal: true, + }, + { + path: '[*].eventSelectors', + array_any: { + and: [ + { path: '[*].readWriteType', equal: 'All' }, + { + path: '[*].includeManagementEvents', + equal: true, + }, + ], + }, + }, + { + path: '[*].cloudwatchLog', + jq: '[.[].metricFilters[] + .[].cloudwatch[] | select(.metricTransformations[].metricName == .metric)]', + array_any: { + and: [ + { + and: [ + { + path: '[*].filterPattern', + match: /\s*\$.eventName\s*=\s*ConsoleLogin\s*/, + }, + { + path: '[*].filterPattern', + match: /\s*\$.errorMessage\s*=\s*"Failed authentication"\s*/, + }, + ], + }, + { + path: '[*].sns', + array_any: { + path: '[*].subscriptions', + array_any: { + path: '[*].arn', + match: /^arn:aws:.*$/, + }, + }, + }, + ], + }, + }, + ], + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.9.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.9.ts new file mode 100644 index 00000000..34f601e8 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-7.9.ts @@ -0,0 +1,182 @@ +// AWS CIS 1.2.0 Rule equivalent 3.2 +export default { + id: 'aws-nist-800-53-rev4-7.9', + title: 'AWS NIST 7.9 CloudWatch log metric filter and alarm for Management Console sign-in without MFA should be configured', + + description: `Real-time monitoring of API calls can be achieved by directing CloudTrail Logs to + CloudWatch Logs and establishing corresponding metric filters and alarms. It is + recommended that a metric filter and alarm be established for console logins that are not + protected by multi-factor authentication (MFA).`, + + audit: `Perform the following to ensure that there is at least one active multi-region CloudTrail + with prescribed metric filters and alarms configured: + + 1. Identify the log group name configured for use with active multi-region CloudTrail: + + - List all CloudTrails: + + aws cloudtrail describe-trails + + - Identify Multi region Cloudtrails: *Trails with "IsMultiRegionTrail" set to true* + - From value associated with CloudWatchLogsLogGroupArn note ** + + Example: for CloudWatchLogsLogGroupArn that looks like *arn:aws:logs:::log-group:NewGroup:\*, * would be *NewGroup* + + - Ensure Identified Multi region CloudTrail is active + + *aws cloudtrail get-trail-status --name * ensure *IsLogging* is set to *TRUE* + + - Ensure identified Multi-region Cloudtrail captures all Management Events + + aws cloudtrail get-event-selectors --trail-name + + Ensure there is at least one Event Selector for a Trail with *IncludeManagementEvents* set to *true* and *ReadWriteType* set to *All* + + 2. Get a list of all associated metric filters for this **: + + aws logs describe-metric-filters --log-group-name "" + + 3. Ensure the output from the above command contains the following: + + "filterPattern": "{ ($.eventName = "ConsoleLogin") && ($.additionalEventData.MFAUsed != "Yes") }" + + 4. Note the ** value associated with the filterPattern found in step 3. + 5. Get a list of CloudWatch alarms and filter on the ** captured in step 4. + + aws cloudwatch describe-alarms --query 'MetricAlarms[?MetricName== ""]' + + 6. Note the *AlarmActions* value - this will provide the SNS topic ARN value. + 7. Ensure there is at least one active subscriber to the SNS topic + + aws sns list-subscriptions-by-topic --topic-arn + + at least one subscription should have "SubscriptionArn" with valid aws ARN. + + Example of valid "SubscriptionArn": "arn:aws:sns::::"`, + + rationale: 'Monitoring for single-factor console logins will increase visibility into accounts that are not protected by MFA.', + + remediation: `Perform the following to setup the metric filter, alarm, SNS topic, and subscription: + + 1. Create a metric filter based on the filter pattern provided which checks for AWS Management Console sign-in without MFA and the ** taken from audit step 1. + + aws logs put-metric-filter --log-group-name -- filter-name "" --metric-transformations metricName= "" ,metricNamespace='CISBenchmark',metricValue=1 --filter-pattern '{ ($.eventName = "ConsoleLogin") && ($.additionalEventData.MFAUsed != "Yes") }' + + **Note**: You can choose your own metricName and metricNamespace strings. Using the same metricNamespace for all Foundations Benchmark metrics will group them together. + + 2. Create an SNS topic that the alarm will notify + + aws sns create-topic --name + + **Note**: you can execute this command once and then re-use the same topic for all monitoring alarms. + + 3. Create an SNS subscription to the topic created in step 2 + + aws sns subscribe --topic-arn --protocol -- notification-endpoint + + **Note**: you can execute this command once and then re-use the SNS subscription for all monitoring alarms. + + 4. Create an alarm that is associated with the CloudWatch Logs Metric Filter created in step 1 and an SNS topic created in step 2 + + aws cloudwatch put-metric-alarm --alarm-name "" --metric-name "" --statistic Sum --period 300 --threshold 1 --comparison-operator GreaterThanOrEqualToThreshold -- evaluation-periods 1 --namespace 'CISBenchmark' --alarm-actions `, + references: [ + 'http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/viewing_metrics_with_cloudwatch.html', + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/receive-cloudtrail-log-files-from-multiple-regions.html', + 'https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudwatch-alarms-for-cloudtrail.html', + 'https://docs.aws.amazon.com/sns/latest/dg/SubscribeTopic.html', + ], + gql: `{ + queryawsAccount { + id + __typename + cloudtrail { + isMultiRegionTrail + status { + isLogging + } + eventSelectors { + id + readWriteType + includeManagementEvents + } + cloudwatchLog { + arn + metricFilters { + id + filterName + filterPattern + metricTransformations { + metricName + } + } + cloudwatch { + metric + arn + actions + sns { + arn + subscriptions { + arn + } + } + } + } + } + } + }`, + resource: 'queryawsAccount[*]', + severity: 'medium', + conditions: { + path: '@.cloudtrail', + array_any: { + and: [ + { + path: '[*].isMultiRegionTrail', + equal: 'Yes', + }, + { + path: '[*].status.isLogging', + equal: true, + }, + { + path: '[*].eventSelectors', + array_any: { + and: [ + { path: '[*].readWriteType', equal: 'All' }, + { + path: '[*].includeManagementEvents', + equal: true, + }, + ], + }, + }, + { + path: '[*].cloudwatchLog', + jq: '[.[].metricFilters[] + .[].cloudwatch[] | select(.metricTransformations[].metricName == .metric)]', + array_any: { + and: [ + { + path: '[*].filterPattern', + match: /(\$.errorCode)\s*=\s*"ConsoleLogin"/, + }, + { + path: '[*].filterPattern', + match: /(\$.additionalEventData.MFAUsed)\s*!=\s*"Yes"/, + }, + { + path: '[*].sns', + array_any: { + path: '[*].subscriptions', + array_any: { + path: '[*].arn', + match: /^arn:aws:.*$/, + }, + }, + }, + ], + }, + }, + ], + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.1.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.1.ts new file mode 100644 index 00000000..e0045e30 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.1.ts @@ -0,0 +1,111 @@ +export default { + id: 'aws-nist-800-53-rev4-8.1', + title: 'AWS NIST 8.1 ELB listener security groups should not be set to TCP all', + + description: 'ELB security groups should permit access only to necessary ports to prevent access to potentially vulnerable services on other ports.', + + audit: '', + + rationale: '', + + remediation: `**AWS Console** + + - Navigate to [EC2](https://console.aws.amazon.com/ec2/). + - In the left navigation, select Load Balancers. + - Select the desired load balancer. + - In the Description tab under Security, take note of the security groups associated with the load balancer. + - In the left navigation, select Security Groups. + - Search and select the security groups from the previous step. + - Click the Inbound tab. Click Edit and remove any references to TCP all. + - Click Save. + - Click the Outbound tab. Click Edit and remove any references to TCP all. + - Click Save. + + **AWS CLI** + + List all load balancers and their attributes: + + aws elb describe-load-balancers + + - Make note of each Security Group ID associated with each ELB. + + Get security group details: + + aws ec2 describe-security-groups --group-ids + + - In the output, if FromPort is 0 and ToPort is 65535, this means the rule Type is ALL TCP. If this is the case, run the following command to remove those rules. + + Remove the rule that opens all tcp ports: + + aws ec2 revoke-security-group-ingress --protocol tcp --port 0-65535 --cidr --group-id + + aws ec2 revoke-security-group-egress --protocol tcp --port 0-65535 --cidr --group-id `, + + references: [ + 'https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/elb-security-groups.html', + 'https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-update-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/elb/describe-load-balancers.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-egress.html', + ], + gql: `{ + queryawsElb { + id + arn + accountId + __typename + securityGroups { + inboundRules { + fromPort + toPort + } + outboundRules { + fromPort + toPort + } + } + } + }`, + resource: 'queryawsElb[*]', + severity: 'high', + conditions: { + not: { + path: '@.securityGroups', + array_any: { + or: [ + { + path: '[*].inboundRules', + array_any: { + and: [ + { + path: '[*].fromPort', + in: [0, null], + }, + { + path: '[*].toPort', + in: [65535, null], + }, + ], + }, + }, + { + path: '[*].outboundRules', + array_any: { + and: [ + { + path: '[*].fromPort', + in: [0, null], + }, + { + path: '[*].toPort', + in: [65535, null], + }, + ], + }, + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.10.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.10.ts new file mode 100644 index 00000000..fd72da21 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.10.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.10', + title: 'AWS NIST 8.10 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 61621 (Cassandra OpsCenter Agent)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 61621 (Cassandra OpsCenter Agent). Removing unfettered connectivity to a Cassandra OpsCenter Agent reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *61621* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as Cassandra OpsCenter Agent, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 61621 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 61621: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol tcp --port 61621 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol tcp --port 61621 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 61621, + }, + { + path: '[*].toPort', + greaterThanInclusive: 61621, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.11.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.11.ts new file mode 100644 index 00000000..101b2c2b --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.11.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.11', + title: 'AWS NIST 8.11 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 636 (LDAP SSL)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 636 (LDAP SSL). Removing unfettered connectivity to a LDAP SSL server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *636* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as LDAP SSL, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 636 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 636: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol tcp --port 636 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol tcp --port 636 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 636, + }, + { + path: '[*].toPort', + greaterThanInclusive: 636, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.12.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.12.ts new file mode 100644 index 00000000..eb67fcbf --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.12.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.12', + title: 'AWS NIST 8.12 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 7001 (Cassandra)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 7001 (Cassandra). Removing unfettered connectivity to a Cassandra server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *7001* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as Cassandra, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 7001 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 7001: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol tcp --port 7001 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol tcp --port 7001 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 7001, + }, + { + path: '[*].toPort', + greaterThanInclusive: 7001, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.13.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.13.ts new file mode 100644 index 00000000..1695414a --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.13.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.13', + title: 'AWS NIST 8.13 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 11214 (Memcached SSL)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 11214 (Memcached SSL). Removing unfettered connectivity to a Memcached SSL server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *11214* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as Memcached SSL, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 11214 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 11214: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port 11214 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 11214 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 11214, + }, + { + path: '[*].toPort', + greaterThanInclusive: 11214, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.14.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.14.ts new file mode 100644 index 00000000..f98ff46b --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.14.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.14', + title: 'AWS NIST 8.14 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 11215 (Memcached SSL)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 11215 (Memcached SSL). Removing unfettered connectivity to a Memcached SSL server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *11215* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as Memcached SSL, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 11215 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 11215: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port 11215 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 11215 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 11215, + }, + { + path: '[*].toPort', + greaterThanInclusive: 11215, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.15.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.15.ts new file mode 100644 index 00000000..ed4e76e7 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.15.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.15', + title: 'AWS NIST 8.15 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 135 (MSSQL Debugger)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 135 (MSSQL Debugger). Removing unfettered connectivity to a MSSQL Debugger server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *135* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as MSSQL Debugger, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 135 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 135: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port 135 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 135 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 135, + }, + { + path: '[*].toPort', + greaterThanInclusive: 135, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.16.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.16.ts new file mode 100644 index 00000000..5b36895f --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.16.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.16', + title: 'AWS NIST 8.16 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 137 (NetBIOS Name Service)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 137 (NetBIOS Name Service). Removing unfettered connectivity to a NetBIOS Name Service server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *137* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as NetBios Name Service, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 137 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 137: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port 137 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 137 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 137, + }, + { + path: '[*].toPort', + greaterThanInclusive: 137, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.17.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.17.ts new file mode 100644 index 00000000..4fcb7c1b --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.17.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.17', + title: 'AWS NIST 8.17 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 138 (NetBios Datagram Service)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 138 (NetBios Datagram Service). Removing unfettered connectivity to a NetBios Datagram Service server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *138* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as NetBios Datagram Service, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 138 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 138: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port 138 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 138 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 138, + }, + { + path: '[*].toPort', + greaterThanInclusive: 138, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.18.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.18.ts new file mode 100644 index 00000000..9bedad20 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.18.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.18', + title: 'AWS NIST 8.18 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 139 (NetBios Session Service)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 139 (NetBios Session Service). Removing unfettered connectivity to a NetBios Session Service server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *139* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as NetBios Session Service, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 139 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 139: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port 139 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 139 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 139, + }, + { + path: '[*].toPort', + greaterThanInclusive: 139, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.19.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.19.ts new file mode 100644 index 00000000..9a4f0802 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.19.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.19', + title: 'AWS NIST 8.19 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 1433 (MSSQL Server)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 1433 (MSSQL Server). Removing unfettered connectivity to a MSSQL Server server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *1433* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as MSSQL Server, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 1433 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 1433: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port 1433 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 1433 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 1433, + }, + { + path: '[*].toPort', + greaterThanInclusive: 1433, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.2.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.2.ts new file mode 100644 index 00000000..947a90f1 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.2.ts @@ -0,0 +1,117 @@ +// AWS CIS 1.2.0 Rule equivalent 4.3 +export default { + id: 'aws-nist-800-53-rev4-8.2', + title: 'AWS NIST 8.2 VPC default security group should restrict all traffic', + + description: `A VPC comes with a default security group whose initial settings deny all inbound traffic, + allow all outbound traffic, and allow all traffic between instances assigned to the security + group. If you don't specify a security group when you launch an instance, the instance is + automatically assigned to this default security group. Security groups provide stateful + filtering of ingress/egress network traffic to AWS resources. It is recommended that the + default security group restrict all traffic. + + The default VPC in every region should have its default security group updated to comply. + Any newly created VPCs will automatically contain a default security group that will need + remediation to comply with this recommendation. + + **NOTE:** When implementing this recommendation, VPC flow logging is invaluable in + determining the least privilege port access required by systems to work properly because it + can log all packet acceptances and rejections occurring under the current security groups. + This dramatically reduces the primary barrier to least privilege engineering - discovering + the minimum ports required by systems in the environment. Even if the VPC flow logging + recommendation in this benchmark is not adopted as a permanent security measure, it + should be used during any period of discovery and engineering for least privileged security + groups.`, + + audit: `Perform the following to determine if the account is configured as prescribed: + Security Group State + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. Repeat the next steps for all VPCs - including the default VPC in each AWS region: + 3. In the left pane, click *Security Groups* + 4. For each default security group, perform the following: + 5. Select the *default* security group + 6. Click the *Inbound Rules* tab + 7. Ensure no rule exist + 8. Click the *Outbound Rules* tab + 9. Ensure no rules exist + + Security Group Members + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. Repeat the next steps for all default groups in all VPCs - including the default VPC in each AWS region: + 3. In the left pane, click *Security Groups* + 4. Copy the id of the default security group. + 5. Change to the EC2 Management Console at https://console.aws.amazon.com/ec2/v2/home + 6. In the filter column type 'Security Group ID : < security group id from #4 >`, + + rationale: 'Configuring all VPC default security groups to restrict all traffic will encourage least privilege security group development and mindful placement of AWS resources into security groups which will, in turn, reduce the exposure of those resources.', + + remediation: `Security Group Members + Perform the following to implement the prescribed state: + + 1. Identify AWS resources that exist within the default security group + 2. Create a set of least privilege security groups for those resources + 3. Place the resources in those security groups + 4. Remove the resources noted in #1 from the default security group + + Security Group State + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. Repeat the next steps for all VPCs - including the default VPC in each AWS region: + 3. In the left pane, click *Security Groups* + 4. For each default security group, perform the following: + 5. Select the *default* security group + 6. Click the *Inbound Rules* tab + 7. Remove any inbound rules + 8. Click the *Outbound Rules* tab + 9. Remove any inbound rules + + Recommended: + IAM groups allow you to edit the "name" field. After remediating default groups rules for all VPCs in all regions, edit this field to add text similar to "DO NOT USE. DO NOT ADD RULES"`, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html', + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-egress.html', + ], + gql: `{ + queryawsSecurityGroup(filter: { name: { eq: "default" } }) { + id + name + arn + accountId + __typename + inboundRules { + source + } + outboundRules{ + destination + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + or: [ + { + path: '@.inboundRules', + array_any: { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + }, + { + path: '@.outboundRules', + array_any: { + path: '[*].destination', + in: ['0.0.0.0/0', '::/0'], + }, + }, + ], + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.20.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.20.ts new file mode 100644 index 00000000..449fcb7f --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.20.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.20', + title: 'AWS NIST 8.20 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 1434 (MSSQL Admin)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UPD port 1434 (MSSQL Admin). Removing unfettered connectivity to a MSSQL Admin server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *1434* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as MSSQL Admin, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 1434 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 1434: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port 1434 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 1434 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 1434, + }, + { + path: '[*].toPort', + greaterThanInclusive: 1434, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.21.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.21.ts new file mode 100644 index 00000000..cc4e45af --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.21.ts @@ -0,0 +1,102 @@ +// AWS CIS 1.2.0 Rule equivalent 4.1 +export default { + id: 'aws-nist-800-53-rev4-8.21', + title: 'AWS NIST 8.21 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to port 22 (SSH)', + + description: 'VPC security groups should not permit unrestricted access from the internet to port 22 (SSH). Removing unfettered connectivity to remote console services, such as SSH, reduces a server’s exposure to risk.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *1434* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as SSH, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 22 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 22: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port 22 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 22 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 22, + }, + { + path: '[*].toPort', + greaterThanInclusive: 22, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.22.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.22.ts new file mode 100644 index 00000000..e2272548 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.22.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.22', + title: 'AWS NIST 8.22 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 23 (Telnet)', + + description: 'Security groups provide stateful filtering of ingress/egress network traffic to AWS resources. AWS recommends that no security group allows unrestricted ingress access to port 23. Removing unfettered connectivity to remote console services reduces a server’s exposure to risk.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *23* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as Telnet, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 23 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 23: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port 23 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 23 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 23, + }, + { + path: '[*].toPort', + greaterThanInclusive: 23, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.23.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.23.ts new file mode 100644 index 00000000..1ccf335e --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.23.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.23', + title: 'AWS NIST 8.23 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 2379 (etcd)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 2379 (etcd). Removing unfettered connectivity to an etcd server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *2379* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as etcd, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 2379 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 2379: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port 2379 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 2379 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 2379, + }, + { + path: '[*].toPort', + greaterThanInclusive: 2379, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.24.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.24.ts new file mode 100644 index 00000000..07d8410c --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.24.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.24', + title: 'AWS NIST 8.24 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 2382 (SQL Server Analysis Services browser)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 2382 (SQL Server Analysis Services Browser). Removing unfettered connectivity to a SQL Server Analysis Services Browser server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *2382* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as SQL Server Analysis Services Browser, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 2382 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 2382: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port 2382 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 2382 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 2382, + }, + { + path: '[*].toPort', + greaterThanInclusive: 2382, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.25.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.25.ts new file mode 100644 index 00000000..5bba224a --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.25.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.25', + title: 'AWS NIST 8.25 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 2383 (SQL Server Analysis Services)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 2383 (SQL Server Analysis Services). Removing unfettered connectivity to a SQL Server Analysis Services server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *2383* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as SQL Server Analysis Services Browser, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 2383 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 2383: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port 2383 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 2383 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 2383, + }, + { + path: '[*].toPort', + greaterThanInclusive: 2383, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.26.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.26.ts new file mode 100644 index 00000000..f36056c8 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.26.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.26', + title: 'AWS NIST 8.26 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 2484 (Oracle DB SSL)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 2484 (Oracle DB SSL). Removing unfettered connectivity to an Oracle DB SSL server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *2484* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as Oracle DB SSL, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 2484 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 2484: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port 2484 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 2484 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 2484, + }, + { + path: '[*].toPort', + greaterThanInclusive: 2484, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.27.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.27.ts new file mode 100644 index 00000000..efcdbb09 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.27.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.27', + title: 'AWS NIST 8.27 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 27017 (MongoDB)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 27017 (MongoDB). Removing unfettered connectivity to a MongoDB server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *27017* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as MongoDB, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 27017 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 27017: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port 27017 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 27017 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 27017, + }, + { + path: '[*].toPort', + greaterThanInclusive: 27017, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.28.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.28.ts new file mode 100644 index 00000000..d69e8123 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.28.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.28', + title: 'AWS NIST 8.28 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 27018 (MongoDB)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 27018 (MongoDB). Removing unfettered connectivity to a MongoDB server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *27018* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as MongoDB, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 27018 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 27018: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port 27018 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 27018 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 27018, + }, + { + path: '[*].toPort', + greaterThanInclusive: 27018, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.29.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.29.ts new file mode 100644 index 00000000..ba0a758d --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.29.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.29', + title: 'AWS NIST 8.29 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 27019 (MongoDB)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 27019 (MongoDB). Removing unfettered connectivity to a MongoDB server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *27019* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as MongoDB, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 27019 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 27019: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port 27019 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 27019 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 27019, + }, + { + path: '[*].toPort', + greaterThanInclusive: 27019, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.3.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.3.ts new file mode 100644 index 00000000..8f1a1688 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.3.ts @@ -0,0 +1,87 @@ +export default { + id: 'aws-nist-800-53-rev4-8.3', + title: 'AWS NIST 8.3 VPC network ACLs should not allow ingress from 0.0.0.0/0 to TCP/UDP port 22', + + description: 'Public access to remote server administration ports, such as 22 and 3389, increases resource attack surface and unnecessarily raises the risk of resource compromise.', + + audit: '', + + rationale: 'Removing unfettered connectivity to remote console services, such as SSH, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation, select Network ACLs. + - For each Network ACL, perform the steps described below. + - Select the Network ACL, click the Inbound Rules tab, and and click Edit Inbound rules. + - Remove any rule that permits unrestricted ingress from 0.0.0.0/0 to TCP/UDP port 22. + - Click Save. + + **AWS CLI** + + Remove the inbound rule(s) that permits unrestricted ingress from 0.0.0.0/0 to TCP/UDP port 22 from the selected Network ACLs: + + aws ec2 delete-network-acl-entry --network-acl-id --ingress --rule-number `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html', + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Security.html#VPC_Security_Comparison', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-network-acl-entry.html', + ], + gql: `{ + queryawsNetworkAcl { + id + arn + accountId + __typename + inboundRules { + source + fromPort + toPort + } + } + }`, + resource: 'queryawsNetworkAcl[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 22, + }, + { + path: '[*].toPort', + greaterThanInclusive: 22, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.30.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.30.ts new file mode 100644 index 00000000..8da037ad --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.30.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.30', + title: 'AWS NIST 8.30 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 3000 (Ruby on Rails web server)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 3000 (Ruby on Rails web server). Removing unfettered connectivity to a Ruby on Rails web server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *3000* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as Ruby on Rails web server, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 3000 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 3000: + + ws ec2 revoke-security-group-ingress --region --group-name --protocol --port 3000 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 3000 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 3000, + }, + { + path: '[*].toPort', + greaterThanInclusive: 3000, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.31.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.31.ts new file mode 100644 index 00000000..b5da977b --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.31.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.31', + title: 'AWS NIST 8.31 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 3020 (CIFS / SMB)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 3020 (CIFS / SMB). Removing unfettered connectivity to CIFS / SMB ports reduces a server’s exposure to risk.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *3020* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as CIFS / SMB, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 3020 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 3020: + + ws ec2 revoke-security-group-ingress --region --group-name --protocol --port 3020 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 3020 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 3020, + }, + { + path: '[*].toPort', + greaterThanInclusive: 3020, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.32.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.32.ts new file mode 100644 index 00000000..967df7d2 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.32.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.32', + title: 'AWS NIST 8.32 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 3306 (MySQL)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 3306 (MySQL). Removing unfettered connectivity to a MySQL server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *3306* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as MySQL, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 3306 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 3306: + + ws ec2 revoke-security-group-ingress --region --group-name --protocol --port 3306 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 3306 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 3306, + }, + { + path: '[*].toPort', + greaterThanInclusive: 3306, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.33.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.33.ts new file mode 100644 index 00000000..6b99a5fd --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.33.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.33', + title: 'AWS NIST 8.33 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 4505 (SaltStack Master)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 4505 (SaltStack Master). Removing unfettered connectivity to a SaltStack Master server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *4505* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as SaltStack Master, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 4505 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 4505: + + ws ec2 revoke-security-group-ingress --region --group-name --protocol --port 4505 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 4505 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 4505, + }, + { + path: '[*].toPort', + greaterThanInclusive: 4505, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.34.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.34.ts new file mode 100644 index 00000000..03a1823c --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.34.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.34', + title: 'AWS NIST 8.34 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 4506 (SaltStack Master)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 4506 (SaltStack Master). Removing unfettered connectivity to a SaltStack Master server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *4506* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as SaltStack Master, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 4506 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 4506: + + ws ec2 revoke-security-group-ingress --region --group-name --protocol --port 4506 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 4506 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 4506, + }, + { + path: '[*].toPort', + greaterThanInclusive: 4506, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.35.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.35.ts new file mode 100644 index 00000000..c6594977 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.35.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.35', + title: 'AWS NIST 8.35 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 5432 (PostgreSQL)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 5432 (PostgreSQL). Removing unfettered connectivity to a PostgreSQL server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *5432* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as PostgreSQL, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 5432 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 5432: + + ws ec2 revoke-security-group-ingress --region --group-name --protocol --port 5432 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 5432 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 5432, + }, + { + path: '[*].toPort', + greaterThanInclusive: 5432, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.36.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.36.ts new file mode 100644 index 00000000..7464e221 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.36.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.36', + title: 'AWS NIST 8.36 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 5500 (Virtual Network Computing)', + + description: 'Security groups provide stateful filtering of ingress/egress network traffic to AWS resources. AWS recommends that no security group allow unrestricted ingress access to port 5500. Removing unfettered connectivity to remote console services reduces a server’s exposure to risk.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *5500* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as Virtual Network Computing, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 5500 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 5500: + + ws ec2 revoke-security-group-ingress --region --group-name --protocol --port 5500 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 5500 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 5500, + }, + { + path: '[*].toPort', + greaterThanInclusive: 5500, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.37.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.37.ts new file mode 100644 index 00000000..b168f895 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.37.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.37', + title: 'AWS NIST 8.37 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 5800 (Virtual Network Computing), unless from ELBs', + + description: 'Security groups provide stateful filtering of ingress/egress network traffic to AWS resources. AWS recommends that no security group allow unrestricted ingress access to port 5800, unless it is from an AWS Elastic Load Balancer. Removing unfettered connectivity to remote console services reduces a server’s exposure to risk.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *5800* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as Virtual Network Computing, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 5800 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 5800: + + ws ec2 revoke-security-group-ingress --region --group-name --protocol --port 5800 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 5800 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 5800, + }, + { + path: '[*].toPort', + greaterThanInclusive: 5800, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.38.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.38.ts new file mode 100644 index 00000000..430d01ad --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.38.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.38', + title: 'AWS NIST 8.38 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 5900 (Virtual Network Computing)', + + description: 'Security groups provide stateful filtering of ingress/egress network traffic to AWS resources. AWS recommends that no security group allow unrestricted ingress access to port 5900. Removing unfettered connectivity to remote console services reduces a server’s exposure to risk.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *5900* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as Virtual Network Computing, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 5900 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 5900: + + ws ec2 revoke-security-group-ingress --region --group-name --protocol --port 5900 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 5900 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 5900, + }, + { + path: '[*].toPort', + greaterThanInclusive: 5900, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.39.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.39.ts new file mode 100644 index 00000000..4072f818 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.39.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.39', + title: 'AWS NIST 8.39 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 80 (HTTP), unless from ELBs', + + description: 'Security groups provide stateful filtering of ingress/egress network traffic to AWS resources. AWS recommends that no security group allow unrestricted ingress access to port 80, unless it is from an AWS Elastic Load Balancer.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *80* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as HTTP, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 80 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 80: + + ws ec2 revoke-security-group-ingress --region --group-name --protocol --port 80 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 80 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 80, + }, + { + path: '[*].toPort', + greaterThanInclusive: 80, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.4.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.4.ts new file mode 100644 index 00000000..9a073c72 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.4.ts @@ -0,0 +1,87 @@ +export default { + id: 'aws-nist-800-53-rev4-8.4', + title: 'AWS NIST 8.4 VPC network ACLs should not allow ingress from 0.0.0.0/0 to TCP/UDP port 3389', + + description: 'Public access to remote server administration ports, such as 22 and 3389, increases resource attack surface and unnecessarily raises the risk of resource compromise.', + + audit: '', + + rationale: 'Removing unfettered connectivity to remote console services, such as SSH, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation, select Network ACLs. + - For each Network ACL, perform the steps described below. + - Select the Network ACL, click the Inbound Rules tab, and and click Edit Inbound rules. + - Remove any rule that permits unrestricted ingress from 0.0.0.0/0 to TCP/UDP port 3389. + - Click Save. + + **AWS CLI** + + Remove the inbound rule(s) that permits unrestricted ingress from 0.0.0.0/0 to TCP/UDP port 3389 from the selected Network ACLs: + + aws ec2 delete-network-acl-entry --network-acl-id --ingress --rule-number `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html', + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Security.html#VPC_Security_Comparison', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/delete-network-acl-entry.html', + ], + gql: `{ + queryawsNetworkAcl { + id + arn + accountId + __typename + inboundRules { + source + fromPort + toPort + } + } + }`, + resource: 'queryawsNetworkAcl[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 3389, + }, + { + path: '[*].toPort', + greaterThanInclusive: 3389, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.40.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.40.ts new file mode 100644 index 00000000..2cb6a079 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.40.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.40', + title: 'AWS NIST 8.40 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 8000 (HTTP Alternate)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 8000 (HTTP Alternate). Removing unfettered connectivity to a HTTP Alternate server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *8000* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as HTTP Alternate, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 8000 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 8000: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port 8000 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 8000 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 8000, + }, + { + path: '[*].toPort', + greaterThanInclusive: 8000, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.41.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.41.ts new file mode 100644 index 00000000..b43ae2d4 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.41.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.41', + title: 'AWS NIST 8.41 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 9200 (Elasticsearch)', + + description: 'VPC security groups should not permit unrestricted access from the internet to port 9200 (Elasticsearch). Removing unfettered connectivity to an Elasticsearch server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *9200* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as Elasticsearch, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 9200 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 9200: + + ws ec2 revoke-security-group-ingress --region --group-name --protocol --port 9200 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 9200 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 9200, + }, + { + path: '[*].toPort', + greaterThanInclusive: 9200, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.42.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.42.ts new file mode 100644 index 00000000..4180446b --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.42.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.42', + title: 'AWS NIST 8.42 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 9300 (Elasticsearch)', + + description: 'VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 9300 (Elasticsearch). Removing unfettered connectivity to an Elasticsearch server reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *9300* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as Elasticsearch, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation pane, click Security Groups. + - Remove any rules that include port 9300 and have a source of 0.0.0.0/0. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress to port 9300: + + ws ec2 revoke-security-group-ingress --region --group-name --protocol --port 9300 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected Security Group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol --port 9300 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 9300, + }, + { + path: '[*].toPort', + greaterThanInclusive: 9300, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.43.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.43.ts new file mode 100644 index 00000000..761f328b --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.43.ts @@ -0,0 +1,83 @@ +export default { + id: 'aws-nist-800-53-rev4-8.43', + title: 'AWS NIST 8.43 VPC security groups attached to EC2 instances should not permit ingress from ‘0.0.0.0/0’ to all ports', + + description: 'EC2 security groups should permit access only to necessary ports to prevent access to potentially vulnerable services on other ports.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *0-65535* and has a *Source* of *0.0.0.0/0*`, + + rationale: '', + + remediation: `**AWS Console** + + - Navigate to [EC2](https://console.aws.amazon.com/ec2/). + - In the left navigation, select Security Groups. + - Select the desired security group and click the Inbound tab. + - Click Edit rules. + - Remove any permissions that allow ‘0.0.0.0/0’ to all ports. + + **AWS CLI** + + Remove ingress rules which allow connectivity from anywhere to all ports and protocols: + + aws ec2 revoke-security-group-ingress --group-id --ip-permissions `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsEc2 { + id + arn + accountId + __typename + securityGroups { + inboundRules { + source + fromPort + toPort + } + } + } + }`, + resource: 'queryawsEc2[*]', + severity: 'high', + conditions: { + not: { + path: '@.securityGroups', + array_any: { + path: '[*].inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + and: [ + { + path: '[*].fromPort', + in: [0, null], + }, + { + path: '[*].toPort', + in: [65535, null], + }, + ], + }, + ], + }, + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.44.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.44.ts new file mode 100644 index 00000000..02f648b7 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.44.ts @@ -0,0 +1,101 @@ +export default { + id: 'aws-nist-800-53-rev4-8.44', + title: 'AWS NIST 8.44 VPC security groups attached to EC2 instances should not permit ingress from ‘0.0.0.0/0’ to TCP port 389 (LDAP)', + + description: 'VPC security groups attached to EC2 instances should not permit ingress from ‘0.0.0.0/0’ to TCP port 389 (LDAP). Removing unfettered connectivity to LDAP reduces the chance of exposing critical data.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *389* and has a *Source* of *0.0.0.0/0*`, + + rationale: 'Removing unfettered connectivity to remote console services, such as LDAP, reduces a server\'s exposure to risk.', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left pane, click Security Groups. + - For each security group, perform the following: + - Select the security group. + - Click the Inbound Rules tab. + - Identify the rules to be removed. + - Click the x in the Remove column. + - Click Save. + + **AWS CLI** + + Remove the inbound rule(s) that permits unrestricted ingress to TCP port 389 from the selected security group: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol tcp --port 389 --cidr 0.0.0.0/0 + + Optionally add a more restrictive ingress rule to the selected security group: + + aws ec2 authorize-security-group-ingress --region --group-name --protocol tcp --port 389 --cidr `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 389, + }, + { + path: '[*].toPort', + greaterThanInclusive: 389, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.45.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.45.ts new file mode 100644 index 00000000..8387d9ab --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.45.ts @@ -0,0 +1,83 @@ +export default { + id: 'aws-nist-800-53-rev4-8.45', + title: 'AWS NIST 8.45 VPC security groups attached to RDS instances should not permit ingress from ‘0.0.0.0/0’ to all ports', + + description: 'RDS security groups should permit access only to necessary ports to prevent access to potentially vulnerable services on other ports.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *0-65535* and has a *Source* of *0.0.0.0/0*`, + + rationale: '', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/). + - In the left navigation, select Security Groups. + - Select the desired security group and click the Inbound tab. + - Click Edit rules. + - Remove any permissions that allow ‘0.0.0.0/0’ to all ports. + + **AWS CLI** + + Remove ingress rules which allow connectivity from anywhere to all ports and protocols: + + aws ec2 revoke-security-group-ingress --group-id --ip-permissions `, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/working-with-security-groups.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsRdsDbInstance { + id + arn + accountId + __typename + securityGroups { + inboundRules { + source + fromPort + toPort + } + } + } + }`, + resource: 'queryawsRdsDbInstance[*]', + severity: 'high', + conditions: { + not: { + path: '@.securityGroups', + array_any: { + path: '[*].inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + and: [ + { + path: '[*].fromPort', + in: [0, null], + }, + { + path: '[*].toPort', + in: [65535, null], + }, + ], + }, + ], + }, + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.5.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.5.ts new file mode 100644 index 00000000..32e4b750 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.5.ts @@ -0,0 +1,85 @@ +export default { + id: 'aws-nist-800-53-rev4-8.5', + title: 'AWS NIST 8.5 VPC security group inbound rules should not permit ingress from ‘0.0.0.0/0’ to all ports and protocols', + + description: 'Security groups provide stateful filtering of ingress/egress network traffic to AWS resources. AWS recommends that no security group allow unrestricted ingress access from 0.0.0.0/0 to all ports. Removing unfettered connectivity to remote console services reduces a server’s exposure to risk.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a port range that includes port *0-65535* and has a *Source* of *0.0.0.0/0*`, + + rationale: '', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/home). + - In the left navigation, select Security Groups. + - For each security group, perform the steps described below. + - Select the Security Group, click the Inbound Rules tab, and and click Edit rules. + - Remove any rules that permit ingress from ‘0.0.0.0/0’ to all ports and protocols. + - Click Save. + + **AWS CLI** + + Remove ingress rules which allow connectivity from anywhere to all ports and protocols: + + aws ec2 revoke-security-group-ingress --group-id --ip-permissions 'FromPort=0,IpProtocol=tcp,IpRanges=[{CidrIp=0.0.0.0/0}],Ipv6Ranges=[{CidrIpv6=::/0}],ToPort=65535' + + aws ec2 revoke-security-group-ingress --group-id --ip-permissions 'FromPort=0,IpProtocol=udp,IpRanges=[{CidrIp=0.0.0.0/0}],Ipv6Ranges=[{CidrIpv6=::/0}],ToPort=65535' + + aws ec2 revoke-security-group-ingress --group-id --ip-permissions 'FromPort=-1,IpProtocol=icmp,IpRanges=[{CidrIp=0.0.0.0/0}],Ipv6Ranges=[{CidrIpv6=::/0}],ToPort=-1' + + aws ec2 revoke-security-group-ingress --group-id --ip-permissions 'FromPort=-1,IpProtocol=-1,IpRanges=[{CidrIp=0.0.0.0/0}],Ipv6Ranges=[{CidrIpv6=::/0}],ToPort=-1' + + aws ec2 revoke-security-group-ingress --group-id --ip-permissions 'FromPort=-1,IpProtocol=icmpv6,IpRanges=[{CidrIp=0.0.0.0/0}],Ipv6Ranges=[{CidrIpv6=::/0}],ToPort=-1'`, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + and: [ + { + path: '[*].fromPort', + in: [0, null], + }, + { + path: '[*].toPort', + in: [65535, null], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.6.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.6.ts new file mode 100644 index 00000000..750bceb8 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.6.ts @@ -0,0 +1,91 @@ +export default { + id: 'aws-nist-800-53-rev4-8.6', + title: 'AWS NIST 8.6 VPC security group inbound rules should not permit ingress from a public address to all ports and protocols', + + description: 'Security groups provide stateful filtering of ingress/egress network traffic to AWS resources. AWS recommends that no security groups explicitly allow inbound ports.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that permit all ports and protocols`, + + rationale: '', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/home). + - In the left navigation, select Security Groups. + - For each security group, perform the steps described below. + - Select the Security Group, click the Inbound Rules tab, and and click Edit rules. + - Remove any rules that permit ingress from any public address to all ports and protocols. + - Click Save. + + **Note:** A public CIDR block; is when it's set to anything EXCEPT the following valid blocks: + + - 10.0.0.0/8 + - 172.16.0.0/12 + - 192.168.0.0/16 + + **AWS CLI** + + Remove all ingress rules which allow connectivity from a public CIDR block to all ports and protocols: + + aws ec2 revoke-security-group-ingress --group-id --ip-permissions 'FromPort=0,IpProtocol=tcp,IpRanges=[{CidrIp=}],Ipv6Ranges=[{CidrIpv6=}],ToPort=65535' + + aws ec2 revoke-security-group-ingress --group-id --ip-permissions 'FromPort=0,IpProtocol=udp,IpRanges=[{CidrIp=}],Ipv6Ranges=[{CidrIpv6=}],ToPort=65535' + + aws ec2 revoke-security-group-ingress --group-id --ip-permissions 'FromPort=-1,IpProtocol=icmp,IpRanges=[{CidrIp=}],Ipv6Ranges=[{CidrIpv6=}],ToPort=-1' + + aws ec2 revoke-security-group-ingress --group-id --ip-permissions 'FromPort=-1,IpProtocol=icmpv6,IpRanges=[{CidrIp=}],Ipv6Ranges=[{CidrIpv6=}],ToPort=-1' + + aws ec2 revoke-security-group-ingress --group-id --ip-permissions 'FromPort=-1,IpProtocol=-1,IpRanges=[{CidrIp=}],Ipv6Ranges=[{CidrIpv6=}],ToPort=-1'`, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup { + id + arn + accountId + __typename + inboundRules { + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + notIn: ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16'], + }, + { + and: [ + { + path: '[*].fromPort', + in: [0, null], + }, + { + path: '[*].toPort', + in: [65535, null], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.7.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.7.ts new file mode 100644 index 00000000..5d35f117 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.7.ts @@ -0,0 +1,76 @@ +export default { + id: 'aws-nist-800-53-rev4-8.7', + title: 'AWS NIST 8.7 VPC security group inbound rules should not permit ingress from any address to all ports and protocols', + + description: 'Security groups provide stateful filtering of ingress/egress network traffic to AWS resources. AWS recommends that no security groups explicitly allow inbound ports.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that permit ingress from any address to all ports and protocols'`, + + rationale: '', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/home). + - In the left navigation, select Security Groups. + - For each security group, perform the steps described below. + - Select the Security Group, click the Inbound Rules tab, and and click Edit rules. + - Remove any rules that permit ingress from any address to all ports and protocols. + - Click Save. + + **AWS CLI** + + Remove all ingress rules which allow connectivity from a public CIDR block to all ports and protocols: + + aws ec2 revoke-security-group-ingress --group-id --ip-permissions 'FromPort=0,IpProtocol=tcp,IpRanges=[{CidrIp=}],Ipv6Ranges=[{CidrIpv6=}],ToPort=65535' + + aws ec2 revoke-security-group-ingress --group-id --ip-permissions 'FromPort=0,IpProtocol=udp,IpRanges=[{CidrIp=}],Ipv6Ranges=[{CidrIpv6=}],ToPort=65535' + + aws ec2 revoke-security-group-ingress --group-id --ip-permissions 'FromPort=-1,IpProtocol=icmp,IpRanges=[{CidrIp=}],Ipv6Ranges=[{CidrIpv6=}],ToPort=-1' + + aws ec2 revoke-security-group-ingress --group-id --ip-permissions 'FromPort=-1,IpProtocol=icmpv6,IpRanges=[{CidrIp=}],Ipv6Ranges=[{CidrIpv6=}],ToPort=-1' + + aws ec2 revoke-security-group-ingress --group-id --ip-permissions 'FromPort=-1,IpProtocol=-1,IpRanges=[{CidrIp=}],Ipv6Ranges=[{CidrIpv6=}],ToPort=-1'`, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup { + id + arn + accountId + __typename + inboundRules { + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].fromPort', + in: [0, null], + }, + { + path: '[*].toPort', + in: [65535, null], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.8.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.8.ts new file mode 100644 index 00000000..4f1b0044 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.8.ts @@ -0,0 +1,97 @@ +export default { + id: 'aws-nist-800-53-rev4-8.8', + title: 'AWS NIST 8.8 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ except to ports 80 and 443', + + description: 'VPC firewall rules should not permit unrestricted access from the internet, with the exception of port 80 (HTTP) and port 443 (HTTPS). Web applications or APIs generally need to be publicly accessible.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rule*s tab + 6. Ensure no rule exists that has a *Source* of *0.0.0.0/0* to ports differents to 80 and 443`, + + rationale: '', + + remediation: `**AWS Console** + + - Navigate to [VPC](https://console.aws.amazon.com/vpc/home). + - In the left navigation pane, click Security Groups. + - Remove any rules that permit ingress from ‘0.0.0.0/0’ except to ports 80 and 443. + - Click Save. + + **AWS CLI** + + List all security groups with an ingress rule of 0.0.0.0/0: + + aws ec2 describe-security-groups --filters Name=ip-permission.cidr,Values='0.0.0.0/0' --query "SecurityGroups[*].{Name:GroupName,ID:GroupId}" + + Remove the inbound rule(s) that permits unrestricted ingress from ‘0.0.0.0/0’ except to ports 80 and 443: + + aws ec2 revoke-security-group-ingress --region --group-name --protocol --port --cidr 0.0.0.0/0`, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + not: { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: 80, + }, + { + path: '[*].toPort', + equal: 80, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + equal: 443, + }, + { + path: '[*].toPort', + equal: 443, + }, + ], + }, + ], + }, + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.9.ts b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.9.ts new file mode 100644 index 00000000..36fc6f32 --- /dev/null +++ b/src/aws/nist-800-53-rev4/rules/aws-nist-800-53-rev4-8.9.ts @@ -0,0 +1,94 @@ +// AWS CIS 1.2.0 Rule equivalent 4.2 +export default { + id: 'aws-nist-800-53-rev4-8.9', + title: 'AWS NIST 8.9 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to port 3389 (Remote Desktop Protocol)', + + description: 'Security groups provide stateful filtering of ingress/egress network traffic to AWS resources. It is recommended that no security group allows unrestricted ingress access to port 3389.', + + audit: `Perform the following to determine if the account is configured as prescribed: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rules* tab + 6. Ensure no rule exists that has a port range that includes port *3389* and has a *Source* of *0.0.0.0/0* + + Note: A *Port* value of *ALL* or a port range such as *1024 - 4098* are inclusive of port *3389*.`, + + rationale: 'Removing unfettered connectivity to remote console services, such as RDP, reduces a server\'s exposure to risk.', + + remediation: `Perform the following to implement the prescribed state: + + 1. Login to the AWS Management Console at https://console.aws.amazon.com/vpc/home + 2. In the left pane, click *Security Groups* + 3. For each security group, perform the following: + 4. Select the security group + 5. Click the *Inbound Rules* tab + 6. Identify the rules to be removed + 7. Click the *x* in the *Remove* column + 8. Click *Save*`, + + references: [ + 'https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#AddRemoveRules', + 'https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/using-network-security.html#updating-security-group-rules', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-security-groups.html', + 'https://docs.aws.amazon.com/cli/latest/reference/ec2/revoke-security-group-ingress.html', + ], + gql: `{ + queryawsSecurityGroup{ + id + arn + accountId + __typename + inboundRules{ + source + toPort + fromPort + } + } + }`, + resource: 'queryawsSecurityGroup[*]', + severity: 'high', + conditions: { + not: { + path: '@.inboundRules', + array_any: { + and: [ + { + path: '[*].source', + in: ['0.0.0.0/0', '::/0'], + }, + { + or: [ + { + and: [ + { + path: '[*].fromPort', + equal: null, + }, + { + path: '[*].toPort', + equal: null, + }, + ], + }, + { + and: [ + { + path: '[*].fromPort', + lessThanInclusive: 3389, + }, + { + path: '[*].toPort', + greaterThanInclusive: 3389, + }, + ], + }, + ], + }, + ], + }, + }, + }, +} diff --git a/src/aws/nist-800-53-rev4/rules/index.ts b/src/aws/nist-800-53-rev4/rules/index.ts index b488c625..b6b236f3 100644 --- a/src/aws/nist-800-53-rev4/rules/index.ts +++ b/src/aws/nist-800-53-rev4/rules/index.ts @@ -20,15 +20,93 @@ import Aws_NIST_800_53_44 from './aws-nist-800-53-rev4-4.4' import Aws_NIST_800_53_45 from './aws-nist-800-53-rev4-4.5' import Aws_NIST_800_53_46 from './aws-nist-800-53-rev4-4.6' import Aws_NIST_800_53_61 from './aws-nist-800-53-rev4-6.1' +import Aws_NIST_800_53_62 from './aws-nist-800-53-rev4-6.2' +import Aws_NIST_800_53_63 from './aws-nist-800-53-rev4-6.3' import Aws_NIST_800_53_64 from './aws-nist-800-53-rev4-6.4' import Aws_NIST_800_53_65 from './aws-nist-800-53-rev4-6.5' import Aws_NIST_800_53_66 from './aws-nist-800-53-rev4-6.6' +import Aws_NIST_800_53_67 from './aws-nist-800-53-rev4-6.7' import Aws_NIST_800_53_68 from './aws-nist-800-53-rev4-6.8' import Aws_NIST_800_53_69 from './aws-nist-800-53-rev4-6.9' +import Aws_NIST_800_53_610 from './aws-nist-800-53-rev4-6.10' +import Aws_NIST_800_53_611 from './aws-nist-800-53-rev4-6.11' import Aws_NIST_800_53_612 from './aws-nist-800-53-rev4-6.12' import Aws_NIST_800_53_613 from './aws-nist-800-53-rev4-6.13' +import Aws_NIST_800_53_614 from './aws-nist-800-53-rev4-6.14' +import Aws_NIST_800_53_71 from './aws-nist-800-53-rev4-7.1' +import Aws_NIST_800_53_72 from './aws-nist-800-53-rev4-7.2' +import Aws_NIST_800_53_73 from './aws-nist-800-53-rev4-7.3' +import Aws_NIST_800_53_74 from './aws-nist-800-53-rev4-7.4' +import Aws_NIST_800_53_75 from './aws-nist-800-53-rev4-7.5' +import Aws_NIST_800_53_77 from './aws-nist-800-53-rev4-7.7' +import Aws_NIST_800_53_78 from './aws-nist-800-53-rev4-7.8' +import Aws_NIST_800_53_79 from './aws-nist-800-53-rev4-7.9' +import Aws_NIST_800_53_710 from './aws-nist-800-53-rev4-7.10' +import Aws_NIST_800_53_711 from './aws-nist-800-53-rev4-7.11' +import Aws_NIST_800_53_712 from './aws-nist-800-53-rev4-7.12' +import Aws_NIST_800_53_713 from './aws-nist-800-53-rev4-7.13' +import Aws_NIST_800_53_714 from './aws-nist-800-53-rev4-7.14' +import Aws_NIST_800_53_81 from './aws-nist-800-53-rev4-8.1' +import Aws_NIST_800_53_82 from './aws-nist-800-53-rev4-8.2' +import Aws_NIST_800_53_83 from './aws-nist-800-53-rev4-8.3' +import Aws_NIST_800_53_84 from './aws-nist-800-53-rev4-8.4' +import Aws_NIST_800_53_85 from './aws-nist-800-53-rev4-8.5' +import Aws_NIST_800_53_86 from './aws-nist-800-53-rev4-8.6' +import Aws_NIST_800_53_87 from './aws-nist-800-53-rev4-8.7' +import Aws_NIST_800_53_88 from './aws-nist-800-53-rev4-8.8' +import Aws_NIST_800_53_89 from './aws-nist-800-53-rev4-8.9' +import Aws_NIST_800_53_810 from './aws-nist-800-53-rev4-8.10' +import Aws_NIST_800_53_811 from './aws-nist-800-53-rev4-8.11' +import Aws_NIST_800_53_812 from './aws-nist-800-53-rev4-8.12' +import Aws_NIST_800_53_813 from './aws-nist-800-53-rev4-8.13' +import Aws_NIST_800_53_814 from './aws-nist-800-53-rev4-8.14' +import Aws_NIST_800_53_815 from './aws-nist-800-53-rev4-8.15' +import Aws_NIST_800_53_816 from './aws-nist-800-53-rev4-8.16' +import Aws_NIST_800_53_817 from './aws-nist-800-53-rev4-8.17' +import Aws_NIST_800_53_818 from './aws-nist-800-53-rev4-8.18' +import Aws_NIST_800_53_819 from './aws-nist-800-53-rev4-8.19' +import Aws_NIST_800_53_820 from './aws-nist-800-53-rev4-8.20' +import Aws_NIST_800_53_821 from './aws-nist-800-53-rev4-8.21' +import Aws_NIST_800_53_822 from './aws-nist-800-53-rev4-8.22' +import Aws_NIST_800_53_823 from './aws-nist-800-53-rev4-8.23' +import Aws_NIST_800_53_824 from './aws-nist-800-53-rev4-8.24' +import Aws_NIST_800_53_825 from './aws-nist-800-53-rev4-8.25' +import Aws_NIST_800_53_826 from './aws-nist-800-53-rev4-8.26' +import Aws_NIST_800_53_827 from './aws-nist-800-53-rev4-8.27' +import Aws_NIST_800_53_828 from './aws-nist-800-53-rev4-8.28' +import Aws_NIST_800_53_829 from './aws-nist-800-53-rev4-8.29' +import Aws_NIST_800_53_830 from './aws-nist-800-53-rev4-8.30' +import Aws_NIST_800_53_831 from './aws-nist-800-53-rev4-8.31' +import Aws_NIST_800_53_832 from './aws-nist-800-53-rev4-8.32' +import Aws_NIST_800_53_833 from './aws-nist-800-53-rev4-8.33' +import Aws_NIST_800_53_834 from './aws-nist-800-53-rev4-8.34' +import Aws_NIST_800_53_835 from './aws-nist-800-53-rev4-8.35' +import Aws_NIST_800_53_836 from './aws-nist-800-53-rev4-8.36' +import Aws_NIST_800_53_837 from './aws-nist-800-53-rev4-8.37' +import Aws_NIST_800_53_838 from './aws-nist-800-53-rev4-8.38' +import Aws_NIST_800_53_839 from './aws-nist-800-53-rev4-8.39' +import Aws_NIST_800_53_840 from './aws-nist-800-53-rev4-8.40' +import Aws_NIST_800_53_841 from './aws-nist-800-53-rev4-8.41' +import Aws_NIST_800_53_842 from './aws-nist-800-53-rev4-8.42' +import Aws_NIST_800_53_843 from './aws-nist-800-53-rev4-8.43' +import Aws_NIST_800_53_844 from './aws-nist-800-53-rev4-8.44' +import Aws_NIST_800_53_845 from './aws-nist-800-53-rev4-8.45' +import Aws_NIST_800_53_101 from './aws-nist-800-53-rev4-10.1' +import Aws_NIST_800_53_102 from './aws-nist-800-53-rev4-10.2' +import Aws_NIST_800_53_103 from './aws-nist-800-53-rev4-10.3' +import Aws_NIST_800_53_104 from './aws-nist-800-53-rev4-10.4' +import Aws_NIST_800_53_105 from './aws-nist-800-53-rev4-10.5' +import Aws_NIST_800_53_106 from './aws-nist-800-53-rev4-10.6' +import Aws_NIST_800_53_107 from './aws-nist-800-53-rev4-10.7' +import Aws_NIST_800_53_108 from './aws-nist-800-53-rev4-10.8' import Aws_NIST_800_53_111 from './aws-nist-800-53-rev4-11.1' import Aws_NIST_800_53_112 from './aws-nist-800-53-rev4-11.2' +import Aws_NIST_800_53_131 from './aws-nist-800-53-rev4-13.1' +import Aws_NIST_800_53_132 from './aws-nist-800-53-rev4-13.2' +import Aws_NIST_800_53_133 from './aws-nist-800-53-rev4-13.3' +import Aws_NIST_800_53_134 from './aws-nist-800-53-rev4-13.4' +import Aws_NIST_800_53_153 from './aws-nist-800-53-rev4-15.3' +import Aws_NIST_800_53_154 from './aws-nist-800-53-rev4-15.4' export default [ Aws_NIST_800_53_11, @@ -53,13 +131,91 @@ export default [ Aws_NIST_800_53_45, Aws_NIST_800_53_46, Aws_NIST_800_53_61, + Aws_NIST_800_53_62, + Aws_NIST_800_53_63, Aws_NIST_800_53_64, Aws_NIST_800_53_65, Aws_NIST_800_53_66, + Aws_NIST_800_53_67, Aws_NIST_800_53_68, Aws_NIST_800_53_69, + Aws_NIST_800_53_610, + Aws_NIST_800_53_611, Aws_NIST_800_53_612, Aws_NIST_800_53_613, + Aws_NIST_800_53_614, + Aws_NIST_800_53_71, + Aws_NIST_800_53_72, + Aws_NIST_800_53_73, + Aws_NIST_800_53_74, + Aws_NIST_800_53_75, + Aws_NIST_800_53_77, + Aws_NIST_800_53_78, + Aws_NIST_800_53_79, + Aws_NIST_800_53_710, + Aws_NIST_800_53_711, + Aws_NIST_800_53_712, + Aws_NIST_800_53_713, + Aws_NIST_800_53_714, + Aws_NIST_800_53_81, + Aws_NIST_800_53_82, + Aws_NIST_800_53_83, + Aws_NIST_800_53_84, + Aws_NIST_800_53_85, + Aws_NIST_800_53_86, + Aws_NIST_800_53_87, + Aws_NIST_800_53_88, + Aws_NIST_800_53_89, + Aws_NIST_800_53_810, + Aws_NIST_800_53_811, + Aws_NIST_800_53_812, + Aws_NIST_800_53_813, + Aws_NIST_800_53_814, + Aws_NIST_800_53_815, + Aws_NIST_800_53_816, + Aws_NIST_800_53_817, + Aws_NIST_800_53_818, + Aws_NIST_800_53_819, + Aws_NIST_800_53_820, + Aws_NIST_800_53_821, + Aws_NIST_800_53_822, + Aws_NIST_800_53_823, + Aws_NIST_800_53_824, + Aws_NIST_800_53_825, + Aws_NIST_800_53_826, + Aws_NIST_800_53_827, + Aws_NIST_800_53_828, + Aws_NIST_800_53_829, + Aws_NIST_800_53_830, + Aws_NIST_800_53_831, + Aws_NIST_800_53_832, + Aws_NIST_800_53_833, + Aws_NIST_800_53_834, + Aws_NIST_800_53_835, + Aws_NIST_800_53_836, + Aws_NIST_800_53_837, + Aws_NIST_800_53_838, + Aws_NIST_800_53_839, + Aws_NIST_800_53_840, + Aws_NIST_800_53_841, + Aws_NIST_800_53_842, + Aws_NIST_800_53_843, + Aws_NIST_800_53_844, + Aws_NIST_800_53_845, + Aws_NIST_800_53_101, + Aws_NIST_800_53_102, + Aws_NIST_800_53_103, + Aws_NIST_800_53_104, + Aws_NIST_800_53_105, + Aws_NIST_800_53_106, + Aws_NIST_800_53_107, + Aws_NIST_800_53_108, Aws_NIST_800_53_111, Aws_NIST_800_53_112, + Aws_NIST_800_53_131, + Aws_NIST_800_53_132, + Aws_NIST_800_53_133, + Aws_NIST_800_53_134, + Aws_NIST_800_53_153, + Aws_NIST_800_53_154, ] diff --git a/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-1.x.test.ts b/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-1.x.test.ts index efcf9725..cad9e33b 100644 --- a/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-1.x.test.ts +++ b/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-1.x.test.ts @@ -43,12 +43,8 @@ export interface Policy { statement: Statement[] } -export interface BucketPolicy { - policy: PolicyContent -} - export interface S3 { - bucketPolicies?: BucketPolicy[] + policy?: PolicyContent } export interface QueryawsCloudtrail { @@ -210,23 +206,19 @@ describe('AWS NIST 800-53: Rev. 4', () => { id: cuid(), s3: [ { - bucketPolicies: [ - { - policy: { - statement: [ + policy: { + statement: [ + { + effect, + principal: [ { - effect, - principal: [ - { - key, - value: [value], - }, - ], + key, + value: [value], }, ], }, - }, - ], + ], + }, }, ], }, @@ -250,7 +242,11 @@ describe('AWS NIST 800-53: Rev. 4', () => { } test('No Security Issue when S3 bucket ACLs not have public access on S3 buckets that store CloudTrail log files', async () => { - const data: NIS1xQueryResponse = getTestRuleFixture('Allow', 'Service','cloudtrail.amazonaws.com') + const data: NIS1xQueryResponse = getTestRuleFixture( + 'Allow', + 'Service', + 'cloudtrail.amazonaws.com' + ) await testRule(data, Result.PASS) }) diff --git a/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-10.x.test.ts b/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-10.x.test.ts new file mode 100644 index 00000000..f0a8246f --- /dev/null +++ b/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-10.x.test.ts @@ -0,0 +1,387 @@ +import CloudGraph, { Rule, Result, Engine } from '@cloudgraph/sdk' +import cuid from 'cuid' + +import Aws_NIST_800_53_101 from '../rules/aws-nist-800-53-rev4-10.1' +import Aws_NIST_800_53_102 from '../rules/aws-nist-800-53-rev4-10.2' +import Aws_NIST_800_53_103 from '../rules/aws-nist-800-53-rev4-10.3' +import Aws_NIST_800_53_104 from '../rules/aws-nist-800-53-rev4-10.4' +import Aws_NIST_800_53_105 from '../rules/aws-nist-800-53-rev4-10.5' +import Aws_NIST_800_53_106 from '../rules/aws-nist-800-53-rev4-10.6' +import Aws_NIST_800_53_107 from '../rules/aws-nist-800-53-rev4-10.7' +import Aws_NIST_800_53_108 from '../rules/aws-nist-800-53-rev4-10.8' + +export interface AccessKeyData { + status: string + lastRotated: string +} + +export interface QueryawsIamUser { + id: string + accessKeyData: AccessKeyData[] +} + +export interface QueryawsIamPasswordPolicy { + id: string + minimumPasswordLength?: number + requireNumbers?: boolean + passwordReusePrevention?: number + requireLowercaseCharacters?: boolean + requireSymbols?: boolean + requireUppercaseCharacters?: boolean + expirePasswords?: boolean + maxPasswordAge?: number +} + +export interface NIST10xQueryResponse { + queryawsIamUser?: QueryawsIamUser[] + queryawsIamPasswordPolicy?: QueryawsIamPasswordPolicy[] +} + +describe('AWS NIST 800-53: Rev. 4', () => { + let rulesEngine: Engine + beforeAll(() => { + rulesEngine = new CloudGraph.RulesEngine({ + providerName: 'aws', + entityName: 'NIST', + }) + }) + + describe('AWS NIST 10.1 IAM password policies should expire passwords within 90 days', () => { + const getTestRuleFixture = ( + expirePasswords: boolean, + maxPasswordAge: number + ): NIST10xQueryResponse => { + return { + queryawsIamPasswordPolicy: [ + { + id: cuid(), + expirePasswords, + maxPasswordAge, + }, + ] + } + } + + // Act + const testRule = async ( + data: NIST10xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_101 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there is an inbound rule that password expire within 90 days', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(true, 90) + await testRule(data, Result.PASS) + }) + + test('Security Issue when there is an inbound rule that password expire in more than 90 days', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(true, 91) + await testRule(data, Result.FAIL) + }) + + test('Security Issue when there is an inbound rule with password expiration disabled', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(false, 0) + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 10.2 IAM password policies should have a minimum length of 7 and include both alphabetic and numeric characters', () => { + const getTestRuleFixture = ( + minimumPasswordLength: number, + requireNumbers: boolean, + ): NIST10xQueryResponse => { + return { + queryawsIamPasswordPolicy: [ + { + id: cuid(), + minimumPasswordLength, + requireNumbers, + }, + ] + } + } + + // Act + const testRule = async ( + data: NIST10xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_102 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there is an inbound rule with minimum length of 7 and include both alphabetic and numeric characters', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(7, true) + await testRule(data, Result.PASS) + }) + + test('Security Issue when there is an inbound rule with minimum length less than 7', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(6, true) + await testRule(data, Result.FAIL) + }) + + test('Security issue when there is an inbound rule that does not include alphabetic or numeric characters', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(7, false) + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 10.3 IAM password policies should prevent reuse of previously used passwords', () => { + const getTestRuleFixture = ( + passwordReusePrevention: number + ): NIST10xQueryResponse => { + return { + queryawsIamPasswordPolicy: [ + { + id: cuid(), + passwordReusePrevention, + }, + ] + } + } + + // Act + const testRule = async ( + data: NIST10xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_103 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there is an inbound rule with password reuse prevention greater than or equal to 24', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(24) + await testRule(data, Result.PASS) + }) + + test('Security Issue when there is an inbound rule with password reuse prevention less than 24', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(23) + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 10.4 IAM password policies should prevent reuse of the four previously used passwords', () => { + const getTestRuleFixture = ( + passwordReusePrevention: number + ): NIST10xQueryResponse => { + return { + queryawsIamPasswordPolicy: [ + { + id: cuid(), + passwordReusePrevention, + }, + ] + } + } + + // Act + const testRule = async ( + data: NIST10xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_104 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there is an inbound rule with password reuse prevention equal to 4', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(4) + await testRule(data, Result.PASS) + }) + + test('Security Issue when there is an inbound rule with password reuse prevention greater than 4', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(5) + await testRule(data, Result.FAIL) + }) + + test('Security Issue when there is an inbound rule with password reuse prevention less than 4', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(3) + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 10.5 IAM password policies should require at least one lowercase character', () => { + const getTestRuleFixture = ( + requireLowercaseCharacters: boolean + ): NIST10xQueryResponse => { + return { + queryawsIamPasswordPolicy: [ + { + id: cuid(), + requireLowercaseCharacters, + }, + ] + } + } + + // Act + const testRule = async ( + data: NIST10xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_105 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there is an inbound rule that require at least one lowercase character', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(true) + await testRule(data, Result.PASS) + }) + + test('Security Issue when there is an inbound rule that NOT require at least one lowercase character', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(false) + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 10.6 IAM password policies should require at least one number', () => { + const getTestRuleFixture = ( + requireNumbers: boolean + ): NIST10xQueryResponse => { + return { + queryawsIamPasswordPolicy: [ + { + id: cuid(), + requireNumbers, + }, + ] + } + } + + // Act + const testRule = async ( + data: NIST10xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_106 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there is an inbound rule that require at least one number', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(true) + await testRule(data, Result.PASS) + }) + + test('Security Issue when there is an inbound rule that NOT require at least one number', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(false) + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 10.7 IAM password policies should require at least one symbol', () => { + const getTestRuleFixture = ( + requireSymbols: boolean + ): NIST10xQueryResponse => { + return { + queryawsIamPasswordPolicy: [ + { + id: cuid(), + requireSymbols, + }, + ] + } + } + + // Act + const testRule = async ( + data: NIST10xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_107 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there is an inbound rule that require at least one symbol', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(true) + await testRule(data, Result.PASS) + }) + + test('Security Issue when there is an inbound rule that NOT require at least one symbol', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(false) + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 10.8 IAM password policies should require at least one uppercase character', () => { + const getTestRuleFixture = ( + requireUppercaseCharacters: boolean + ): NIST10xQueryResponse => { + return { + queryawsIamPasswordPolicy: [ + { + id: cuid(), + requireUppercaseCharacters, + }, + ] + } + } + + // Act + const testRule = async ( + data: NIST10xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_108 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there is an inbound rule that require at least one uppercase character', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(true) + await testRule(data, Result.PASS) + }) + + test('Security Issue when there is an inbound rule that NOT require at least one uppercase character', async () => { + const data: NIST10xQueryResponse = getTestRuleFixture(false) + await testRule(data, Result.FAIL) + }) + }) +}) diff --git a/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-13.x.test.ts b/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-13.x.test.ts new file mode 100644 index 00000000..f823125f --- /dev/null +++ b/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-13.x.test.ts @@ -0,0 +1,215 @@ +import CloudGraph, { Rule, Result, Engine } from '@cloudgraph/sdk' +import cuid from 'cuid' + +import Aws_NIST_800_53_131 from '../rules/aws-nist-800-53-rev4-13.1' +import Aws_NIST_800_53_132 from '../rules/aws-nist-800-53-rev4-13.2' +import Aws_NIST_800_53_133 from '../rules/aws-nist-800-53-rev4-13.3' +import Aws_NIST_800_53_134 from '../rules/aws-nist-800-53-rev4-13.4' + +export interface AccessKeyData { + status: string + lastRotated: string +} + +export interface VirtualMfaDevice { + serialNumber: string +} + +export interface QueryawsIamUser { + id: string + accountId?: string + passwordEnabled?: boolean + name?: string + mfaActive?: boolean + virtualMfaDevices?: VirtualMfaDevice[] + accessKeyData?: AccessKeyData[] +} + +export interface NIST13xQueryResponse { + queryawsIamUser?: QueryawsIamUser[] +} + +describe('AWS NIST 800-53: Rev. 4', () => { + let rulesEngine: Engine + beforeAll(() => { + rulesEngine = new CloudGraph.RulesEngine({ + providerName: 'aws', + entityName: 'NIST', + }) + }) + + describe('AWS NIST 13.1 IAM multi-factor authentication should be enabled for all IAM users that have a console password', () => { + const getTestRuleFixture = ( + passwordEnabled: boolean, + mfaActive: boolean + ): NIST13xQueryResponse => { + return { + queryawsIamUser: [ + { + id: cuid(), + passwordEnabled, + mfaActive + }, + ] + } + } + + // Act + const testRule = async ( + data: NIST13xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_131 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there is an inbound rule with a user that has an active password with an mfa device register', async () => { + const data: NIST13xQueryResponse = getTestRuleFixture(true, true) + await testRule(data, Result.PASS) + }) + + test('No Security Issue when there is an inbound rule with a user that has no active password', async () => { + const data: NIST13xQueryResponse = getTestRuleFixture(false, true) + await testRule(data, Result.PASS) + }) + + test('Security Issue when there is an inbound rule with user that has an active password without an mfa device register', async () => { + const data: NIST13xQueryResponse = getTestRuleFixture(true, false) + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 13.2 IAM should have hardware MFA enabled for the root account', () => { + const getTestRuleFixture = ( + mfaActive: boolean + ): NIST13xQueryResponse => { + return { + queryawsIamUser: [ + { + id: cuid(), + name: 'root', + mfaActive, + accountId: '123456', + virtualMfaDevices: [ + { + serialNumber: 'arn:aws:iam::123456:mfa/some-account-mfa-device' + } + ] + }, + ] + } + } + + // Act + const testRule = async ( + data: NIST13xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_132 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there is an inbound rule with a root account that has a mfa hardware device active', async () => { + const data: NIST13xQueryResponse = getTestRuleFixture(true) + await testRule(data, Result.PASS) + }) + + test('Security Issue when there is an inbound rule with a root account that has a mfa hardware device deactivate', async () => { + const data: NIST13xQueryResponse = getTestRuleFixture(false) + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 13.3 IAM should have MFA enabled for the root account', () => { + const getTestRuleFixture = ( + mfaActive: boolean + ): NIST13xQueryResponse => { + return { + queryawsIamUser: [ + { + id: cuid(), + name: 'root', + mfaActive, + }, + ] + } + } + + // Act + const testRule = async ( + data: NIST13xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_133 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there is an inbound rule with a root account that has a mfa enabled', async () => { + const data: NIST13xQueryResponse = getTestRuleFixture(true) + await testRule(data, Result.PASS) + }) + + test('Security Issue when there is an inbound rule with a root account that has a mfa disabled', async () => { + const data: NIST13xQueryResponse = getTestRuleFixture(false) + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 13.4 IAM users should have MFA (virtual or hardware) enabled', () => { + const getTestRuleFixture = ( + mfaActive: boolean + ): NIST13xQueryResponse => { + return { + queryawsIamUser: [ + { + id: cuid(), + mfaActive, + }, + ] + } + } + + // Act + const testRule = async ( + data: NIST13xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_134 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there is an inbound rule with IAM users that has a mfa enabled', async () => { + const data: NIST13xQueryResponse = getTestRuleFixture(true) + await testRule(data, Result.PASS) + }) + + test('Security Issue when there is an inbound rule with IAM users that has a mfa disabled', async () => { + const data: NIST13xQueryResponse = getTestRuleFixture(false) + await testRule(data, Result.FAIL) + }) + }) +}) \ No newline at end of file diff --git a/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-15.x.test.ts b/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-15.x.test.ts new file mode 100644 index 00000000..2b70d0c4 --- /dev/null +++ b/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-15.x.test.ts @@ -0,0 +1,108 @@ +import CloudGraph, { Rule, Result, Engine } from '@cloudgraph/sdk' +import cuid from 'cuid' + +import Aws_NIST_800_53_153 from '../rules/aws-nist-800-53-rev4-15.3' +import Aws_NIST_800_53_154 from '../rules/aws-nist-800-53-rev4-15.4' + +export interface QueryawsIamUser { + id: string + accessKeysActive?: boolean + passwordLastUsed?: string + passwordEnabled?: boolean +} + +export interface NIST13xQueryResponse { + queryawsIamUser?: QueryawsIamUser[] +} + +describe('AWS NIST 800-53: Rev. 4', () => { + let rulesEngine: Engine + beforeAll(() => { + rulesEngine = new CloudGraph.RulesEngine({ + providerName: 'aws', + entityName: 'NIST', + }) + }) + + describe('AWS NIST 15.3 IAM root user access key should not exist', () => { + const getTestRuleFixture = ( + accessKeysActive: boolean + ): NIST13xQueryResponse => { + return { + queryawsIamUser: [ + { + id: cuid(), + accessKeysActive, + }, + ] + } + } + + // Act + const testRule = async ( + data: NIST13xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_153 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there is an inbound rule with a root account that does not have any access key active', async () => { + const data: NIST13xQueryResponse = getTestRuleFixture(false) + await testRule(data, Result.PASS) + }) + + test('Security Issue when there is an inbound rule with a root account that has at least one access key active', async () => { + const data: NIST13xQueryResponse = getTestRuleFixture(true) + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 15.4 IAM root user should not be used', () => { + const getTestRuleFixture = ( + passwordEnabled: boolean, + passwordLastUsed: string, + ): NIST13xQueryResponse => { + return { + queryawsIamUser: [ + { + id: cuid(), + passwordLastUsed, + passwordEnabled, + }, + ] + } + } + + // Act + const testRule = async ( + data: NIST13xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_154 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there is an inbound rule with a root account that does not uses his password in the last 30 days', async () => { + const data: NIST13xQueryResponse = getTestRuleFixture(true, '2021-04-08T17:20:19.000Z') + await testRule(data, Result.PASS) + }) + + test('Security Issue when there is an inbound rule with a root account that uses his password in the last 30 days', async () => { + const data: NIST13xQueryResponse = getTestRuleFixture(true, new Date().toISOString()) + await testRule(data, Result.FAIL) + }) + }) +}) \ No newline at end of file diff --git a/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-4.x.test.ts b/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-4.x.test.ts index 3d9390d8..d64aa23f 100644 --- a/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-4.x.test.ts +++ b/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-4.x.test.ts @@ -46,10 +46,6 @@ export interface Policy { statement: Statement[] } -export interface BucketPolicy { - policy: Policy -} - export interface Subscription { protocol: string endpoint: string @@ -57,7 +53,7 @@ export interface Subscription { export interface QueryawsS3 { id: string - bucketPolicies: BucketPolicy[] + policy: Policy } export interface QueryawsCloudfront { @@ -299,20 +295,16 @@ describe('AWS NIST 800-53: Rev. 4', () => { queryawsS3: [ { id: cuid(), - bucketPolicies: [ - { - policy: { - statement: [ - { - effect, - action: [action], - principal: [principal], - condition: [condition], - }, - ], + policy: { + statement: [ + { + effect, + action: [action], + principal: [principal], + condition: [condition], }, - }, - ], + ], + }, }, ], } @@ -334,25 +326,55 @@ describe('AWS NIST 800-53: Rev. 4', () => { } test('No Security Issue when S3 bucket policies only allow requests that use HTTPS', async () => { - const principal: Principal = { key: 'AWS', value: ['arn:aws:iam::111122223333:root'] } - const condition: Condition = { key: 'aws:SecureTransport', value: ['true'] } - const data: NIS4xQueryResponse = getTestRuleFixture('Allow', '*', principal, condition) + const principal: Principal = { + key: 'AWS', + value: ['arn:aws:iam::111122223333:root'], + } + const condition: Condition = { + key: 'aws:SecureTransport', + value: ['true'], + } + const data: NIS4xQueryResponse = getTestRuleFixture( + 'Allow', + '*', + principal, + condition + ) await testRule(data, Result.PASS) }) test('Security Issue when S3 bucket policy does not have SecureTransport enabled', async () => { - const principal: Principal = { key: 'AWS', value: ['arn:aws:iam::111122223333:root'] } - const condition: Condition = { key: 'aws:SecureTransport', value: ['false'] } - const data: NIS4xQueryResponse = getTestRuleFixture('Allow', '*', principal, condition) + const principal: Principal = { + key: 'AWS', + value: ['arn:aws:iam::111122223333:root'], + } + const condition: Condition = { + key: 'aws:SecureTransport', + value: ['false'], + } + const data: NIS4xQueryResponse = getTestRuleFixture( + 'Allow', + '*', + principal, + condition + ) await testRule(data, Result.FAIL) }) test('Security Issue when S3 bucket policy have SecureTransport enabled but grants permission to any public anonymous users', async () => { const principal: Principal = { key: '', value: ['*'] } - const condition: Condition = { key: 'aws:SecureTransport', value: ['true'] } - const data: NIS4xQueryResponse = getTestRuleFixture('Allow', '*', principal, condition) + const condition: Condition = { + key: 'aws:SecureTransport', + value: ['true'], + } + const data: NIS4xQueryResponse = getTestRuleFixture( + 'Allow', + '*', + principal, + condition + ) await testRule(data, Result.FAIL) }) @@ -370,7 +392,7 @@ describe('AWS NIST 800-53: Rev. 4', () => { subscriptions: [ { protocol, - endpoint + endpoint, }, ], }, @@ -394,19 +416,28 @@ describe('AWS NIST 800-53: Rev. 4', () => { } test('No Security Issue when SNS subscriptions deny access via HTTP', async () => { - const data: NIS4xQueryResponse = getTestRuleFixture('https', 'https://06c5056f74ab.ngrok.io/sns-response-endpoint') + const data: NIS4xQueryResponse = getTestRuleFixture( + 'https', + 'https://06c5056f74ab.ngrok.io/sns-response-endpoint' + ) await testRule(data, Result.PASS) }) test('Security Issue when SNS subscriptions allow access via HTTP protocol', async () => { - const data: NIS4xQueryResponse = getTestRuleFixture('http', 'https://06c5056f74ab.ngrok.io/sns-response-endpoint') + const data: NIS4xQueryResponse = getTestRuleFixture( + 'http', + 'https://06c5056f74ab.ngrok.io/sns-response-endpoint' + ) await testRule(data, Result.FAIL) }) test('Security Issue when SNS subscriptions allow access via HTTP domain', async () => { - const data: NIS4xQueryResponse = getTestRuleFixture('https', 'http://06c5056f74ab.ngrok.io/sns-response-endpoint') + const data: NIS4xQueryResponse = getTestRuleFixture( + 'https', + 'http://06c5056f74ab.ngrok.io/sns-response-endpoint' + ) await testRule(data, Result.FAIL) }) diff --git a/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-6.x.test.ts b/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-6.x.test.ts index b343201b..929625b6 100644 --- a/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-6.x.test.ts +++ b/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-6.x.test.ts @@ -2,13 +2,19 @@ import CloudGraph, { Rule, Result, Engine } from '@cloudgraph/sdk' import cuid from 'cuid' import Aws_NIST_800_53_61 from '../rules/aws-nist-800-53-rev4-6.1' +import Aws_NIST_800_53_62 from '../rules/aws-nist-800-53-rev4-6.2' +import Aws_NIST_800_53_63 from '../rules/aws-nist-800-53-rev4-6.3' import Aws_NIST_800_53_64 from '../rules/aws-nist-800-53-rev4-6.4' import Aws_NIST_800_53_65 from '../rules/aws-nist-800-53-rev4-6.5' import Aws_NIST_800_53_66 from '../rules/aws-nist-800-53-rev4-6.6' +import Aws_NIST_800_53_67 from '../rules/aws-nist-800-53-rev4-6.7' import Aws_NIST_800_53_68 from '../rules/aws-nist-800-53-rev4-6.8' import Aws_NIST_800_53_69 from '../rules/aws-nist-800-53-rev4-6.9' +import Aws_NIST_800_53_610 from '../rules/aws-nist-800-53-rev4-6.10' +import Aws_NIST_800_53_611 from '../rules/aws-nist-800-53-rev4-6.11' import Aws_NIST_800_53_612 from '../rules/aws-nist-800-53-rev4-6.12' import Aws_NIST_800_53_613 from '../rules/aws-nist-800-53-rev4-6.13' +import Aws_NIST_800_53_614 from '../rules/aws-nist-800-53-rev4-6.14' export interface Logging { enabled: boolean @@ -24,10 +30,24 @@ export interface EventSelector { dataResources?: DataResource[] } +export interface Status { + isLogging?: boolean + latestCloudWatchLogsDeliveryTime?: string +} + export interface Cloudtrail { isMultiRegionTrail?: string eventSelectors?: EventSelector[] includeGlobalServiceEvents?: string + status?: Status +} + +export interface S3 { + logging: string +} + +export interface FlowLog { + resourceId: string } export interface QueryawsCloudfront { @@ -43,6 +63,10 @@ export interface QueryawsAccount { export interface QueryawsCloudtrail { id: string eventSelectors?: EventSelector[] + logFileValidationEnabled?: string + cloudWatchLogsLogGroupArn?: string + s3?: S3[] + status?: Status } export interface QueryawsAlb { @@ -55,12 +79,23 @@ export interface QueryawsElb { accessLogs: string } +export interface QueryawsS3 { + id: string + logging: string +} + +export interface QueryawsVpc { + id: string + flowLog: FlowLog[] +} export interface NIS6xQueryResponse { queryawsCloudfront?: QueryawsCloudfront[] queryawsAccount?: QueryawsAccount[] queryawsCloudtrail?: QueryawsCloudtrail[] queryawsAlb?: QueryawsAlb[] queryawsElb?: QueryawsElb[] + queryawsS3?: QueryawsS3[] + queryawsVpc?: QueryawsVpc[] } describe('AWS NIST 800-53: Rev. 4', () => { @@ -112,6 +147,144 @@ describe('AWS NIST 800-53: Rev. 4', () => { }) }) + describe('AWS NIST 6.2 CloudTrail log file validation should be enabled', () => { + const getTestRuleFixture = ( + logFileValidationEnabled: string + ): NIS6xQueryResponse => { + return { + queryawsCloudtrail: [ + { + id: cuid(), + logFileValidationEnabled, + }, + ], + } + } + + // Act + const testRule = async ( + data: NIS6xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_62 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when a trail has log file validation enabled', async () => { + const data: NIS6xQueryResponse = getTestRuleFixture('Yes') + await testRule(data, Result.PASS) + }) + + test('Security Issue when a trail has log file validation disabled', async () => { + const data: NIS6xQueryResponse = getTestRuleFixture('No') + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 6.3 CloudTrail should be enabled in all regions', () => { + const getTestRuleFixture = ( + isMultiRegionTrail: string, + isLogging: boolean, + readWriteType: string, + includeManagementEvents: boolean + ): NIS6xQueryResponse => { + return { + queryawsAccount: [ + { + id: cuid(), + cloudtrail: [ + { + isMultiRegionTrail, + status: { + isLogging, + }, + eventSelectors: [ + { + readWriteType, + includeManagementEvents, + }, + ], + }, + ], + }, + ], + } + } + + // Act + const testRule = async ( + data: NIS6xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_63 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when a trail has set IsMultiRegionTrail and isLogging as true with at least one Event Selector with IncludeManagementEvents set to true and ReadWriteType set to All', async () => { + const data: NIS6xQueryResponse = getTestRuleFixture( + 'Yes', + true, + 'All', + true + ) + await testRule(data, Result.PASS) + }) + + test('Security Issue when a trail has set IsMultiRegionTrail is set to false', async () => { + const data: NIS6xQueryResponse = getTestRuleFixture( + 'No', + true, + 'All', + true + ) + await testRule(data, Result.FAIL) + }) + + test('Security Issue when a trail has set isLogging is set to false', async () => { + const data: NIS6xQueryResponse = getTestRuleFixture( + 'Yes', + false, + 'All', + true + ) + await testRule(data, Result.FAIL) + }) + + test('Security Issue when a trail has set multi region as true with all read-write type and include management events false', async () => { + const data: NIS6xQueryResponse = getTestRuleFixture( + 'Yes', + true, + 'All', + false + ) + await testRule(data, Result.FAIL) + }) + + test('Security Issue when there not are any trail', async () => { + const data: NIS6xQueryResponse = getTestRuleFixture( + 'Yes', + true, + 'All', + true + ) + const account = data.queryawsAccount?.[0] as QueryawsAccount + account.cloudtrail = [] + await testRule(data, Result.FAIL) + }) + }) + describe('AWS NIST 6.4 CloudTrail should have at least one CloudTrail trail set to a multi-region trail', () => { const getTestRuleFixture = ( isMultiRegionTrail: string @@ -248,6 +421,50 @@ describe('AWS NIST 800-53: Rev. 4', () => { }) }) + describe('AWS NIST 6.7 CloudTrail trails should have CloudWatch log integration enabled', () => { + const getTestRuleFixture = ( + cloudWatchLogsLogGroupArn: string, + latestCloudWatchLogsDeliveryTime: string + ): NIS6xQueryResponse => { + return { + queryawsCloudtrail: [ + { + id: cuid(), + cloudWatchLogsLogGroupArn, + status: { + latestCloudWatchLogsDeliveryTime + } + }, + ], + } + } + + // Act + const testRule = async ( + data: NIS6xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_67 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when a trail has cloudwatch logs integrated with a delivery date no more than a day', async () => { + const data: NIS6xQueryResponse = getTestRuleFixture(cuid(), new Date().toISOString()) + await testRule(data, Result.PASS) + }) + + test('Security Issue when a trail has cloudwatch logs integrated with a delivery date more than a day', async () => { + const data: NIS6xQueryResponse = getTestRuleFixture(cuid(), '2021-11-20T16:18:21.724Z') + await testRule(data, Result.FAIL) + }) + }) + describe('AWS NIST 6.8 Exactly one CloudTrail trail should monitor global services', () => { const getTestRuleFixture = ( includeGlobalServiceEvents: string @@ -296,9 +513,7 @@ describe('AWS NIST 800-53: Rev. 4', () => { }) describe('AWS NIST 6.9 Load balancer access logging should be enabled', () => { - const getTestRuleAFixture = ( - accessLogs: string - ): NIS6xQueryResponse => { + const getTestRuleAFixture = (accessLogs: string): NIS6xQueryResponse => { return { queryawsElb: [ { @@ -336,7 +551,6 @@ describe('AWS NIST 800-53: Rev. 4', () => { expect(processedRule.result).toBe(expectedResult) } - describe('queryawsElb query:', () => { let targetElbRule: Rule beforeAll(() => { @@ -382,6 +596,86 @@ describe('AWS NIST 800-53: Rev. 4', () => { }) }) + describe('AWS NIST 6.10 S3 bucket access logging should be enabled', () => { + const getTestRuleFixture = (logging: string): NIS6xQueryResponse => { + return { + queryawsS3: [ + { + id: cuid(), + logging, + }, + ], + } + } + + // Act + const testRule = async ( + data: NIS6xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_610 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when S3 bucket access logging is enabled', async () => { + const data: NIS6xQueryResponse = getTestRuleFixture('Enabled') + await testRule(data, Result.PASS) + }) + + test('Security Issue when S3 bucket access logging is disabled', async () => { + const data: NIS6xQueryResponse = getTestRuleFixture('Disabled') + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 6.11 S3 bucket access logging should be enabled on S3 buckets that store CloudTrail log files', () => { + const getTestRuleFixture = (logging: string): NIS6xQueryResponse => { + return { + queryawsCloudtrail: [ + { + id: cuid(), + s3: [ + { + logging, + }, + ], + }, + ], + } + } + + // Act + const testRule = async ( + data: NIS6xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_611 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when a trail bucket has access logging enabled', async () => { + const data: NIS6xQueryResponse = getTestRuleFixture('Enabled') + await testRule(data, Result.PASS) + }) + + test('Security Issue when a trail bucket has access logging disabled', async () => { + const data: NIS6xQueryResponse = getTestRuleFixture('Disabled') + await testRule(data, Result.FAIL) + }) + }) + describe('AWS NIST 6.12 S3 bucket object-level logging for read events should be enabled', () => { const getTestRuleFixture = ( includeManagementEvents: boolean, @@ -489,4 +783,48 @@ describe('AWS NIST 800-53: Rev. 4', () => { await testRule(data, Result.PASS) }) }) + + describe('AWS NIST 6.14 VPC flow logging should be enabled', () => { + const getTestRuleFixture = (resourceId: string): NIS6xQueryResponse => { + return { + queryawsVpc: [ + { + id: cuid(), + flowLog: [ + { + resourceId, + }, + ], + }, + ], + } + } + + // Act + const testRule = async ( + data: NIS6xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_614 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when flow logging is enabled for each VPC', async () => { + const data: NIS6xQueryResponse = getTestRuleFixture(cuid()) + await testRule(data, Result.PASS) + }) + + test('Security Issue when flow logging is disabled on one VPC', async () => { + const data: NIS6xQueryResponse = getTestRuleFixture(cuid()) + const vpc = data.queryawsVpc?.[0] as QueryawsVpc + vpc.flowLog = [] + await testRule(data, Result.FAIL) + }) + }) }) diff --git a/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-7.x.test.ts b/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-7.x.test.ts new file mode 100644 index 00000000..7a87f380 --- /dev/null +++ b/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-7.x.test.ts @@ -0,0 +1,851 @@ +import CloudGraph, { Rule, Result, Engine } from '@cloudgraph/sdk' +import cuid from 'cuid' + +import Aws_NIST_800_53_71 from '../rules/aws-nist-800-53-rev4-7.1' +import Aws_NIST_800_53_72 from '../rules/aws-nist-800-53-rev4-7.2' +import Aws_NIST_800_53_73 from '../rules/aws-nist-800-53-rev4-7.3' +import Aws_NIST_800_53_74 from '../rules/aws-nist-800-53-rev4-7.4' +import Aws_NIST_800_53_75 from '../rules/aws-nist-800-53-rev4-7.5' +import Aws_NIST_800_53_77 from '../rules/aws-nist-800-53-rev4-7.7' +import Aws_NIST_800_53_78 from '../rules/aws-nist-800-53-rev4-7.8' +import Aws_NIST_800_53_79 from '../rules/aws-nist-800-53-rev4-7.9' +import Aws_NIST_800_53_710 from '../rules/aws-nist-800-53-rev4-7.10' +import Aws_NIST_800_53_711 from '../rules/aws-nist-800-53-rev4-7.11' +import Aws_NIST_800_53_712 from '../rules/aws-nist-800-53-rev4-7.12' +import Aws_NIST_800_53_713 from '../rules/aws-nist-800-53-rev4-7.13' +import Aws_NIST_800_53_714 from '../rules/aws-nist-800-53-rev4-7.14' + +const Aws_NIST_800_53_72_Filter_Pattern = + '{ ($.eventSource = organizations.amazonaws.com) && (($.eventName = "AcceptHandshake") || ($.eventName = "AttachPolicy") || ($.eventName = "CreateAccount") || ($.eventName = "CreateOrganizationalUnit") || ($.eventName = "CreatePolicy") || ($.eventName = "DeclineHandshake") || ($.eventName = "DeleteOrganization") || ($.eventName = "DeleteOrganizationalUnit") || ($.eventName = "DeletePolicy") || ($.eventName = "DetachPolicy") || ($.eventName = "DisablePolicyType") || ($.eventName = "EnablePolicyType") || ($.eventName = "InviteAccountToOrganization") || ($.eventName = "LeaveOrganization") || ($.eventName = "MoveAccount") || ($.eventName = "RemoveAccountFromOrganization") || ($.eventName = "UpdatePolicy") || ($.eventName = "UpdateOrganizationalUnit")) }' +const Aws_NIST_800_53_73_Filter_Pattern = + '{ ($.eventName = CreateNetworkAcl) || ($.eventName = CreateNetworkAclEntry) || ($.eventName = DeleteNetworkAcl) || ($.eventName = DeleteNetworkAclEntry) || ($.eventName = ReplaceNetworkAclEntry) || ($.eventName = ReplaceNetworkAclAssociation) }' +const Aws_NIST_800_53_74_Filter_Pattern = + '{ ($.eventName = CreateCustomerGateway) || ($.eventName = DeleteCustomerGateway) || ($.eventName = AttachInternetGateway) || ($.eventName = CreateInternetGateway) || ($.eventName = DeleteInternetGateway) || ($.eventName = DetachInternetGateway) }' +const Aws_NIST_800_53_75_Filter_Pattern = + '{ ($.eventName = CreateTrail) || ($.eventName = UpdateTrail) || ($.eventName = DeleteTrail) || ($.eventName = StartLogging) || ($.eventName = StopLogging) }' +const Aws_NIST_800_53_77_Filter_Pattern = + '{ ($.eventName = DeleteGroupPolicy) || ($.eventName = DeleteRolePolicy) || ($.eventName = DeleteUserPolicy) || ($.eventName = PutGroupPolicy) || ($.eventName = PutRolePolicy) || ($.eventName = PutUserPolicy) || ($.eventName = CreatePolicy) || ($.eventName = DeletePolicy) || ($.eventName=CreatePolicyVersion) || ($.eventName=DeletePolicyVersion) || ($.eventName=AttachRolePolicy) || ($.eventName=DetachRolePolicy) || ($.eventName=AttachUserPolicy) || ($.eventName = DetachUserPolicy) || ($.eventName = AttachGroupPolicy) || ($.eventName = DetachGroupPolicy)}' +const Aws_NIST_800_53_78_Filter_Pattern = + '{ ($.eventName = ConsoleLogin1) && ($.errorMessage = "Failed authentication") }' +const Aws_NIST_800_53_79_Filter_Pattern = + '{ ($.errorCode = "ConsoleLogin") || ($.additionalEventData.MFAUsed != "Yes") }' +const Aws_NIST_800_53_710_Filter_Pattern = + '{ ($.errorCode = "UnauthorizedOperation") || ($.errorCode = "AccessDenied") }' +const Aws_NIST_800_53_711_Filter_Pattern = + '{ $.userIdentity.type = "Root" && $.userIdentity.invokedBy NOT EXISTS && $.eventType != "AwsServiceEvent" }' +const Aws_NIST_800_53_712_Filter_Pattern = + '{ ($.eventName = CreateVpc) || ($.eventName = DeleteVpc) || ($.eventName = ModifyVpcAttribute) || ($.eventName = AcceptVpcPeeringConnection) || ($.eventName = CreateVpcPeeringConnection) || ($.eventName = DeleteVpcPeeringConnection) || ($.eventName = RejectVpcPeeringConnection) || ($.eventName = AttachClassicLinkVpc) || ($.eventName = DetachClassicLinkVpc) || ($.eventName = DisableVpcClassicLink) || ($.eventName = EnableVpcClassicLink) }' +const Aws_NIST_800_53_713_Filter_Pattern = + '{ ($.eventName = CreateRoute) || ($.eventName = CreateRouteTable) || ($.eventName = ReplaceRoute) || ($.eventName = ReplaceRouteTableAssociation) || ($.eventName = DeleteRouteTable) || ($.eventName = DeleteRoute) || ($.eventName = DisassociateRouteTable) }' +const Aws_NIST_800_53_714_Filter_Pattern = + '{ ($.eventName = AuthorizeSecurityGroupIngress) || ($.eventName = AuthorizeSecurityGroupEgress) || ($.eventName = RevokeSecurityGroupIngress) || ($.eventName = RevokeSecurityGroupEgress) || ($.eventName = CreateSecurityGroup) || ($.eventName = DeleteSecurityGroup) }' + +export interface SubscriptionsEntity { + arn: string +} + +export interface SnsEntity { + arn: string + subscriptions?: SubscriptionsEntity[] | null +} + +export interface CloudwatchEntity { + arn: string + actions?: string[] | null + sns: SnsEntity[] + metric: string +} + +export interface MetricTransformation { + metricName: string +} + +export interface MetricFiltersEntity { + id: string + filterName: string + filterPattern: string + metricTransformations: MetricTransformation[] +} + +export interface CloudwatchLogEntity { + arn: string + metricFilters: MetricFiltersEntity[] + cloudwatch: CloudwatchEntity[] +} + +export interface EventSelectorsEntity { + id: string + readWriteType: string + includeManagementEvents: boolean +} + +export interface Status { + isLogging: boolean +} + +export interface QueryawsCloudtrailEntity { + id: string + isMultiRegionTrail: string + status: Status + eventSelectors: EventSelectorsEntity[] + cloudwatchLog: CloudwatchLogEntity[] +} + +export interface Cloudwatch { + metric: string +} + +export interface QueryawsAccount { + id: string + cloudtrail: QueryawsCloudtrailEntity[] +} + +export interface QueryawsCloudfront { + id: string + cloudwatch: Cloudwatch[] +} + +export interface NIST7xQueryResponse { + queryawsAccount: QueryawsAccount[] + queryawsCloudfront?: QueryawsCloudfront[] +} + +describe('AWS NIST 800-53: Rev. 4', () => { + let rulesEngine: Engine + beforeAll(() => { + rulesEngine = new CloudGraph.RulesEngine({ + providerName: 'aws', + entityName: 'NIST', + }) + }) + + const get7xValidResponse = ( + metricFilterPattern: string + ): NIST7xQueryResponse => ({ + queryawsAccount: [ + { + id: cuid(), + cloudtrail: [ + { + id: 'arn:aws:cloudtrail:us-east-2:111111111111:trail/snsTest', + isMultiRegionTrail: 'Yes', + status: { + isLogging: true, + }, + eventSelectors: [ + { + id: 'ckxysdl0u000osf7k0bmz41n8', + readWriteType: 'All', + includeManagementEvents: true, + }, + ], + cloudwatchLog: [ + { + arn: 'arn:aws:logs:us-east-1:111111111111:log-group:aws-cloudtrail-logs-111111111111-11111111:*', + metricFilters: [ + { + id: 'ckxysdl0s000ksf7kci3q4obi', + filterName: 'KmsDeletion', + filterPattern: + '{($.eventSource = kms.test.amazonaws.com) && (($.eventName=DisableKey)||($.eventName=ScheduleKeyDeletion)) }', + metricTransformations: [ + { + metricName: 'KmsDeletionCount', + }, + ], + }, + { + id: 'ckxysdl0s000ksf7kci3q4obi', + filterName: 'DummyName', + filterPattern: metricFilterPattern, + metricTransformations: [ + { + metricName: 'DummyNameCount', + }, + ], + }, + ], + cloudwatch: [ + { + metric: 'KmsDeletionCount', + arn: 'arn:aws:cloudwatch:us-east-1:111111111111:alarm:KmsDeletionAlarm', + actions: ['arn:aws:sns:us-east-1:111111111111:...'], + sns: [ + { + arn: 'arn:aws:sns:us-east-1:111111111111:...', + subscriptions: [ + { + arn: 'arn:aws:sns:...', + }, + ], + }, + ], + }, + { + metric: 'DummyNameCount', + arn: 'arn:aws:cloudwatch:us-east-1:111111111111:alarm:DummyAlarm', + actions: ['arn:aws:sns:us-east-1:111111111111:...'], + sns: [ + { + arn: 'arn:aws:sns:us-east-1:111111111111:...', + subscriptions: [ + { + arn: 'arn:aws:sns:us-east-1:111111111111:...:11111111-1111-1111-1111-111111111111', + }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }, + ], + }) + + describe('AWS NIST 7.1 Alarm for denied connections in CloudFront logs should be configured', () => { + const getTestRuleFixture = ( + metric1: string, + metric2: string + ): NIST7xQueryResponse => { + return { + queryawsAccount: [], + queryawsCloudfront: [ + { + id: cuid(), + cloudwatch: [ + { + metric: metric1 + }, + { + metric: metric2 + }, + ], + }, + ], + } + } + + // Act + const testRule = async ( + data: NIST7xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_71 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when Cloudfront has a CloudWatch alarm to trigger on HTTP 4xx and 5xx error codes', async () => { + const data: NIST7xQueryResponse = getTestRuleFixture('4xxErrorRate','5xxErrorRate') + await testRule(data, Result.PASS) + }) + + test('Security Issue when Cloudfront has a only CloudWatch alarm to trigger on HTTP 4xx error codes', async () => { + const data: NIST7xQueryResponse = getTestRuleFixture('4xxErrorRate','test') + await testRule(data, Result.FAIL) + }) + + test('Security Issue when Cloudfront has a only CloudWatch alarm to trigger on HTTP 5xx error codes', async () => { + const data: NIST7xQueryResponse = getTestRuleFixture('5xxErrorRate','test') + await testRule(data, Result.FAIL) + }) + + test('Security Issue when Cloudfront has a not a CloudWatch alarm to trigger on HTTP 4xx and 5xx error codes', async () => { + const data: NIST7xQueryResponse = getTestRuleFixture('','test') + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 7.2 CloudWatch log metric filter and alarm for AWS Organizations changes should be configured for the master account', () => { + const testRule = async ( + data: NIST7xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_72 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there are metric filters and alarms for AWS Organizations changes', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_72_Filter_Pattern) + await testRule(data, Result.PASS) + }) + test('Security Issue when isLogging is false', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_72_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].status.isLogging = false + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors readWriteType is not All', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_72_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].readWriteType = + 'dummy' + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors includeManagementEvents is not true', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_72_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].includeManagementEvents = + false + await testRule(data, Result.FAIL) + }) + test('Security Issue when metricFilters filterPattern is not found', async () => { + const data = get7xValidResponse('dummy metric filter value') + await testRule(data, Result.FAIL) + }) + test('Security Issue when cloudwatch sns suscription is not found', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_72_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].cloudwatchLog[0].cloudwatch[1].sns[0].subscriptions = + [] + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 7.3 CloudWatch log metric filter and alarm for changes to VPC NACLs should be configured', () => { + const testRule = async ( + data: NIST7xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_73 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there are metric filters and alarms for security group changes', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_73_Filter_Pattern) + await testRule(data, Result.PASS) + }) + test('Security Issue when isLogging is false', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_73_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].status.isLogging = false + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors readWriteType is not All', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_73_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].readWriteType = + 'dummy' + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors includeManagementEvents is not true', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_73_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].includeManagementEvents = + false + await testRule(data, Result.FAIL) + }) + test('Security Issue when metricFilters filterPattern is not found', async () => { + const data = get7xValidResponse('dummy metric filter value') + await testRule(data, Result.FAIL) + }) + test('Security Issue when cloudwatch sns suscription is not found', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_73_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].cloudwatchLog[0].cloudwatch[1].sns[0].subscriptions = + [] + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 7.4 CloudWatch log metric filter and alarm for changes to VPC network gateways should be configured', () => { + const testRule = async ( + data: NIST7xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_74 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there are metric filters and alarms for security group changes', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_74_Filter_Pattern) + await testRule(data, Result.PASS) + }) + test('Security Issue when isLogging is false', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_74_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].status.isLogging = false + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors readWriteType is not All', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_74_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].readWriteType = + 'dummy' + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors includeManagementEvents is not true', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_74_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].includeManagementEvents = + false + await testRule(data, Result.FAIL) + }) + test('Security Issue when metricFilters filterPattern is not found', async () => { + const data = get7xValidResponse('dummy metric filter value') + await testRule(data, Result.FAIL) + }) + test('Security Issue when cloudwatch sns suscription is not found', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_74_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].cloudwatchLog[0].cloudwatch[1].sns[0].subscriptions = + [] + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 7.5 CloudWatch log metric filter and alarm for CloudTrail configuration changes should be configured', () => { + const testRule = async ( + data: NIST7xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_75 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there are metric filters and alarms for security group changes', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_75_Filter_Pattern) + await testRule(data, Result.PASS) + }) + + test('Security Issue when isLogging is false', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_75_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].status.isLogging = false + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors readWriteType is not All', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_75_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].readWriteType = + 'dummy' + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors includeManagementEvents is not true', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_75_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].includeManagementEvents = + false + await testRule(data, Result.FAIL) + }) + test('Security Issue when metricFilters filterPattern just contains one condition', async () => { + const data = get7xValidResponse('{ ($.eventName = CreateTrail) }') + await testRule(data, Result.FAIL) + }) + test('Security Issue when cloudwatch sns suscription is not found', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_75_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].cloudwatchLog[0].cloudwatch[1].sns[0].subscriptions = + [] + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 7.7 CloudWatch log metric filter and alarm for IAM policy changes should be configured', () => { + const testRule = async ( + data: NIST7xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_77 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there are metric filters and alarms for security group changes', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_77_Filter_Pattern) + await testRule(data, Result.PASS) + }) + + test('Security Issue when isLogging is false', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_77_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].status.isLogging = false + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors readWriteType is not All', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_77_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].readWriteType = + 'dummy' + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors includeManagementEvents is not true', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_77_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].includeManagementEvents = + false + await testRule(data, Result.FAIL) + }) + test('Security Issue when metricFilters filterPattern just contains one condition', async () => { + const data = get7xValidResponse('{ ($.eventName = DeleteGroupPolicy) }') + await testRule(data, Result.FAIL) + }) + test('Security Issue when cloudwatch sns suscription is not found', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_77_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].cloudwatchLog[0].cloudwatch[1].sns[0].subscriptions = + [] + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 7.8 CloudWatch log metric filter and alarm for Management Console authentication failures should be configured', () => { + const testRule = async ( + data: NIST7xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_78 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there are metric filters and alarms for security group changes', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_78_Filter_Pattern) + await testRule(data, Result.PASS) + }) + test('Security Issue when isLogging is false', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_78_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].status.isLogging = false + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors readWriteType is not All', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_78_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].readWriteType = + 'dummy' + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors includeManagementEvents is not true', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_78_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].includeManagementEvents = + false + await testRule(data, Result.FAIL) + }) + test('Security Issue when metricFilters filterPattern is not found', async () => { + const data = get7xValidResponse('dummy metric filter value') + await testRule(data, Result.FAIL) + }) + test('Security Issue when cloudwatch sns suscription is not found', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_78_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].cloudwatchLog[0].cloudwatch[1].sns[0].subscriptions = + [] + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 7.9 CloudWatch log metric filter and alarm for Management Console sign-in without MFA should be configured', () => { + const testRule = async ( + data: NIST7xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_79 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there are metric filters and alarms for security group changes', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_79_Filter_Pattern) + await testRule(data, Result.PASS) + }) + + test('Security Issue when isLogging is false', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_79_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].status.isLogging = false + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors readWriteType is not All', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_79_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].readWriteType = + 'dummy' + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors includeManagementEvents is not true', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_79_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].includeManagementEvents = + false + await testRule(data, Result.FAIL) + }) + test('Security Issue when metricFilters filterPattern just contains one error code', async () => { + const data = get7xValidResponse('{ ($.errorCode = "ConsoleLogin") }') + await testRule(data, Result.FAIL) + }) + test('Security Issue when cloudwatch sns suscription is not found', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_79_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].cloudwatchLog[0].cloudwatch[1].sns[0].subscriptions = + [] + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 7.10 CloudWatch log metric filter and alarm for unauthorized API calls should be configured', () => { + const testRule = async ( + data: NIST7xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_710 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there are metric filters and alarms for security group changes', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_710_Filter_Pattern) + await testRule(data, Result.PASS) + }) + + test('Security Issue when isLogging is false', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_710_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].status.isLogging = false + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors readWriteType is not All', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_710_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].readWriteType = + 'dummy' + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors includeManagementEvents is not true', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_710_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].includeManagementEvents = + false + await testRule(data, Result.FAIL) + }) + test('Security Issue when metricFilters filterPattern just contains one error code', async () => { + const data = get7xValidResponse( + '{ ($.errorCode = "UnauthorizedOperation") }' + ) + await testRule(data, Result.FAIL) + }) + test('Security Issue when cloudwatch sns suscription is not found', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_710_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].cloudwatchLog[0].cloudwatch[1].sns[0].subscriptions = + [] + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 7.11 CloudWatch log metric filter and alarm for usage of root account should be configured', () => { + const testRule = async ( + data: NIST7xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_711 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there are metric filters and alarms for security group changes', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_711_Filter_Pattern) + await testRule(data, Result.PASS) + }) + + test('Security Issue when isLogging is false', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_711_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].status.isLogging = false + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors readWriteType is not All', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_711_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].readWriteType = + 'dummy' + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors includeManagementEvents is not true', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_711_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].includeManagementEvents = + false + await testRule(data, Result.FAIL) + }) + test('Security Issue when metricFilters filterPattern just contains one condition', async () => { + const data = get7xValidResponse( + '{ $.userIdentity.type = "Root" || $.userIdentity.invokedBy NOT EXISTS }' + ) + await testRule(data, Result.FAIL) + }) + test('Security Issue when cloudwatch sns suscription is not found', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_711_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].cloudwatchLog[0].cloudwatch[1].sns[0].subscriptions = + [] + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 7.12 CloudWatch log metric filter and alarm for VPC changes should be configured', () => { + const testRule = async ( + data: NIST7xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_712 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there are metric filters and alarms for security group changes', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_712_Filter_Pattern) + await testRule(data, Result.PASS) + }) + test('Security Issue when isLogging is false', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_712_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].status.isLogging = false + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors readWriteType is not All', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_712_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].readWriteType = + 'dummy' + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors includeManagementEvents is not true', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_712_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].includeManagementEvents = + false + await testRule(data, Result.FAIL) + }) + test('Security Issue when metricFilters filterPattern is not found', async () => { + const data = get7xValidResponse('dummy metric filter value') + await testRule(data, Result.FAIL) + }) + test('Security Issue when cloudwatch sns suscription is not found', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_712_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].cloudwatchLog[0].cloudwatch[1].sns[0].subscriptions = + [] + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS CIS 7.13 Ensure a log metric filter and alarm exist for route table changes (Scored)', () => { + const testRule = async ( + data: NIST7xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_713 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there are metric filters and alarms for security group changes', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_713_Filter_Pattern) + await testRule(data, Result.PASS) + }) + test('Security Issue when isLogging is false', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_713_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].status.isLogging = false + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors readWriteType is not All', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_713_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].readWriteType = + 'dummy' + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors includeManagementEvents is not true', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_713_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].includeManagementEvents = + false + await testRule(data, Result.FAIL) + }) + test('Security Issue when metricFilters filterPattern is not found', async () => { + const data = get7xValidResponse('dummy metric filter value') + await testRule(data, Result.FAIL) + }) + test('Security Issue when cloudwatch sns suscription is not found', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_713_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].cloudwatchLog[0].cloudwatch[1].sns[0].subscriptions = + [] + await testRule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 7.14 CloudWatch log metric filter and alarm for VPC security group changes should be configured', () => { + const testRule = async ( + data: NIST7xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_714 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there are metric filters and alarms for security group changes', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_714_Filter_Pattern) + await testRule(data, Result.PASS) + }) + test('Security Issue when isLogging is false', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_714_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].status.isLogging = false + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors readWriteType is not All', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_714_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].readWriteType = + 'dummy' + await testRule(data, Result.FAIL) + }) + test('Security Issue when eventSelectors includeManagementEvents is not true', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_714_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].eventSelectors[0].includeManagementEvents = + false + await testRule(data, Result.FAIL) + }) + test('Security Issue when metricFilters filterPattern is not found', async () => { + const data = get7xValidResponse('dummy metric filter value') + await testRule(data, Result.FAIL) + }) + test('Security Issue when cloudwatch sns suscription is not found', async () => { + const data = get7xValidResponse(Aws_NIST_800_53_714_Filter_Pattern) + data.queryawsAccount[0].cloudtrail[0].cloudwatchLog[0].cloudwatch[1].sns[0].subscriptions = + [] + await testRule(data, Result.FAIL) + }) + }) +}) diff --git a/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-8.x.test.ts b/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-8.x.test.ts new file mode 100644 index 00000000..39ca41e5 --- /dev/null +++ b/src/aws/nist-800-53-rev4/tests/nist-800-53-rev4-8.x.test.ts @@ -0,0 +1,1279 @@ +import CloudGraph, { Rule, Result, Engine } from '@cloudgraph/sdk' +import cuid from 'cuid' + +import Aws_NIST_800_53_81 from '../rules/aws-nist-800-53-rev4-8.1' +import Aws_NIST_800_53_82 from '../rules/aws-nist-800-53-rev4-8.2' +import Aws_NIST_800_53_83 from '../rules/aws-nist-800-53-rev4-8.3' +import Aws_NIST_800_53_84 from '../rules/aws-nist-800-53-rev4-8.4' +import Aws_NIST_800_53_85 from '../rules/aws-nist-800-53-rev4-8.5' +import Aws_NIST_800_53_86 from '../rules/aws-nist-800-53-rev4-8.6' +import Aws_NIST_800_53_87 from '../rules/aws-nist-800-53-rev4-8.7' +import Aws_NIST_800_53_88 from '../rules/aws-nist-800-53-rev4-8.8' +import Aws_NIST_800_53_89 from '../rules/aws-nist-800-53-rev4-8.9' +import Aws_NIST_800_53_810 from '../rules/aws-nist-800-53-rev4-8.10' +import Aws_NIST_800_53_811 from '../rules/aws-nist-800-53-rev4-8.11' +import Aws_NIST_800_53_812 from '../rules/aws-nist-800-53-rev4-8.12' +import Aws_NIST_800_53_813 from '../rules/aws-nist-800-53-rev4-8.13' +import Aws_NIST_800_53_814 from '../rules/aws-nist-800-53-rev4-8.14' +import Aws_NIST_800_53_815 from '../rules/aws-nist-800-53-rev4-8.15' +import Aws_NIST_800_53_816 from '../rules/aws-nist-800-53-rev4-8.16' +import Aws_NIST_800_53_817 from '../rules/aws-nist-800-53-rev4-8.17' +import Aws_NIST_800_53_818 from '../rules/aws-nist-800-53-rev4-8.18' +import Aws_NIST_800_53_819 from '../rules/aws-nist-800-53-rev4-8.19' +import Aws_NIST_800_53_820 from '../rules/aws-nist-800-53-rev4-8.20' +import Aws_NIST_800_53_821 from '../rules/aws-nist-800-53-rev4-8.21' +import Aws_NIST_800_53_822 from '../rules/aws-nist-800-53-rev4-8.22' +import Aws_NIST_800_53_823 from '../rules/aws-nist-800-53-rev4-8.23' +import Aws_NIST_800_53_824 from '../rules/aws-nist-800-53-rev4-8.24' +import Aws_NIST_800_53_825 from '../rules/aws-nist-800-53-rev4-8.25' +import Aws_NIST_800_53_826 from '../rules/aws-nist-800-53-rev4-8.26' +import Aws_NIST_800_53_827 from '../rules/aws-nist-800-53-rev4-8.27' +import Aws_NIST_800_53_828 from '../rules/aws-nist-800-53-rev4-8.28' +import Aws_NIST_800_53_829 from '../rules/aws-nist-800-53-rev4-8.29' +import Aws_NIST_800_53_830 from '../rules/aws-nist-800-53-rev4-8.30' +import Aws_NIST_800_53_831 from '../rules/aws-nist-800-53-rev4-8.31' +import Aws_NIST_800_53_832 from '../rules/aws-nist-800-53-rev4-8.32' +import Aws_NIST_800_53_833 from '../rules/aws-nist-800-53-rev4-8.33' +import Aws_NIST_800_53_834 from '../rules/aws-nist-800-53-rev4-8.34' +import Aws_NIST_800_53_835 from '../rules/aws-nist-800-53-rev4-8.35' +import Aws_NIST_800_53_836 from '../rules/aws-nist-800-53-rev4-8.36' +import Aws_NIST_800_53_837 from '../rules/aws-nist-800-53-rev4-8.37' +import Aws_NIST_800_53_838 from '../rules/aws-nist-800-53-rev4-8.38' +import Aws_NIST_800_53_839 from '../rules/aws-nist-800-53-rev4-8.39' +import Aws_NIST_800_53_840 from '../rules/aws-nist-800-53-rev4-8.40' +import Aws_NIST_800_53_841 from '../rules/aws-nist-800-53-rev4-8.41' +import Aws_NIST_800_53_842 from '../rules/aws-nist-800-53-rev4-8.42' +import Aws_NIST_800_53_843 from '../rules/aws-nist-800-53-rev4-8.43' +import Aws_NIST_800_53_844 from '../rules/aws-nist-800-53-rev4-8.44' +import Aws_NIST_800_53_845 from '../rules/aws-nist-800-53-rev4-8.45' + +const ipV4WildcardAddress = '0.0.0.0/0' +const ipV6WildcardAddress = '::/0' + +export interface InboundRule { + source?: string + toPort?: number | null + fromPort?: number | null + protocol?: string +} + +export interface OutboundRule { + destination?: string + toPort?: number | null + fromPort?: number | null + protocol?: string +} + +export interface QueryawsSecurityGroup { + id: string + inboundRules?: InboundRule[] + outboundRules?: OutboundRule[] +} +export interface QueryawsElb { + id: string + securityGroups: QueryawsSecurityGroup[] +} + +export interface QueryawsEc2 { + id: string + securityGroups: QueryawsSecurityGroup[] +} + +export interface QueryawsRdsDbInstance { + id: string + securityGroups: QueryawsSecurityGroup[] +} + +export interface QueryawsNetworkAcl { + id: string + inboundRules?: InboundRule[] + outboundRules?: OutboundRule[] +} +export interface NIS8xQueryResponse { + queryawsSecurityGroup?: QueryawsSecurityGroup[] + queryawsElb?: QueryawsElb[] + queryawsEc2?: QueryawsEc2[] + queryawsRdsDbInstance?: QueryawsRdsDbInstance[] + queryawsNetworkAcl?: QueryawsNetworkAcl[] +} + +describe('AWS NIST 800-53: Rev. 4', () => { + let rulesEngine: Engine + beforeAll(() => { + rulesEngine = new CloudGraph.RulesEngine({ + providerName: 'aws', + entityName: 'NIST', + }) + }) + + const testRule = async ( + fromPort: number | null , + toPort: number | null, + sourceAddress: string, + rule: Rule, + expectedResult: Result, + includeRandomValidData = false + ): Promise => { + // Arrange + const validInboundRule = { + toPort: 123, + fromPort: 456, + source: '10.10.10.10/16', + } + + const data: NIS8xQueryResponse = { + queryawsSecurityGroup: [ + { + id: cuid(), + inboundRules: [ + { + toPort, + fromPort, + source: sourceAddress, + }, + ], + }, + ], + } + + if (includeRandomValidData) { + data.queryawsSecurityGroup?.[0].inboundRules?.push(validInboundRule) + data.queryawsSecurityGroup?.push({ + id: cuid(), + inboundRules: [validInboundRule, validInboundRule], + }) + } + + // Act + const [processedRule] = await rulesEngine.processRule(rule, { ...data }) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + const testSecurityGroupRule = ( + rule: Rule, + fromPort: number, + toPort: number + ): void => { + test(`No Security Issue when there is an inbound rule with a random IPv4 address and port ${fromPort}`, async () => { + await testRule(fromPort, toPort, '10.10.10.10/16', rule, Result.PASS) + }) + + test('No Security Issue when there is an inbound rule with IPv4 wildcard address and port 80', async () => { + await testRule(80, 80, ipV4WildcardAddress, rule, Result.PASS) + }) + + test('No Security Issue when there is an inbound rule with IPv6 wildcard address and port 80', async () => { + await testRule(80, 80, ipV6WildcardAddress, rule, Result.PASS) + }) + + test(`No Security Issue when there is an inbound rule with a random IPv4 and a port range not including the port ${fromPort}`, async () => { + await testRule( + fromPort + 100, + fromPort + 200, + '10.10.10.10/16', + rule, + Result.PASS + ) + }) + + test(`No Security Issue when there is an inbound rule with IPv4 wildcard address and a port range not including the port ${fromPort}`, async () => { + await testRule( + fromPort + 100, + fromPort + 200, + ipV4WildcardAddress, + rule, + Result.PASS + ) + }) + + test(`No Security Issue when there is an inbound rule with IPv6 wildcard address and a port range not including the port ${fromPort}`, async () => { + await testRule( + fromPort + 100, + fromPort + 200, + ipV6WildcardAddress, + rule, + Result.PASS + ) + }) + + test(`No Security Issue when there is an inbound rule with IPv6 wildcard address and a port range not including the port ${fromPort} (multiple values)`, async () => { + await testRule( + fromPort + 100, + fromPort + 200, + ipV6WildcardAddress, + rule, + Result.PASS, + true + ) + }) + + test(`Security Issue when IPv4 wildcard address and port ${fromPort}`, async () => { + await testRule(fromPort, toPort, ipV4WildcardAddress, rule, Result.FAIL) + }) + + test(`Security Issue when IPv6 wildcard address and port ${fromPort}`, async () => { + await testRule(fromPort, toPort, ipV6WildcardAddress, rule, Result.FAIL) + }) + + test(`Security Issue when IPv4 wildcard address and port ${fromPort} (multiple values)`, async () => { + await testRule( + fromPort, + toPort, + ipV4WildcardAddress, + rule, + Result.FAIL, + true + ) + }) + + test('Security Issue when there is an inbound rule with IPv4 wildcard address and no port range is specified', async () => { + await testRule( + null, + null, + ipV4WildcardAddress, + rule, + Result.FAIL + ) + }) + + test('Security Issue when there is an inbound rule with IPv6 wildcard address and no port range is specified', async () => { + await testRule( + null, + null, + ipV6WildcardAddress, + rule, + Result.FAIL + ) + }) + + test(`Security Issue when there is an inbound rule with IPv4 wildcard address and port range includes the port ${fromPort}`, async () => { + await testRule(0, fromPort + 100, ipV4WildcardAddress, rule, Result.FAIL) + }) + + test(`Security Issue when there is an inbound rule with IPv6 wildcard address and port range includes the port ${fromPort}`, async () => { + await testRule(0, fromPort + 100, ipV6WildcardAddress, rule, Result.FAIL) + }) + } + + describe('AWS NIST 8.1 ELB listener security groups should not be set to TCP all', () => { + const test81Rule = async ( + inboundRules?: InboundRule[], + outboundRules?: OutboundRule[], + expectedResult?: Result, + includeRandomValidData = false + ): Promise => { + // Arrange + const validInboundRule = { + toPort: 123, + fromPort: 456, + source: '10.10.10.10/16', + } + + const data: NIS8xQueryResponse = { + queryawsElb: [ + { + id: cuid(), + securityGroups: [ + { + id: cuid(), + inboundRules, + outboundRules, + }, + ], + } + ], + } + + if (includeRandomValidData) { + data.queryawsElb?.[0].securityGroups?.[0].inboundRules?.push(validInboundRule) + data.queryawsElb?.[0].securityGroups?.push({ + id: cuid(), + inboundRules: [validInboundRule, validInboundRule], + }) + } + + // Act + const [processedRule] = await rulesEngine.processRule(Aws_NIST_800_53_81 as Rule, { ...data }) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there are an inbound and outbound rule that not allows all ports range', async () => { + const inboundRules: InboundRule[] = [ { fromPort: 0, toPort: 1000 } as InboundRule] + const outboundRules: OutboundRule[] = [ { fromPort: 2000, toPort: 3000 } as OutboundRule] + await test81Rule(inboundRules, outboundRules, Result.PASS) + }) + + test('Security Issue when there are an inbound and outbound rule that allows all ports range', async () => { + const inboundRules: InboundRule[] = [ { fromPort: null, toPort: null } as InboundRule] + const outboundRules: OutboundRule[] = [ { fromPort: 0, toPort: 65535 } as OutboundRule] + await test81Rule(inboundRules, outboundRules, Result.FAIL) + }) + + test('Security Issue when there is an inbound rule that allows all ports range', async () => { + const inboundRules: InboundRule[] = [ { fromPort: 0, toPort: 65535 } as InboundRule] + const outboundRules: OutboundRule[] = [ { fromPort: 2000, toPort: 3000 } as OutboundRule] + await test81Rule(inboundRules, outboundRules, Result.FAIL) + }) + + test('Security Issue when there is an outbound rule that allows all ports range', async () => { + const inboundRules: InboundRule[] = [ { fromPort: 2000, toPort: 3000 } as InboundRule] + const outboundRules: OutboundRule[] = [ { fromPort: 0, toPort: 65535 } as OutboundRule] + await test81Rule(inboundRules, outboundRules, Result.FAIL) + }) + }) + + describe('AWS NIST 8.2 VPC default security group should restrict all traffic', () => { + const getTestRuleFixture = ( + source: string, + destination: string + ): NIS8xQueryResponse => { + return { + queryawsSecurityGroup: [ + { + id: cuid(), + inboundRules: [ + { + source, + }, + ], + outboundRules: [ + { + destination, + }, + ], + }, + ], + } + } + + // Act + const test82Rule = async ( + data: NIS8xQueryResponse, + expectedResult: Result + ): Promise => { + // Act + const [processedRule] = await rulesEngine.processRule( + Aws_NIST_800_53_82 as Rule, + { ...data } + ) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there is not an inbound/outbound rules with the wildcard addresses', async () => { + const data: NIS8xQueryResponse = getTestRuleFixture( + '10.10.10.10/16', + '2001:db8:3333:4444:5555:6666:7777:8888' + ) + await test82Rule(data, Result.PASS) + }) + + test('Security Issue when there is an inbound rule with a IPv4 wildcard address', async () => { + const data: NIS8xQueryResponse = getTestRuleFixture( + ipV4WildcardAddress, + '' + ) + await test82Rule(data, Result.FAIL) + }) + test('Security Issue when there is an inbound rule with a IPv6 wildcard address', async () => { + const data: NIS8xQueryResponse = getTestRuleFixture( + ipV6WildcardAddress, + '' + ) + await test82Rule(data, Result.FAIL) + }) + test('Security Issue when there is an outbound rule with a IPv4 wildcard address', async () => { + const data: NIS8xQueryResponse = getTestRuleFixture( + '', + ipV4WildcardAddress + ) + await test82Rule(data, Result.FAIL) + }) + test('Security Issue when there is an outbound rule with a IPv6 wildcard address', async () => { + const data: NIS8xQueryResponse = getTestRuleFixture( + '', + ipV6WildcardAddress + ) + await test82Rule(data, Result.FAIL) + }) + test('Security Issue when there is an inbound and an outbound rule with a IPv4 wildcard address', async () => { + const data: NIS8xQueryResponse = getTestRuleFixture( + ipV4WildcardAddress, + ipV4WildcardAddress + ) + await test82Rule(data, Result.FAIL) + }) + test('Security Issue when there is an inbound and an outbound rule with a IPv6 wildcard address', async () => { + const data: NIS8xQueryResponse = getTestRuleFixture( + ipV6WildcardAddress, + ipV6WildcardAddress + ) + await test82Rule(data, Result.FAIL) + }) + }) + + describe('AWS NIST 8.3 VPC network ACLs should not allow ingress from 0.0.0.0/0 to TCP/UDP port 22', () => { + const test83Rule = async ( + fromPort: number | undefined, + toPort: number | undefined, + sourceAddress: string, + expectedResult: Result, + includeRandomValidData = false + ): Promise => { + // Arrange + const validInboundRule = { + toPort: 123, + fromPort: 456, + source: '10.10.10.10/16', + } + + const data: NIS8xQueryResponse = { + queryawsNetworkAcl: [ + { + id: cuid(), + inboundRules: [ + { + toPort, + fromPort, + source: sourceAddress, + }, + ], + }, + ], + } + + if (includeRandomValidData) { + data.queryawsNetworkAcl?.[0].inboundRules?.push(validInboundRule) + data.queryawsNetworkAcl?.push({ + id: cuid(), + inboundRules: [validInboundRule, validInboundRule], + }) + } + + // Act + const [processedRule] = await rulesEngine.processRule(Aws_NIST_800_53_83 as Rule, { ...data }) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + const fromPort = 22 + const toPort = 22 + + test(`No Security Issue when there is an inbound rule with a random IPv4 address and port ${fromPort}`, async () => { + await test83Rule(fromPort, toPort, '10.10.10.10/16', Result.PASS) + }) + + test('No Security Issue when there is an inbound rule with IPv4 wildcard address and port 80', async () => { + await test83Rule(80, 80, ipV4WildcardAddress, Result.PASS) + }) + + test('No Security Issue when there is an inbound rule with IPv6 wildcard address and port 80', async () => { + await test83Rule(80, 80, ipV6WildcardAddress, Result.PASS) + }) + + test(`No Security Issue when there is an inbound rule with a random IPv4 and a port range not including the port ${fromPort}`, async () => { + await test83Rule( + fromPort + 100, + fromPort + 200, + '10.10.10.10/16', + Result.PASS + ) + }) + + test(`No Security Issue when there is an inbound rule with IPv4 wildcard address and a port range not including the port ${fromPort}`, async () => { + await test83Rule( + fromPort + 100, + fromPort + 200, + ipV4WildcardAddress, + Result.PASS + ) + }) + + test(`No Security Issue when there is an inbound rule with IPv6 wildcard address and a port range not including the port ${fromPort}`, async () => { + await test83Rule( + fromPort + 100, + fromPort + 200, + ipV6WildcardAddress, + Result.PASS + ) + }) + + test(`No Security Issue when there is an inbound rule with IPv6 wildcard address and a port range not including the port ${fromPort} (multiple values)`, async () => { + await test83Rule( + fromPort + 100, + fromPort + 200, + ipV6WildcardAddress, + Result.PASS, + true + ) + }) + + test(`Security Issue when IPv4 wildcard address and port ${fromPort}`, async () => { + await test83Rule(fromPort, toPort, ipV4WildcardAddress, Result.FAIL) + }) + + test(`Security Issue when IPv6 wildcard address and port ${fromPort}`, async () => { + await test83Rule(fromPort, toPort, ipV6WildcardAddress, Result.FAIL) + }) + + test(`Security Issue when IPv4 wildcard address and port ${fromPort} (multiple values)`, async () => { + await test83Rule( + fromPort, + toPort, + ipV4WildcardAddress, + Result.FAIL, + true + ) + }) + + test('Security Issue when there is an inbound rule with IPv4 wildcard address and no port range is specified', async () => { + await test83Rule( + undefined, + undefined, + ipV4WildcardAddress, + Result.FAIL + ) + }) + + test('Security Issue when there is an inbound rule with IPv6 wildcard address and no port range is specified', async () => { + await test83Rule( + undefined, + undefined, + ipV6WildcardAddress, + Result.FAIL + ) + }) + + test(`Security Issue when there is an inbound rule with IPv4 wildcard address and port range includes the port ${fromPort}`, async () => { + await test83Rule(0, fromPort + 100, ipV4WildcardAddress, Result.FAIL) + }) + + test(`Security Issue when there is an inbound rule with IPv6 wildcard address and port range includes the port ${fromPort}`, async () => { + await test83Rule(0, fromPort + 100, ipV6WildcardAddress, Result.FAIL) + }) + }) + + describe('AWS NIST 8.4 VPC network ACLs should not allow ingress from 0.0.0.0/0 to TCP/UDP port 3389', () => { + const test84Rule = async ( + fromPort: number | undefined, + toPort: number | undefined, + sourceAddress: string, + expectedResult: Result, + includeRandomValidData = false + ): Promise => { + // Arrange + const validInboundRule = { + toPort: 123, + fromPort: 456, + source: '10.10.10.10/16', + } + + const data: NIS8xQueryResponse = { + queryawsNetworkAcl: [ + { + id: cuid(), + inboundRules: [ + { + toPort, + fromPort, + source: sourceAddress, + }, + ], + }, + ], + } + + if (includeRandomValidData) { + data.queryawsNetworkAcl?.[0].inboundRules?.push(validInboundRule) + data.queryawsNetworkAcl?.push({ + id: cuid(), + inboundRules: [validInboundRule, validInboundRule], + }) + } + + // Act + const [processedRule] = await rulesEngine.processRule(Aws_NIST_800_53_84 as Rule, { ...data }) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + const fromPort = 3389 + const toPort = 3389 + + test(`No Security Issue when there is an inbound rule with a random IPv4 address and port ${fromPort}`, async () => { + await test84Rule(fromPort, toPort, '10.10.10.10/16', Result.PASS) + }) + + test('No Security Issue when there is an inbound rule with IPv4 wildcard address and port 80', async () => { + await test84Rule(80, 80, ipV4WildcardAddress, Result.PASS) + }) + + test('No Security Issue when there is an inbound rule with IPv6 wildcard address and port 80', async () => { + await test84Rule(80, 80, ipV6WildcardAddress, Result.PASS) + }) + + test(`No Security Issue when there is an inbound rule with a random IPv4 and a port range not including the port ${fromPort}`, async () => { + await test84Rule( + fromPort + 100, + fromPort + 200, + '10.10.10.10/16', + Result.PASS + ) + }) + + test(`No Security Issue when there is an inbound rule with IPv4 wildcard address and a port range not including the port ${fromPort}`, async () => { + await test84Rule( + fromPort + 100, + fromPort + 200, + ipV4WildcardAddress, + Result.PASS + ) + }) + + test(`No Security Issue when there is an inbound rule with IPv6 wildcard address and a port range not including the port ${fromPort}`, async () => { + await test84Rule( + fromPort + 100, + fromPort + 200, + ipV6WildcardAddress, + Result.PASS + ) + }) + + test(`No Security Issue when there is an inbound rule with IPv6 wildcard address and a port range not including the port ${fromPort} (multiple values)`, async () => { + await test84Rule( + fromPort + 100, + fromPort + 200, + ipV6WildcardAddress, + Result.PASS, + true + ) + }) + + test(`Security Issue when IPv4 wildcard address and port ${fromPort}`, async () => { + await test84Rule(fromPort, toPort, ipV4WildcardAddress, Result.FAIL) + }) + + test(`Security Issue when IPv6 wildcard address and port ${fromPort}`, async () => { + await test84Rule(fromPort, toPort, ipV6WildcardAddress, Result.FAIL) + }) + + test(`Security Issue when IPv4 wildcard address and port ${fromPort} (multiple values)`, async () => { + await test84Rule( + fromPort, + toPort, + ipV4WildcardAddress, + Result.FAIL, + true + ) + }) + + test('Security Issue when there is an inbound rule with IPv4 wildcard address and no port range is specified', async () => { + await test84Rule( + undefined, + undefined, + ipV4WildcardAddress, + Result.FAIL + ) + }) + + test('Security Issue when there is an inbound rule with IPv6 wildcard address and no port range is specified', async () => { + await test84Rule( + undefined, + undefined, + ipV6WildcardAddress, + Result.FAIL + ) + }) + + test(`Security Issue when there is an inbound rule with IPv4 wildcard address and port range includes the port ${fromPort}`, async () => { + await test84Rule(0, fromPort + 100, ipV4WildcardAddress, Result.FAIL) + }) + + test(`Security Issue when there is an inbound rule with IPv6 wildcard address and port range includes the port ${fromPort}`, async () => { + await test84Rule(0, fromPort + 100, ipV6WildcardAddress, Result.FAIL) + }) + }) + + describe('AWS NIST 8.5 VPC security group inbound rules should not permit ingress from ‘0.0.0.0/0’ to all ports and protocols', () => { + const rule = Aws_NIST_800_53_85 as Rule + + test('No Security Issue when there is an inbound rule with a random IPv4 address and all ports range', async () => { + await testRule(0, 65535, '10.10.10.10/16', rule, Result.PASS) + }) + + test('No Security Issue when there is an inbound rule with IPv4 wildcard address and a port range not allow all ports', async () => { + await testRule(1000, 2000, ipV4WildcardAddress, rule, Result.PASS) + }) + + test('No Security Issue when there is an inbound rule with IPv6 wildcard address and a port range not allow all ports', async () => { + await testRule(1000, 2000, ipV6WildcardAddress, rule, Result.PASS) + }) + + test('Security Issue when IPv4 wildcard address and allow all ports', async () => { + await testRule(0, 65535, ipV4WildcardAddress, rule, Result.FAIL) + }) + + test('Security Issue when IPv6 wildcard address and allow all ports', async () => { + await testRule(0, 65535, ipV6WildcardAddress, rule, Result.FAIL) + }) + + test('Security Issue when IPv4 wildcard address and allow all ports (multiple values)', async () => { + await testRule(0, 65535, ipV4WildcardAddress, rule, Result.FAIL, true) + }) + + test('Security Issue when there is an inbound rule with IPv4 wildcard address and no port range is specified', async () => { + await testRule( + null, + null, + ipV4WildcardAddress, + rule, + Result.FAIL + ) + }) + + test('Security Issue when there is an inbound rule with IPv6 wildcard address and no port range is specified', async () => { + await testRule( + null, + null, + ipV6WildcardAddress, + rule, + Result.FAIL + ) + }) + + test('Security Issue when there is an inbound rule with IPv4 wildcard address and port range allow all ports', async () => { + await testRule(0, 65535, ipV4WildcardAddress, rule, Result.FAIL) + }) + + test('Security Issue when there is an inbound rule with IPv6 wildcard address and port range allow all ports', async () => { + await testRule(0, 65535, ipV6WildcardAddress, rule, Result.FAIL) + }) + }) + + describe('AWS NIST 8.6 VPC security group inbound rules should not permit ingress from a public address to all ports and protocols', () => { + const rule = Aws_NIST_800_53_86 as Rule + + test('No Security Issue when there is an inbound rule with a random IPv4 CIDR block and not allows all ports range', async () => { + await testRule(1000, 2000, '10.10.10.10/16', rule, Result.PASS) + }) + + test('No Security Issue when there is an inbound rule that allows all ports range with a private CIDR block', async () => { + await testRule(0, 65535, '10.0.0.0/8', rule, Result.PASS) + }) + + test('Security Issue when there is an inbound rule with a random IPv4 CIDR block and allows all ports range', async () => { + await testRule(0, 65535, '10.10.10.10/16', rule, Result.FAIL) + }) + }) + + describe('AWS NIST 8.6 VPC security group inbound rules should not permit ingress from a public address to all ports and protocols', () => { + const rule = Aws_NIST_800_53_86 as Rule + + test('No Security Issue when there is an inbound rule with a random IPv4 CIDR block and not allows all ports range', async () => { + await testRule(1000, 2000, '10.10.10.10/16', rule, Result.PASS) + }) + + test('No Security Issue when there is an inbound rule that allows all ports range with a private CIDR block', async () => { + await testRule(0, 65535, '10.0.0.0/8', rule, Result.PASS) + }) + + test('Security Issue when there is an inbound rule with a random IPv4 CIDR block and allows all ports range', async () => { + await testRule(0, 65535, '10.10.10.10/16', rule, Result.FAIL) + }) + }) + + describe('AWS NIST 8.7 VPC security group inbound rules should not permit ingress from any address to all ports and protocols', () => { + const rule = Aws_NIST_800_53_87 as Rule + + test('No Security Issue when there is an inbound rule with IPv4 wildcard address and not allows all ports range', async () => { + await testRule(1000, 2000, ipV4WildcardAddress, rule, Result.PASS) + }) + + test('No Security Issue when there is an inbound rule with IPv6 wildcard address and not allows all ports range', async () => { + await testRule(3000, 4000, ipV6WildcardAddress, rule, Result.PASS) + }) + + test('No Security Issue when there is an inbound rule with a random IPv4 CIDR block and not allows all ports range', async () => { + await testRule(0, 100, '10.10.10.10/16', rule, Result.PASS) + }) + + test('Security Issue when there is an inbound rule with IPv4 wildcard address and allows all ports range', async () => { + await testRule(0, 65535, ipV4WildcardAddress, rule, Result.FAIL) + }) + + test('Security Issue when there is an inbound rule with IPv6 wildcard address and allows all ports range', async () => { + await testRule(0, 65535, ipV6WildcardAddress, rule, Result.FAIL) + }) + }) + + describe('AWS NIST 8.8 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ except to ports 80 and 443', () => { + const rule = Aws_NIST_800_53_88 as Rule + + test('No Security Issue when there is an inbound rule with IPv4 wildcard address and port 80', async () => { + await testRule(80, 80, ipV4WildcardAddress, rule, Result.PASS) + }) + + test('No Security Issue when there is an inbound rule with IPv6 wildcard address and port 80', async () => { + await testRule(80, 80, ipV6WildcardAddress, rule, Result.PASS) + }) + + test('No Security Issue when there is an inbound rule with IPv4 wildcard address and port 443', async () => { + await testRule(443, 443, ipV4WildcardAddress, rule, Result.PASS) + }) + + test('No Security Issue when there is an inbound rule with IPv6 wildcard address and port 443', async () => { + await testRule(443, 443, ipV6WildcardAddress, rule, Result.PASS) + }) + + test('Security Issue when there is an inbound rule with IPv4 wildcard address and port different to 80 and 443', async () => { + await testRule(132, 132, ipV4WildcardAddress, rule, Result.FAIL) + }) + + test('Security Issue when there is an inbound rule with IPv6 wildcard address and port different to 80 and 443', async () => { + await testRule(3389, 3389, ipV6WildcardAddress, rule, Result.FAIL) + }) + }) + + describe('AWS NIST 8.9 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to port 3389 (Remote Desktop Protocol)', () => { + testSecurityGroupRule(Aws_NIST_800_53_89 as Rule, 3389, 3389) + }) + + describe('AWS NIST 8.10 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 61621 (Cassandra OpsCenter Agent)', () => { + testSecurityGroupRule(Aws_NIST_800_53_810 as Rule, 61621, 61621) + }) + + describe('AWS NIST 8.11 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 636 (LDAP SSL)', () => { + testSecurityGroupRule(Aws_NIST_800_53_811 as Rule, 636, 636) + }) + + describe('AWS NIST 8.12 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 7001 (Cassandra)', () => { + testSecurityGroupRule(Aws_NIST_800_53_812 as Rule, 7001, 7001) + }) + + describe('AWS NIST 8.13 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 11214 (Memcached SSL)', () => { + testSecurityGroupRule(Aws_NIST_800_53_813 as Rule, 11214, 11214) + }) + + describe('AWS NIST 8.14 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 11215 (Memcached SSL)', () => { + testSecurityGroupRule(Aws_NIST_800_53_814 as Rule, 11215, 11215) + }) + + describe('AWS NIST 8.15 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 135 (MSSQL Debugger)', () => { + testSecurityGroupRule(Aws_NIST_800_53_815 as Rule, 135, 135) + }) + + describe('AWS NIST 8.16 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 137 (NetBIOS Name Service)', () => { + testSecurityGroupRule(Aws_NIST_800_53_816 as Rule, 137, 137) + }) + + describe('AWS NIST 8.17 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 138 (NetBios Datagram Service)', () => { + testSecurityGroupRule(Aws_NIST_800_53_817 as Rule, 138, 138) + }) + + describe('AWS NIST 8.18 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 139 (NetBios Session Service)', () => { + testSecurityGroupRule(Aws_NIST_800_53_818 as Rule, 139, 139) + }) + + describe('AWS NIST 8.19 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 1433 (MSSQL Server)', () => { + testSecurityGroupRule(Aws_NIST_800_53_819 as Rule, 1433, 1433) + }) + + describe('AWS NIST 8.20 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 1434 (MSSQL Admin)', () => { + testSecurityGroupRule(Aws_NIST_800_53_820 as Rule, 1434, 1434) + }) + + describe('AWS NIST 8.21 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to port 22 (SSH)', () => { + testSecurityGroupRule(Aws_NIST_800_53_821 as Rule, 22, 22) + }) + + describe('AWS NIST 8.22 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 23 (Telnet)', () => { + testSecurityGroupRule(Aws_NIST_800_53_822 as Rule, 23, 23) + }) + + describe('AWS NIST 8.23 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 2379 (etcd)', () => { + testSecurityGroupRule(Aws_NIST_800_53_823 as Rule, 2379, 2379) + }) + + describe('AWS NIST 8.24 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 2382 (SQL Server Analysis Services browser)', () => { + testSecurityGroupRule(Aws_NIST_800_53_824 as Rule, 2382, 2382) + }) + + describe('AWS NIST 8.25 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 2383 (SQL Server Analysis Services)', () => { + testSecurityGroupRule(Aws_NIST_800_53_825 as Rule, 2383, 2383) + }) + + describe('AWS NIST 8.26 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 2484 (Oracle DB SSL)', () => { + testSecurityGroupRule(Aws_NIST_800_53_826 as Rule, 2484, 2484) + }) + + describe('AWS NIST 8.27 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 27017 (MongoDB)', () => { + testSecurityGroupRule(Aws_NIST_800_53_827 as Rule, 27017, 27017) + }) + + describe('AWS NIST 8.28 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 27018 (MongoDB)', () => { + testSecurityGroupRule(Aws_NIST_800_53_828 as Rule, 27018, 27018) + }) + + describe('AWS NIST 8.29 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 27019 (MongoDB)', () => { + testSecurityGroupRule(Aws_NIST_800_53_829 as Rule, 27019, 27019) + }) + + describe('AWS NIST 8.30 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 3000 (Ruby on Rails web server)', () => { + testSecurityGroupRule(Aws_NIST_800_53_830 as Rule, 3000, 3000) + }) + + describe('AWS NIST 8.31 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 3020 (CIFS / SMB)', () => { + testSecurityGroupRule(Aws_NIST_800_53_831 as Rule, 3020, 3020) + }) + + describe('AWS NIST 8.32 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 3306 (MySQL)', () => { + testSecurityGroupRule(Aws_NIST_800_53_832 as Rule, 3306, 3306) + }) + + describe('AWS NIST 8.33 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 4505 (SaltStack Master)', () => { + testSecurityGroupRule(Aws_NIST_800_53_833 as Rule, 4505, 4505) + }) + + describe('AWS NIST 8.34 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 4506 (SaltStack Master)', () => { + testSecurityGroupRule(Aws_NIST_800_53_834 as Rule, 4506, 4506) + }) + + describe('AWS NIST 8.35 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 5432 (PostgreSQL)', () => { + testSecurityGroupRule(Aws_NIST_800_53_835 as Rule, 5432, 5432) + }) + + describe('AWS NIST 8.36 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 5500 (Virtual Network Computing)', () => { + testSecurityGroupRule(Aws_NIST_800_53_836 as Rule, 5500, 5500) + }) + + describe('AWS NIST 8.37 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 5800 (Virtual Network Computing), unless from ELBs', () => { + testSecurityGroupRule(Aws_NIST_800_53_837 as Rule, 5800, 5800) + }) + + describe('AWS NIST 8.38 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 5900 (Virtual Network Computing)', () => { + testSecurityGroupRule(Aws_NIST_800_53_838 as Rule, 5900, 5900) + }) + + describe('AWS NIST 8.39 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 80 (HTTP), unless from ELBs', () => { + const rule = Aws_NIST_800_53_839 as Rule + const fromPort = 80 + const toPort = 80 + + test(`No Security Issue when there is an inbound rule with a random IPv4 address and port ${fromPort}`, async () => { + await testRule(fromPort, toPort, '10.10.10.10/16', rule, Result.PASS) + }) + + test(`No Security Issue when there is an inbound rule with a random IPv4 and a port range not including the port ${fromPort}`, async () => { + await testRule( + fromPort + 100, + fromPort + 200, + '10.10.10.10/16', + rule, + Result.PASS + ) + }) + + test(`No Security Issue when there is an inbound rule with IPv4 wildcard address and a port range not including the port ${fromPort}`, async () => { + await testRule( + fromPort + 100, + fromPort + 200, + ipV4WildcardAddress, + rule, + Result.PASS + ) + }) + + test(`No Security Issue when there is an inbound rule with IPv6 wildcard address and a port range not including the port ${fromPort}`, async () => { + await testRule( + fromPort + 100, + fromPort + 200, + ipV6WildcardAddress, + rule, + Result.PASS + ) + }) + + test(`No Security Issue when there is an inbound rule with IPv6 wildcard address and a port range not including the port ${fromPort} (multiple values)`, async () => { + await testRule( + fromPort + 100, + fromPort + 200, + ipV6WildcardAddress, + rule, + Result.PASS, + true + ) + }) + + test(`Security Issue when IPv4 wildcard address and port ${fromPort}`, async () => { + await testRule(fromPort, toPort, ipV4WildcardAddress, rule, Result.FAIL) + }) + + test(`Security Issue when IPv6 wildcard address and port ${fromPort}`, async () => { + await testRule(fromPort, toPort, ipV6WildcardAddress, rule, Result.FAIL) + }) + + test(`Security Issue when IPv4 wildcard address and port ${fromPort} (multiple values)`, async () => { + await testRule( + fromPort, + toPort, + ipV4WildcardAddress, + rule, + Result.FAIL, + true + ) + }) + + test('Security Issue when there is an inbound rule with IPv4 wildcard address and no port range is specified', async () => { + await testRule( + null, + null, + ipV4WildcardAddress, + rule, + Result.FAIL + ) + }) + + test('Security Issue when there is an inbound rule with IPv6 wildcard address and no port range is specified', async () => { + await testRule( + null, + null, + ipV6WildcardAddress, + rule, + Result.FAIL + ) + }) + + test(`Security Issue when there is an inbound rule with IPv4 wildcard address and port range includes the port ${fromPort}`, async () => { + await testRule(0, fromPort + 100, ipV4WildcardAddress, rule, Result.FAIL) + }) + + test(`Security Issue when there is an inbound rule with IPv6 wildcard address and port range includes the port ${fromPort}`, async () => { + await testRule(0, fromPort + 100, ipV6WildcardAddress, rule, Result.FAIL) + }) + }) + + describe('AWS NIST 8.40 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP/UDP port 8000 (HTTP Alternate)', () => { + testSecurityGroupRule(Aws_NIST_800_53_840 as Rule, 8000, 8000) + }) + + describe('AWS NIST 8.41 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 9200 (Elasticsearch)', () => { + testSecurityGroupRule(Aws_NIST_800_53_841 as Rule, 9200, 9200) + }) + + describe('AWS NIST 8.42 VPC security group rules should not permit ingress from ‘0.0.0.0/0’ to TCP port 9300 (Elasticsearch)', () => { + testSecurityGroupRule(Aws_NIST_800_53_842 as Rule, 9300, 9300) + }) + + describe('AWS NIST 8.43 VPC security groups attached to EC2 instances should not permit ingress from ‘0.0.0.0/0’ to all ports', () => { + const test843Rule = async ( + fromPort: number | null, + toPort: number | null, + sourceAddress: string, + expectedResult: Result, + includeRandomValidData = false + ): Promise => { + // Arrange + const validInboundRule = { + toPort: 123, + fromPort: 456, + source: '10.10.10.10/16', + } + + const data: NIS8xQueryResponse = { + queryawsEc2: [ + { + id: cuid(), + securityGroups: [ + { + id: cuid(), + inboundRules: [ + { + fromPort, + toPort, + source: sourceAddress, + } + ] + }, + ], + } + ], + } + + if (includeRandomValidData) { + data.queryawsEc2?.[0].securityGroups?.[0].inboundRules?.push(validInboundRule) + data.queryawsEc2?.[0].securityGroups?.push({ + id: cuid(), + inboundRules: [validInboundRule, validInboundRule], + }) + } + + // Act + const [processedRule] = await rulesEngine.processRule(Aws_NIST_800_53_843 as Rule, { ...data }) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there is an inbound rule with a random IPv4 address and all ports range', async () => { + await test843Rule(0, 65535, '10.10.10.10/16', Result.PASS) + }) + + test('No Security Issue when there is an inbound rule with IPv4 wildcard address and a port range not allow all ports', async () => { + await test843Rule(1000, 2000, ipV4WildcardAddress, Result.PASS) + }) + + test('No Security Issue when there is an inbound rule with IPv6 wildcard address and a port range not allow all ports', async () => { + await test843Rule(1000, 2000, ipV6WildcardAddress, Result.PASS) + }) + + test('Security Issue when IPv4 wildcard address and allow all ports', async () => { + await test843Rule(0, 65535, ipV4WildcardAddress, Result.FAIL) + }) + + test('Security Issue when IPv6 wildcard address and allow all ports', async () => { + await test843Rule(0, 65535, ipV6WildcardAddress, Result.FAIL) + }) + + test('Security Issue when IPv4 wildcard address and allow all ports (multiple values)', async () => { + await test843Rule(0, 65535, ipV4WildcardAddress, Result.FAIL, true) + }) + + test('Security Issue when there is an inbound rule with IPv4 wildcard address and no port range is specified', async () => { + await test843Rule( + null, + null, + ipV4WildcardAddress, + Result.FAIL + ) + }) + + test('Security Issue when there is an inbound rule with IPv6 wildcard address and no port range is specified', async () => { + await test843Rule( + null, + null, + ipV6WildcardAddress, + Result.FAIL + ) + }) + + test('Security Issue when there is an inbound rule with IPv4 wildcard address and port range allow all ports', async () => { + await test843Rule(0, 65535, ipV4WildcardAddress, Result.FAIL) + }) + + test('Security Issue when there is an inbound rule with IPv6 wildcard address and port range allow all ports', async () => { + await test843Rule(0, 65535, ipV6WildcardAddress, Result.FAIL) + }) + }) + + describe('AWS NIST 8.44 VPC security groups attached to EC2 instances should not permit ingress from ‘0.0.0.0/0’ to TCP port 389 (LDAP)', () => { + testSecurityGroupRule(Aws_NIST_800_53_844 as Rule, 389, 389) + }) + + describe('AWS NIST 8.45 VPC security groups attached to RDS instances should not permit ingress from ‘0.0.0.0/0’ to all ports', () => { + const test845Rule = async ( + fromPort: number | null, + toPort: number | null, + sourceAddress: string, + expectedResult: Result, + includeRandomValidData = false + ): Promise => { + // Arrange + const validInboundRule = { + toPort: 123, + fromPort: 456, + source: '10.10.10.10/16', + } + + const data: NIS8xQueryResponse = { + queryawsRdsDbInstance: [ + { + id: cuid(), + securityGroups: [ + { + id: cuid(), + inboundRules: [ + { + fromPort, + toPort, + source: sourceAddress, + } + ] + }, + ], + } + ], + } + + if (includeRandomValidData) { + data.queryawsRdsDbInstance?.[0].securityGroups?.[0].inboundRules?.push(validInboundRule) + data.queryawsRdsDbInstance?.[0].securityGroups?.push({ + id: cuid(), + inboundRules: [validInboundRule, validInboundRule], + }) + } + + // Act + const [processedRule] = await rulesEngine.processRule(Aws_NIST_800_53_845 as Rule, { ...data }) + + // Asserts + expect(processedRule.result).toBe(expectedResult) + } + + test('No Security Issue when there is an inbound rule with a random IPv4 address and all ports range', async () => { + await test845Rule(0, 65535, '10.10.10.10/16', Result.PASS) + }) + + test('No Security Issue when there is an inbound rule with IPv4 wildcard address and a port range not allow all ports', async () => { + await test845Rule(1000, 2000, ipV4WildcardAddress, Result.PASS) + }) + + test('No Security Issue when there is an inbound rule with IPv6 wildcard address and a port range not allow all ports', async () => { + await test845Rule(1000, 2000, ipV6WildcardAddress, Result.PASS) + }) + + test('Security Issue when IPv4 wildcard address and allow all ports', async () => { + await test845Rule(0, 65535, ipV4WildcardAddress, Result.FAIL) + }) + + test('Security Issue when IPv6 wildcard address and allow all ports', async () => { + await test845Rule(0, 65535, ipV6WildcardAddress, Result.FAIL) + }) + + test('Security Issue when IPv4 wildcard address and allow all ports (multiple values)', async () => { + await test845Rule(0, 65535, ipV4WildcardAddress, Result.FAIL, true) + }) + + test('Security Issue when there is an inbound rule with IPv4 wildcard address and no port range is specified', async () => { + await test845Rule( + null, + null, + ipV4WildcardAddress, + Result.FAIL + ) + }) + + test('Security Issue when there is an inbound rule with IPv6 wildcard address and no port range is specified', async () => { + await test845Rule( + null, + null, + ipV6WildcardAddress, + Result.FAIL + ) + }) + + test('Security Issue when there is an inbound rule with IPv4 wildcard address and port range allow all ports', async () => { + await test845Rule(0, 65535, ipV4WildcardAddress, Result.FAIL) + }) + + test('Security Issue when there is an inbound rule with IPv6 wildcard address and port range allow all ports', async () => { + await test845Rule(0, 65535, ipV6WildcardAddress, Result.FAIL) + }) + }) +}) diff --git a/src/aws/pci-dss-3.2.1/.releaserc.yml b/src/aws/pci-dss-3.2.1/.releaserc.yml index 70788a7a..cba7db8c 100644 --- a/src/aws/pci-dss-3.2.1/.releaserc.yml +++ b/src/aws/pci-dss-3.2.1/.releaserc.yml @@ -1,10 +1,13 @@ --- branches: - - name: main - - name: beta - prerelease: true - name: alpha + channel: alpha prerelease: true + - name: beta + channel: beta + prerelease: true + - name: main + plugins: - "@semantic-release/commit-analyzer" - "@semantic-release/release-notes-generator" @@ -12,24 +15,23 @@ plugins: - changelogFile: CHANGELOG.md - - "@semantic-release/git" - assets: - - CHANGELOG.md - - package.json - - - "@semantic-release/npm" - - npmPublish: false - - "@semantic-release/gitlab" + - CHANGELOG.md + - package.json + - - "@semrel-extra/npm" + - npmPublish: true + - "@semantic-release/github" verifyConditions: - "@semantic-release/changelog" - - "@semantic-release/gitlab" + - "@semantic-release/github" + - "@semrel-extra/npm" prepare: - "@semantic-release/changelog" - - "@semantic-release/npm" + - "@semrel-extra/npm" - - "@semantic-release/git" - - message: "chore(publish): ${nextRelease.version} \n\n${nextRelease.notes}" + - message: "chore(release): ${nextRelease.version} \n\n${nextRelease.notes}" publish: - - "@semantic-release/gitlab" -release: - noCi: true + - "@semantic-release/github" + - "@semrel-extra/npm" success: false fail: false -repositoryUrl: https://gitlab.com/auto-cloud/cloudgraph/policy-packs.git tagFormat: "${version}" diff --git a/src/aws/pci-dss-3.2.1/CHANGELOG.md b/src/aws/pci-dss-3.2.1/CHANGELOG.md index 371ac5fc..e2558bfc 100644 --- a/src/aws/pci-dss-3.2.1/CHANGELOG.md +++ b/src/aws/pci-dss-3.2.1/CHANGELOG.md @@ -1,3 +1,12 @@ +## @cloudgraph/policy-pack-aws-pci-dss-3.2.1 [1.16.1-alpha.1](https://github.com/cloudgraphdev/cloudgraph-policy-packs/compare/@cloudgraph/policy-pack-aws-pci-dss-3.2.1@1.16.0...@cloudgraph/policy-pack-aws-pci-dss-3.2.1@1.16.1-alpha.1) (2022-04-27) + + +### Bug Fixes + +* Added missing fields for aws benchmarks ([dfd5874](https://github.com/cloudgraphdev/cloudgraph-policy-packs/commit/dfd5874e7d015ec5e6ab82fc419faf82a0b8cd4b)) +* rename vpc flowLogs connection to FlowLog ([c31e985](https://github.com/cloudgraphdev/cloudgraph-policy-packs/commit/c31e985b4a2623fb01f8a29a4c5897becb2e4905)) +* Updated policy field for S3 schema ([dc3d6c8](https://github.com/cloudgraphdev/cloudgraph-policy-packs/commit/dc3d6c8b4b7e22ba58c1394d0b64e866ab3de519)) + # @cloudgraph/policy-pack-aws-pci-dss-3.2.1 [1.16.0](https://gitlab.com/auto-cloud/cloudgraph/policy-packs/compare/@cloudgraph/policy-pack-aws-pci-dss-3.2.1@1.15.0...@cloudgraph/policy-pack-aws-pci-dss-3.2.1@1.16.0) (2022-04-01) diff --git a/src/aws/pci-dss-3.2.1/index.ts b/src/aws/pci-dss-3.2.1/index.ts index a2891324..6c0ec9cd 100644 --- a/src/aws/pci-dss-3.2.1/index.ts +++ b/src/aws/pci-dss-3.2.1/index.ts @@ -4,4 +4,5 @@ export default { provider: 'aws', entity: 'PCI', rules: PolicyPacksRules, + extraFields: ['arn', 'accountId'], } diff --git a/src/aws/pci-dss-3.2.1/package.json b/src/aws/pci-dss-3.2.1/package.json index cdb585d2..2bb7213d 100644 --- a/src/aws/pci-dss-3.2.1/package.json +++ b/src/aws/pci-dss-3.2.1/package.json @@ -1,14 +1,14 @@ { "name": "@cloudgraph/policy-pack-aws-pci-dss-3.2.1", "description": "Policy pack implementing Payment Card Industry Data Security Standard version 3.2.1 Benchmark for Amazon Web Services", - "version": "1.16.0", + "version": "1.16.1-alpha.1", "author": "AutoCloud", "license": "MPL-2.0", "main": "dist/index.js", "types": "dist/index.d.ts", "repository": { "type": "git", - "url": "https://github.com/cloudgraphdev/cloudgraph-policy-packs.git", + "url": "git+https://github.com/cloudgraphdev/cloudgraph-policy-packs.git", "directory": "src/aws/pci-dss-3.2.1" }, "bugs": { @@ -43,7 +43,7 @@ "typescript": "^4.3.5" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" }, "homepage": "https://www.cloudgraph.dev/", "keywords": [ @@ -54,10 +54,10 @@ "singleQuote": true }, "scripts": { - "build": "yarn prepublish", + "build": "yarn prepack", + "clean": "rm -rf dist", "lint": "eslint", - "prepack": "rm -rf dist && tsc -b", - "prepublish": "rm -rf dist && tsc", + "prepack": "yarn clean && tsc -b", "publish": "yarn npm publish", "test": "NODE_ENV=test jest" } diff --git a/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-ec2-check-6.ts b/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-ec2-check-6.ts index 9d19bb4e..f28b710c 100644 --- a/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-ec2-check-6.ts +++ b/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-ec2-check-6.ts @@ -49,7 +49,7 @@ export default { arn accountId __typename - flowLogs { + flowLog { resourceId } } @@ -57,7 +57,7 @@ export default { resource: 'queryawsVpc[*]', severity: 'medium', conditions: { - path: '@.flowLogs', + path: '@.flowLog', isEmpty: false, }, } diff --git a/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-lambda-check-1.ts b/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-lambda-check-1.ts index 436ff899..b9956e94 100644 --- a/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-lambda-check-1.ts +++ b/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-lambda-check-1.ts @@ -84,7 +84,15 @@ export default { arn accountId __typename - policy + policy { + statement { + effect + principal { + key + value + } + } + } } }`, resource: 'queryawsLambda[*]', diff --git a/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-s3-check-1.ts b/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-s3-check-1.ts index 835dde4c..5acd3ec0 100644 --- a/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-s3-check-1.ts +++ b/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-s3-check-1.ts @@ -50,15 +50,13 @@ export default { __typename blockPublicPolicy blockPublicAcls - bucketPolicies { - policy { - statement { - action - effect - principal { - key - value - } + policy { + statement { + action + effect + principal { + key + value } } } @@ -77,67 +75,56 @@ export default { equal: 'Yes', }, { - or: [ - { - path: '@.bucketPolicies', - isEmpty: true, - }, - { - path: '@.bucketPolicies', - array_all: { - path: '[*].policy.statement', - array_all: { - not: { + path: '@.policy.statement', + array_all: { + not: { + and: [ + { + path: '[*].effect', + equal: 'Allow', + }, + { + or: [ + { + path: '[*].action', + contains: '*', + }, + { + path: '[*].action', + contains: 's3:DeleteObject', + }, + { + path: '[*].action', + contains: 's3:PutObject', + }, + ], + }, + { + path: '[*].principal', + array_any: { and: [ { - path: '[*].effect', - equal: 'Allow', + path: '[*].key', + in: ['', 'AWS'], }, { or: [ { - path: '[*].action', + path: '[*].value', contains: '*', }, { - path: '[*].action', - contains: 's3:DeleteObject', - }, - { - path: '[*].action', - contains: 's3:PutObject', + path: '[*].value', + matchAny: /\s*:root\s*/, }, ], }, - { - path: '[*].principal', - array_any: { - and: [ - { - path: '[*].key', - in: ['', 'AWS'], - }, - { - or: [ - { - path: '[*].value', - contains: '*', - }, - { - path: '[*].value', - matchAny: /\s*:root\s*/, - }, - ], - }, - ], - }, - }, ], }, }, - }, + ], }, - ], + }, }, ], }, diff --git a/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-s3-check-2.ts b/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-s3-check-2.ts index 0ae7ee4a..c0dde23e 100644 --- a/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-s3-check-2.ts +++ b/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-s3-check-2.ts @@ -46,15 +46,13 @@ export default { __typename blockPublicPolicy blockPublicAcls - bucketPolicies { - policy { - statement { - action - effect - principal { - key - value - } + policy { + statement { + action + effect + principal { + key + value } } } @@ -73,75 +71,64 @@ export default { equal: 'Yes', }, { - or: [ - { - path: '@.bucketPolicies', - isEmpty: true, - }, - { - path: '@.bucketPolicies', - array_all: { - path: '[*].policy.statement', - array_all: { - not: { + path: '@.policy.statement', + array_all: { + not: { + and: [ + { + path: '[*].effect', + equal: 'Allow', + }, + { + or: [ + { + path: '[*].action', + contains: '*', + }, + { + path: '[*].action', + contains: 's3:GetObject', + }, + { + path: '[*].action', + contains: 's3:GetObjectVersion', + }, + { + path: '[*].action', + contains: 's3:ListBucket', + }, + { + path: '[*].action', + contains: 's3:ListBucketVersions', + }, + ], + }, + { + path: '[*].principal', + array_any: { and: [ { - path: '[*].effect', - equal: 'Allow', + path: '[*].key', + in: ['', 'AWS'], }, { or: [ { - path: '[*].action', + path: '[*].value', contains: '*', }, { - path: '[*].action', - contains: 's3:GetObject', - }, - { - path: '[*].action', - contains: 's3:GetObjectVersion', - }, - { - path: '[*].action', - contains: 's3:ListBucket', - }, - { - path: '[*].action', - contains: 's3:ListBucketVersions', + path: '[*].value', + matchAny: /\s*:root\s*/, }, ], }, - { - path: '[*].principal', - array_any: { - and: [ - { - path: '[*].key', - in: ['', 'AWS'], - }, - { - or: [ - { - path: '[*].value', - contains: '*', - }, - { - path: '[*].value', - matchAny: /\s*:root\s*/, - }, - ], - }, - ], - }, - }, ], }, }, - }, + ], }, - ], + }, }, ], }, diff --git a/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-s3-check-5.ts b/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-s3-check-5.ts index 487d7633..3c4d2879 100644 --- a/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-s3-check-5.ts +++ b/src/aws/pci-dss-3.2.1/rules/pci-dss-3.2.1-s3-check-5.ts @@ -57,19 +57,17 @@ export default { arn accountId __typename - bucketPolicies { - policy { - statement { - effect - action - principal { - key - value - } - condition { - key - value - } + policy { + statement { + effect + action + principal { + key + value + } + condition { + key + value } } } @@ -78,65 +76,54 @@ export default { resource: 'queryawsS3[*]', severity: 'medium', conditions: { - and: [ - { - path: '@.bucketPolicies', - isEmpty: false, - }, - { - path: '@.bucketPolicies', - array_all: { - path: '[*].policy.statement', - array_any: { - or: [ - { - path: '[*].effect', - equal: 'Deny', - }, - { + path: '@.policy.statement', + array_any: { + or: [ + { + path: '[*].effect', + equal: 'Deny', + }, + { + and: [ + { + path: '@.[*].condition', + isEmpty: false, + }, + { + path: '[*].condition', + array_any: { and: [ { - path: '@.[*].condition', - isEmpty: false, + path: '[*].key', + equal: 'aws:SecureTransport', }, { - path: '[*].condition', - array_any: { - and: [ - { - path: '[*].key', - equal: 'aws:SecureTransport', - }, - { - path: '[*].value', - contains: 'true', - }, - ], - }, - }, - { - path: '[*].principal', - array_any: { - not: { - and: [ - { - path: '[*].key', - in: ['', 'AWS'], - }, - { - path: '[*].value', - contains: '*', - }, - ], - }, - }, + path: '[*].value', + contains: 'true', }, ], }, - ], - }, + }, + { + path: '[*].principal', + array_any: { + not: { + and: [ + { + path: '[*].key', + in: ['', 'AWS'], + }, + { + path: '[*].value', + contains: '*', + }, + ], + }, + }, + }, + ], }, - }, - ], + ], + }, }, } diff --git a/src/aws/pci-dss-3.2.1/tests/pci-dss-3.2.1-ec2-checks.test.ts b/src/aws/pci-dss-3.2.1/tests/pci-dss-3.2.1-ec2-checks.test.ts index 65a60478..8c770416 100644 --- a/src/aws/pci-dss-3.2.1/tests/pci-dss-3.2.1-ec2-checks.test.ts +++ b/src/aws/pci-dss-3.2.1/tests/pci-dss-3.2.1-ec2-checks.test.ts @@ -347,7 +347,7 @@ describe('PCI Data Security Standard: 3.2.1', () => { queryawsVpc: [ { id: cuid(), - flowLogs: [ + flowLog: [ { resourceId: cuid(), }, @@ -369,7 +369,7 @@ describe('PCI Data Security Standard: 3.2.1', () => { queryawsVpc: [ { id: cuid(), - flowLogs: [], + flowLog: [], }, ], } diff --git a/src/aws/pci-dss-3.2.1/tests/pci-dss-3.2.1-s3-checks.test.ts b/src/aws/pci-dss-3.2.1/tests/pci-dss-3.2.1-s3-checks.test.ts index 12b0756b..36c156c9 100644 --- a/src/aws/pci-dss-3.2.1/tests/pci-dss-3.2.1-s3-checks.test.ts +++ b/src/aws/pci-dss-3.2.1/tests/pci-dss-3.2.1-s3-checks.test.ts @@ -119,7 +119,7 @@ describe('PCI Data Security Standard: 3.2.1', () => { __typename: 'awsS3', blockPublicPolicy: 'No', blockPublicAcls: 'No', - bucketPolicies: [], + policy: null, }, ], } @@ -140,13 +140,9 @@ describe('PCI Data Security Standard: 3.2.1', () => { __typename: 'awsS3', blockPublicPolicy: 'Yes', blockPublicAcls: 'Yes', - bucketPolicies: [ - { - policy: { - statement: [allowAll, ...allowPublicWriteAccess], - }, - }, - ], + policy: { + statement: [allowAll, ...allowPublicWriteAccess], + }, }, ], } @@ -167,13 +163,9 @@ describe('PCI Data Security Standard: 3.2.1', () => { __typename: 'awsS3', blockPublicPolicy: 'Yes', blockPublicAcls: 'Yes', - bucketPolicies: [ - { - policy: { - statement: [...allowPublicReadAccess], - }, - }, - ], + policy: { + statement: [...allowPublicReadAccess], + }, }, ], } @@ -194,7 +186,7 @@ describe('PCI Data Security Standard: 3.2.1', () => { __typename: 'awsS3', blockPublicPolicy: 'Yes', blockPublicAcls: 'Yes', - bucketPolicies: [], + policy: null, }, ], } @@ -238,13 +230,9 @@ describe('PCI Data Security Standard: 3.2.1', () => { __typename: 'awsS3', blockPublicPolicy: 'Yes', blockPublicAcls: 'Yes', - bucketPolicies: [ - { - policy: { - statement: [allowAll, ...allowPublicReadAccess], - }, - }, - ], + policy: { + statement: [allowAll, ...allowPublicReadAccess], + }, }, ], } @@ -292,7 +280,7 @@ describe('PCI Data Security Standard: 3.2.1', () => { __typename: 'awsS3', blockPublicPolicy: 'Yes', blockPublicAcls: 'Yes', - bucketPolicies: [], + policy: [], }, ], } @@ -389,7 +377,7 @@ describe('PCI Data Security Standard: 3.2.1', () => { { id: cuid(), __typename: 'awsS3', - bucketPolicies: [], + policy: null, }, ], } @@ -408,13 +396,9 @@ describe('PCI Data Security Standard: 3.2.1', () => { { id: cuid(), __typename: 'awsS3', - bucketPolicies: [ - { - policy: { - statement: [allowSSLRequestsOnly], - }, - }, - ], + policy: { + statement: [allowSSLRequestsOnly], + }, }, ], } @@ -433,13 +417,9 @@ describe('PCI Data Security Standard: 3.2.1', () => { { id: cuid(), __typename: 'awsS3', - bucketPolicies: [ - { - policy: { - statement: [allowAll], - }, - }, - ], + policy: { + statement: [allowAll], + }, }, ], } diff --git a/src/azure/cis-1.3.1/.releaserc.yml b/src/azure/cis-1.3.1/.releaserc.yml index 70788a7a..cba7db8c 100644 --- a/src/azure/cis-1.3.1/.releaserc.yml +++ b/src/azure/cis-1.3.1/.releaserc.yml @@ -1,10 +1,13 @@ --- branches: - - name: main - - name: beta - prerelease: true - name: alpha + channel: alpha prerelease: true + - name: beta + channel: beta + prerelease: true + - name: main + plugins: - "@semantic-release/commit-analyzer" - "@semantic-release/release-notes-generator" @@ -12,24 +15,23 @@ plugins: - changelogFile: CHANGELOG.md - - "@semantic-release/git" - assets: - - CHANGELOG.md - - package.json - - - "@semantic-release/npm" - - npmPublish: false - - "@semantic-release/gitlab" + - CHANGELOG.md + - package.json + - - "@semrel-extra/npm" + - npmPublish: true + - "@semantic-release/github" verifyConditions: - "@semantic-release/changelog" - - "@semantic-release/gitlab" + - "@semantic-release/github" + - "@semrel-extra/npm" prepare: - "@semantic-release/changelog" - - "@semantic-release/npm" + - "@semrel-extra/npm" - - "@semantic-release/git" - - message: "chore(publish): ${nextRelease.version} \n\n${nextRelease.notes}" + - message: "chore(release): ${nextRelease.version} \n\n${nextRelease.notes}" publish: - - "@semantic-release/gitlab" -release: - noCi: true + - "@semantic-release/github" + - "@semrel-extra/npm" success: false fail: false -repositoryUrl: https://gitlab.com/auto-cloud/cloudgraph/policy-packs.git tagFormat: "${version}" diff --git a/src/azure/cis-1.3.1/package.json b/src/azure/cis-1.3.1/package.json index 69e8f8d9..99ecc846 100644 --- a/src/azure/cis-1.3.1/package.json +++ b/src/azure/cis-1.3.1/package.json @@ -8,7 +8,7 @@ "types": "dist/index.d.ts", "repository": { "type": "git", - "url": "https://github.com/cloudgraphdev/cloudgraph-policy-packs.git", + "url": "git+https://github.com/cloudgraphdev/cloudgraph-policy-packs.git", "directory": "src/azure/cis-1.3.1" }, "bugs": { @@ -43,7 +43,7 @@ "typescript": "^4.3.5" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" }, "homepage": "https://www.cloudgraph.dev/", "keywords": [ @@ -55,10 +55,10 @@ "arrowParens": "avoid" }, "scripts": { - "build": "yarn prepublish", + "build": "yarn prepack", + "clean": "rm -rf dist", "lint": "eslint", - "prepack": "rm -rf dist && tsc -b", - "prepublish": "rm -rf dist && tsc", + "prepack": "yarn clean && tsc -b", "publish": "yarn npm publish", "test": "NODE_ENV=test jest" } diff --git a/src/azure/cis-1.3.1/rules/azure-cis-1.3.1-4.3.8.ts b/src/azure/cis-1.3.1/rules/azure-cis-1.3.1-4.3.8.ts index faf291e0..10c07c16 100644 --- a/src/azure/cis-1.3.1/rules/azure-cis-1.3.1-4.3.8.ts +++ b/src/azure/cis-1.3.1/rules/azure-cis-1.3.1-4.3.8.ts @@ -45,11 +45,12 @@ export default { ], severity: 'medium', gql: `{ - queryazurePostgreSqlServer{ + queryazurePostgreSqlServer { __typename - firewallRules{ + firewallRules { name - value + startIpAddress + endIpAddress } } }`, diff --git a/src/gcp/cis-1.2.0/.releaserc.yml b/src/gcp/cis-1.2.0/.releaserc.yml index 70788a7a..cba7db8c 100644 --- a/src/gcp/cis-1.2.0/.releaserc.yml +++ b/src/gcp/cis-1.2.0/.releaserc.yml @@ -1,10 +1,13 @@ --- branches: - - name: main - - name: beta - prerelease: true - name: alpha + channel: alpha prerelease: true + - name: beta + channel: beta + prerelease: true + - name: main + plugins: - "@semantic-release/commit-analyzer" - "@semantic-release/release-notes-generator" @@ -12,24 +15,23 @@ plugins: - changelogFile: CHANGELOG.md - - "@semantic-release/git" - assets: - - CHANGELOG.md - - package.json - - - "@semantic-release/npm" - - npmPublish: false - - "@semantic-release/gitlab" + - CHANGELOG.md + - package.json + - - "@semrel-extra/npm" + - npmPublish: true + - "@semantic-release/github" verifyConditions: - "@semantic-release/changelog" - - "@semantic-release/gitlab" + - "@semantic-release/github" + - "@semrel-extra/npm" prepare: - "@semantic-release/changelog" - - "@semantic-release/npm" + - "@semrel-extra/npm" - - "@semantic-release/git" - - message: "chore(publish): ${nextRelease.version} \n\n${nextRelease.notes}" + - message: "chore(release): ${nextRelease.version} \n\n${nextRelease.notes}" publish: - - "@semantic-release/gitlab" -release: - noCi: true + - "@semantic-release/github" + - "@semrel-extra/npm" success: false fail: false -repositoryUrl: https://gitlab.com/auto-cloud/cloudgraph/policy-packs.git tagFormat: "${version}" diff --git a/src/gcp/cis-1.2.0/package.json b/src/gcp/cis-1.2.0/package.json index 7e78a707..f7398bd4 100644 --- a/src/gcp/cis-1.2.0/package.json +++ b/src/gcp/cis-1.2.0/package.json @@ -8,7 +8,7 @@ "types": "dist/index.d.ts", "repository": { "type": "git", - "url": "https://github.com/cloudgraphdev/cloudgraph-policy-packs.git", + "url": "git+https://github.com/cloudgraphdev/cloudgraph-policy-packs.git", "directory": "src/gcp/cis-1.2.0" }, "bugs": { @@ -43,7 +43,7 @@ "typescript": "^4.3.5" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" }, "homepage": "https://www.cloudgraph.dev/", "keywords": [ @@ -55,10 +55,10 @@ "arrowParens": "avoid" }, "scripts": { - "build": "yarn prepublish", + "build": "yarn prepack", + "clean": "rm -rf dist", "lint": "eslint", - "prepack": "rm -rf dist && tsc -b", - "prepublish": "rm -rf dist && tsc", + "prepack": "yarn clean && tsc -b", "publish": "yarn npm publish", "test": "NODE_ENV=test jest" } diff --git a/yarn.lock b/yarn.lock index ab162f22..26aa591f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,15 @@ __metadata: version: 6 cacheKey: 8 +"@ampproject/remapping@npm:^2.1.0": + version: 2.1.2 + resolution: "@ampproject/remapping@npm:2.1.2" + dependencies: + "@jridgewell/trace-mapping": ^0.3.0 + checksum: e023f92cdd9723f3042cde3b4d922adfeef0e198aa73486b0b6c034ad36af5f96e5c0cc72b335b30b2eb9852d907efc92af6bfcd3f4b4d286177ee32a189cf92 + languageName: node + linkType: hard + "@autocloud/eslint-config@npm:^0.1.0": version: 0.1.0 resolution: "@autocloud/eslint-config@npm:0.1.0" @@ -40,58 +49,58 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.16.4": - version: 7.16.4 - resolution: "@babel/compat-data@npm:7.16.4" - checksum: 4949ce54eafc4b38d5623696a872acaaced1a523605708d81c2c483253941917d90dae0de40fc01e152ae56075dadd89c23014da5a632b09c001a716fa689cae +"@babel/compat-data@npm:^7.17.7": + version: 7.17.7 + resolution: "@babel/compat-data@npm:7.17.7" + checksum: bf13476676884ce9afc199747ff82f3bcd6d42a9cfb01ce91bdb762b83ea11ec619b6ec532d1a80469ab14f191f33b5d4b9f8796fa8be3bc728d42b0c5e737e3 languageName: node linkType: hard "@babel/core@npm:^7.1.0, @babel/core@npm:^7.12.3, @babel/core@npm:^7.7.2, @babel/core@npm:^7.8.0": - version: 7.16.7 - resolution: "@babel/core@npm:7.16.7" + version: 7.17.9 + resolution: "@babel/core@npm:7.17.9" dependencies: + "@ampproject/remapping": ^2.1.0 "@babel/code-frame": ^7.16.7 - "@babel/generator": ^7.16.7 - "@babel/helper-compilation-targets": ^7.16.7 - "@babel/helper-module-transforms": ^7.16.7 - "@babel/helpers": ^7.16.7 - "@babel/parser": ^7.16.7 + "@babel/generator": ^7.17.9 + "@babel/helper-compilation-targets": ^7.17.7 + "@babel/helper-module-transforms": ^7.17.7 + "@babel/helpers": ^7.17.9 + "@babel/parser": ^7.17.9 "@babel/template": ^7.16.7 - "@babel/traverse": ^7.16.7 - "@babel/types": ^7.16.7 + "@babel/traverse": ^7.17.9 + "@babel/types": ^7.17.0 convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 - json5: ^2.1.2 + json5: ^2.2.1 semver: ^6.3.0 - source-map: ^0.5.0 - checksum: 3206e077e76db189726c4da19a5296eae11c6c1f5abea7013e74f18708bb91616914717ff8d8ca466cc0ba9d2d2147e9a84c3c357b9ad4cba601da14107838ed + checksum: 2d301e4561a170bb584a735ec412de8fdc40b2052e12380d4a5e36781be5af1fd2a60552e7f0764b0a491a242f20105265bd2a10ff57b30c2842684f02dbb5a2 languageName: node linkType: hard -"@babel/generator@npm:^7.16.7, @babel/generator@npm:^7.7.2": - version: 7.16.7 - resolution: "@babel/generator@npm:7.16.7" +"@babel/generator@npm:^7.17.9, @babel/generator@npm:^7.7.2": + version: 7.17.9 + resolution: "@babel/generator@npm:7.17.9" dependencies: - "@babel/types": ^7.16.7 + "@babel/types": ^7.17.0 jsesc: ^2.5.1 source-map: ^0.5.0 - checksum: 20c6a7c5e372a66ec2900c074b2ec3634d3f615cafccbb416770f4b419251c6dc27a0a137b71407e218463fe059a3a6a5afb734f35089d94bdb66e01fe8a9e6f + checksum: afbdd4afbf731ba0a17e7e2d9a2291e6461259af887f88f1178f63514a86e9c18cec462ae8f9cd6df9ba15a18296f47b0e151202bb4f834f7338ac0c07ec8dc8 languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.16.7": - version: 7.16.7 - resolution: "@babel/helper-compilation-targets@npm:7.16.7" +"@babel/helper-compilation-targets@npm:^7.17.7": + version: 7.17.7 + resolution: "@babel/helper-compilation-targets@npm:7.17.7" dependencies: - "@babel/compat-data": ^7.16.4 + "@babel/compat-data": ^7.17.7 "@babel/helper-validator-option": ^7.16.7 browserslist: ^4.17.5 semver: ^6.3.0 peerDependencies: "@babel/core": ^7.0.0 - checksum: 7238aaee78c011a42fb5ca92e5eff098752f7b314c2111d7bb9cdd58792fcab1b9c819b59f6a0851dc210dc09dc06b30d130a23982753e70eb3111bc65204842 + checksum: 24bf851539d5ec8e73779304b5d1ad5b0be09a74459ecc7d9baee9a0fa38ad016e9eaf4b5704504ae8da32f91ce0e31857bbbd9686854caeffd38f58226d3760 languageName: node linkType: hard @@ -104,23 +113,13 @@ __metadata: languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.16.7": - version: 7.16.7 - resolution: "@babel/helper-function-name@npm:7.16.7" +"@babel/helper-function-name@npm:^7.17.9": + version: 7.17.9 + resolution: "@babel/helper-function-name@npm:7.17.9" dependencies: - "@babel/helper-get-function-arity": ^7.16.7 "@babel/template": ^7.16.7 - "@babel/types": ^7.16.7 - checksum: fc77cbe7b10cfa2a262d7a37dca575c037f20419dfe0c5d9317f589599ca24beb5f5c1057748011159149eaec47fe32338c6c6412376fcded68200df470161e1 - languageName: node - linkType: hard - -"@babel/helper-get-function-arity@npm:^7.16.7": - version: 7.16.7 - resolution: "@babel/helper-get-function-arity@npm:7.16.7" - dependencies: - "@babel/types": ^7.16.7 - checksum: 25d969fb207ff2ad5f57a90d118f6c42d56a0171022e200aaa919ba7dc95ae7f92ec71cdea6c63ef3629a0dc962ab4c78e09ca2b437185ab44539193f796e0c3 + "@babel/types": ^7.17.0 + checksum: a59b2e5af56d8f43b9b0019939a43774754beb7cb01a211809ca8031c71890999d07739e955343135ec566c4d8ff725435f1f60fb0af3bb546837c1f9f84f496 languageName: node linkType: hard @@ -142,19 +141,19 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.16.7": - version: 7.16.7 - resolution: "@babel/helper-module-transforms@npm:7.16.7" +"@babel/helper-module-transforms@npm:^7.17.7": + version: 7.17.7 + resolution: "@babel/helper-module-transforms@npm:7.17.7" dependencies: "@babel/helper-environment-visitor": ^7.16.7 "@babel/helper-module-imports": ^7.16.7 - "@babel/helper-simple-access": ^7.16.7 + "@babel/helper-simple-access": ^7.17.7 "@babel/helper-split-export-declaration": ^7.16.7 "@babel/helper-validator-identifier": ^7.16.7 "@babel/template": ^7.16.7 - "@babel/traverse": ^7.16.7 - "@babel/types": ^7.16.7 - checksum: 6e930ce776c979f299cdbeaf80187f4ab086d75287b96ecc1c6896d392fcb561065f0d6219fc06fa79b4ceb4bbdc1a9847da8099aba9b077d0a9e583500fb673 + "@babel/traverse": ^7.17.3 + "@babel/types": ^7.17.0 + checksum: 0b8f023aa7ff82dc4864349d54c4557865ad8ba54d78f6d78a86b05ca40f65c2d60acb4a54c5c309e7a4356beb9a89b876e54af4b3c4801ad25f62ec3721f0ae languageName: node linkType: hard @@ -165,12 +164,12 @@ __metadata: languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.16.7": - version: 7.16.7 - resolution: "@babel/helper-simple-access@npm:7.16.7" +"@babel/helper-simple-access@npm:^7.17.7": + version: 7.17.7 + resolution: "@babel/helper-simple-access@npm:7.17.7" dependencies: - "@babel/types": ^7.16.7 - checksum: 8d22c46c5ec2ead0686c4d5a3d1d12b5190c59be676bfe0d9d89df62b437b51d1a3df2ccfb8a77dded2e585176ebf12986accb6d45a18cff229eef3b10344f4b + "@babel/types": ^7.17.0 + checksum: 58a9bfd054720024f6ff47fbb113c96061dc2bd31a5e5285756bd3c2e83918c6926900e00150d0fb175d899494fe7d69bf2a8b278c32ef6f6bea8d032e6a3831 languageName: node linkType: hard @@ -197,34 +196,34 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.16.7": - version: 7.16.7 - resolution: "@babel/helpers@npm:7.16.7" +"@babel/helpers@npm:^7.17.9": + version: 7.17.9 + resolution: "@babel/helpers@npm:7.17.9" dependencies: "@babel/template": ^7.16.7 - "@babel/traverse": ^7.16.7 - "@babel/types": ^7.16.7 - checksum: 75504c76b66a29b91f954fcc0867dfe275a4cfba5b44df6d64405df74ea72f967fccfa63d62c31c423c5502d113290000c581e0e4858a214f0303d7ecf55c29f + "@babel/traverse": ^7.17.9 + "@babel/types": ^7.17.0 + checksum: 3c6db861e4c82fff2de3efb4ad12e32658c50c29920597cd0979390659b202e5849acd9542e0e2453167a52ccc30156ee4455d64d0e330f020d991d7551566f8 languageName: node linkType: hard "@babel/highlight@npm:^7.10.4, @babel/highlight@npm:^7.16.7": - version: 7.16.7 - resolution: "@babel/highlight@npm:7.16.7" + version: 7.17.9 + resolution: "@babel/highlight@npm:7.17.9" dependencies: "@babel/helper-validator-identifier": ^7.16.7 chalk: ^2.0.0 js-tokens: ^4.0.0 - checksum: f7e04e7e03b83c2cca984f4d3e180c9b018784f45d03367e94daf983861229ddc47264045f3b58dfeb0007f9c67bc2a76c4de1693bad90e5394876ef55ece5bb + checksum: 7bdf10228f2e4d18f48f114411ed584380d356e7c168d7582c14abd8df9909b2fc09e0a7cd334f47c3eb0bc17e639e0c8d9688c6afd5d09a2bdbf0ac193b11fd languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.7": - version: 7.16.7 - resolution: "@babel/parser@npm:7.16.7" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.16.7, @babel/parser@npm:^7.17.9": + version: 7.17.9 + resolution: "@babel/parser@npm:7.17.9" bin: parser: ./bin/babel-parser.js - checksum: e664ff1edda164ab3f3c97fc1dd1a8930b0fba9981cbf873d3f25a22d16d50e2efcfaf81daeefa978bff2c4f268d34832f6817c8bc4e03594c3f43beba92fb68 + checksum: ea59c985ebfae7c0299c8ea63ed34903202f51665db8d59c55b4366e20270b74d7367a2c211fdd2db20f25750df89adcc85ab6c8692061c6459a88efb79f43e6 languageName: node linkType: hard @@ -372,11 +371,11 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.5.5": - version: 7.16.7 - resolution: "@babel/runtime@npm:7.16.7" + version: 7.17.9 + resolution: "@babel/runtime@npm:7.17.9" dependencies: regenerator-runtime: ^0.13.4 - checksum: 47912f0aaacd1cab2e2552aaf3e6eaffbcaf2d5ac9b07a89a12ac0d42029cb92c070b0d16f825e4277c4a34677c54d8ffe85e1f7c6feb57de58f700eec67ce2f + checksum: 4d56bdb82890f386d5a57c40ef985a0ed7f0a78f789377a2d0c3e8826819e0f7f16ba0fe906d9b2241c5f7ca56630ef0653f5bb99f03771f7b87ff8af4bf5fe3 languageName: node linkType: hard @@ -391,21 +390,21 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.16.7, @babel/traverse@npm:^7.7.2": - version: 7.16.7 - resolution: "@babel/traverse@npm:7.16.7" +"@babel/traverse@npm:^7.17.3, @babel/traverse@npm:^7.17.9, @babel/traverse@npm:^7.7.2": + version: 7.17.9 + resolution: "@babel/traverse@npm:7.17.9" dependencies: "@babel/code-frame": ^7.16.7 - "@babel/generator": ^7.16.7 + "@babel/generator": ^7.17.9 "@babel/helper-environment-visitor": ^7.16.7 - "@babel/helper-function-name": ^7.16.7 + "@babel/helper-function-name": ^7.17.9 "@babel/helper-hoist-variables": ^7.16.7 "@babel/helper-split-export-declaration": ^7.16.7 - "@babel/parser": ^7.16.7 - "@babel/types": ^7.16.7 + "@babel/parser": ^7.17.9 + "@babel/types": ^7.17.0 debug: ^4.1.0 globals: ^11.1.0 - checksum: 65261f7a5bf257c10a9415b6c227fb555ace359ad786645d9cf22f0e3fc8dc8e38895269f3b93cc39eccd8ed992e7bacc358b4cb7d3496fe54f91cda49220834 + checksum: d907c71d1617589cc0cddc9837cb27bcb9b8f2117c379e13e72653745abe01da24e8c072bd0c91b9db33323ddb1086722756fbc50b487b2608733baf9dd6fd2c languageName: node linkType: hard @@ -437,9 +436,9 @@ __metadata: linkType: hard "@changesets/types@npm:^4.0.1": - version: 4.0.2 - resolution: "@changesets/types@npm:4.0.2" - checksum: 098ed02b44ac70dbe341ca3560acdd0ae46c54edb8a1134f743d5fa56bf983b5f4ea085b8c5187314c23ac51e51e1ca6c735aaaa3ee17d79f0395b23baf042a0 + version: 4.1.0 + resolution: "@changesets/types@npm:4.1.0" + checksum: 72c1f58044178ca867dd9349ecc4b7c233ce3781bb03b5b72a70c3166fbbab54a2f2cb19a81f96b4649ba004442c8734569fba238be4dd737fb4624a135c6098 languageName: node linkType: hard @@ -659,6 +658,13 @@ __metadata: languageName: node linkType: hard +"@colors/colors@npm:1.5.0": + version: 1.5.0 + resolution: "@colors/colors@npm:1.5.0" + checksum: d64d5260bed1d5012ae3fc617d38d1afc0329fec05342f4e6b838f46998855ba56e0a73833f4a80fa8378c84810da254f76a8a19c39d038260dc06dc4e007425 + languageName: node + linkType: hard + "@eslint/eslintrc@npm:^0.4.3": version: 0.4.3 resolution: "@eslint/eslintrc@npm:0.4.3" @@ -697,25 +703,25 @@ __metadata: linkType: hard "@graphql-tools/merge@npm:^8.2.1": - version: 8.2.1 - resolution: "@graphql-tools/merge@npm:8.2.1" + version: 8.2.10 + resolution: "@graphql-tools/merge@npm:8.2.10" dependencies: - "@graphql-tools/utils": ^8.5.1 + "@graphql-tools/utils": 8.6.9 tslib: ~2.3.0 peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: b2c126fc697ad1cf0fb2c09d3766d791ba6243a318edfa24932b558628244f822b9454bd47cd98f5a7eee90caca264573695c582e10730b7a67785fea21c346c + checksum: 7059d9f68cfb9b7c04d6024f528e5638fab165e681b3307877a6bad0fc461686595d19375350875bb5f4f7572b21d10272a1e4b08a8af5b6a67950a4a950012b languageName: node linkType: hard -"@graphql-tools/utils@npm:^8.5.1": - version: 8.6.0 - resolution: "@graphql-tools/utils@npm:8.6.0" +"@graphql-tools/utils@npm:8.6.9": + version: 8.6.9 + resolution: "@graphql-tools/utils@npm:8.6.9" dependencies: tslib: ~2.3.0 peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - checksum: ef6fef40d4568606059f77dc8839f18c75a4330096ec89a21f0965bd58c749d80087830551c618fd040fdbcdcb9be35c949b2d96c495a1f1dbfba943b124bc3b + checksum: 73b9569a9c2409f86a6a9005f19026cfab6d136bf884dfbff436996a47fb0561ae24d3f6bb2abcfd600197aab85d6dfc177b9a0cbaba23905ba0c7591ef12110 languageName: node linkType: hard @@ -780,48 +786,48 @@ __metadata: languageName: node linkType: hard -"@jest/console@npm:^27.4.6": - version: 27.4.6 - resolution: "@jest/console@npm:27.4.6" +"@jest/console@npm:^27.5.1": + version: 27.5.1 + resolution: "@jest/console@npm:27.5.1" dependencies: - "@jest/types": ^27.4.2 + "@jest/types": ^27.5.1 "@types/node": "*" chalk: ^4.0.0 - jest-message-util: ^27.4.6 - jest-util: ^27.4.2 + jest-message-util: ^27.5.1 + jest-util: ^27.5.1 slash: ^3.0.0 - checksum: 603408498d2fd7fa6cfb85cc18a5823747c824be2f88be526ed4db83df65db7a9d3a93056eeaddd32ea1517d581b94862e532ccde081e0ecf9d82ac743ec6ac2 + checksum: 7cb20f06a34b09734c0342685ec53aa4c401fe3757c13a9c58fce76b971a322eb884f6de1068ef96f746e5398e067371b89515a07c268d4440a867c87748a706 languageName: node linkType: hard -"@jest/core@npm:^27.4.7": - version: 27.4.7 - resolution: "@jest/core@npm:27.4.7" +"@jest/core@npm:^27.5.1": + version: 27.5.1 + resolution: "@jest/core@npm:27.5.1" dependencies: - "@jest/console": ^27.4.6 - "@jest/reporters": ^27.4.6 - "@jest/test-result": ^27.4.6 - "@jest/transform": ^27.4.6 - "@jest/types": ^27.4.2 + "@jest/console": ^27.5.1 + "@jest/reporters": ^27.5.1 + "@jest/test-result": ^27.5.1 + "@jest/transform": ^27.5.1 + "@jest/types": ^27.5.1 "@types/node": "*" ansi-escapes: ^4.2.1 chalk: ^4.0.0 emittery: ^0.8.1 exit: ^0.1.2 - graceful-fs: ^4.2.4 - jest-changed-files: ^27.4.2 - jest-config: ^27.4.7 - jest-haste-map: ^27.4.6 - jest-message-util: ^27.4.6 - jest-regex-util: ^27.4.0 - jest-resolve: ^27.4.6 - jest-resolve-dependencies: ^27.4.6 - jest-runner: ^27.4.6 - jest-runtime: ^27.4.6 - jest-snapshot: ^27.4.6 - jest-util: ^27.4.2 - jest-validate: ^27.4.6 - jest-watcher: ^27.4.6 + graceful-fs: ^4.2.9 + jest-changed-files: ^27.5.1 + jest-config: ^27.5.1 + jest-haste-map: ^27.5.1 + jest-message-util: ^27.5.1 + jest-regex-util: ^27.5.1 + jest-resolve: ^27.5.1 + jest-resolve-dependencies: ^27.5.1 + jest-runner: ^27.5.1 + jest-runtime: ^27.5.1 + jest-snapshot: ^27.5.1 + jest-util: ^27.5.1 + jest-validate: ^27.5.1 + jest-watcher: ^27.5.1 micromatch: ^4.0.4 rimraf: ^3.0.0 slash: ^3.0.0 @@ -831,71 +837,71 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: 24ed123ef1819fa8c6069706760efac9904ee8824b22c346259be2017d820b5e578a4d444339448a576a0158e6fec91d18fdedb201bc97d7390b105d665f3642 + checksum: 904a94ad8f1b43cd6b48de3b0226659bff3696150ff8cf7680fc2faffdc8a115203bb9ab6e817c1f79f9d6a81f67953053cbc64d8a4604f2e0c42a04c28cf126 languageName: node linkType: hard -"@jest/environment@npm:^27.4.6": - version: 27.4.6 - resolution: "@jest/environment@npm:27.4.6" +"@jest/environment@npm:^27.5.1": + version: 27.5.1 + resolution: "@jest/environment@npm:27.5.1" dependencies: - "@jest/fake-timers": ^27.4.6 - "@jest/types": ^27.4.2 + "@jest/fake-timers": ^27.5.1 + "@jest/types": ^27.5.1 "@types/node": "*" - jest-mock: ^27.4.6 - checksum: c3aadcf6d42e55e35d8020f7cf5054c445775608e466fcfc37348359e54f2f79e0e39d029281836ae9082dc50eac81d1cf6b4fc3899adfb58afc68a7c72f8e3d + jest-mock: ^27.5.1 + checksum: 2a9e18c35a015508dbec5b90b21c150230fa6c1c8cb8fabe029d46ee2ca4c40eb832fb636157da14c66590d0a4c8a2c053226b041f54a44507d6f6a89abefd66 languageName: node linkType: hard -"@jest/fake-timers@npm:^27.4.6": - version: 27.4.6 - resolution: "@jest/fake-timers@npm:27.4.6" +"@jest/fake-timers@npm:^27.5.1": + version: 27.5.1 + resolution: "@jest/fake-timers@npm:27.5.1" dependencies: - "@jest/types": ^27.4.2 + "@jest/types": ^27.5.1 "@sinonjs/fake-timers": ^8.0.1 "@types/node": "*" - jest-message-util: ^27.4.6 - jest-mock: ^27.4.6 - jest-util: ^27.4.2 - checksum: 389f655d39f13fdd0448b554260cd41810cf824b99e9de057600869a708d34cfa74e7fdaba5fcd6e3295e7bfed08f1b3fc0735ca86f7c0b2281b25e534032876 + jest-message-util: ^27.5.1 + jest-mock: ^27.5.1 + jest-util: ^27.5.1 + checksum: 02a0561ed2f4586093facd4ae500b74694f187ac24d4a00e949a39a1c5325bca8932b4fcb0388a2c5ed0656506fc1cf51fd3e32cdd48cea7497ad9c6e028aba8 languageName: node linkType: hard -"@jest/globals@npm:^27.4.6": - version: 27.4.6 - resolution: "@jest/globals@npm:27.4.6" +"@jest/globals@npm:^27.5.1": + version: 27.5.1 + resolution: "@jest/globals@npm:27.5.1" dependencies: - "@jest/environment": ^27.4.6 - "@jest/types": ^27.4.2 - expect: ^27.4.6 - checksum: a438645771f45557b3af6e371e65c88e109d7433d3d4ee5db908177f29be6d6d12b4cfe9279ae6475bc033b5ff2a97235659a75f2718855041dd3ed805ed2edd + "@jest/environment": ^27.5.1 + "@jest/types": ^27.5.1 + expect: ^27.5.1 + checksum: 087f97047e9dcf555f76fe2ce54aee681e005eaa837a0c0c2d251df6b6412c892c9df54cb871b180342114389a5ff895a4e52e6e6d3d0015bf83c02a54f64c3c languageName: node linkType: hard -"@jest/reporters@npm:^27.4.6": - version: 27.4.6 - resolution: "@jest/reporters@npm:27.4.6" +"@jest/reporters@npm:^27.5.1": + version: 27.5.1 + resolution: "@jest/reporters@npm:27.5.1" dependencies: "@bcoe/v8-coverage": ^0.2.3 - "@jest/console": ^27.4.6 - "@jest/test-result": ^27.4.6 - "@jest/transform": ^27.4.6 - "@jest/types": ^27.4.2 + "@jest/console": ^27.5.1 + "@jest/test-result": ^27.5.1 + "@jest/transform": ^27.5.1 + "@jest/types": ^27.5.1 "@types/node": "*" chalk: ^4.0.0 collect-v8-coverage: ^1.0.0 exit: ^0.1.2 glob: ^7.1.2 - graceful-fs: ^4.2.4 + graceful-fs: ^4.2.9 istanbul-lib-coverage: ^3.0.0 istanbul-lib-instrument: ^5.1.0 istanbul-lib-report: ^3.0.0 istanbul-lib-source-maps: ^4.0.0 istanbul-reports: ^3.1.3 - jest-haste-map: ^27.4.6 - jest-resolve: ^27.4.6 - jest-util: ^27.4.2 - jest-worker: ^27.4.6 + jest-haste-map: ^27.5.1 + jest-resolve: ^27.5.1 + jest-util: ^27.5.1 + jest-worker: ^27.5.1 slash: ^3.0.0 source-map: ^0.6.0 string-length: ^4.0.1 @@ -906,78 +912,102 @@ __metadata: peerDependenciesMeta: node-notifier: optional: true - checksum: 4c14b2cf6c9b624977f9ad519e9ce2f5ead4a3c9a3fa0b9c68097b7bc78b598ceb5402566417d81e16489dbd6bb6e97e58f04c22099013897dd6010c0549b169 + checksum: faba5eafb86e62b62e152cafc8812d56308f9d1e8b77f3a7dcae4a8803a20a60a0909cc43ed73363ef649bf558e4fb181c7a336d144c89f7998279d1882bb69e languageName: node linkType: hard -"@jest/source-map@npm:^27.4.0": - version: 27.4.0 - resolution: "@jest/source-map@npm:27.4.0" +"@jest/source-map@npm:^27.5.1": + version: 27.5.1 + resolution: "@jest/source-map@npm:27.5.1" dependencies: callsites: ^3.0.0 - graceful-fs: ^4.2.4 + graceful-fs: ^4.2.9 source-map: ^0.6.0 - checksum: cf87ac3dd1c2d210b0637060710d64417bcd88d670cbb26af7367ded99fd7d64d431c1718054351f0236c14659bc17a8deff6ee3d9f52902299911231bbaf0c8 + checksum: 4fb1e743b602841babf7e22bd84eca34676cb05d4eb3b604cae57fc59e406099f5ac759ac1a0d04d901237d143f0f4f234417306e823bde732a1d19982230862 languageName: node linkType: hard -"@jest/test-result@npm:^27.4.6": - version: 27.4.6 - resolution: "@jest/test-result@npm:27.4.6" +"@jest/test-result@npm:^27.5.1": + version: 27.5.1 + resolution: "@jest/test-result@npm:27.5.1" dependencies: - "@jest/console": ^27.4.6 - "@jest/types": ^27.4.2 + "@jest/console": ^27.5.1 + "@jest/types": ^27.5.1 "@types/istanbul-lib-coverage": ^2.0.0 collect-v8-coverage: ^1.0.0 - checksum: ddfc5783f2025ba979df395ddead7f76aac91df9a8a4ab15d5b1210a58e523932bb9ea9e1e97229c09cab81fdb2611292fdc8e56e2c5b44ed452ac11db7f79f0 + checksum: 338f7c509d6a3bc6d7dd7388c8f6f548b87638e171dc1fddfedcacb4e8950583288832223ba688058cbcf874b937d22bdc0fa88f79f5fc666f77957e465c06a5 languageName: node linkType: hard -"@jest/test-sequencer@npm:^27.4.6": - version: 27.4.6 - resolution: "@jest/test-sequencer@npm:27.4.6" +"@jest/test-sequencer@npm:^27.5.1": + version: 27.5.1 + resolution: "@jest/test-sequencer@npm:27.5.1" dependencies: - "@jest/test-result": ^27.4.6 - graceful-fs: ^4.2.4 - jest-haste-map: ^27.4.6 - jest-runtime: ^27.4.6 - checksum: 8d761fd81f5cf4845a09844a8a16717fc148137f364916165ce5e1ebfc5dfd89160d4b98e7e947c97f8707500050863606d0becb8c388997efcc31cafa6f5e31 + "@jest/test-result": ^27.5.1 + graceful-fs: ^4.2.9 + jest-haste-map: ^27.5.1 + jest-runtime: ^27.5.1 + checksum: f21f9c8bb746847f7f89accfd29d6046eec1446f0b54e4694444feaa4df379791f76ef0f5a4360aafcbc73b50bc979f68b8a7620de404019d3de166be6720cb0 languageName: node linkType: hard -"@jest/transform@npm:^27.4.6": - version: 27.4.6 - resolution: "@jest/transform@npm:27.4.6" +"@jest/transform@npm:^27.5.1": + version: 27.5.1 + resolution: "@jest/transform@npm:27.5.1" dependencies: "@babel/core": ^7.1.0 - "@jest/types": ^27.4.2 + "@jest/types": ^27.5.1 babel-plugin-istanbul: ^6.1.1 chalk: ^4.0.0 convert-source-map: ^1.4.0 fast-json-stable-stringify: ^2.0.0 - graceful-fs: ^4.2.4 - jest-haste-map: ^27.4.6 - jest-regex-util: ^27.4.0 - jest-util: ^27.4.2 + graceful-fs: ^4.2.9 + jest-haste-map: ^27.5.1 + jest-regex-util: ^27.5.1 + jest-util: ^27.5.1 micromatch: ^4.0.4 pirates: ^4.0.4 slash: ^3.0.0 source-map: ^0.6.1 write-file-atomic: ^3.0.0 - checksum: b2500fc5a7e7cad34547acdb8930797f021cda6b811ed0626564999bfd9ca856f52cc3a9b2ced5d037f3bd06a49b8b30cb7c10259318dc67bd11a564854d2ca6 + checksum: a22079121aedea0f20a03a9c026be971f7b92adbfb4d5fd1fb67be315741deac4f056936d7c72a53b24aa5a1071bc942c003925fd453bf3f6a0ae5da6384e137 languageName: node linkType: hard -"@jest/types@npm:^27.4.2": - version: 27.4.2 - resolution: "@jest/types@npm:27.4.2" +"@jest/types@npm:^27.5.1": + version: 27.5.1 + resolution: "@jest/types@npm:27.5.1" dependencies: "@types/istanbul-lib-coverage": ^2.0.0 "@types/istanbul-reports": ^3.0.0 "@types/node": "*" "@types/yargs": ^16.0.0 chalk: ^4.0.0 - checksum: 1191022023e32763063cc1c8b1143fa316fb05db2f9698280a7bdbafcabd989e5fd64f8eb875b8a2e54c53f25dba45ed2eea8ced394d9e484da0fda674cd17a5 + checksum: d1f43cc946d87543ddd79d49547aab2399481d34025d5c5f2025d3d99c573e1d9832fa83cef25e9d9b07a8583500229d15bbb07b8e233d127d911d133e2f14b1 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.0.3": + version: 3.0.6 + resolution: "@jridgewell/resolve-uri@npm:3.0.6" + checksum: e57cc08d2aaea6bd55e77e7a124beb2fcca87be28c0db6c2d69b7cb2cb4e14109bbef1d57ae6250bf5f4a4ad950f094ed99c8925adaf82336b66dab0ad6906e6 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10": + version: 1.4.11 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.11" + checksum: 3b2afaf8400fb07a36db60e901fcce6a746cdec587310ee9035939d89878e57b2dec8173b0b8f63176f647efa352294049a53c49739098eb907ff81fec2547c8 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.0": + version: 0.3.9 + resolution: "@jridgewell/trace-mapping@npm:0.3.9" + dependencies: + "@jridgewell/resolve-uri": ^3.0.3 + "@jridgewell/sourcemap-codec": ^1.4.10 + checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef languageName: node linkType: hard @@ -1197,12 +1227,12 @@ __metadata: languageName: node linkType: hard -"@npmcli/package-json@npm:^1.0.1": - version: 1.0.1 - resolution: "@npmcli/package-json@npm:1.0.1" +"@npmcli/package-json@npm:^2.0.0": + version: 2.0.0 + resolution: "@npmcli/package-json@npm:2.0.0" dependencies: json-parse-even-better-errors: ^2.3.1 - checksum: 08b66c8ddb1d6b678975a83006d2fe5070b3013bcb68ea9d54c0142538a614596ddfd1143183fbb8f82c5cecf477d98f3c4e473ef34df3bbf3814e97e37e18d3 + checksum: 7a598e42d2778654ec87438ebfafbcbafbe5a5f5e89ed2ca1db6ca3f94ef14655e304aa41f77632a2a3f5c66b6bd5960bd9370e0ceb4902ea09346720364f9e4 languageName: node linkType: hard @@ -1246,17 +1276,17 @@ __metadata: linkType: hard "@octokit/core@npm:^3.5.1": - version: 3.5.1 - resolution: "@octokit/core@npm:3.5.1" + version: 3.6.0 + resolution: "@octokit/core@npm:3.6.0" dependencies: "@octokit/auth-token": ^2.4.4 "@octokit/graphql": ^4.5.8 - "@octokit/request": ^5.6.0 + "@octokit/request": ^5.6.3 "@octokit/request-error": ^2.0.5 "@octokit/types": ^6.0.3 before-after-hook: ^2.2.0 universal-user-agent: ^6.0.0 - checksum: 67179739fc9712b201f2400f132287a2c56a18506e00900bc9d2a3f742b74f1ba69ad998e42f28f3964c0bd1d5478232c1ec7b485c97702b821fbe22b76afa90 + checksum: f81160129037bd8555d47db60cd5381637b7e3602ad70735a7bdf8f3d250c7b7114a666bb12ef7a8746a326a5d72ed30a1b8f8a5a170007f7285c8e217bef1f0 languageName: node linkType: hard @@ -1332,17 +1362,17 @@ __metadata: languageName: node linkType: hard -"@octokit/request@npm:^5.6.0": - version: 5.6.2 - resolution: "@octokit/request@npm:5.6.2" +"@octokit/request@npm:^5.6.0, @octokit/request@npm:^5.6.3": + version: 5.6.3 + resolution: "@octokit/request@npm:5.6.3" dependencies: "@octokit/endpoint": ^6.0.1 "@octokit/request-error": ^2.1.0 "@octokit/types": ^6.16.1 is-plain-object: ^5.0.0 - node-fetch: ^2.6.1 + node-fetch: ^2.6.7 universal-user-agent: ^6.0.0 - checksum: 51ef3ad244b3d89ffd6d997fa0ed3e13a7a93b4c868ce5c53b0fcc93a654965135528e62d0720ebfeb7dfd586448a4a45d08fd75ba2e170cfa19d37834e49f1f + checksum: c0b4542eb4baaf880d673c758d3e0b5c4a625a4ae30abf40df5548b35f1ff540edaac74625192b1aff42a79ac661e774da4ab7d5505f1cb4ef81239b1e8510c5 languageName: node linkType: hard @@ -1460,7 +1490,7 @@ __metadata: languageName: node linkType: hard -"@semantic-release/github@npm:^8.0.0": +"@semantic-release/github@npm:^8.0.0, @semantic-release/github@npm:^8.0.1": version: 8.0.4 resolution: "@semantic-release/github@npm:8.0.4" dependencies: @@ -1553,9 +1583,9 @@ __metadata: linkType: hard "@semrel-extra/npm@npm:^1.2.0": - version: 1.2.0 - resolution: "@semrel-extra/npm@npm:1.2.0" - checksum: ce899b2976323833695c1adba88bcc0698042a6234e0ce0742a081db23bc444215d6703d949c975beb796dad9112762b0c65d289aa6f7e0a872301fda0a9d4dd + version: 1.2.2 + resolution: "@semrel-extra/npm@npm:1.2.2" + checksum: 39fd8c6af5f70fffb2584a02c71d326d0b2a2e2caf4d779c1d6b23df40625baf15b8701b893844e9545cfa689b26ef161033cd822c9a7b6bf890b3dc34d5a7b7 languageName: node linkType: hard @@ -1572,11 +1602,11 @@ __metadata: linkType: hard "@sideway/address@npm:^4.1.3": - version: 4.1.3 - resolution: "@sideway/address@npm:4.1.3" + version: 4.1.4 + resolution: "@sideway/address@npm:4.1.4" dependencies: "@hapi/hoek": ^9.0.0 - checksum: 3c1faf6ef37a0b59b62ce42b59c012c00ef1fc4194ad6776c65c2f9a6dd6c1710c6f6362b3ca3fa582fdb93984f0cb64ca44f9f5e02940634805f5e561279c22 + checksum: b9fca2a93ac2c975ba12e0a6d97853832fb1f4fb02393015e012b47fa916a75ca95102d77214b2a29a2784740df2407951af8c5dde054824c65577fd293c4cdb languageName: node linkType: hard @@ -1601,13 +1631,6 @@ __metadata: languageName: node linkType: hard -"@sindresorhus/is@npm:^4.0.0": - version: 4.6.0 - resolution: "@sindresorhus/is@npm:4.6.0" - checksum: 83839f13da2c29d55c97abc3bc2c55b250d33a0447554997a85c539e058e57b8da092da396e252b11ec24a0279a0bed1f537fa26302209327060643e327f81d2 - languageName: node - linkType: hard - "@sinonjs/commons@npm:^1.7.0": version: 1.8.3 resolution: "@sinonjs/commons@npm:1.8.3" @@ -1626,15 +1649,6 @@ __metadata: languageName: node linkType: hard -"@szmarczak/http-timer@npm:^4.0.5": - version: 4.0.6 - resolution: "@szmarczak/http-timer@npm:4.0.6" - dependencies: - defer-to-connect: ^2.0.0 - checksum: c29df3bcec6fc3bdec2b17981d89d9c9fc9bd7d0c9bcfe92821dc533f4440bc890ccde79971838b4ceed1921d456973c4180d7175ee1d0023ad0562240a58d95 - languageName: node - linkType: hard - "@tootallnate/once@npm:1": version: 1.1.2 resolution: "@tootallnate/once@npm:1.1.2" @@ -1650,15 +1664,15 @@ __metadata: linkType: hard "@types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.14": - version: 7.1.18 - resolution: "@types/babel__core@npm:7.1.18" + version: 7.1.19 + resolution: "@types/babel__core@npm:7.1.19" dependencies: "@babel/parser": ^7.1.0 "@babel/types": ^7.0.0 "@types/babel__generator": "*" "@types/babel__template": "*" "@types/babel__traverse": "*" - checksum: 2e5b5d7c84f347d3789575486e58b0df5c91613abc3d27e716274aba3048518e07e1f068250ba829e2ed58532ccc88da595ce95ba2688e7bbcd7c25a3c6627ed + checksum: 8c9fa87a1c2224cbec251683a58bebb0d74c497118034166aaa0491a4e2627998a6621fc71f8a60ffd27d9c0c52097defedf7637adc6618d0331c15adb302338 languageName: node linkType: hard @@ -1682,23 +1696,11 @@ __metadata: linkType: hard "@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.4, @types/babel__traverse@npm:^7.0.6": - version: 7.14.2 - resolution: "@types/babel__traverse@npm:7.14.2" + version: 7.17.0 + resolution: "@types/babel__traverse@npm:7.17.0" dependencies: "@babel/types": ^7.3.0 - checksum: a797ea09c72307569e3ee08aa3900ca744ce3091114084f2dc59b67a45ee7d01df7865252790dbfa787a7915ce892cdc820c9b920f3683292765fc656b08dc63 - languageName: node - linkType: hard - -"@types/cacheable-request@npm:^6.0.1": - version: 6.0.2 - resolution: "@types/cacheable-request@npm:6.0.2" - dependencies: - "@types/http-cache-semantics": "*" - "@types/keyv": "*" - "@types/node": "*" - "@types/responselike": "*" - checksum: 667d25808dbf46fe104d6f029e0281ff56058d50c7c1b9182774b3e38bb9c1124f56e4c367ba54f92dbde2d1cc573f26eb0e9748710b2822bc0fd1e5498859c6 + checksum: b9a4acfc260179168d840c7f17e6b8b3ab4e7ebbce47b3308dd748683136518ab8636e2dcbf8d619fece0db7e561e08def9ede29269b7210a761763a26ece66a languageName: node linkType: hard @@ -1711,13 +1713,6 @@ __metadata: languageName: node linkType: hard -"@types/http-cache-semantics@npm:*": - version: 4.0.1 - resolution: "@types/http-cache-semantics@npm:4.0.1" - checksum: 1048aacf627829f0d5f00184e16548205cd9f964bf0841c29b36bc504509230c40bc57c39778703a1c965a6f5b416ae2cbf4c1d4589c889d2838dd9dbfccf6e9 - languageName: node - linkType: hard - "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": version: 2.0.4 resolution: "@types/istanbul-lib-coverage@npm:2.0.4" @@ -1744,12 +1739,12 @@ __metadata: linkType: hard "@types/jest@npm:^27.0.3, @types/jest@npm:^27.4.0": - version: 27.4.0 - resolution: "@types/jest@npm:27.4.0" + version: 27.4.1 + resolution: "@types/jest@npm:27.4.1" dependencies: - jest-diff: ^27.0.0 + jest-matcher-utils: ^27.0.0 pretty-format: ^27.0.0 - checksum: d2350267f954f9a2e4a15e5f02fbf19a77abfb9fd9e57a954de1fb0e9a0d3d5f8d3646ac7d9c42aeb4b4d828d2e70624ec149c85bb50a48634a54eed8429e1f8 + checksum: 5184f3eef4832d01ee8f59bed15eec45ccc8e29c724a5e6ce37bf74396b37bdf04f557000f45ba4fc38ae6075cf9cfcce3d7a75abc981023c61ceb27230a93e4 languageName: node linkType: hard @@ -1761,9 +1756,9 @@ __metadata: linkType: hard "@types/json-schema@npm:^7.0.7": - version: 7.0.9 - resolution: "@types/json-schema@npm:7.0.9" - checksum: 259d0e25f11a21ba5c708f7ea47196bd396e379fddb79c76f9f4f62c945879dc21657904914313ec2754e443c5018ea8372362f323f30e0792897fdb2098a705 + version: 7.0.11 + resolution: "@types/json-schema@npm:7.0.11" + checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d languageName: node linkType: hard @@ -1774,7 +1769,7 @@ __metadata: languageName: node linkType: hard -"@types/keyv@npm:*, @types/keyv@npm:^3.1.1": +"@types/keyv@npm:^3.1.1": version: 3.1.4 resolution: "@types/keyv@npm:3.1.4" dependencies: @@ -1798,9 +1793,9 @@ __metadata: linkType: hard "@types/node@npm:^17.0.8": - version: 17.0.8 - resolution: "@types/node@npm:17.0.8" - checksum: f4cadeb9e602027520abc88c77142697e33cf6ac98bb02f8b595a398603cbd33df1f94d01c055c9f13cde0c8eaafc5e396ca72645458d42b4318b845bc7f1d0f + version: 17.0.27 + resolution: "@types/node@npm:17.0.27" + checksum: 6645ca813c24dcb9893729ed6f87a9e415d6df03cb3e1ececa3a03ca845d3324c3808b4dc79c08a4b3c7d1ccd515e6d7e004db9c9123c9333e963675238e39fc languageName: node linkType: hard @@ -1819,12 +1814,12 @@ __metadata: linkType: hard "@types/pino-pretty@npm:*": - version: 4.7.4 - resolution: "@types/pino-pretty@npm:4.7.4" + version: 4.7.5 + resolution: "@types/pino-pretty@npm:4.7.5" dependencies: "@types/node": "*" "@types/pino": 6.3 - checksum: 1fc6e73de3ffc23eacb69070212e4dd838dd3a353326072aaf68bf5a4418f919c535cc4719a0c51ec6832f298f1d8da9d97376c748166c61369b77ffde858aec + checksum: 80b3e80d1d9b52f015382bbd544206228d0c35eed1a0e1443245568eee01191b5fe916e7821de2922846f267e5d0693f4796562d3bcf24266156d1abc9e2e673 languageName: node linkType: hard @@ -1850,13 +1845,13 @@ __metadata: linkType: hard "@types/prettier@npm:^2.1.5": - version: 2.4.2 - resolution: "@types/prettier@npm:2.4.2" - checksum: 76e230b2d11028af11fe12e09b2d5b10b03738e9abf819ae6ebb0f78cac13d39f860755ce05ac3855b608222518d956628f5d00322dc206cc6d1f2d8d1519f1e + version: 2.6.0 + resolution: "@types/prettier@npm:2.6.0" + checksum: 946f1f82ce6f31664e023a5d65931c31b7d677b454f528f67dce851d72e7fcfe713076f4251b16c3646eecf1545f5f5b909b4962966341ed9ddf5b80113b3674 languageName: node linkType: hard -"@types/responselike@npm:*, @types/responselike@npm:^1.0.0": +"@types/responselike@npm:^1.0.0": version: 1.0.0 resolution: "@types/responselike@npm:1.0.0" dependencies: @@ -1887,9 +1882,9 @@ __metadata: linkType: hard "@types/yargs-parser@npm:*": - version: 20.2.1 - resolution: "@types/yargs-parser@npm:20.2.1" - checksum: 1d039e64494a7a61ddd278349a3dc60b19f99ff0517425696e796f794e4252452b9d62178e69755ad03f439f9dc0c8c3d7b3a1201b3a24e134bac1a09fa11eaa + version: 21.0.0 + resolution: "@types/yargs-parser@npm:21.0.0" + checksum: b2f4c8d12ac18a567440379909127cf2cec393daffb73f246d0a25df36ea983b93b7e9e824251f959e9f928cbc7c1aab6728d0a0ff15d6145f66cec2be67d9a2 languageName: node linkType: hard @@ -2015,9 +2010,9 @@ __metadata: linkType: hard "abab@npm:^2.0.3, abab@npm:^2.0.5": - version: 2.0.5 - resolution: "abab@npm:2.0.5" - checksum: 0ec951b46d5418c2c2f923021ec193eaebdb4e802ffd5506286781b454be722a13a8430f98085cd3e204918401d9130ec6cc8f5ae19be315b3a0e857d83196e1 + version: 2.0.6 + resolution: "abab@npm:2.0.6" + checksum: 6ffc1af4ff315066c62600123990d87551ceb0aafa01e6539da77b0f5987ac7019466780bf480f1787576d4385e3690c81ccc37cfda12819bf510b8ab47e5a3e languageName: node linkType: hard @@ -2064,11 +2059,11 @@ __metadata: linkType: hard "acorn@npm:^8.2.4": - version: 8.7.0 - resolution: "acorn@npm:8.7.0" + version: 8.7.1 + resolution: "acorn@npm:8.7.1" bin: acorn: bin/acorn - checksum: e0f79409d68923fbf1aa6d4166f3eedc47955320d25c89a20cc822e6ba7c48c5963d5bc657bc242d68f7a4ac9faf96eef033e8f73656da6c640d4219935fdfd0 + checksum: aca0aabf98826717920ac2583fdcad0a6fbe4e583fdb6e843af2594e907455aeafe30b1e14f1757cd83ce1776773cf8296ffc3a4acf13f0bd3dfebcf1db6ae80 languageName: node linkType: hard @@ -2115,14 +2110,14 @@ __metadata: linkType: hard "ajv@npm:^8.0.1": - version: 8.8.2 - resolution: "ajv@npm:8.8.2" + version: 8.11.0 + resolution: "ajv@npm:8.11.0" dependencies: fast-deep-equal: ^3.1.1 json-schema-traverse: ^1.0.0 require-from-string: ^2.0.2 uri-js: ^4.2.2 - checksum: 90849ef03c4f4f7051d15f655120137b89e3205537d683beebd39d95f40c0ca00ea8476cd999602d2f433863e7e4bf1b81d1869d1e07f4dcf56d71b6430a605c + checksum: 5e0ff226806763be73e93dd7805b634f6f5921e3e90ca04acdf8db81eed9d8d3f0d4c5f1213047f45ebbf8047ffe0c840fa1ef2ec42c3a644899f69aa72b5bef languageName: node linkType: hard @@ -2181,13 +2176,6 @@ __metadata: languageName: node linkType: hard -"ansistyles@npm:~0.1.3": - version: 0.1.3 - resolution: "ansistyles@npm:0.1.3" - checksum: 0072507f97e46cc3cb71439f1c0935ceec5c8bca812ebb5034b9f8f6a9ee7d65cdc150c375b8d56643fc8305a08542f6df3a1cd6c80e32eba0b27c4e72da4efd - languageName: node - linkType: hard - "anymatch@npm:^1.3.0": version: 1.3.2 resolution: "anymatch@npm:1.3.2" @@ -2329,13 +2317,14 @@ __metadata: linkType: hard "array.prototype.flat@npm:^1.2.5": - version: 1.2.5 - resolution: "array.prototype.flat@npm:1.2.5" + version: 1.3.0 + resolution: "array.prototype.flat@npm:1.3.0" dependencies: call-bind: ^1.0.2 define-properties: ^1.1.3 - es-abstract: ^1.19.0 - checksum: 9cc6414b111abfc7717e39546e4887b1e5ec74df8f1618d83425deaa95752bf05d475d1d241253b4d88d4a01f8e1bc84845ad5b7cc2047f8db2f614512acd40e + es-abstract: ^1.19.2 + es-shim-unscopables: ^1.0.0 + checksum: 2a652b3e8dc0bebb6117e42a5ab5738af0203a14c27341d7bb2431467bdb4b348e2c5dc555dfcda8af0a5e4075c400b85311ded73861c87290a71a17c3e0a257 languageName: node linkType: hard @@ -2404,21 +2393,21 @@ __metadata: languageName: node linkType: hard -"babel-jest@npm:^27.4.6": - version: 27.4.6 - resolution: "babel-jest@npm:27.4.6" +"babel-jest@npm:^27.5.1": + version: 27.5.1 + resolution: "babel-jest@npm:27.5.1" dependencies: - "@jest/transform": ^27.4.6 - "@jest/types": ^27.4.2 + "@jest/transform": ^27.5.1 + "@jest/types": ^27.5.1 "@types/babel__core": ^7.1.14 babel-plugin-istanbul: ^6.1.1 - babel-preset-jest: ^27.4.0 + babel-preset-jest: ^27.5.1 chalk: ^4.0.0 - graceful-fs: ^4.2.4 + graceful-fs: ^4.2.9 slash: ^3.0.0 peerDependencies: "@babel/core": ^7.8.0 - checksum: fc839d5e8788170e68c8cbde9466fdf1c4fc740a947ba0728e1933ade7ad6fe744c9276d86207f093b64e9cf72a1fdd756fbc44c21034282f01832338e7a8a80 + checksum: 4e93e6e9fb996cc5f1505e924eb8e8cc7b25c294ba9629762a2715390f48af6a4c14dbb84cd9730013ac0e03267a5a9aa2fb6318c544489cda7f50f4e506def4 languageName: node linkType: hard @@ -2435,15 +2424,15 @@ __metadata: languageName: node linkType: hard -"babel-plugin-jest-hoist@npm:^27.4.0": - version: 27.4.0 - resolution: "babel-plugin-jest-hoist@npm:27.4.0" +"babel-plugin-jest-hoist@npm:^27.5.1": + version: 27.5.1 + resolution: "babel-plugin-jest-hoist@npm:27.5.1" dependencies: "@babel/template": ^7.3.3 "@babel/types": ^7.3.3 "@types/babel__core": ^7.0.0 "@types/babel__traverse": ^7.0.6 - checksum: 48f216f286f2fb3b1d571b4ba4ccffdb0c11a2fb1117e4c355b26c8cef09603abd96a5c1f8442866830a7da5accdd9ae4805f3e977b606a596b4a259f2ff5a67 + checksum: 709c17727aa8fd3be755d256fb514bf945a5c2ea6017f037d80280fc44ae5fe7dfeebf63d8412df53796455c2c216119d628d8cc90b099434fd819005943d058 languageName: node linkType: hard @@ -2469,15 +2458,15 @@ __metadata: languageName: node linkType: hard -"babel-preset-jest@npm:^27.4.0": - version: 27.4.0 - resolution: "babel-preset-jest@npm:27.4.0" +"babel-preset-jest@npm:^27.5.1": + version: 27.5.1 + resolution: "babel-preset-jest@npm:27.5.1" dependencies: - babel-plugin-jest-hoist: ^27.4.0 + babel-plugin-jest-hoist: ^27.5.1 babel-preset-current-node-syntax: ^1.0.0 peerDependencies: "@babel/core": ^7.0.0 - checksum: 744449cc63283116e8268c088a714d9c26d93af8d6051523b900517b665e0122239fc6a326de206657d423f4cccfaf2437ef099fcdfbfd91c4cdde6b1c55c11f + checksum: 251bcea11c18fd9672fec104eadb45b43f117ceeb326fa7345ced778d4c1feab29343cd7a87a1dcfae4997d6c851a8b386d7f7213792da6e23b74f4443a8976d languageName: node linkType: hard @@ -2660,7 +2649,7 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.1": +"braces@npm:^3.0.2": version: 3.0.2 resolution: "braces@npm:3.0.2" dependencies: @@ -2677,17 +2666,17 @@ __metadata: linkType: hard "browserslist@npm:^4.17.5": - version: 4.19.1 - resolution: "browserslist@npm:4.19.1" + version: 4.20.3 + resolution: "browserslist@npm:4.20.3" dependencies: - caniuse-lite: ^1.0.30001286 - electron-to-chromium: ^1.4.17 + caniuse-lite: ^1.0.30001332 + electron-to-chromium: ^1.4.118 escalade: ^3.1.1 - node-releases: ^2.0.1 + node-releases: ^2.0.3 picocolors: ^1.0.0 bin: browserslist: cli.js - checksum: c0777fd483691638fd6801e16c9d809e1d65f6d2b06db2e806654be51045cbab1452a89841a2c5caea2cbe19d621b4f1d391cffbb24512aa33280039ab345875 + checksum: 1e4b719ac2ca0fe235218a606e8b8ef16b8809e0973b924158c39fbc435a0b0fe43437ea52dd6ef5ad2efcb83fcb07431244e472270177814217f7c563651f7d languageName: node linkType: hard @@ -2757,13 +2746,6 @@ __metadata: languageName: node linkType: hard -"builtins@npm:^1.0.3": - version: 1.0.3 - resolution: "builtins@npm:1.0.3" - checksum: 47ce94f7eee0e644969da1f1a28e5f29bd2e48b25b2bbb61164c345881086e29464ccb1fb88dbc155ea26e8b1f5fc8a923b26c8c1ed0935b67b644d410674513 - languageName: node - linkType: hard - "builtins@npm:^5.0.0": version: 5.0.1 resolution: "builtins@npm:5.0.1" @@ -2816,13 +2798,6 @@ __metadata: languageName: node linkType: hard -"cacheable-lookup@npm:^5.0.3": - version: 5.0.4 - resolution: "cacheable-lookup@npm:5.0.4" - checksum: 763e02cf9196bc9afccacd8c418d942fc2677f22261969a4c2c2e760fa44a2351a81557bd908291c3921fe9beb10b976ba8fa50c5ca837c5a0dd945f16468f2d - languageName: node - linkType: hard - "cacheable-request@npm:^2.1.1": version: 2.1.4 resolution: "cacheable-request@npm:2.1.4" @@ -2838,21 +2813,6 @@ __metadata: languageName: node linkType: hard -"cacheable-request@npm:^7.0.2": - version: 7.0.2 - resolution: "cacheable-request@npm:7.0.2" - dependencies: - clone-response: ^1.0.2 - get-stream: ^5.1.0 - http-cache-semantics: ^4.0.0 - keyv: ^4.0.0 - lowercase-keys: ^2.0.0 - normalize-url: ^6.0.1 - responselike: ^2.0.0 - checksum: 6152813982945a5c9989cb457a6c499f12edcc7ade323d2fbfd759abc860bdbd1306e08096916bb413c3c47e812f8e4c0a0cc1e112c8ce94381a960f115bc77f - languageName: node - linkType: hard - "call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": version: 1.0.2 resolution: "call-bind@npm:1.0.2" @@ -2907,10 +2867,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001286": - version: 1.0.30001297 - resolution: "caniuse-lite@npm:1.0.30001297" - checksum: 4f0d298cf32c050aa1d8a7bb33ef6ff5f289e6dd6dad48b364bc2db91e03b5f0089ffa9950d6228dbd43446695cecd1990601b432a8d03c1d5b2e945cb67bade +"caniuse-lite@npm:^1.0.30001332": + version: 1.0.30001332 + resolution: "caniuse-lite@npm:1.0.30001332" + checksum: e54182ea42ab3d2ff1440f9a6480292f7ab23c00c188df7ad65586312e4da567e8bedd5cb5fb8f0ff4193dc027a54e17e0b3c0b6db5d5a3fb61c7726ff9c45b3 languageName: node linkType: hard @@ -3058,15 +3018,15 @@ __metadata: linkType: hard "cli-table3@npm:^0.6.1": - version: 0.6.1 - resolution: "cli-table3@npm:0.6.1" + version: 0.6.2 + resolution: "cli-table3@npm:0.6.2" dependencies: - colors: 1.4.0 + "@colors/colors": 1.5.0 string-width: ^4.2.0 dependenciesMeta: - colors: + "@colors/colors": optional: true - checksum: 956e175f8eb019c26465b9f1e51121c08d8978e2aab04be7f8520ea8a4e67906fcbd8516dfb77e386ae3730ef0281aa21a65613dffbfa3d62969263252bd25a9 + checksum: 2f82391698b8a2a2a5e45d2adcfea5d93e557207f90455a8d4c1aac688e9b18a204d9eb4ba1d322fa123b17d64ea3dc5e11de8b005529f3c3e7dbeb27cb4d9be languageName: node linkType: hard @@ -3088,7 +3048,7 @@ __metadata: languageName: node linkType: hard -"clone-response@npm:1.0.2, clone-response@npm:^1.0.2": +"clone-response@npm:1.0.2": version: 1.0.2 resolution: "clone-response@npm:1.0.2" dependencies: @@ -3162,13 +3122,6 @@ __metadata: languageName: node linkType: hard -"colors@npm:1.4.0": - version: 1.4.0 - resolution: "colors@npm:1.4.0" - checksum: 98aa2c2418ad87dedf25d781be69dc5fc5908e279d9d30c34d8b702e586a0474605b3a189511482b9d5ed0d20c867515d22749537f7bc546256c6014f3ebdcec - languageName: node - linkType: hard - "columnify@npm:^1.6.0": version: 1.6.0 resolution: "columnify@npm:1.6.0" @@ -3348,9 +3301,9 @@ __metadata: linkType: hard "core-util-is@npm:~1.0.0": - version: 1.0.2 - resolution: "core-util-is@npm:1.0.2" - checksum: 7a4c925b497a2c91421e25bf76d6d8190f0b2359a9200dbeed136e63b2931d6294d3b1893eda378883ed363cd950f44a12a401384c609839ea616befb7927dab + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 languageName: node linkType: hard @@ -3565,15 +3518,6 @@ __metadata: languageName: node linkType: hard -"decompress-response@npm:^6.0.0": - version: 6.0.0 - resolution: "decompress-response@npm:6.0.0" - dependencies: - mimic-response: ^3.1.0 - checksum: d377cf47e02d805e283866c3f50d3d21578b779731e8c5072d6ce8c13cc31493db1c2f6784da9d1d5250822120cefa44f1deab112d5981015f2e17444b763812 - languageName: node - linkType: hard - "decompress-tar@npm:^4.0.0, decompress-tar@npm:^4.1.0, decompress-tar@npm:^4.1.1": version: 4.1.1 resolution: "decompress-tar@npm:4.1.1" @@ -3674,19 +3618,13 @@ __metadata: languageName: node linkType: hard -"defer-to-connect@npm:^2.0.0": - version: 2.0.1 - resolution: "defer-to-connect@npm:2.0.1" - checksum: 8a9b50d2f25446c0bfefb55a48e90afd58f85b21bcf78e9207cd7b804354f6409032a1705c2491686e202e64fc05f147aa5aa45f9aa82627563f045937f5791b - languageName: node - linkType: hard - "define-properties@npm:^1.1.3": - version: 1.1.3 - resolution: "define-properties@npm:1.1.3" + version: 1.1.4 + resolution: "define-properties@npm:1.1.4" dependencies: - object-keys: ^1.0.12 - checksum: da80dba55d0cd76a5a7ab71ef6ea0ebcb7b941f803793e4e0257b384cb772038faa0c31659d244e82c4342edef841c1a1212580006a05a5068ee48223d787317 + has-property-descriptors: ^1.0.0 + object-keys: ^1.1.1 + checksum: ce0aef3f9eb193562b5cfb79b2d2c86b6a109dfc9fdcb5f45d680631a1a908c06824ddcdb72b7573b54e26ace07f0a23420aaba0d5c627b34d2c1de8ef527e2b languageName: node linkType: hard @@ -3793,10 +3731,10 @@ __metadata: languageName: node linkType: hard -"diff-sequences@npm:^27.4.0": - version: 27.4.0 - resolution: "diff-sequences@npm:27.4.0" - checksum: 66d04033e8632eeacdd029b4ecaf87d233d475e4b0cd1cee035eda99e70e1a7f803507d72f2677990ef526f28a2f6e5709af8d94dcdc0682b8884a3a646190a1 +"diff-sequences@npm:^27.5.1": + version: 27.5.1 + resolution: "diff-sequences@npm:27.5.1" + checksum: a00db5554c9da7da225db2d2638d85f8e41124eccbd56cbaefb3b276dcbb1c1c2ad851c32defe2055a54a4806f030656cbf6638105fd6ce97bb87b90b32a33ca languageName: node linkType: hard @@ -3913,10 +3851,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.17": - version: 1.4.37 - resolution: "electron-to-chromium@npm:1.4.37" - checksum: d5da221e456bdbd23d554d1362c3e544fb3d384680a8a9fe5027e855f4a16986e7ccfa2924ba8b24f40b47eadd81738db8d2cc6388b5b6386dfadee7bada2155 +"electron-to-chromium@npm:^1.4.118": + version: 1.4.122 + resolution: "electron-to-chromium@npm:1.4.122" + checksum: 8af3e4ec8d7429a301bd3e2df42c5899d590dc93b750ef74aa3244c5343b01bd3048e98bd6f13073bf3d053c6931ccda6827d8f47ba8022d7ba3c74003321cae languageName: node linkType: hard @@ -3995,9 +3933,9 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1": - version: 1.19.1 - resolution: "es-abstract@npm:1.19.1" +"es-abstract@npm:^1.19.1, es-abstract@npm:^1.19.2": + version: 1.19.5 + resolution: "es-abstract@npm:1.19.5" dependencies: call-bind: ^1.0.2 es-to-primitive: ^1.2.1 @@ -4005,21 +3943,30 @@ __metadata: get-intrinsic: ^1.1.1 get-symbol-description: ^1.0.0 has: ^1.0.3 - has-symbols: ^1.0.2 + has-symbols: ^1.0.3 internal-slot: ^1.0.3 is-callable: ^1.2.4 - is-negative-zero: ^2.0.1 + is-negative-zero: ^2.0.2 is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.1 + is-shared-array-buffer: ^1.0.2 is-string: ^1.0.7 - is-weakref: ^1.0.1 - object-inspect: ^1.11.0 + is-weakref: ^1.0.2 + object-inspect: ^1.12.0 object-keys: ^1.1.1 object.assign: ^4.1.2 string.prototype.trimend: ^1.0.4 string.prototype.trimstart: ^1.0.4 unbox-primitive: ^1.0.1 - checksum: b6be8410672c5364db3fb01eb786e30c7b4bb32b4af63d381c08840f4382c4a168e7855cd338bf59d4f1a1a1138f4d748d1fd40ec65aaa071876f9e9fbfed949 + checksum: 55199b0f179a12b3b0ec9c9f2e3a27a7561686e4f88d46f9ef32c836448a336e367c14d8f792612fc83a64113896e478259e4dffbbcffb3efdd06650f6360324 + languageName: node + linkType: hard + +"es-shim-unscopables@npm:^1.0.0": + version: 1.0.0 + resolution: "es-shim-unscopables@npm:1.0.0" + dependencies: + has: ^1.0.3 + checksum: 83e95cadbb6ee44d3644dfad60dcad7929edbc42c85e66c3e99aefd68a3a5c5665f2686885cddb47dfeabfd77bd5ea5a7060f2092a955a729bbd8834f0d86fa1 languageName: node linkType: hard @@ -4055,13 +4002,6 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:^3.0.0": - version: 3.0.0 - resolution: "escape-string-regexp@npm:3.0.0" - checksum: 3df0560857b2c81c02b264268940f2c81d58886c434200216d4884a3a3880dc539114efa1c692f8d1c09b307b0fba857f0f8df51faf51cd88d8569e67d78d9d8 - languageName: node - linkType: hard - "escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" @@ -4144,36 +4084,36 @@ __metadata: languageName: node linkType: hard -"eslint-module-utils@npm:^2.7.2": - version: 2.7.2 - resolution: "eslint-module-utils@npm:2.7.2" +"eslint-module-utils@npm:^2.7.3": + version: 2.7.3 + resolution: "eslint-module-utils@npm:2.7.3" dependencies: debug: ^3.2.7 find-up: ^2.1.0 - checksum: 3e6407461d12b1568556fc9a84668415693ecce92d17d7407353defcfcafec5d3d8dfa2d9eda3743b3b53ef04101d8aa69072b3d634d92e766c3dfa10505542d + checksum: 77048263f309167a1e6a1e1b896bfb5ddd1d3859b2e2abbd9c32c432aee13d610d46e6820b1ca81b37fba437cf423a404bc6649be64ace9148a3062d1886a678 languageName: node linkType: hard "eslint-plugin-import@npm:^2.22.1": - version: 2.25.4 - resolution: "eslint-plugin-import@npm:2.25.4" + version: 2.26.0 + resolution: "eslint-plugin-import@npm:2.26.0" dependencies: array-includes: ^3.1.4 array.prototype.flat: ^1.2.5 debug: ^2.6.9 doctrine: ^2.1.0 eslint-import-resolver-node: ^0.3.6 - eslint-module-utils: ^2.7.2 + eslint-module-utils: ^2.7.3 has: ^1.0.3 - is-core-module: ^2.8.0 + is-core-module: ^2.8.1 is-glob: ^4.0.3 - minimatch: ^3.0.4 + minimatch: ^3.1.2 object.values: ^1.1.5 - resolve: ^1.20.0 - tsconfig-paths: ^3.12.0 + resolve: ^1.22.0 + tsconfig-paths: ^3.14.1 peerDependencies: eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: 0af24f5c7c6ca692f42e3947127f0ae7dfe44f1e02740f7cbe988b510a9c52bab0065d7df04e2d953dcc88a4595a00cbdcf14018acf8cd75cfd47b72efcbb734 + checksum: 0bf77ad80339554481eafa2b1967449e1f816b94c7a6f9614ce33fb4083c4e6c050f10d241dd50b4975d47922880a34de1e42ea9d8e6fd663ebb768baa67e655 languageName: node linkType: hard @@ -4445,15 +4385,15 @@ __metadata: languageName: node linkType: hard -"expect@npm:^27.4.6": - version: 27.4.6 - resolution: "expect@npm:27.4.6" +"expect@npm:^27.5.1": + version: 27.5.1 + resolution: "expect@npm:27.5.1" dependencies: - "@jest/types": ^27.4.2 - jest-get-type: ^27.4.0 - jest-matcher-utils: ^27.4.6 - jest-message-util: ^27.4.6 - checksum: 593eaa8ff34320f9a70f961bc25eeae932df4f48ebcc5ecc1033f1cddffd286fc42a2f312929222541cec1077de2604ff4fc6e97012afcbd36b333bfaba82f7f + "@jest/types": ^27.5.1 + jest-get-type: ^27.5.1 + jest-matcher-utils: ^27.5.1 + jest-message-util: ^27.5.1 + checksum: b2c66beb52de53ef1872165aace40224e722bca3c2274c54cfa74b6d617d55cf0ccdbf36783ccd64dbea501b280098ed33fd0b207d4f15bc03cd3c7a24364a6a languageName: node linkType: hard @@ -4545,7 +4485,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.1.1, fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.7": +"fast-glob@npm:^3.1.1, fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9": version: 3.2.11 resolution: "fast-glob@npm:3.2.11" dependencies: @@ -4745,13 +4685,6 @@ __metadata: languageName: node linkType: hard -"filter-obj@npm:^1.1.0": - version: 1.1.0 - resolution: "filter-obj@npm:1.1.0" - checksum: cf2104a7c45ff48e7f505b78a3991c8f7f30f28bd8106ef582721f321f1c6277f7751aacd5d83026cb079d9d5091082f588d14a72e7c5d720ece79118fa61e10 - languageName: node - linkType: hard - "find-index@npm:^0.1.1": version: 0.1.1 resolution: "find-index@npm:0.1.1" @@ -4808,9 +4741,9 @@ __metadata: linkType: hard "flatted@npm:^3.1.0": - version: 3.2.4 - resolution: "flatted@npm:3.2.4" - checksum: 7d33846428ab337ec81ef9b8b9103894c1c81f5f67feb32bd4ed106fbc47da60d56edb42efd36c9f1f30a010272aeccd34ec1ffacfe9dfdff19673b1d4df481b + version: 3.2.5 + resolution: "flatted@npm:3.2.5" + checksum: 3c436e9695ccca29620b4be5671dd72e5dd0a7500e0856611b7ca9bd8169f177f408c3b9abfa78dfe1493ee2d873e2c119080a8a9bee4e1a186a9e60ca6c89f1 languageName: node linkType: hard @@ -4841,17 +4774,6 @@ __metadata: languageName: node linkType: hard -"form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.8 - mime-types: ^2.1.12 - checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c - languageName: node - linkType: hard - "fragment-cache@npm:^0.2.1": version: 0.2.1 resolution: "fragment-cache@npm:0.2.1" @@ -4886,13 +4808,13 @@ __metadata: linkType: hard "fs-extra@npm:^10.0.0": - version: 10.0.1 - resolution: "fs-extra@npm:10.0.1" + version: 10.1.0 + resolution: "fs-extra@npm:10.1.0" dependencies: graceful-fs: ^4.2.0 jsonfile: ^6.0.1 universalify: ^2.0.0 - checksum: c1faaa5eb9e1c5c7c7ff09f966e93922ecb068ae1b04801cfc983ef05fcc1f66bfbb8d8d0b745c910014c7a2e7317fb6cf3bfe7390450c1157e3cc1a218f221d + checksum: dc94ab37096f813cc3ca12f0f1b5ad6744dfed9ed21e953d72530d103cea193c2f81584a39e9dee1bea36de5ee66805678c0dddc048e8af1427ac19c00fffc50 languageName: node linkType: hard @@ -5079,15 +5001,6 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^5.1.0": - version: 5.2.0 - resolution: "get-stream@npm:5.2.0" - dependencies: - pump: ^3.0.0 - checksum: 8bc1a23174a06b2b4ce600df38d6c98d2ef6d84e020c1ddad632ad75bac4e092eeb40e4c09e0761c35fc2dbc5e7fff5dab5e763a383582c4a167dd69a905bd12 - languageName: node - linkType: hard - "get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": version: 6.0.1 resolution: "get-stream@npm:6.0.1" @@ -5199,15 +5112,15 @@ __metadata: linkType: hard "globals@npm:^13.6.0, globals@npm:^13.9.0": - version: 13.12.0 - resolution: "globals@npm:13.12.0" + version: 13.13.0 + resolution: "globals@npm:13.13.0" dependencies: type-fest: ^0.20.2 - checksum: 1f959abb11117916468a1afcba527eead152900cad652c8383c4e8976daea7ec55e1ee30c086f48d1b8655719f214e9d92eca083c3a43b5543bc4056e7e5fccf + checksum: c55ea8fd3afecb72567bac41605577e19e68476993dfb0ca4c49b86075af5f0ae3f0f5502525f69010f7c5ea5db6a1c540a80a4f80ebdfb2f686d87b0f05d7e9 languageName: node linkType: hard -"globby@npm:11.0.4, globby@npm:^11.0.0, globby@npm:^11.0.1, globby@npm:^11.0.3": +"globby@npm:11.0.4": version: 11.0.4 resolution: "globby@npm:11.0.4" dependencies: @@ -5234,22 +5147,17 @@ __metadata: languageName: node linkType: hard -"got@npm:^11.0.0": - version: 11.8.3 - resolution: "got@npm:11.8.3" +"globby@npm:^11.0.0, globby@npm:^11.0.1, globby@npm:^11.0.3": + version: 11.1.0 + resolution: "globby@npm:11.1.0" dependencies: - "@sindresorhus/is": ^4.0.0 - "@szmarczak/http-timer": ^4.0.5 - "@types/cacheable-request": ^6.0.1 - "@types/responselike": ^1.0.0 - cacheable-lookup: ^5.0.3 - cacheable-request: ^7.0.2 - decompress-response: ^6.0.0 - http2-wrapper: ^1.0.0-beta.5.2 - lowercase-keys: ^2.0.0 - p-cancelable: ^2.0.0 - responselike: ^2.0.0 - checksum: 3b6db107d9765470b18e4cb22f7c7400381be7425b9be5823f0168d6c21b5d6b28b023c0b3ee208f73f6638c3ce251948ca9b54a1e8f936d3691139ac202d01b + array-union: ^2.1.0 + dir-glob: ^3.0.1 + fast-glob: ^3.2.9 + ignore: ^5.2.0 + merge2: ^1.4.1 + slash: ^3.0.0 + checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 languageName: node linkType: hard @@ -5300,17 +5208,17 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.10, graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.5, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": - version: 4.2.9 - resolution: "graceful-fs@npm:4.2.9" - checksum: 68ea4e07ff2c041ada184f9278b830375f8e0b75154e3f080af6b70f66172fabb4108d19b3863a96b53fc068a310b9b6493d86d1291acc5f3861eb4b79d26ad6 +"graceful-fs@npm:^4.1.10, graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.5, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": + version: 4.2.10 + resolution: "graceful-fs@npm:4.2.10" + checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da languageName: node linkType: hard "graphql@npm:^16.2.0": - version: 16.2.0 - resolution: "graphql@npm:16.2.0" - checksum: 204b5c9991b82561651a28b13dbb2e0e67514171a6a8c045ca4a527b944087344a14519d0426d661b49f2305584b390591abadc82b942f7b65e64e05cb31a584 + version: 16.4.0 + resolution: "graphql@npm:16.4.0" + checksum: 8cac2c466891b6c6ace2fa3807f93815dea53cbec372998c139e796a321a6882c2324cc605e5f9aa45356890239aa9e731a04d8c59ec524db82bd18fb48aafee languageName: node linkType: hard @@ -5339,10 +5247,10 @@ __metadata: languageName: node linkType: hard -"has-bigints@npm:^1.0.1": - version: 1.0.1 - resolution: "has-bigints@npm:1.0.1" - checksum: 44ab55868174470065d2e0f8f6def1c990d12b82162a8803c679699fa8a39f966e336f2a33c185092fe8aea7e8bf2e85f1c26add5f29d98f2318bd270096b183 +"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b languageName: node linkType: hard @@ -5353,6 +5261,15 @@ __metadata: languageName: node linkType: hard +"has-property-descriptors@npm:^1.0.0": + version: 1.0.0 + resolution: "has-property-descriptors@npm:1.0.0" + dependencies: + get-intrinsic: ^1.1.1 + checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb + languageName: node + linkType: hard + "has-symbol-support-x@npm:^1.4.1": version: 1.4.2 resolution: "has-symbol-support-x@npm:1.4.2" @@ -5360,10 +5277,10 @@ __metadata: languageName: node linkType: hard -"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2": - version: 1.0.2 - resolution: "has-symbols@npm:1.0.2" - checksum: 2309c426071731be792b5be43b3da6fb4ed7cbe8a9a6bcfca1862587709f01b33d575ce8f5c264c1eaad09fca2f9a8208c0a2be156232629daa2dd0c0740976b +"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 languageName: node linkType: hard @@ -5502,7 +5419,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0": +"http-cache-semantics@npm:^4.1.0": version: 4.1.0 resolution: "http-cache-semantics@npm:4.1.0" checksum: 974de94a81c5474be07f269f9fd8383e92ebb5a448208223bfb39e172a9dbc26feff250192ecc23b9593b3f92098e010406b0f24bd4d588d631f80214648ed42 @@ -5531,23 +5448,13 @@ __metadata: languageName: node linkType: hard -"http2-wrapper@npm:^1.0.0-beta.5.2": - version: 1.0.3 - resolution: "http2-wrapper@npm:1.0.3" - dependencies: - quick-lru: ^5.1.1 - resolve-alpn: ^1.0.0 - checksum: 74160b862ec699e3f859739101ff592d52ce1cb207b7950295bf7962e4aa1597ef709b4292c673bece9c9b300efad0559fc86c71b1409c7a1e02b7229456003e - languageName: node - linkType: hard - "https-proxy-agent@npm:^5.0.0": - version: 5.0.0 - resolution: "https-proxy-agent@npm:5.0.0" + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" dependencies: agent-base: 6 debug: 4 - checksum: 165bfb090bd26d47693597661298006841ab733d0c7383a8cb2f17373387a94c903a3ac687090aa739de05e379ab6f868bae84ab4eac288ad85c328cd1ec9e53 + checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 languageName: node linkType: hard @@ -5703,10 +5610,10 @@ __metadata: languageName: node linkType: hard -"ini@npm:^2.0.0": - version: 2.0.0 - resolution: "ini@npm:2.0.0" - checksum: e7aadc5fb2e4aefc666d74ee2160c073995a4061556b1b5b4241ecb19ad609243b9cceafe91bae49c219519394bbd31512516cb22a3b1ca6e66d869e0447e84e +"ini@npm:^3.0.0": + version: 3.0.0 + resolution: "ini@npm:3.0.0" + checksum: e92b6b0835ac369e58c677e7faa8db6019ac667d7404887978fb86b181d658e50f1742ecbba7d81eb5ff917b3ae4d63a48e1ef3a9f8a0527bd7605fe1a9995d4 languageName: node linkType: hard @@ -5733,8 +5640,8 @@ __metadata: linkType: hard "inquirer@npm:^8.1.2": - version: 8.2.0 - resolution: "inquirer@npm:8.2.0" + version: 8.2.2 + resolution: "inquirer@npm:8.2.2" dependencies: ansi-escapes: ^4.2.1 chalk: ^4.1.1 @@ -5746,11 +5653,11 @@ __metadata: mute-stream: 0.0.8 ora: ^5.4.1 run-async: ^2.4.0 - rxjs: ^7.2.0 + rxjs: ^7.5.5 string-width: ^4.1.0 strip-ansi: ^6.0.0 through: ^2.3.6 - checksum: 861d1a9324ae933b49126b3541d94e4d6a2f2a25411b3f3cc00c34bf1bdab34146362d702cf289efe6d8034900dc5905bcf2ea716092a02b6fc390e5986dd236 + checksum: 69a2cf32f51af0e94dd66c597fdca42b890ff521b537dbfe1fd532c19a751d54893b7896523691ec30357f6212a80a2417fec7bf34411f369bbf151bdbc95ae9 languageName: node linkType: hard @@ -5887,7 +5794,7 @@ __metadata: resolution: "is-core-module@npm:2.8.1" dependencies: has: ^1.0.3 - checksum: 418b7bc10768a73c41c7ef497e293719604007f88934a6ffc5f7c78702791b8528102fb4c9e56d006d69361549b3d9519440214a74aefc7e0b79e5e4411d377f + checksum: b27034318b4b462f1c8f1dfb1b32baecd651d891a4e2d1922135daeff4141dfced2b82b07aef83ef54275c4a3526aa38da859223664d0868ca24182badb784ce languageName: node linkType: hard @@ -6057,7 +5964,7 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.1": +"is-negative-zero@npm:^2.0.2": version: 2.0.2 resolution: "is-negative-zero@npm:2.0.2" checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a @@ -6065,11 +5972,11 @@ __metadata: linkType: hard "is-number-object@npm:^1.0.4": - version: 1.0.6 - resolution: "is-number-object@npm:1.0.6" + version: 1.0.7 + resolution: "is-number-object@npm:1.0.7" dependencies: has-tostringtag: ^1.0.0 - checksum: c697704e8fc2027fc41cb81d29805de4e8b6dc9c3efee93741dbf126a8ecc8443fef85adbc581415ae7e55d325e51d0a942324ae35c829131748cce39cba55f3 + checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 languageName: node linkType: hard @@ -6194,19 +6101,12 @@ __metadata: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.1": - version: 1.0.1 - resolution: "is-shared-array-buffer@npm:1.0.1" - checksum: 2ffb92533e64e2876e6cfe6906871d28400b6f1a53130fe652ec8007bc0e5044d05e7af8e31bdc992fbba520bd92938cfbeedd0f286be92f250c7c76191c4d90 - languageName: node - linkType: hard - -"is-ssh@npm:^1.3.0": - version: 1.3.3 - resolution: "is-ssh@npm:1.3.3" +"is-shared-array-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "is-shared-array-buffer@npm:1.0.2" dependencies: - protocols: ^1.1.0 - checksum: 7a751facad3c61abf080eefe4f5df488d37f690ac2b130a8012001ecee4d7991306561bcb25896894d19268ea0512b20497f243e74d21c5901187a8f55f1c08c + call-bind: ^1.0.2 + checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a languageName: node linkType: hard @@ -6281,7 +6181,7 @@ __metadata: languageName: node linkType: hard -"is-weakref@npm:^1.0.1": +"is-weakref@npm:^1.0.2": version: 1.0.2 resolution: "is-weakref@npm:1.0.2" dependencies: @@ -6348,15 +6248,15 @@ __metadata: linkType: hard "istanbul-lib-instrument@npm:^5.0.4, istanbul-lib-instrument@npm:^5.1.0": - version: 5.1.0 - resolution: "istanbul-lib-instrument@npm:5.1.0" + version: 5.2.0 + resolution: "istanbul-lib-instrument@npm:5.2.0" dependencies: "@babel/core": ^7.12.3 "@babel/parser": ^7.14.7 "@istanbuljs/schema": ^0.1.2 istanbul-lib-coverage: ^3.2.0 semver: ^6.3.0 - checksum: 8b82e733c69fe9f94d2e21f3e5760c9bedb110329aa75df4bd40df95f1cac3bf38767e43f35b125cc547ceca7376b72ce7d95cc5238b7e9088345c7b589233d3 + checksum: 7c242ed782b6bf7b655656576afae8b6bd23dcc020e5fdc1472cca3dfb6ddb196a478385206d0df5219b9babf46ac4f21fea5d8ea9a431848b6cca6007012353 languageName: node linkType: hard @@ -6383,12 +6283,12 @@ __metadata: linkType: hard "istanbul-reports@npm:^3.1.3": - version: 3.1.3 - resolution: "istanbul-reports@npm:3.1.3" + version: 3.1.4 + resolution: "istanbul-reports@npm:3.1.4" dependencies: html-escaper: ^2.0.0 istanbul-lib-report: ^3.0.0 - checksum: ef6e0d9ed05ecab1974c6eb46cc2a12d8570911934192db4ed40cf1978449240ea80aae32c4dd5555b67407cdf860212d1a9e415443af69641aa57ed1da5ebbb + checksum: 2132983355710c522f6b26808015cab9a0ee8b9f5ae0db0d3edeff40b886dd83cb670fb123cb7b32dbe59473d7c00cdde2ba6136bc0acdb20a865fccea64dfe1 languageName: node linkType: hard @@ -6409,58 +6309,58 @@ __metadata: languageName: node linkType: hard -"jest-changed-files@npm:^27.4.2": - version: 27.4.2 - resolution: "jest-changed-files@npm:27.4.2" +"jest-changed-files@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-changed-files@npm:27.5.1" dependencies: - "@jest/types": ^27.4.2 + "@jest/types": ^27.5.1 execa: ^5.0.0 throat: ^6.0.1 - checksum: 4df8dff39882995d4852756686357e0629cf8029ea5c35dcf25f63fba4febe15b564b9222f7d18a7546fcd48d3414345bf3c363a1d13af61d8d66e662a035420 + checksum: 95e9dc74c3ca688ef85cfeab270f43f8902721a6c8ade6ac2459459a77890c85977f537d6fb809056deaa6d9c3f075fa7d2699ff5f3bf7d3fda17c3760b79b15 languageName: node linkType: hard -"jest-circus@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-circus@npm:27.4.6" +"jest-circus@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-circus@npm:27.5.1" dependencies: - "@jest/environment": ^27.4.6 - "@jest/test-result": ^27.4.6 - "@jest/types": ^27.4.2 + "@jest/environment": ^27.5.1 + "@jest/test-result": ^27.5.1 + "@jest/types": ^27.5.1 "@types/node": "*" chalk: ^4.0.0 co: ^4.6.0 dedent: ^0.7.0 - expect: ^27.4.6 + expect: ^27.5.1 is-generator-fn: ^2.0.0 - jest-each: ^27.4.6 - jest-matcher-utils: ^27.4.6 - jest-message-util: ^27.4.6 - jest-runtime: ^27.4.6 - jest-snapshot: ^27.4.6 - jest-util: ^27.4.2 - pretty-format: ^27.4.6 + jest-each: ^27.5.1 + jest-matcher-utils: ^27.5.1 + jest-message-util: ^27.5.1 + jest-runtime: ^27.5.1 + jest-snapshot: ^27.5.1 + jest-util: ^27.5.1 + pretty-format: ^27.5.1 slash: ^3.0.0 stack-utils: ^2.0.3 throat: ^6.0.1 - checksum: 00aae02bc4de4afa2144b073c4158a322cb37924d5583ef5caa5cb4badcc8f32474da3a01dd5672e85eda088b92d2b769986b46e36c2c88df0dd6ec0c72bd8c1 + checksum: 6192dccbccb3a6acfa361cbb97bdbabe94864ccf3d885932cfd41f19534329d40698078cf9be1489415e8234255d6ea9f9aff5396b79ad842a6fca6e6fc08fd0 languageName: node linkType: hard -"jest-cli@npm:^27.4.7": - version: 27.4.7 - resolution: "jest-cli@npm:27.4.7" +"jest-cli@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-cli@npm:27.5.1" dependencies: - "@jest/core": ^27.4.7 - "@jest/test-result": ^27.4.6 - "@jest/types": ^27.4.2 + "@jest/core": ^27.5.1 + "@jest/test-result": ^27.5.1 + "@jest/types": ^27.5.1 chalk: ^4.0.0 exit: ^0.1.2 - graceful-fs: ^4.2.4 + graceful-fs: ^4.2.9 import-local: ^3.0.2 - jest-config: ^27.4.7 - jest-util: ^27.4.2 - jest-validate: ^27.4.6 + jest-config: ^27.5.1 + jest-util: ^27.5.1 + jest-validate: ^27.5.1 prompts: ^2.0.1 yargs: ^16.2.0 peerDependencies: @@ -6470,210 +6370,212 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: bf301039f1c14ef3fa2b7699b7b94328faa5549e34cb1573610c894bedd036ad36e31e6af436e11b3aa85e22e409a05d1fef1624bebc2da7ed416ce969b87307 + checksum: 6c0a69fb48e500241409e09ff743ed72bc6578d7769e2c994724e7ef1e5587f6c1f85dc429e93b98ae38a365222993ee70f0acc2199358992120900984f349e5 languageName: node linkType: hard -"jest-config@npm:^27.4.7": - version: 27.4.7 - resolution: "jest-config@npm:27.4.7" +"jest-config@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-config@npm:27.5.1" dependencies: "@babel/core": ^7.8.0 - "@jest/test-sequencer": ^27.4.6 - "@jest/types": ^27.4.2 - babel-jest: ^27.4.6 + "@jest/test-sequencer": ^27.5.1 + "@jest/types": ^27.5.1 + babel-jest: ^27.5.1 chalk: ^4.0.0 ci-info: ^3.2.0 deepmerge: ^4.2.2 glob: ^7.1.1 - graceful-fs: ^4.2.4 - jest-circus: ^27.4.6 - jest-environment-jsdom: ^27.4.6 - jest-environment-node: ^27.4.6 - jest-get-type: ^27.4.0 - jest-jasmine2: ^27.4.6 - jest-regex-util: ^27.4.0 - jest-resolve: ^27.4.6 - jest-runner: ^27.4.6 - jest-util: ^27.4.2 - jest-validate: ^27.4.6 + graceful-fs: ^4.2.9 + jest-circus: ^27.5.1 + jest-environment-jsdom: ^27.5.1 + jest-environment-node: ^27.5.1 + jest-get-type: ^27.5.1 + jest-jasmine2: ^27.5.1 + jest-regex-util: ^27.5.1 + jest-resolve: ^27.5.1 + jest-runner: ^27.5.1 + jest-util: ^27.5.1 + jest-validate: ^27.5.1 micromatch: ^4.0.4 - pretty-format: ^27.4.6 + parse-json: ^5.2.0 + pretty-format: ^27.5.1 slash: ^3.0.0 + strip-json-comments: ^3.1.1 peerDependencies: ts-node: ">=9.0.0" peerDependenciesMeta: ts-node: optional: true - checksum: 23d5bacc483b2674d6efcd6bfc66bcde7c2b428511b50d17a22a2750d85bfc23753f9e41f504411e411e848e34ec61244bdae9da8782df4ada6e284106f71a4d + checksum: 1188fd46c0ed78cbe3175eb9ad6712ccf74a74be33d9f0d748e147c107f0889f8b701fbff1567f31836ae18597dacdc43d6a8fc30dd34ade6c9229cc6c7cb82d languageName: node linkType: hard -"jest-diff@npm:^27.0.0, jest-diff@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-diff@npm:27.4.6" +"jest-diff@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-diff@npm:27.5.1" dependencies: chalk: ^4.0.0 - diff-sequences: ^27.4.0 - jest-get-type: ^27.4.0 - pretty-format: ^27.4.6 - checksum: cf6b7e80e3c64a7c71ab209c0325bbda175991aed985ecee7652df9d6540e4959089038e208c04ab05391c9ddf07adc72f0c8c26cc4cee6fa17f76f500e2bf43 + diff-sequences: ^27.5.1 + jest-get-type: ^27.5.1 + pretty-format: ^27.5.1 + checksum: 8be27c1e1ee57b2bb2bef9c0b233c19621b4c43d53a3c26e2c00a4e805eb4ea11fe1694a06a9fb0e80ffdcfdc0d2b1cb0b85920b3f5c892327ecd1e7bd96b865 languageName: node linkType: hard -"jest-docblock@npm:^27.4.0": - version: 27.4.0 - resolution: "jest-docblock@npm:27.4.0" +"jest-docblock@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-docblock@npm:27.5.1" dependencies: detect-newline: ^3.0.0 - checksum: 4b7639ceb7808280562166c87c49746d9e9cc13f8315ea05a0a400d2f7b11f4491b4ad50935e5976db6509f26004fa2b187dc19eea5e09c445eed2648eb1e927 + checksum: c0fed6d55b229d8bffdd8d03f121dd1a3be77c88f50552d374f9e1ea3bde57bf6bea017a0add04628d98abcb1bfb48b456438eeca8a74ef0053f4dae3b95d29c languageName: node linkType: hard -"jest-each@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-each@npm:27.4.6" +"jest-each@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-each@npm:27.5.1" dependencies: - "@jest/types": ^27.4.2 + "@jest/types": ^27.5.1 chalk: ^4.0.0 - jest-get-type: ^27.4.0 - jest-util: ^27.4.2 - pretty-format: ^27.4.6 - checksum: cce85a14a4c3a37733e75da2352e767c6eef923181e0c884eb9f86253ed417de0454da5117ebfbc1fcabdf109a305b1dbbf9b71a5712da8b6d79fde1f73a9b75 + jest-get-type: ^27.5.1 + jest-util: ^27.5.1 + pretty-format: ^27.5.1 + checksum: b5a6d8730fd938982569c9e0b42bdf3c242f97b957ed8155a6473b5f7b540970f8685524e7f53963dc1805319f4b6602abfc56605590ca19d55bd7a87e467e63 languageName: node linkType: hard -"jest-environment-jsdom@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-environment-jsdom@npm:27.4.6" +"jest-environment-jsdom@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-environment-jsdom@npm:27.5.1" dependencies: - "@jest/environment": ^27.4.6 - "@jest/fake-timers": ^27.4.6 - "@jest/types": ^27.4.2 + "@jest/environment": ^27.5.1 + "@jest/fake-timers": ^27.5.1 + "@jest/types": ^27.5.1 "@types/node": "*" - jest-mock: ^27.4.6 - jest-util: ^27.4.2 + jest-mock: ^27.5.1 + jest-util: ^27.5.1 jsdom: ^16.6.0 - checksum: bdf5f349a3e96b029fd0c442c8ba86dd7beb8d14922b6a53f0c52f9ab7b34521ef8deedfaba13ce81ca01e9074032eb8dc506d9035941348e129d0b76671d6bc + checksum: bc104aef7d7530d0740402aa84ac812138b6d1e51fe58adecce679f82b99340ddab73e5ec68fa079f33f50c9ddec9728fc9f0ddcca2ad6f0b351eed2762cc555 languageName: node linkType: hard -"jest-environment-node@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-environment-node@npm:27.4.6" +"jest-environment-node@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-environment-node@npm:27.5.1" dependencies: - "@jest/environment": ^27.4.6 - "@jest/fake-timers": ^27.4.6 - "@jest/types": ^27.4.2 + "@jest/environment": ^27.5.1 + "@jest/fake-timers": ^27.5.1 + "@jest/types": ^27.5.1 "@types/node": "*" - jest-mock: ^27.4.6 - jest-util: ^27.4.2 - checksum: 3f146e7819f65b1dc0252573cddadc8c565a566ddf7c06c93eded51cccfc55f4765373fb2aaafeb4d8b76ec62b062e1bd4f1da6b9f57429af6789ef8bbada3cb + jest-mock: ^27.5.1 + jest-util: ^27.5.1 + checksum: 0f988330c4f3eec092e3fb37ea753b0c6f702e83cd8f4d770af9c2bf964a70bc45fbd34ec6fdb6d71ce98a778d9f54afd673e63f222e4667fff289e8069dba39 languageName: node linkType: hard -"jest-get-type@npm:^27.4.0": - version: 27.4.0 - resolution: "jest-get-type@npm:27.4.0" - checksum: bb9b70e420009fdaed3026d5bccd01569f92c7500f9f544d862796d4f4efa93ced5484864b2f272c7748bfb5bfd3268d48868b169c51ab45fe5b45b9519b6e46 +"jest-get-type@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-get-type@npm:27.5.1" + checksum: 63064ab70195c21007d897c1157bf88ff94a790824a10f8c890392e7d17eda9c3900513cb291ca1c8d5722cad79169764e9a1279f7c8a9c4cd6e9109ff04bbc0 languageName: node linkType: hard -"jest-haste-map@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-haste-map@npm:27.4.6" +"jest-haste-map@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-haste-map@npm:27.5.1" dependencies: - "@jest/types": ^27.4.2 + "@jest/types": ^27.5.1 "@types/graceful-fs": ^4.1.2 "@types/node": "*" anymatch: ^3.0.3 fb-watchman: ^2.0.0 fsevents: ^2.3.2 - graceful-fs: ^4.2.4 - jest-regex-util: ^27.4.0 - jest-serializer: ^27.4.0 - jest-util: ^27.4.2 - jest-worker: ^27.4.6 + graceful-fs: ^4.2.9 + jest-regex-util: ^27.5.1 + jest-serializer: ^27.5.1 + jest-util: ^27.5.1 + jest-worker: ^27.5.1 micromatch: ^4.0.4 walker: ^1.0.7 dependenciesMeta: fsevents: optional: true - checksum: 07a336e9dba9e7308f16c8b8e037dcc80eb346b0f68cbb6bd1badf97abb104da12c305b411549a5ac0bd4e634b61f9d12e0b5ac2ae8e8bea08952a5fe1a6e82e + checksum: e092a1412829a9254b4725531ee72926de530f77fda7b0d9ea18008fb7623c16f72e772d8e93be71cac9e591b2c6843a669610887dd2c89bd9eb528856e3ab47 languageName: node linkType: hard -"jest-jasmine2@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-jasmine2@npm:27.4.6" +"jest-jasmine2@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-jasmine2@npm:27.5.1" dependencies: - "@jest/environment": ^27.4.6 - "@jest/source-map": ^27.4.0 - "@jest/test-result": ^27.4.6 - "@jest/types": ^27.4.2 + "@jest/environment": ^27.5.1 + "@jest/source-map": ^27.5.1 + "@jest/test-result": ^27.5.1 + "@jest/types": ^27.5.1 "@types/node": "*" chalk: ^4.0.0 co: ^4.6.0 - expect: ^27.4.6 + expect: ^27.5.1 is-generator-fn: ^2.0.0 - jest-each: ^27.4.6 - jest-matcher-utils: ^27.4.6 - jest-message-util: ^27.4.6 - jest-runtime: ^27.4.6 - jest-snapshot: ^27.4.6 - jest-util: ^27.4.2 - pretty-format: ^27.4.6 + jest-each: ^27.5.1 + jest-matcher-utils: ^27.5.1 + jest-message-util: ^27.5.1 + jest-runtime: ^27.5.1 + jest-snapshot: ^27.5.1 + jest-util: ^27.5.1 + pretty-format: ^27.5.1 throat: ^6.0.1 - checksum: d9b05405708161b90c2e9add00ee3c62b154b0f839bc50f034ae8369921956bb16cec428e46ae3b8074a3aeded6cb02f770161d7453f1a183b1abac17dae43f7 + checksum: b716adf253ceb73db661936153394ab90d7f3a8ba56d6189b7cd4df8e4e2a4153b4e63ebb5d36e29ceb0f4c211d5a6f36ab7048c6abbd881c8646567e2ab8e6d languageName: node linkType: hard -"jest-leak-detector@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-leak-detector@npm:27.4.6" +"jest-leak-detector@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-leak-detector@npm:27.5.1" dependencies: - jest-get-type: ^27.4.0 - pretty-format: ^27.4.6 - checksum: 4259400403d51b1297b9ab05c1342345c4a93a77c99447b061192ed81b56efcbdd28a03914c9f97670d2f3498bdc368712575d6218b02e3af1656b7db507d3bf + jest-get-type: ^27.5.1 + pretty-format: ^27.5.1 + checksum: 5c9689060960567ddaf16c570d87afa760a461885765d2c71ef4f4857bbc3af1482c34e3cce88e50beefde1bf35e33530b020480752057a7e3dbb1ca0bae359f languageName: node linkType: hard -"jest-matcher-utils@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-matcher-utils@npm:27.4.6" +"jest-matcher-utils@npm:^27.0.0, jest-matcher-utils@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-matcher-utils@npm:27.5.1" dependencies: chalk: ^4.0.0 - jest-diff: ^27.4.6 - jest-get-type: ^27.4.0 - pretty-format: ^27.4.6 - checksum: 445a8cc9eaa7cb08653a10cfc4f109eca76a97d1b1d3a01067bd77efa9cb3a554b74c7402a4c9d5083b21e11218e1515ef538faa47fa47c282072b4825f6b307 + jest-diff: ^27.5.1 + jest-get-type: ^27.5.1 + pretty-format: ^27.5.1 + checksum: bb2135fc48889ff3fe73888f6cc7168ddab9de28b51b3148f820c89fdfd2effdcad005f18be67d0b9be80eda208ad47290f62f03d0a33f848db2dd0273c8217a languageName: node linkType: hard -"jest-message-util@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-message-util@npm:27.4.6" +"jest-message-util@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-message-util@npm:27.5.1" dependencies: "@babel/code-frame": ^7.12.13 - "@jest/types": ^27.4.2 + "@jest/types": ^27.5.1 "@types/stack-utils": ^2.0.0 chalk: ^4.0.0 - graceful-fs: ^4.2.4 + graceful-fs: ^4.2.9 micromatch: ^4.0.4 - pretty-format: ^27.4.6 + pretty-format: ^27.5.1 slash: ^3.0.0 stack-utils: ^2.0.3 - checksum: 1fdd542d091dbf7aa63a484feead97a921e3c4d6db3784fe2e6d83e9110ac06de5691fdc043da991ca1d0ce5d179ea8266c8d93b388f4bba7d80a267fdd946df + checksum: eb6d637d1411c71646de578c49826b6da8e33dd293e501967011de9d1916d53d845afbfb52a5b661ff1c495be7c13f751c48c7f30781fd94fbd64842e8195796 languageName: node linkType: hard -"jest-mock@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-mock@npm:27.4.6" +"jest-mock@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-mock@npm:27.5.1" dependencies: - "@jest/types": ^27.4.2 + "@jest/types": ^27.5.1 "@types/node": "*" - checksum: 34df5ec502fa0db5ef36e2b2e96a522de730e7be907c6df5d4ec8ab1292d9be71f1e269e8bcdafd020239edaf3ca6f9c464eb0b4aca6986420a1f392976fc0ab + checksum: f5b5904bb1741b4a1687a5f492535b7b1758dc26534c72a5423305f8711292e96a601dec966df81bb313269fb52d47227e29f9c2e08324d79529172f67311be0 languageName: node linkType: hard @@ -6689,203 +6591,202 @@ __metadata: languageName: node linkType: hard -"jest-regex-util@npm:^27.4.0": - version: 27.4.0 - resolution: "jest-regex-util@npm:27.4.0" - checksum: 222e4aacec601fd2cfdfee74adb8d324fef672f77577a7c2220893ec1a62031a2640388fce8d0bd8be2e4537da1ab40aa74dba60ac531a23b2643b15c65014ac +"jest-regex-util@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-regex-util@npm:27.5.1" + checksum: d45ca7a9543616a34f7f3079337439cf07566e677a096472baa2810e274b9808b76767c97b0a4029b8a5b82b9d256dee28ef9ad4138b2b9e5933f6fac106c418 languageName: node linkType: hard -"jest-resolve-dependencies@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-resolve-dependencies@npm:27.4.6" +"jest-resolve-dependencies@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-resolve-dependencies@npm:27.5.1" dependencies: - "@jest/types": ^27.4.2 - jest-regex-util: ^27.4.0 - jest-snapshot: ^27.4.6 - checksum: c644adb74a602c8c08f90256c9a5c519434cd213a02a6f427425003f9ab026c12860527eb67cf624aa6717c410fa92aee66662d212c0ffbb73f80e2711ffb7a4 + "@jest/types": ^27.5.1 + jest-regex-util: ^27.5.1 + jest-snapshot: ^27.5.1 + checksum: c67af97afad1da88f5530317c732bbd1262d1225f6cd7f4e4740a5db48f90ab0bd8564738ac70d1a43934894f9aef62205c1b8f8ee89e5c7a737e6a121ee4c25 languageName: node linkType: hard -"jest-resolve@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-resolve@npm:27.4.6" +"jest-resolve@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-resolve@npm:27.5.1" dependencies: - "@jest/types": ^27.4.2 + "@jest/types": ^27.5.1 chalk: ^4.0.0 - graceful-fs: ^4.2.4 - jest-haste-map: ^27.4.6 + graceful-fs: ^4.2.9 + jest-haste-map: ^27.5.1 jest-pnp-resolver: ^1.2.2 - jest-util: ^27.4.2 - jest-validate: ^27.4.6 + jest-util: ^27.5.1 + jest-validate: ^27.5.1 resolve: ^1.20.0 resolve.exports: ^1.1.0 slash: ^3.0.0 - checksum: 69b765660ee2dd71542953fbe5f6fc9ee3590a4829376e00d955f7566d47049ec5e300832bee1530ac85d2946e341558993ab381d3023363058ae6f9d4c10025 + checksum: 735830e7265b20a348029738680bb2f6e37f80ecea86cda869a4c318ba3a45d39c7a3a873a22f7f746d86258c50ead6e7f501de043e201c095d7ba628a1c440f languageName: node linkType: hard -"jest-runner@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-runner@npm:27.4.6" +"jest-runner@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-runner@npm:27.5.1" dependencies: - "@jest/console": ^27.4.6 - "@jest/environment": ^27.4.6 - "@jest/test-result": ^27.4.6 - "@jest/transform": ^27.4.6 - "@jest/types": ^27.4.2 + "@jest/console": ^27.5.1 + "@jest/environment": ^27.5.1 + "@jest/test-result": ^27.5.1 + "@jest/transform": ^27.5.1 + "@jest/types": ^27.5.1 "@types/node": "*" chalk: ^4.0.0 emittery: ^0.8.1 - exit: ^0.1.2 - graceful-fs: ^4.2.4 - jest-docblock: ^27.4.0 - jest-environment-jsdom: ^27.4.6 - jest-environment-node: ^27.4.6 - jest-haste-map: ^27.4.6 - jest-leak-detector: ^27.4.6 - jest-message-util: ^27.4.6 - jest-resolve: ^27.4.6 - jest-runtime: ^27.4.6 - jest-util: ^27.4.2 - jest-worker: ^27.4.6 + graceful-fs: ^4.2.9 + jest-docblock: ^27.5.1 + jest-environment-jsdom: ^27.5.1 + jest-environment-node: ^27.5.1 + jest-haste-map: ^27.5.1 + jest-leak-detector: ^27.5.1 + jest-message-util: ^27.5.1 + jest-resolve: ^27.5.1 + jest-runtime: ^27.5.1 + jest-util: ^27.5.1 + jest-worker: ^27.5.1 source-map-support: ^0.5.6 throat: ^6.0.1 - checksum: 4e76117e5373b6eb51c7113f848dbc92bc1e1d2f1302f9530ef9cb6c967eb364836f4a5790f65a437f47debc917bfb696bbc647831292fa8b1b4321f292e721f + checksum: 5bbe6cf847dd322b3332ec9d6977b54f91bd5f72ff620bc1a0192f0f129deda8aa7ca74c98922187a7aa87d8e0ce4f6c50e99a7ccb2a310bf4d94be2e0c3ce8e languageName: node linkType: hard -"jest-runtime@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-runtime@npm:27.4.6" +"jest-runtime@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-runtime@npm:27.5.1" dependencies: - "@jest/environment": ^27.4.6 - "@jest/fake-timers": ^27.4.6 - "@jest/globals": ^27.4.6 - "@jest/source-map": ^27.4.0 - "@jest/test-result": ^27.4.6 - "@jest/transform": ^27.4.6 - "@jest/types": ^27.4.2 + "@jest/environment": ^27.5.1 + "@jest/fake-timers": ^27.5.1 + "@jest/globals": ^27.5.1 + "@jest/source-map": ^27.5.1 + "@jest/test-result": ^27.5.1 + "@jest/transform": ^27.5.1 + "@jest/types": ^27.5.1 chalk: ^4.0.0 cjs-module-lexer: ^1.0.0 collect-v8-coverage: ^1.0.0 execa: ^5.0.0 glob: ^7.1.3 - graceful-fs: ^4.2.4 - jest-haste-map: ^27.4.6 - jest-message-util: ^27.4.6 - jest-mock: ^27.4.6 - jest-regex-util: ^27.4.0 - jest-resolve: ^27.4.6 - jest-snapshot: ^27.4.6 - jest-util: ^27.4.2 + graceful-fs: ^4.2.9 + jest-haste-map: ^27.5.1 + jest-message-util: ^27.5.1 + jest-mock: ^27.5.1 + jest-regex-util: ^27.5.1 + jest-resolve: ^27.5.1 + jest-snapshot: ^27.5.1 + jest-util: ^27.5.1 slash: ^3.0.0 strip-bom: ^4.0.0 - checksum: 64d833c7d7b1d67b53932dc9fd9332aaf43ea1777fc61c3f143515968f066438b3247e4f1a71a7f127b1bedbc7c3124bfc53cb4f026fff5b26e2feda8d35535c + checksum: 929e3df0c53dab43f831f2af4e2996b22aa8cb2d6d483919d6b0426cbc100098fd5b777b998c6568b77f8c4d860b2e83127514292ff61416064f5ef926492386 languageName: node linkType: hard -"jest-serializer@npm:^27.4.0": - version: 27.4.0 - resolution: "jest-serializer@npm:27.4.0" +"jest-serializer@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-serializer@npm:27.5.1" dependencies: "@types/node": "*" - graceful-fs: ^4.2.4 - checksum: 1ed5f38e88010f258bd9557d7842a89741ff15bfc578328e8ae1985933406350b817cf5e3127773e3dbc755dbe2522195378f8b98284bcc32111a723294ebbea + graceful-fs: ^4.2.9 + checksum: 803e03a552278610edc6753c0dd9fa5bb5cd3ca47414a7b2918106efb62b79fd5e9ae785d0a21f12a299fa599fea8acc1fa6dd41283328cee43962cf7df9bb44 languageName: node linkType: hard -"jest-snapshot@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-snapshot@npm:27.4.6" +"jest-snapshot@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-snapshot@npm:27.5.1" dependencies: "@babel/core": ^7.7.2 "@babel/generator": ^7.7.2 "@babel/plugin-syntax-typescript": ^7.7.2 "@babel/traverse": ^7.7.2 "@babel/types": ^7.0.0 - "@jest/transform": ^27.4.6 - "@jest/types": ^27.4.2 + "@jest/transform": ^27.5.1 + "@jest/types": ^27.5.1 "@types/babel__traverse": ^7.0.4 "@types/prettier": ^2.1.5 babel-preset-current-node-syntax: ^1.0.0 chalk: ^4.0.0 - expect: ^27.4.6 - graceful-fs: ^4.2.4 - jest-diff: ^27.4.6 - jest-get-type: ^27.4.0 - jest-haste-map: ^27.4.6 - jest-matcher-utils: ^27.4.6 - jest-message-util: ^27.4.6 - jest-util: ^27.4.2 + expect: ^27.5.1 + graceful-fs: ^4.2.9 + jest-diff: ^27.5.1 + jest-get-type: ^27.5.1 + jest-haste-map: ^27.5.1 + jest-matcher-utils: ^27.5.1 + jest-message-util: ^27.5.1 + jest-util: ^27.5.1 natural-compare: ^1.4.0 - pretty-format: ^27.4.6 + pretty-format: ^27.5.1 semver: ^7.3.2 - checksum: c7a1ae993ae7334277c61e6d645efedefce53ca212498ae766ea28efa46287559a56d2bd2edaaead8476191a45adbb1354df5367dfd223763b5a66751bfbda14 + checksum: a5cfadf0d21cd76063925d1434bc076443ed6d87847d0e248f0b245f11db3d98ff13e45cc03b15404027dabecd712d925f47b6eae4f64986f688640a7d362514 languageName: node linkType: hard -"jest-util@npm:^27.0.0, jest-util@npm:^27.4.2": - version: 27.4.2 - resolution: "jest-util@npm:27.4.2" +"jest-util@npm:^27.0.0, jest-util@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-util@npm:27.5.1" dependencies: - "@jest/types": ^27.4.2 + "@jest/types": ^27.5.1 "@types/node": "*" chalk: ^4.0.0 ci-info: ^3.2.0 - graceful-fs: ^4.2.4 + graceful-fs: ^4.2.9 picomatch: ^2.2.3 - checksum: bcf16881aff1421c5f7c2df2ef9492cf8cd92fcd0a2a99bec5ab16f7185ee19aea48eda41d9dfa7b5bf4354bdc21628f5931cd2e7281741e6d2983965efb631e + checksum: ac8d122f6daf7a035dcea156641fd3701aeba245417c40836a77e35b3341b9c02ddc5d904cfcd4ddbaa00ab854da76d3b911870cafdcdbaff90ea471de26c7d7 languageName: node linkType: hard -"jest-validate@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-validate@npm:27.4.6" +"jest-validate@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-validate@npm:27.5.1" dependencies: - "@jest/types": ^27.4.2 + "@jest/types": ^27.5.1 camelcase: ^6.2.0 chalk: ^4.0.0 - jest-get-type: ^27.4.0 + jest-get-type: ^27.5.1 leven: ^3.1.0 - pretty-format: ^27.4.6 - checksum: d3578030eadd872b99e65dac24d9ca755f2a2483f8344d9e575ea6034c6cb5ed5bcf7a4aa4f1050ab0080d5a8d0b0efd31c911514f27820b871a636a97dc196c + pretty-format: ^27.5.1 + checksum: 82e870f8ee7e4fb949652711b1567f05ae31c54be346b0899e8353e5c20fad7692b511905b37966945e90af8dc0383eb41a74f3ffefb16140ea4f9164d841412 languageName: node linkType: hard -"jest-watcher@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-watcher@npm:27.4.6" +"jest-watcher@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-watcher@npm:27.5.1" dependencies: - "@jest/test-result": ^27.4.6 - "@jest/types": ^27.4.2 + "@jest/test-result": ^27.5.1 + "@jest/types": ^27.5.1 "@types/node": "*" ansi-escapes: ^4.2.1 chalk: ^4.0.0 - jest-util: ^27.4.2 + jest-util: ^27.5.1 string-length: ^4.0.1 - checksum: bb9c0a34dcc690cef6430c275e81213620bc4ba6337e42302efa51666ac06781e9f6f50c930332396e4e8cd8cc47de8fb2e8de57da0f7e35a246b0206dde1cd3 + checksum: 191c4e9c278c0902ade1a8a80883ac244963ba3e6e78607a3d5f729ccca9c6e71fb3b316f87883658132641c5d818aa84202585c76752e03c539e6cbecb820bd languageName: node linkType: hard -"jest-worker@npm:^27.4.6": - version: 27.4.6 - resolution: "jest-worker@npm:27.4.6" +"jest-worker@npm:^27.5.1": + version: 27.5.1 + resolution: "jest-worker@npm:27.5.1" dependencies: "@types/node": "*" merge-stream: ^2.0.0 supports-color: ^8.0.0 - checksum: 105bcdf5c66700bbfe352bc09476629ca0858cfa819fcc1a37ea76660f0168d586c6e77aee8ea91eded5a20f40f331a0a81e503b5ba19f7b566204406b239466 + checksum: 98cd68b696781caed61c983a3ee30bf880b5bd021c01d98f47b143d4362b85d0737f8523761e2713d45e18b4f9a2b98af1eaee77afade4111bb65c77d6f7c980 languageName: node linkType: hard "jest@npm:^27.0.6": - version: 27.4.7 - resolution: "jest@npm:27.4.7" + version: 27.5.1 + resolution: "jest@npm:27.5.1" dependencies: - "@jest/core": ^27.4.7 + "@jest/core": ^27.5.1 import-local: ^3.0.2 - jest-cli: ^27.4.7 + jest-cli: ^27.5.1 peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -6893,20 +6794,20 @@ __metadata: optional: true bin: jest: bin/jest.js - checksum: 28ce948b30c074907393f37553acac4422d0f60190776e62b3403e4c742d33dd6012e3a20748254a43e38b5b4ce52d813b13a3a5be1d43d6d12429bd08ce1a23 + checksum: 96f1d69042b3c6dfc695f2a4e4b0db38af6fb78582ad1a02beaa57cfcd77cbd31567d7d865c1c85709b7c3e176eefa3b2035ffecd646005f15d8ef528eccf205 languageName: node linkType: hard "joi@npm:^17.4.0": - version: 17.5.0 - resolution: "joi@npm:17.5.0" + version: 17.6.0 + resolution: "joi@npm:17.6.0" dependencies: "@hapi/hoek": ^9.0.0 "@hapi/topo": ^5.0.0 "@sideway/address": ^4.1.3 "@sideway/formula": ^3.0.0 "@sideway/pinpoint": ^2.0.0 - checksum: 6a20d009d2fa8a72dbfd9bc739d240f678b09d3a16c05b4bfb4e2d0503e60f7d7914250f0bfc52fb79a537490739ba36a1ace00a05b8ddecaaacfcedafc5c8b9 + checksum: eaf62f6c02f2edb1042f1ab04fc23a5918a2cb8f54bec84c6e1033624d8a462c10ae9518af55a3ba84f1793960450d58094eda308e7ef93c17edd4e3c8ef31d5 languageName: node linkType: hard @@ -7041,14 +6942,12 @@ __metadata: languageName: node linkType: hard -"json5@npm:2.x, json5@npm:^2.1.2": - version: 2.2.0 - resolution: "json5@npm:2.2.0" - dependencies: - minimist: ^1.2.5 +"json5@npm:2.x, json5@npm:^2.2.1": + version: 2.2.1 + resolution: "json5@npm:2.2.1" bin: json5: lib/cli.js - checksum: e88fc5274bb58fc99547baa777886b069d2dd96d9cfc4490b305fd16d711dabd5979e35a4f90873cefbeb552e216b041a304fe56702bedba76e19bc7845f208d + checksum: 74b8a23b102a6f2bf2d224797ae553a75488b5adbaee9c9b6e5ab8b510a2fc6e38f876d4c77dea672d4014a44b2399e15f2051ac2b37b87f74c0c7602003543b languageName: node linkType: hard @@ -7455,7 +7354,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.11, lodash@npm:^4.17.15, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.7.0": +"lodash@npm:^4.17.15, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.7.0": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -7486,13 +7385,6 @@ __metadata: languageName: node linkType: hard -"lowercase-keys@npm:^2.0.0": - version: 2.0.0 - resolution: "lowercase-keys@npm:2.0.0" - checksum: 24d7ebd56ccdf15ff529ca9e08863f3c54b0b9d1edb97a3ae1af34940ae666c01a1e6d200707bce730a8ef76cb57cc10e65f245ecaaf7e6bc8639f2fb460ac23 - languageName: node - linkType: hard - "lru-cache@npm:^4.0.1": version: 4.1.5 resolution: "lru-cache@npm:4.1.5" @@ -7634,11 +7526,11 @@ __metadata: linkType: hard "marked@npm:^4.0.10": - version: 4.0.12 - resolution: "marked@npm:4.0.12" + version: 4.0.14 + resolution: "marked@npm:4.0.14" bin: marked: bin/marked.js - checksum: 7575117f85a8986652f3ac8b8a7b95056c4c5fce01a1fc76dc4c7960412cb4c9bd9da8133487159b6b3ff84f52b543dfe9a36f826a5f358892b5ec4b6824f192 + checksum: 778bc2fc94c51ae4fbafe5a08bc1f3917799c4dd39e9fccd972a97df4e5bc5aa78664b7143d12d4b4969608fb90c6a2de3f19811a2f9ccf6b7f207022f2842ba languageName: node linkType: hard @@ -7745,28 +7637,28 @@ __metadata: linkType: hard "micromatch@npm:^4.0.0, micromatch@npm:^4.0.2, micromatch@npm:^4.0.4": - version: 4.0.4 - resolution: "micromatch@npm:4.0.4" + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" dependencies: - braces: ^3.0.1 - picomatch: ^2.2.3 - checksum: ef3d1c88e79e0a68b0e94a03137676f3324ac18a908c245a9e5936f838079fcc108ac7170a5fadc265a9c2596963462e402841406bda1a4bb7b68805601d631c + braces: ^3.0.2 + picomatch: ^2.3.1 + checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc languageName: node linkType: hard -"mime-db@npm:1.51.0, mime-db@npm:^1.28.0": - version: 1.51.0 - resolution: "mime-db@npm:1.51.0" - checksum: 613b1ac9d6e725cc24444600b124a7f1ce6c60b1baa654f39a3e260d0995a6dffc5693190217e271af7e2a5612dae19f2a73f3e316707d797a7391165f7ef423 +"mime-db@npm:1.52.0, mime-db@npm:^1.28.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f languageName: node linkType: hard "mime-types@npm:^2.1.12": - version: 2.1.34 - resolution: "mime-types@npm:2.1.34" + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" dependencies: - mime-db: 1.51.0 - checksum: 67013de9e9d6799bde6d669d18785b7e18bcd212e710d3e04a4727f92f67a8ad4e74aee24be28b685adb794944814bde649119b58ee3282ffdbee58f9278d9f3 + mime-db: 1.52.0 + checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 languageName: node linkType: hard @@ -7800,13 +7692,6 @@ __metadata: languageName: node linkType: hard -"mimic-response@npm:^3.1.0": - version: 3.1.0 - resolution: "mimic-response@npm:3.1.0" - checksum: 25739fee32c17f433626bf19f016df9036b75b3d84a3046c7d156e72ec963dd29d7fc8a302f55a3d6c5a4ff24259676b15d915aad6480815a969ff2ec0836867 - languageName: node - linkType: hard - "min-indent@npm:^1.0.0, min-indent@npm:^1.0.1": version: 1.0.1 resolution: "min-indent@npm:1.0.1" @@ -7814,12 +7699,12 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.2, minimatch@npm:^3.0.4": - version: 3.0.4 - resolution: "minimatch@npm:3.0.4" +"minimatch@npm:^3.0.2, minimatch@npm:^3.0.4, minimatch@npm:^3.1.2": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" dependencies: brace-expansion: ^1.1.7 - checksum: 66ac295f8a7b59788000ea3749938b0970344c841750abd96694f80269b926ebcafad3deeb3f1da2522978b119e6ae3a5869b63b13a7859a456b3408bd18a078 + checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a languageName: node linkType: hard @@ -7843,10 +7728,10 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.1.0, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5": - version: 1.2.5 - resolution: "minimist@npm:1.2.5" - checksum: 86706ce5b36c16bfc35c5fe3dbb01d5acdc9a22f2b6cc810b6680656a1d2c0e44a0159c9a3ba51fb072bb5c203e49e10b51dcd0eec39c481f4c42086719bae52 +"minimist@npm:^1.1.0, minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.5, minimist@npm:^1.2.6": + version: 1.2.6 + resolution: "minimist@npm:1.2.6" + checksum: d15428cd1e11eb14e1233bcfb88ae07ed7a147de251441d61158619dfb32c4d7e9061d09cab4825fdee18ecd6fce323228c8c47b5ba7cd20af378ca4048fb3fb languageName: node linkType: hard @@ -7952,13 +7837,13 @@ __metadata: linkType: hard "mkdirp@npm:^0.5.1": - version: 0.5.5 - resolution: "mkdirp@npm:0.5.5" + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" dependencies: - minimist: ^1.2.5 + minimist: ^1.2.6 bin: mkdirp: bin/cmd.js - checksum: 3bce20ea525f9477befe458ab85284b0b66c8dc3812f94155af07c827175948cdd8114852ac6c6d82009b13c1048c37f6d98743eb019651ee25c39acc8aabe7d + checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 languageName: node linkType: hard @@ -8071,12 +7956,17 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.1": - version: 2.6.6 - resolution: "node-fetch@npm:2.6.6" +"node-fetch@npm:^2.6.7": + version: 2.6.7 + resolution: "node-fetch@npm:2.6.7" dependencies: whatwg-url: ^5.0.0 - checksum: ee8290626bdb73629c59722b75dcf4b9b6a67c1ed7eb9102e368479c4a13b56a48c2bb3ad71571e378e98c8b2c64c820e11f9cd39e4b8557dd138ad571ef9a42 + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: 8d816ffd1ee22cab8301c7756ef04f3437f18dace86a1dae22cf81db8ef29c0bf6655f3215cb0cdb22b420b6fe141e64b26905e7f33f9377a7fa59135ea3e10b languageName: node linkType: hard @@ -8107,7 +7997,7 @@ __metadata: languageName: node linkType: hard -"node-jq@npm:2.1.0, node-jq@npm:^2.1.0": +"node-jq@npm:2.1.0": version: 2.1.0 resolution: "node-jq@npm:2.1.0" dependencies: @@ -8124,10 +8014,24 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.1": - version: 2.0.1 - resolution: "node-releases@npm:2.0.1" - checksum: b20dd8d4bced11f75060f0387e05e76b9dc4a0451f7bb3516eade6f50499ea7768ba95d8a60d520c193402df1e58cb3fe301510cc1c1ad68949c3d57b5149866 +"node-jq@npm:^2.1.0": + version: 2.3.3 + resolution: "node-jq@npm:2.3.3" + dependencies: + bin-build: ^3.0.0 + download: ^8.0.0 + is-valid-path: ^0.1.1 + joi: ^17.4.0 + strip-final-newline: ^2.0.0 + tempfile: ^3.0.0 + checksum: df757de694ed0b8991c34974c9785c7d0d0b36e497975613a665afc00a3e63386ec2432a95c25ad02756e9c5d3ba06b50c9fcb45126c4c0310e182097e807540 + languageName: node + linkType: hard + +"node-releases@npm:^2.0.3": + version: 2.0.3 + resolution: "node-releases@npm:2.0.3" + checksum: 5e555fbbebb3343a5d1e5f4e10e1737998bedc57472a35027410d17b2678ed9bc0e5fae008f513798a960eb8687159331b1f46f82a3210d39bd7c40d3c9dcead languageName: node linkType: hard @@ -8205,19 +8109,19 @@ __metadata: languageName: node linkType: hard -"normalize-url@npm:^6.0.0, normalize-url@npm:^6.0.1": +"normalize-url@npm:^6.0.0": version: 6.1.0 resolution: "normalize-url@npm:6.1.0" checksum: 4a4944631173e7d521d6b80e4c85ccaeceb2870f315584fa30121f505a6dfd86439c5e3fdd8cd9e0e291290c41d0c3599f0cb12ab356722ed242584c30348e50 languageName: node linkType: hard -"npm-audit-report@npm:^2.1.5": - version: 2.1.5 - resolution: "npm-audit-report@npm:2.1.5" +"npm-audit-report@npm:^3.0.0": + version: 3.0.0 + resolution: "npm-audit-report@npm:3.0.0" dependencies: chalk: ^4.0.0 - checksum: 9199c4331a29b478b7adbafe1bf463943f65cfd840f62ffe9e6263f0ae64d77725ea102126b3892ef3379a6770a6fe11e1f68ab4cb196c0045db2e1aeafc593d + checksum: 3927972c14e1d9fd21a6ab2d3c2d651e20346ff9a784ea2fcdc2b1e3b3e23994fc0e8961c3c9f4aea857e3a995a556a77f4f0250dbaf6238c481c609ed912a92 languageName: node linkType: hard @@ -8240,12 +8144,12 @@ __metadata: languageName: node linkType: hard -"npm-install-checks@npm:^4.0.0": - version: 4.0.0 - resolution: "npm-install-checks@npm:4.0.0" +"npm-install-checks@npm:^5.0.0": + version: 5.0.0 + resolution: "npm-install-checks@npm:5.0.0" dependencies: semver: ^7.1.1 - checksum: 8308ff48e61e0863d7f148f62543e1f6c832525a7d8002ea742d5e478efa8b29bf65a87f9fb82786e15232e4b3d0362b126c45afdceed4c051c0d3c227dd0ace + checksum: 0e7d1aae52b1fe9d3a0fd4a008850c7047931722dd49ee908afd13fd0297ac5ddb10964d9c59afcdaaa2ca04b51d75af2788f668c729ae71fec0e4cdac590ffc languageName: node linkType: hard @@ -8265,7 +8169,7 @@ __metadata: languageName: node linkType: hard -"npm-package-arg@npm:^9.0.0, npm-package-arg@npm:^9.0.1": +"npm-package-arg@npm:^9.0.0, npm-package-arg@npm:^9.0.1, npm-package-arg@npm:^9.0.2": version: 9.0.2 resolution: "npm-package-arg@npm:9.0.2" dependencies: @@ -8362,21 +8266,20 @@ __metadata: linkType: hard "npm@npm:^8.3.0": - version: 8.5.5 - resolution: "npm@npm:8.5.5" + version: 8.7.0 + resolution: "npm@npm:8.7.0" dependencies: "@isaacs/string-locale-compare": ^1.1.0 - "@npmcli/arborist": ^5.0.3 + "@npmcli/arborist": ^5.0.4 "@npmcli/ci-detect": ^2.0.0 - "@npmcli/config": ^4.0.1 + "@npmcli/config": ^4.1.0 + "@npmcli/fs": ^2.1.0 "@npmcli/map-workspaces": ^2.0.2 - "@npmcli/package-json": ^1.0.1 + "@npmcli/package-json": ^2.0.0 "@npmcli/run-script": ^3.0.1 abbrev: ~1.1.1 - ansicolors: ~0.3.2 - ansistyles: ~0.1.3 archy: ~1.0.0 - cacache: ^16.0.2 + cacache: ^16.0.4 chalk: ^4.1.2 chownr: ^2.0.0 cli-columns: ^4.0.0 @@ -8384,10 +8287,10 @@ __metadata: columnify: ^1.6.0 fastest-levenshtein: ^1.0.12 glob: ^7.2.0 - graceful-fs: ^4.2.9 + graceful-fs: ^4.2.10 hosted-git-info: ^5.0.0 - ini: ^2.0.0 - init-package-json: ^3.0.1 + ini: ^3.0.0 + init-package-json: ^3.0.2 is-cidr: ^4.0.2 json-parse-even-better-errors: ^2.3.1 libnpmaccess: ^6.0.2 @@ -8401,7 +8304,7 @@ __metadata: libnpmsearch: ^5.0.2 libnpmteam: ^4.0.2 libnpmversion: ^3.0.1 - make-fetch-happen: ^10.0.6 + make-fetch-happen: ^10.1.2 minipass: ^3.1.6 minipass-pipeline: ^1.2.4 mkdirp: ^1.0.4 @@ -8409,37 +8312,37 @@ __metadata: ms: ^2.1.2 node-gyp: ^9.0.0 nopt: ^5.0.0 - npm-audit-report: ^2.1.5 - npm-install-checks: ^4.0.0 - npm-package-arg: ^9.0.1 - npm-pick-manifest: ^7.0.0 + npm-audit-report: ^3.0.0 + npm-install-checks: ^5.0.0 + npm-package-arg: ^9.0.2 + npm-pick-manifest: ^7.0.1 npm-profile: ^6.0.2 - npm-registry-fetch: ^13.0.1 + npm-registry-fetch: ^13.1.0 npm-user-validate: ^1.0.1 npmlog: ^6.0.1 opener: ^1.5.2 - pacote: ^13.0.5 - parse-conflict-json: ^2.0.1 - proc-log: ^2.0.0 + pacote: ^13.1.1 + parse-conflict-json: ^2.0.2 + proc-log: ^2.0.1 qrcode-terminal: ^0.12.0 read: ~1.0.7 read-package-json: ^5.0.0 read-package-json-fast: ^2.0.3 readdir-scoped-modules: ^1.1.0 rimraf: ^3.0.2 - semver: ^7.3.5 - ssri: ^8.0.1 + semver: ^7.3.6 + ssri: ^9.0.0 tar: ^6.1.11 text-table: ~0.2.0 tiny-relative-date: ^1.3.0 - treeverse: ^1.0.4 - validate-npm-package-name: ~3.0.0 + treeverse: ^2.0.0 + validate-npm-package-name: ^4.0.0 which: ^2.0.2 write-file-atomic: ^4.0.1 bin: npm: bin/npm-cli.js npx: bin/npx-cli.js - checksum: f48fbac8c76a0afa709aaeb3ffeb2d6886b88577f6f7f54e91bc0d6169f6ec90f402bbd6ab7e643347970d95d43860f35b0dc0343664222def47cc6042ccf74a + checksum: fd2334914e671986a92c78eadc1cb38d6f7c1b69db8ac9200848c958d0c9b5921194bc1b6ced658a9b2f36fa2c7aa41ad85a7f86a0c83a125abb6d29d8dcf9f1 languageName: node linkType: hard @@ -8480,14 +8383,14 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.11.0, object-inspect@npm:^1.9.0": +"object-inspect@npm:^1.12.0, object-inspect@npm:^1.9.0": version: 1.12.0 resolution: "object-inspect@npm:1.12.0" checksum: 2b36d4001a9c921c6b342e2965734519c9c58c355822243c3207fbf0aac271f8d44d30d2d570d450b2cc6f0f00b72bcdba515c37827d2560e5f22b1899a31cf4 languageName: node linkType: hard -"object-keys@npm:^1.0.12, object-keys@npm:^1.1.1": +"object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a @@ -8658,13 +8561,6 @@ __metadata: languageName: node linkType: hard -"p-cancelable@npm:^2.0.0": - version: 2.1.1 - resolution: "p-cancelable@npm:2.1.1" - checksum: 3dba12b4fb4a1e3e34524535c7858fc82381bbbd0f247cc32dedc4018592a3950ce66b106d0880b4ec4c2d8d6576f98ca885dc1d7d0f274d1370be20e9523ddf - languageName: node - linkType: hard - "p-each-series@npm:^2.1.0": version: 2.2.0 resolution: "p-each-series@npm:2.2.0" @@ -8895,7 +8791,7 @@ __metadata: languageName: node linkType: hard -"parse-conflict-json@npm:^2.0.1": +"parse-conflict-json@npm:^2.0.1, parse-conflict-json@npm:^2.0.2": version: 2.0.2 resolution: "parse-conflict-json@npm:2.0.2" dependencies: @@ -8940,18 +8836,6 @@ __metadata: languageName: node linkType: hard -"parse-path@npm:^4.0.0": - version: 4.0.3 - resolution: "parse-path@npm:4.0.3" - dependencies: - is-ssh: ^1.3.0 - protocols: ^1.4.0 - qs: ^6.9.4 - query-string: ^6.13.8 - checksum: d1704c0027489b64838c608c3f075fe3599c18a7413fa92e7074a0157e5bcc1a4ef73e7ae9bd9dbf5fad1809137437310cc69a57e5f5130ea17226165f3e942a - languageName: node - linkType: hard - "parse5@npm:6.0.1": version: 6.0.1 resolution: "parse5@npm:6.0.1" @@ -9036,7 +8920,7 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.3": +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf @@ -9081,9 +8965,9 @@ __metadata: linkType: hard "pirates@npm:^4.0.4": - version: 4.0.4 - resolution: "pirates@npm:4.0.4" - checksum: 6b7187d526fd025a2b91e8fd289c78d88c4adc3ea947b9facbe9cb300a896b0ec00f3e77b36a043001695312a8debbf714453495283bd8a4eaad3bc0c38df425 + version: 4.0.5 + resolution: "pirates@npm:4.0.5" + checksum: c9994e61b85260bec6c4fc0307016340d9b0c4f4b6550a957afaaff0c9b1ad58fbbea5cfcf083860a25cb27a375442e2b0edf52e2e1e40e69934e08dcc52d227 languageName: node linkType: hard @@ -9110,11 +8994,13 @@ __metadata: version: 0.0.0-use.local resolution: "policy-packs@workspace:." dependencies: - "@qiwi/multi-semantic-release": ^6.0.2 + "@qiwi/multi-semantic-release": ^6.1.1 "@semantic-release/changelog": ^6.0.1 "@semantic-release/git": ^10.0.1 - "@semantic-release/gitlab": ^8.0.1 + "@semantic-release/github": ^8.0.1 + "@semantic-release/npm": ^9.0.1 "@semrel-extra/npm": ^1.2.0 + lodash: ^4.17.21 semantic-release: ^19.0.2 languageName: unknown linkType: soft @@ -9171,26 +9057,26 @@ __metadata: linkType: hard "prettier@npm:^2.4.1, prettier@npm:^2.5.1": - version: 2.5.1 - resolution: "prettier@npm:2.5.1" + version: 2.6.2 + resolution: "prettier@npm:2.6.2" bin: prettier: bin-prettier.js - checksum: 21b9408476ea1c544b0e45d51ceb94a84789ff92095abb710942d780c862d0daebdb29972d47f6b4d0f7ebbfb0ffbf56cc2cfa3e3e9d1cca54864af185b15b66 + checksum: 48d08dde8e9fb1f5bccdd205baa7f192e9fc8bc98f86e1b97d919de804e28c806b0e6cc685e4a88211aa7987fa9668f30baae19580d87ced3ed0f2ec6572106f languageName: node linkType: hard -"pretty-format@npm:^27.0.0, pretty-format@npm:^27.4.6": - version: 27.4.6 - resolution: "pretty-format@npm:27.4.6" +"pretty-format@npm:^27.0.0, pretty-format@npm:^27.5.1": + version: 27.5.1 + resolution: "pretty-format@npm:27.5.1" dependencies: ansi-regex: ^5.0.1 ansi-styles: ^5.0.0 react-is: ^17.0.1 - checksum: 5eda32e4e47ddd1a9e8fe9ebef519b217ba403eb8bcb804ba551dfb37f87e674472013fcf78480ab535844fdddcc706fac94511eba349bfb94a138a02d1a7a59 + checksum: cf610cffcb793885d16f184a62162f2dd0df31642d9a18edf4ca298e909a8fe80bdbf556d5c9573992c102ce8bf948691da91bf9739bee0ffb6e79c8a8a6e088 languageName: node linkType: hard -"proc-log@npm:^2.0.0": +"proc-log@npm:^2.0.0, proc-log@npm:^2.0.1": version: 2.0.1 resolution: "proc-log@npm:2.0.1" checksum: f6f23564ff759097db37443e6e2765af84979a703d2c52c1b9df506ee9f87caa101ba49d8fdc115c1a313ec78e37e8134704e9069e6a870f3499d98bb24c436f @@ -9275,13 +9161,6 @@ __metadata: languageName: node linkType: hard -"protocols@npm:^1.1.0, protocols@npm:^1.4.0": - version: 1.4.8 - resolution: "protocols@npm:1.4.8" - checksum: 2d555c013df0b05402970f67f7207c9955a92b1d13ffa503c814b5fe2f6dde7ac6a03320e0975c1f5832b0113327865e0b3b28bfcad023c25ddb54b53fab8684 - languageName: node - linkType: hard - "pseudomap@npm:^1.0.2": version: 1.0.2 resolution: "pseudomap@npm:1.0.2" @@ -9349,18 +9228,6 @@ __metadata: languageName: node linkType: hard -"query-string@npm:^6.13.8": - version: 6.14.1 - resolution: "query-string@npm:6.14.1" - dependencies: - decode-uri-component: ^0.2.0 - filter-obj: ^1.1.0 - split-on-first: ^1.0.0 - strict-uri-encode: ^2.0.0 - checksum: f2c7347578fa0f3fd4eaace506470cb4e9dc52d409a7ddbd613f614b9a594d750877e193b5d5e843c7477b3b295b857ec328903c943957adc41a3efb6c929449 - languageName: node - linkType: hard - "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -9681,13 +9548,6 @@ __metadata: languageName: node linkType: hard -"resolve-alpn@npm:^1.0.0": - version: 1.2.1 - resolution: "resolve-alpn@npm:1.2.1" - checksum: f558071fcb2c60b04054c99aebd572a2af97ef64128d59bef7ab73bd50d896a222a056de40ffc545b633d99b304c259ea9d0c06830d5c867c34f0bfa60b8eae0 - languageName: node - linkType: hard - "resolve-cwd@npm:^3.0.0": version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" @@ -9725,29 +9585,29 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.20.0": - version: 1.21.0 - resolution: "resolve@npm:1.21.0" +"resolve@npm:^1.1.6, resolve@npm:^1.1.7, resolve@npm:^1.10.0, resolve@npm:^1.20.0, resolve@npm:^1.22.0": + version: 1.22.0 + resolution: "resolve@npm:1.22.0" dependencies: - is-core-module: ^2.8.0 + is-core-module: ^2.8.1 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: d7d9092a5c04a048bea16c7e5a2eb605ac3e8363a0cc5644de1fde17d5028e8d5f4343aab1d99bd327b98e91a66ea83e242718150c64dfedcb96e5e7aad6c4f5 + checksum: a2d14cc437b3a23996f8c7367eee5c7cf8149c586b07ca2ae00e96581ce59455555a1190be9aa92154785cf9f2042646c200d0e00e0bbd2b8a995a93a0ed3e4e languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin": - version: 1.21.0 - resolution: "resolve@patch:resolve@npm%3A1.21.0#~builtin::version=1.21.0&hash=07638b" +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin": + version: 1.22.0 + resolution: "resolve@patch:resolve@npm%3A1.22.0#~builtin::version=1.22.0&hash=07638b" dependencies: - is-core-module: ^2.8.0 + is-core-module: ^2.8.1 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: a0a4d1f7409e73190f31f901f8a619960bb3bd4ae38ba3a54c7ea7e1c87758d28a73256bb8d6a35996a903d1bf14f53883f0dcac6c571c063cb8162d813ad26e + checksum: c79ecaea36c872ee4a79e3db0d3d4160b593f2ca16e031d8283735acd01715a203607e9ded3f91f68899c2937fa0d49390cddbe0fb2852629212f3cda283f4a7 languageName: node linkType: hard @@ -9760,15 +9620,6 @@ __metadata: languageName: node linkType: hard -"responselike@npm:^2.0.0": - version: 2.0.0 - resolution: "responselike@npm:2.0.0" - dependencies: - lowercase-keys: ^2.0.0 - checksum: 6a4d32c37d4e88678ae0a9d69fcc90aafa15b1a3eab455bd65c06af3c6c4976afc47d07a0e5a60d277ab041a465f43bf0a581e0d7ab33786e7a7741573f2e487 - languageName: node - linkType: hard - "restore-cursor@npm:^3.1.0": version: 3.1.0 resolution: "restore-cursor@npm:3.1.0" @@ -9834,16 +9685,16 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.2.0": - version: 7.5.1 - resolution: "rxjs@npm:7.5.1" +"rxjs@npm:^7.5.5": + version: 7.5.5 + resolution: "rxjs@npm:7.5.5" dependencies: tslib: ^2.1.0 - checksum: 78e3eecb1644dd83adabc8d956f879dca62eb19c8afcd6acac71cf6d94534c33ea201e65387494fdeb1332395cba081e194f5a9699d58a5d48e416b8b52372aa + checksum: e034f60805210cce756dd2f49664a8108780b117cf5d0e2281506e9e6387f7b4f1532d974a8c8b09314fa7a16dd2f6cff3462072a5789672b5dcb45c4173f3c6 languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.1, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.1": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 @@ -10035,7 +9886,7 @@ __metadata: languageName: node linkType: hard -"shelljs@npm:^0.8.4": +"shelljs@npm:^0.8.5": version: 0.8.5 resolution: "shelljs@npm:0.8.5" dependencies: @@ -10049,14 +9900,14 @@ __metadata: linkType: hard "shx@npm:^0.3.3": - version: 0.3.3 - resolution: "shx@npm:0.3.3" + version: 0.3.4 + resolution: "shx@npm:0.3.4" dependencies: minimist: ^1.2.3 - shelljs: ^0.8.4 + shelljs: ^0.8.5 bin: shx: lib/cli.js - checksum: 2e408a79c680cef4d719a56563217031ef20d5c2c18fdfe28933e22d833adabd995ad6fa6be087a141832cb17010facfc0288e90a6743c0276b478759fd393e0 + checksum: 0aa168bfddc11e3fe8943cce2e0d2d8514a560bd58cf2b835b4351ba03f46068f7d88286c2627f4b85604e81952154c43746369fb3f0d60df0e3b511f465e5b8 languageName: node linkType: hard @@ -10186,11 +10037,11 @@ __metadata: linkType: hard "sonic-boom@npm:^2.1.0": - version: 2.4.2 - resolution: "sonic-boom@npm:2.4.2" + version: 2.7.0 + resolution: "sonic-boom@npm:2.7.0" dependencies: atomic-sleep: ^1.0.0 - checksum: 2f63eb28f95e742f2d1f022cf0e3e9df427d0d5c2fd4d24185ac983f60dfd2b45a2d8631e7a88e4d2c21a141cd2890af5aa3ed642ad8edb8716f8f3e017131b6 + checksum: 00dfa56fe9f3b9989fed08809c48645b1ea33759d81a22319ab87211a64e6834c33909dbfa75aa0ec6f6a7502290342a79ce7ba460d137a58579a2acb8ebe835 languageName: node linkType: hard @@ -10313,13 +10164,6 @@ __metadata: languageName: node linkType: hard -"split-on-first@npm:^1.0.0": - version: 1.1.0 - resolution: "split-on-first@npm:1.1.0" - checksum: 16ff85b54ddcf17f9147210a4022529b343edbcbea4ce977c8f30e38408b8d6e0f25f92cd35b86a524d4797f455e29ab89eb8db787f3c10708e0b47ebf528d30 - languageName: node - linkType: hard - "split-string@npm:^3.0.1, split-string@npm:^3.0.2": version: 3.1.0 resolution: "split-string@npm:3.1.0" @@ -10363,12 +10207,12 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^8.0.1": - version: 8.0.1 - resolution: "ssri@npm:8.0.1" +"ssri@npm:^9.0.0": + version: 9.0.0 + resolution: "ssri@npm:9.0.0" dependencies: minipass: ^3.1.1 - checksum: bc447f5af814fa9713aa201ec2522208ae0f4d8f3bda7a1f445a797c7b929a02720436ff7c478fb5edc4045adb02b1b88d2341b436a80798734e2494f1067b36 + checksum: bf33174232d07cc64e77ab1c51b55d28352273380c503d35642a19627e88a2c5f160039bb0a28608a353485075dda084dbf0390c7070f9f284559eb71d01b84b languageName: node linkType: hard @@ -10433,13 +10277,6 @@ __metadata: languageName: node linkType: hard -"strict-uri-encode@npm:^2.0.0": - version: 2.0.0 - resolution: "strict-uri-encode@npm:2.0.0" - checksum: eaac4cf978b6fbd480f1092cab8b233c9b949bcabfc9b598dd79a758f7243c28765ef7639c876fa72940dac687181b35486ea01ff7df3e65ce3848c64822c581 - languageName: node - linkType: hard - "string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2" @@ -10481,16 +10318,7 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: ~5.2.0 - checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 - languageName: node - linkType: hard - -"string_decoder@npm:~1.1.1": +"string_decoder@npm:^1.1.1, string_decoder@npm:~1.1.1": version: 1.1.1 resolution: "string_decoder@npm:1.1.1" dependencies: @@ -10946,10 +10774,10 @@ __metadata: languageName: node linkType: hard -"treeverse@npm:^1.0.4": - version: 1.0.4 - resolution: "treeverse@npm:1.0.4" - checksum: 712640acd811060ff552a3c761f700d18d22a4da544d31b4e290817ac4bbbfcfe33b58f85e7a5787e6ff7351d3a9100670721a289ca14eb87b36ad8a0c20ebd8 +"treeverse@npm:^2.0.0": + version: 2.0.0 + resolution: "treeverse@npm:2.0.0" + checksum: 3c6b2b890975a4d42c86b9a0f1eb932b4450db3fa874be5c301c4f5e306fd76330c6a490cf334b0937b3a44b049787ba5d98c88bc7b140f34fdb3ab1f83e5269 languageName: node linkType: hard @@ -10984,8 +10812,8 @@ __metadata: linkType: hard "ts-jest@npm:^27.0.4": - version: 27.1.2 - resolution: "ts-jest@npm:27.1.2" + version: 27.1.4 + resolution: "ts-jest@npm:27.1.4" dependencies: bs-logger: 0.x fast-json-stable-stringify: 2.x @@ -10999,7 +10827,6 @@ __metadata: "@babel/core": ">=7.0.0-beta.0 <8" "@types/jest": ^27.0.0 babel-jest: ">=27.0.0 <28" - esbuild: ~0.14.0 jest: ^27.0.0 typescript: ">=3.8 <5.0" peerDependenciesMeta: @@ -11013,19 +10840,19 @@ __metadata: optional: true bin: ts-jest: cli.js - checksum: 2e7275f8a3545ec1340b37c458ace9244b5903e86861eb108beffff97d433f296c1254f76a41b573b1fe6245110b21bb62150bb88d55159f1dc7a929886535cb + checksum: d2cc2719ed2884a880ab50d2c14c311834be9c88bc79d0064fa0189afce5c296d7676314d26cc3f7e82ddd52df272c2d4137a832c89616f30cbe8f43e30f9a29 languageName: node linkType: hard -"tsconfig-paths@npm:^3.12.0": - version: 3.12.0 - resolution: "tsconfig-paths@npm:3.12.0" +"tsconfig-paths@npm:^3.14.1": + version: 3.14.1 + resolution: "tsconfig-paths@npm:3.14.1" dependencies: "@types/json5": ^0.0.29 json5: ^1.0.1 - minimist: ^1.2.0 + minimist: ^1.2.6 strip-bom: ^3.0.0 - checksum: 4999ec6cd1c7cc06750a460dbc0d39fe3595a4308cb5f1d0d0a8283009cf9c0a30d5a156508c28fe3a47760508af5263ab288fc23d71e9762779674257a95d3b + checksum: 8afa01c673ebb4782ba53d3a12df97fa837ce524f8ad38ee4e2b2fd57f5ac79abc21c574e9e9eb014d93efe7fe8214001b96233b5c6ea75bd1ea82afe17a4c6d languageName: node linkType: hard @@ -11036,7 +10863,14 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.1.0, tslib@npm:^2.3.1, tslib@npm:~2.3.0": +"tslib@npm:^2.1.0, tslib@npm:^2.3.1": + version: 2.4.0 + resolution: "tslib@npm:2.4.0" + checksum: 8c4aa6a3c5a754bf76aefc38026134180c053b7bd2f81338cb5e5ebf96fefa0f417bff221592bf801077f5bf990562f6264fecbc42cd3309b33872cb6fc3b113 + languageName: node + linkType: hard + +"tslib@npm:~2.3.0": version: 2.3.1 resolution: "tslib@npm:2.3.1" checksum: de17a98d4614481f7fcb5cd53ffc1aaf8654313be0291e1bfaee4b4bb31a20494b7d218ff2e15017883e8ea9626599b3b0e0229c18383ba9dce89da2adf15cb9 @@ -11138,9 +10972,9 @@ __metadata: linkType: hard "type-fest@npm:^2.0.0": - version: 2.12.1 - resolution: "type-fest@npm:2.12.1" - checksum: faac07668190b7709c16ba4696e42b6cc83b702fa11e8936ce94d9ed1415eb9034b157ae25bba23e222d755e031787f7b92552710704d55e39aadcc27f0ee1da + version: 2.12.2 + resolution: "type-fest@npm:2.12.2" + checksum: ee69676da1f69d2b14bbec28c7b95220a3221ab14093f54bde179c59e185a80470859553eada535ec35d8637a245c2f0efe9d7c99cc46a43f3b4c7ef64db7957 languageName: node linkType: hard @@ -11154,43 +10988,43 @@ __metadata: linkType: hard "typescript@npm:^4.3.5": - version: 4.5.4 - resolution: "typescript@npm:4.5.4" + version: 4.6.3 + resolution: "typescript@npm:4.6.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 59f3243f9cd6fe3161e6150ff6bf795fc843b4234a655dbd938a310515e0d61afd1ac942799e7415e4334255e41c2c49b7dd5d9fd38a17acd25a6779ca7e0961 + checksum: 255bb26c8cb846ca689dd1c3a56587af4f69055907aa2c154796ea28ee0dea871535b1c78f85a6212c77f2657843a269c3a742d09d81495b97b914bf7920415b languageName: node linkType: hard "typescript@patch:typescript@^4.3.5#~builtin": - version: 4.5.4 - resolution: "typescript@patch:typescript@npm%3A4.5.4#~builtin::version=4.5.4&hash=bda367" + version: 4.6.3 + resolution: "typescript@patch:typescript@npm%3A4.6.3#~builtin::version=4.6.3&hash=bda367" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: eda87927f9cfb94aca9b5e47842daf37347ad3073133e17f556fbb6c18f3493c5b551eedab0f4b26774235ddb7acbe0087250d5285f72ce6819a0891dd5a74ed + checksum: 6bf45caf847062420592e711bc9c28bf5f9a9a7fa8245343b81493e4ededae33f1774009d1234d911422d1646a2c839f44e1a23ecb111b40a60ac2ea4c1482a8 languageName: node linkType: hard "uglify-js@npm:^3.1.4": - version: 3.14.5 - resolution: "uglify-js@npm:3.14.5" + version: 3.15.4 + resolution: "uglify-js@npm:3.15.4" bin: uglifyjs: bin/uglifyjs - checksum: 0330eb11a36f4181b6d9a00336355989bfad9dd2203049fc63a59454b0d12337612272ad011bc571b9a382bf74d829ca20409ebfe089e38edb26cfc06bfa2cc9 + checksum: 5f673c5dd7f3b3dd15d1d26aebfe29bccbb1b896c4b5423ec70a2e8b9506c70b6fb6a53dec83df5ad65a717ec9a850adf08e0aedf9b1711eac5eb080216615fa languageName: node linkType: hard "unbox-primitive@npm:^1.0.1": - version: 1.0.1 - resolution: "unbox-primitive@npm:1.0.1" + version: 1.0.2 + resolution: "unbox-primitive@npm:1.0.2" dependencies: - function-bind: ^1.1.1 - has-bigints: ^1.0.1 - has-symbols: ^1.0.2 + call-bind: ^1.0.2 + has-bigints: ^1.0.2 + has-symbols: ^1.0.3 which-boxed-primitive: ^1.0.2 - checksum: 89d950e18fb45672bc6b3c961f1e72c07beb9640c7ceed847b571ba6f7d2af570ae1a2584cfee268b9d9ea1e3293f7e33e0bc29eaeb9f8e8a0bab057ff9e6bba + checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 languageName: node linkType: hard @@ -11378,13 +11212,13 @@ __metadata: linkType: hard "v8-to-istanbul@npm:^8.1.0": - version: 8.1.0 - resolution: "v8-to-istanbul@npm:8.1.0" + version: 8.1.1 + resolution: "v8-to-istanbul@npm:8.1.1" dependencies: "@types/istanbul-lib-coverage": ^2.0.1 convert-source-map: ^1.6.0 source-map: ^0.7.3 - checksum: c7dabf9567e0c210b24d0720e553803cbe1ff81edb1ec7f2080eb4be01ed081a40286cc9f4aaa86d1bf8d57840cefae8fdf326b7cb8faa316ba50c7b948030d4 + checksum: 54ce92bec2727879626f623d02c8d193f0c7e919941fa373ec135189a8382265117f5316ea317a1e12a5f9c13d84d8449052a731fe3306fa4beaafbfa4cab229 languageName: node linkType: hard @@ -11407,15 +11241,6 @@ __metadata: languageName: node linkType: hard -"validate-npm-package-name@npm:~3.0.0": - version: 3.0.0 - resolution: "validate-npm-package-name@npm:3.0.0" - dependencies: - builtins: ^1.0.3 - checksum: ce4c68207abfb22c05eedb09ff97adbcedc80304a235a0844f5344f1fd5086aa80e4dbec5684d6094e26e35065277b765c1caef68bcea66b9056761eddb22967 - languageName: node - linkType: hard - "w3c-hr-time@npm:^1.0.2": version: 1.0.2 resolution: "w3c-hr-time@npm:1.0.2" @@ -11616,8 +11441,8 @@ __metadata: linkType: hard "ws@npm:^7.4.6": - version: 7.5.6 - resolution: "ws@npm:7.5.6" + version: 7.5.7 + resolution: "ws@npm:7.5.7" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -11626,7 +11451,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 0c2ffc9a539dd61dd2b00ff6cc5c98a3371e2521011fe23da4b3578bb7ac26cbdf7ca8a68e8e08023c122ae247013216dde2a20c908de415a6bcc87bdef68c87 + checksum: 5c1f669a166fb57560b4e07f201375137fa31d9186afde78b1508926345ce546332f109081574ddc4e38cc474c5406b5fc71c18d71eb75f6e2d2245576976cba languageName: node linkType: hard @@ -11679,14 +11504,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:20.x, yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": - version: 20.2.4 - resolution: "yargs-parser@npm:20.2.4" - checksum: d251998a374b2743a20271c2fd752b9fbef24eb881d53a3b99a7caa5e8227fcafd9abf1f345ac5de46435821be25ec12189a11030c12ee6481fef6863ed8b924 - languageName: node - linkType: hard - -"yargs-parser@npm:^20.2.9": +"yargs-parser@npm:20.x, yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3, yargs-parser@npm:^20.2.9": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3