From b23f272e5101af6b7ec5495cc814cd80bcdf7a10 Mon Sep 17 00:00:00 2001 From: Niek Palm Date: Thu, 6 Jan 2022 21:10:16 +0100 Subject: [PATCH 01/10] Replace creating instance by the fleet api Enable create fleet API Enable create fleet API refactor refactor fix tests cleanup refactor refactor, prepare for creating muliple runners revert and typo revert and typo Adjust for ARM refactor --- README.md | 4 ++-- main.tf | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 32a9e7052c..1218772b93 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ To be able to support a number of use-cases the module has quite a lot configura - Linux vs Windows. you can configure the os types linux and win. Linux will be used by default. - Re-use vs Ephemeral. By default runners are re-used for till detected idle, once idle they will be removed from the pool. To improve security we are introducing ephemeral runners. Those runners are only used for one job. Ephemeral runners are only working in combination with the workflow job event. We also suggest to use a pre-build AMI to improve the start time of jobs. - GitHub cloud vs GitHub enterprise server (GHES). The runner support GitHub cloud as well GitHub enterprise service. For GHES we rely on our community to test and support. We have no possibility to test ourselves on GHES. -- Spot vs on-demand. The runners using either the EC2 spot or on-demand life cycle. Runners will be created via the AWS [CreateFleet API](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet.html). The module (scale up lambda) will request an instance via the create fleet API in one of the subnets and matching one of the specified instance types. +- Spot vs on-demand. The runners using either the EC2 spot or on-demand life cycle. Runners will be created via the AWC [CreateFLeet API](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet.html). THe module (scale up lambda) will request via the create fleet API aan instance in one of the subnets and matching one of the specified instances types. #### ARM64 support via Graviton/Graviton2 instance-types @@ -326,7 +326,7 @@ The following sub modules are optional and are provided as example or utility: ### ARM64 configuration for submodules -When using the top-level module configure `runner_architecture = arm64` and ensure the list of `instance_types` matches. When not using the top-level ensure the bot properties are set on the submodules. +When using the top level module configure `runner_architecture = arm64` and insure the list of `instance_types` matches. When not using the top-level ensure the bot properties are set on the submodules. ## Debugging diff --git a/main.tf b/main.tf index 76ce82833d..a26dec6046 100644 --- a/main.tf +++ b/main.tf @@ -92,12 +92,12 @@ module "runners" { s3_bucket_runner_binaries = module.runner_binaries.bucket s3_location_runner_binaries = local.s3_action_runner_url - runner_os = var.runner_os - instance_types = var.instance_types - instance_target_capacity_type = var.instance_target_capacity_type - instance_allocation_strategy = var.instance_allocation_strategy - instance_max_spot_price = var.instance_max_spot_price - block_device_mappings = var.block_device_mappings + runner_os = var.runner_os + instance_types = var.instance_types + instance_targeet_capacity_type = var.instance_targeet_capacity_type + instance_allocation_strategy = var.instance_allocation_strategy + instance_max_spot_price = var.instance_max_spot_price + block_device_mappings = var.block_device_mappings runner_architecture = var.runner_architecture ami_filter = var.ami_filter From dd97057d72c4dfdef7704fe17ae2b2b02f12b354 Mon Sep 17 00:00:00 2001 From: Niek Palm Date: Wed, 12 Jan 2022 12:19:04 +0100 Subject: [PATCH 02/10] add lambda function for creating a simple pool fix Add tests Add simple pool Add support for multiple pool configs --- README.md | 43 +++-- examples/ephemeral/main.tf | 13 +- main.tf | 6 + modules/runners/README.md | 13 ++ .../lambdas/runners/src/aws/runners.ts | 24 ++- .../lambdas/runners/src/lambda.test.ts | 37 +++- modules/runners/lambdas/runners/src/lambda.ts | 15 +- .../runners/lambdas/runners/src/local-down.ts | 6 +- .../lambdas/runners/src/local-simple-pool.ts | 11 ++ .../runners/lambdas/runners/src/modules.d.ts | 1 + .../runners/src/scale-runners/scale-up.ts | 9 +- .../src/simple-pool/simple-pool.test.ts | 178 ++++++++++++++++++ .../runners/src/simple-pool/simple-pool.ts | 91 +++++++++ .../runners/policies/lambda-simple-pool.json | 49 +++++ modules/runners/simple-pool.tf | 124 ++++++++++++ modules/runners/variables.tf | 27 +++ variables.tf | 28 ++- 17 files changed, 643 insertions(+), 32 deletions(-) create mode 100644 modules/runners/lambdas/runners/src/local-simple-pool.ts create mode 100644 modules/runners/lambdas/runners/src/simple-pool/simple-pool.test.ts create mode 100644 modules/runners/lambdas/runners/src/simple-pool/simple-pool.ts create mode 100644 modules/runners/policies/lambda-simple-pool.json create mode 100644 modules/runners/simple-pool.tf diff --git a/README.md b/README.md index 1218772b93..d075a15736 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ This [Terraform](https://www.terraform.io/) module creates the required infrastr - [Option 2: App](#option-2-app) - [Install app](#install-app) - [Encryption](#encryption) + - [Simple Pool](#simple-pool) - [Idle runners](#idle-runners) - [Ephemeral runners](#ephemeral-runners) - [Prebuilt Images](#prebuilt-images) @@ -251,6 +252,14 @@ module "runners" { ``` +### Simple Pool + +The module basically supports two options for keeping a pool of runners. One is via a simple pool which only supports org-level runners, the second option is [keeping runners idle](#idle-runners). + +The simple pool is introduced in combination with the ephemeral runners and is primary meant to ensure if any event is unexpected dropped, and no runner was created the pool can pick up the job. THe pool is maintained by a lambda. Each time the lambda is triggered a check is preformed if the number of idler runners managed by the module are meeting the expected pool size. If not, the pool will be adjusted. Keep in mind that the scale down function is still active and will terminate instances that are detected to long as idle. + +The simple pool is NOT enabled by default can can be enabled by setting the the size of the pool greater then 0. The [ephemeral example](./examples/ephemeral/README.md) contains a configuration options (commented out). + ### Idle runners The module will scale down to zero runners be default, by specifying a `idle_config` config idle runners can be kept active. The scale down lambda checks if any of the cron expressions matches the current time with a marge of 5 seconds. When there is a match the number of runners specified in the idle config will be kept active. In case multiple cron expressions matches only the first one is taken in to account. Below an idle configuration for keeping runners active from 9 to 5 on working days. @@ -265,20 +274,6 @@ idle_config = [{ _**Note**_: When using Windows runners it's recommended to keep a few runners warmed up due to the minutes-long cold start time. -### Ephemeral runners - -Currently a beta feature! You can configure runners to be ephemeral, runners will be used only for one job. The feature should be used in conjunction with listening for the workflow job event. Please consider the following: - -- The scale down lambda is still active, and should only remove orphan instances. But there is no strict check in place. So ensure you configure the `minimum_running_time_in_minutes` to a value that is high enough to got your runner booted and connected to avoid it got terminated before executing a job. -- The messages sent from the webhook lambda to scale-up lambda are by default delayed delayed by SQS, to give available runners to option to start the job before the decision is made to scale more runners. For ephemeral runners there is no need to wait. Set `delay_webhook_event` to `0`. -- To ensure runners are created in the same order GitHub sends the events we use by default a FIFO queue, this is mainly relevant for repo level runners. For ephemeral runners you can set `fifo_build_queue` to `false`. -- Error related to scaling should be retried via SQS. You can configure `job_queue_retention_in_seconds` `redrive_build_queue` to tune the behavior. We have no mechanism to avoid events will never processed, which means potential no runner could be created and the job in GitHub can time out in 6 hours. - -The example for [ephemeral runners](./examples/ephemeral) is based on the [default example](./examples/default). Have look on the diff to see the major configuration differences. - -### Prebuilt Images - -This module also allows you to run agents from a prebuilt AMI to gain faster startup times. You can find more information in [the image README.md](/images/README.md) #### Supported config @@ -298,6 +293,22 @@ Cron expressions are parsed by [cron-parser](https://github.com/harrisiirak/cron For time zones please check [TZ database name column](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) for the supported values. +### Ephemeral runners + +Currently a beta feature! You can configure runners to be ephemeral, runners will be used only for one job. The feature should be used in conjunction with listening for the workflow job event. Please consider the following: + +- The scale down lambda is still active, and should only remove orphan instances. But there is no strict check in place. So ensure you configure the `minimum_running_time_in_minutes` to a value that is high enough to got your runner booted and connected to avoid it got terminated before executing a job. +- The messages sent from the webhook lambda to scale-up lambda are by default delayed delayed by SQS, to give available runners to option to start the job before the decision is made to scale more runners. For ephemeral runners there is no need to wait. Set `delay_webhook_event` to `0`. +- To ensure runners are created in the same order GitHub sends the events we use by default a FIFO queue, this is mainly relevant for repo level runners. For ephemeral runners you can set `fifo_build_queue` to `false`. +- Error related to scaling should be retried via SQS. You can configure `job_queue_retention_in_seconds` `redrive_build_queue` to tune the behavior. We have no mechanism to avoid events will never processed, which means potential no runner could be created and the job in GitHub can time out in 6 hours. + +The example for [ephemeral runners](./examples/ephemeral) is based on the [default example](./examples/default). Have look on the diff to see the major configuration differences. + +### Prebuilt Images + +This module also allows you to run agents from a prebuilt AMI to gain faster startup times. You can find more information in [the image README.md](/images/README.md) + + ## Examples Examples are located in the [examples](./examples) directory. The following examples are provided: @@ -441,6 +452,10 @@ In case the setup does not work as intended follow the trace of events: | [runners\_scale\_up\_lambda\_timeout](#input\_runners\_scale\_up\_lambda\_timeout) | Time out for the scale up lambda in seconds. | `number` | `30` | no | | [scale\_down\_schedule\_expression](#input\_scale\_down\_schedule\_expression) | Scheduler expression to check every x for scale down. | `string` | `"cron(*/5 * * * ? *)"` | no | | [scale\_up\_reserved\_concurrent\_executions](#input\_scale\_up\_reserved\_concurrent\_executions) | Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations. | `number` | `1` | no | +| [simple\_pool\_config](#input\_simple\_pool\_config) | The configuration for updating the pool. The `pool_size` to adjust to by the events triggered by the the `schedule_expression. For example you can configure a cron expression for week days to adjust the pool to 10 and another expression for the weekend to adjust the pool to 1.` |
list(object({
schedule_expression = string
pool_size = number
}))
| `[]` | no | +| [simple\_pool\_lambda\_timeout](#input\_simple\_pool\_lambda\_timeout) | Time out for the simple pool lambda lambda in seconds. | `number` | `60` | no | +| [simple\_pool\_reserved\_concurrent\_executions](#input\_simple\_pool\_reserved\_concurrent\_executions) | Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations. | `number` | `1` | no | +| [simple\_pool\_runner\_owner](#input\_simple\_pool\_runner\_owner) | The simple pool wil deploy runners to an GitHub org, set this value to the org to which you want the runners deployed. Repo level is not supported. | `string` | `null` | no | | [subnet\_ids](#input\_subnet\_ids) | List of subnets in which the action runners will be launched, the subnets needs to be subnets in the `vpc_id`. | `list(string)` | n/a | yes | | [syncer\_lambda\_s3\_key](#input\_syncer\_lambda\_s3\_key) | S3 key for syncer lambda function. Required if using S3 bucket to specify lambdas. | `any` | `null` | no | | [syncer\_lambda\_s3\_object\_version](#input\_syncer\_lambda\_s3\_object\_version) | S3 object version for syncer lambda function. Useful if S3 versioning is enabled on source bucket. | `any` | `null` | no | diff --git a/examples/ephemeral/main.tf b/examples/ephemeral/main.tf index b9d553823f..06533a0337 100644 --- a/examples/ephemeral/main.tf +++ b/examples/ephemeral/main.tf @@ -57,10 +57,17 @@ module "runners" { enable_ephemeral_runners = true + # # Example of simple pool usages + # simple_pool_runner_owner = "philips-test-runners" + # simple_pool_config = [{ + # pool_size = 2 + # schedule_expression = "cron(*/2 * * * ? *)" + # }] + # configure your pre-built AMI - enabled_userdata = false - ami_filter = { name = ["github-runner-amzn2-x86_64-2021*"] } - ami_owners = [data.aws_caller_identity.current.account_id] + # enabled_userdata = false + # ami_filter = { name = ["github-runner-amzn2-x86_64-2021*"] } + # ami_owners = [data.aws_caller_identity.current.account_id] # Enable logging log_level = "debug" diff --git a/main.tf b/main.tf index a26dec6046..0503f1f8fc 100644 --- a/main.tf +++ b/main.tf @@ -159,6 +159,12 @@ module "runners" { log_type = var.log_type log_level = var.log_level + + simple_pool_config = var.simple_pool_config + simple_pool_lambda_timeout = var.simple_pool_lambda_timeout + simple_pool_runner_owner = var.simple_pool_runner_owner + simple_pool_reserved_concurrent_executions = var.simple_pool_reserved_concurrent_executions + } module "runner_binaries" { diff --git a/modules/runners/README.md b/modules/runners/README.md index 0f0b528e5f..8f1af538e3 100644 --- a/modules/runners/README.md +++ b/modules/runners/README.md @@ -70,14 +70,18 @@ No modules. | Name | Type | |------|------| | [aws_cloudwatch_event_rule.scale_down](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_event_rule) | resource | +| [aws_cloudwatch_event_rule.simple_pool](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_event_rule) | resource | | [aws_cloudwatch_event_target.scale_down](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_event_target) | resource | +| [aws_cloudwatch_event_target.simple_pool](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_event_target) | resource | | [aws_cloudwatch_log_group.gh_runners](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_log_group) | resource | | [aws_cloudwatch_log_group.scale_down](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_log_group) | resource | | [aws_cloudwatch_log_group.scale_up](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_log_group) | resource | +| [aws_cloudwatch_log_group.simple_pool](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_log_group) | resource | | [aws_iam_instance_profile.runner](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_instance_profile) | resource | | [aws_iam_role.runner](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource | | [aws_iam_role.scale_down](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource | | [aws_iam_role.scale_up](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource | +| [aws_iam_role.simple_pool](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource | | [aws_iam_role_policy.cloudwatch](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | | [aws_iam_role_policy.describe_tags](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | | [aws_iam_role_policy.dist_bucket](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | @@ -88,15 +92,20 @@ No modules. | [aws_iam_role_policy.scale_up](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | | [aws_iam_role_policy.scale_up_logging](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | | [aws_iam_role_policy.service_linked_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | +| [aws_iam_role_policy.simple_pool](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | +| [aws_iam_role_policy.simple_pool_logging](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | | [aws_iam_role_policy.ssm_parameters](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | | [aws_iam_role_policy_attachment.managed_policies](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource | | [aws_iam_role_policy_attachment.scale_down_vpc_execution_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource | | [aws_iam_role_policy_attachment.scale_up_vpc_execution_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource | +| [aws_iam_role_policy_attachment.simple_pool_vpc_execution_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource | | [aws_lambda_event_source_mapping.scale_up](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_event_source_mapping) | resource | | [aws_lambda_function.scale_down](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function) | resource | | [aws_lambda_function.scale_up](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function) | resource | +| [aws_lambda_function.simple_pool](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function) | resource | | [aws_lambda_permission.scale_down](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_permission) | resource | | [aws_lambda_permission.scale_runners_lambda](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_permission) | resource | +| [aws_lambda_permission.simple_pool](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_permission) | resource | | [aws_launch_template.runner](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/launch_template) | resource | | [aws_security_group.runner_sg](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group) | resource | | [aws_ssm_parameter.cloudwatch_agent_config_runner](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ssm_parameter) | resource | @@ -169,6 +178,10 @@ No modules. | [s3\_location\_runner\_binaries](#input\_s3\_location\_runner\_binaries) | S3 location of runner distribution. | `string` | n/a | yes | | [scale\_down\_schedule\_expression](#input\_scale\_down\_schedule\_expression) | Scheduler expression to check every x for scale down. | `string` | `"cron(*/5 * * * ? *)"` | no | | [scale\_up\_reserved\_concurrent\_executions](#input\_scale\_up\_reserved\_concurrent\_executions) | Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations. | `number` | `1` | no | +| [simple\_pool\_config](#input\_simple\_pool\_config) | The configuration for updating the pool. The `pool_size` to adjust to by the events triggered by the the `schedule_expression. For example you can configure a cron expression for week days to adjust the pool to 10 and another expression for the weekend to adjust the pool to 1.` |
list(object({
schedule_expression = string
pool_size = number
}))
| `[]` | no | +| [simple\_pool\_lambda\_timeout](#input\_simple\_pool\_lambda\_timeout) | Time out for the simple pool lambda lambda in seconds. | `number` | `60` | no | +| [simple\_pool\_reserved\_concurrent\_executions](#input\_simple\_pool\_reserved\_concurrent\_executions) | Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations. | `number` | `1` | no | +| [simple\_pool\_runner\_owner](#input\_simple\_pool\_runner\_owner) | The simple pool wil deploy runners to an GitHub org, set this value to the org to which you want the runners deployed. Repo level is not supported. | `string` | `null` | no | | [sqs\_build\_queue](#input\_sqs\_build\_queue) | SQS queue to consume accepted build events. |
object({
arn = string
})
| n/a | yes | | [subnet\_ids](#input\_subnet\_ids) | List of subnets in which the action runners will be launched, the subnets needs to be subnets in the `vpc_id`. | `list(string)` | n/a | yes | | [tags](#input\_tags) | Map of tags that will be added to created resources. By default resources will be tagged with name and environment. | `map(string)` | `{}` | no | diff --git a/modules/runners/lambdas/runners/src/aws/runners.ts b/modules/runners/lambdas/runners/src/aws/runners.ts index 1ac66b907d..04030b5920 100644 --- a/modules/runners/lambdas/runners/src/aws/runners.ts +++ b/modules/runners/lambdas/runners/src/aws/runners.ts @@ -24,6 +24,7 @@ export interface ListRunnerFilters { runnerType?: 'Org' | 'Repo'; runnerOwner?: string; environment?: string; + statuses?: string[]; } export interface RunnerInputParameters { @@ -43,11 +44,13 @@ export interface RunnerInputParameters { } export async function listEC2Runners(filters: ListRunnerFilters | undefined = undefined): Promise { + const ec2Statuses = filters?.statuses ? filters.statuses : ['running', 'pending']; const ec2 = new EC2(); const ec2Filters = [ { Name: 'tag:Application', Values: ['github-action-runner'] }, - { Name: 'instance-state-name', Values: ['running', 'pending'] }, + { Name: 'instance-state-name', Values: ec2Statuses }, ]; + if (filters) { if (filters.environment !== undefined) { ec2Filters.push({ Name: 'tag:Environment', Values: [filters.environment] }); @@ -57,7 +60,24 @@ export async function listEC2Runners(filters: ListRunnerFilters | undefined = un ec2Filters.push({ Name: `tag:Owner`, Values: [filters.runnerOwner] }); } } - const runningInstances = await ec2.describeInstances({ Filters: ec2Filters }).promise(); + + // const runningInstances = []; + + const runners: RunnerList[] = []; + let nextToken = undefined; + let hasNext = true; + while (hasNext) { + const runningInstances: EC2.DescribeInstancesResult = await ec2 + .describeInstances({ Filters: ec2Filters, NextToken: nextToken }) + .promise(); + hasNext = runningInstances.NextToken ? true : false; + nextToken = runningInstances.NextToken; + runners.push(...getRunnerInfo(runningInstances)); + } + return runners; +} + +function getRunnerInfo(runningInstances: EC2.DescribeInstancesResult) { const runners: RunnerList[] = []; if (runningInstances.Reservations) { for (const r of runningInstances.Reservations) { diff --git a/modules/runners/lambdas/runners/src/lambda.test.ts b/modules/runners/lambdas/runners/src/lambda.test.ts index b8c163a00f..b300a41466 100644 --- a/modules/runners/lambdas/runners/src/lambda.test.ts +++ b/modules/runners/lambdas/runners/src/lambda.test.ts @@ -1,10 +1,11 @@ import { Context, SQSEvent, SQSRecord } from 'aws-lambda'; import { mocked } from 'ts-jest/utils'; -import { scaleUpHandler } from './lambda'; +import { adjustPool, scaleDownHandler, scaleUpHandler } from './lambda'; import { ActionRequestMessage, scaleUp } from './scale-runners/scale-up'; import ScaleError from './scale-runners/ScaleError'; import { logger } from './logger'; import { scaleDown } from './scale-runners/scale-down'; +import { adjust } from './simple-pool/simple-pool'; const body: ActionRequestMessage = { eventType: 'workflow_job', @@ -58,6 +59,7 @@ const context: Context = { jest.mock('./scale-runners/scale-up'); jest.mock('./scale-runners/scale-down'); +jest.mock('./simple-pool/simple-pool'); jest.mock('./logger'); describe('Test scale up lambda wrapper.', () => { @@ -76,14 +78,14 @@ describe('Test scale up lambda wrapper.', () => { resolve(); }); }); - await expect(scaleUpHandler(sqsEvent, context)).resolves; + expect(await scaleUpHandler(sqsEvent, context)).resolves; }); it('Non scale should resolve.', async () => { const error = new Error('some error'); const mock = mocked(scaleUp); mock.mockRejectedValue(error); - await expect(scaleUpHandler(sqsEvent, context)).resolves; + expect(await scaleUpHandler(sqsEvent, context)).resolves; }); it('Scale should be rejected', async () => { @@ -91,7 +93,7 @@ describe('Test scale up lambda wrapper.', () => { const mock = mocked(scaleUp); mock.mockRejectedValue(error); - await expect(scaleUpHandler(sqsEvent, context)).rejects.toThrow(error); + expect(scaleUpHandler(sqsEvent, context)).rejects.toThrow(error); }); }); @@ -107,7 +109,7 @@ async function testInvalidRecords(sqsRecords: SQSRecord[]) { Records: sqsRecords, }; - await expect(scaleUpHandler(sqsEventMultipleRecords, context)).resolves; + expect(await scaleUpHandler(sqsEventMultipleRecords, context)).resolves; expect(logWarnSpy).toHaveBeenCalledWith( 'Event ignored, only one record at the time can be handled, ensure the lambda batch size is set to 1.', @@ -123,13 +125,34 @@ describe('Test scale down lambda wrapper.', () => { resolve(); }); }); - await expect(scaleDown()).resolves; + expect(await scaleDownHandler(context)).resolves; }); it('Scaling down with error.', async () => { const error = new Error('some error'); const mock = mocked(scaleDown); mock.mockRejectedValue(error); - await expect(scaleDown()).resolves; + expect(await scaleDownHandler(context)).resolves; + }); +}); + +describe('Adjust pool.', () => { + it('Receive message to adjust pool.', async () => { + const mock = mocked(adjust); + mock.mockImplementation(() => { + return new Promise((resolve) => { + resolve(); + }); + }); + expect(await adjustPool({ simplePoolSize: 2 }, context)).resolves; + }); + + it('Handle error for adjusting pool.', async () => { + const mock = mocked(adjust); + const error = new Error('errorXYX'); + mock.mockRejectedValue(error); + const logSpy = jest.spyOn(logger, 'error'); + expect(await adjustPool({ simplePoolSize: 0 }, context)).resolves; + expect(logSpy).lastCalledWith(error); }); }); diff --git a/modules/runners/lambdas/runners/src/lambda.ts b/modules/runners/lambdas/runners/src/lambda.ts index d767595d61..b27ae25847 100644 --- a/modules/runners/lambdas/runners/src/lambda.ts +++ b/modules/runners/lambdas/runners/src/lambda.ts @@ -1,9 +1,10 @@ import { scaleUp } from './scale-runners/scale-up'; import { scaleDown } from './scale-runners/scale-down'; -import { SQSEvent, ScheduledEvent, Context } from 'aws-lambda'; +import { SQSEvent, Context } from 'aws-lambda'; import { LogFields, logger } from './logger'; import ScaleError from './scale-runners/ScaleError'; import 'source-map-support/register'; +import { adjust, SimplePoolEvent } from './simple-pool/simple-pool'; export async function scaleUpHandler(event: SQSEvent, context: Context): Promise { logger.setSettings({ requestId: context.awsRequestId }); @@ -27,7 +28,7 @@ export async function scaleUpHandler(event: SQSEvent, context: Context): Promise } } -export async function scaleDownHandler(event: ScheduledEvent, context: Context): Promise { +export async function scaleDownHandler(context: Context): Promise { logger.setSettings({ requestId: context.awsRequestId }); try { @@ -36,3 +37,13 @@ export async function scaleDownHandler(event: ScheduledEvent, context: Context): logger.error(e); } } + +export async function adjustPool(event: SimplePoolEvent, context: Context): Promise { + logger.setSettings({ requestId: context.awsRequestId }); + + try { + await adjust(event); + } catch (e) { + logger.error(e); + } +} diff --git a/modules/runners/lambdas/runners/src/local-down.ts b/modules/runners/lambdas/runners/src/local-down.ts index b0ee840964..2d0ac05fca 100644 --- a/modules/runners/lambdas/runners/src/local-down.ts +++ b/modules/runners/lambdas/runners/src/local-down.ts @@ -1,7 +1,11 @@ import { scaleDown } from './scale-runners/scale-down'; export function run(): void { - scaleDown(); + scaleDown() + .then() + .catch((e) => { + console.log(e); + }); } run(); diff --git a/modules/runners/lambdas/runners/src/local-simple-pool.ts b/modules/runners/lambdas/runners/src/local-simple-pool.ts new file mode 100644 index 0000000000..c1d32c817e --- /dev/null +++ b/modules/runners/lambdas/runners/src/local-simple-pool.ts @@ -0,0 +1,11 @@ +import { adjust } from './simple-pool/simple-pool'; + +export function run(): void { + adjust({ simplePoolSize: 1 }) + .then() + .catch((e) => { + console.log(e); + }); +} + +run(); diff --git a/modules/runners/lambdas/runners/src/modules.d.ts b/modules/runners/lambdas/runners/src/modules.d.ts index 59d49e5b08..41d4339c1e 100644 --- a/modules/runners/lambdas/runners/src/modules.d.ts +++ b/modules/runners/lambdas/runners/src/modules.d.ts @@ -11,6 +11,7 @@ declare namespace NodeJS { PARAMETER_GITHUB_APP_CLIENT_SECRET_NAME: string; PARAMETER_GITHUB_APP_ID_NAME: string; PARAMETER_GITHUB_APP_KEY_BASE64_NAME: string; + RUNNER_OWNER: string; SCALE_DOWN_CONFIG: string; SUBNET_IDS: string; INSTANCE_TYPES: string; diff --git a/modules/runners/lambdas/runners/src/scale-runners/scale-up.ts b/modules/runners/lambdas/runners/src/scale-runners/scale-up.ts index 296219e274..f2e1e5cc37 100644 --- a/modules/runners/lambdas/runners/src/scale-runners/scale-up.ts +++ b/modules/runners/lambdas/runners/src/scale-runners/scale-up.ts @@ -29,9 +29,10 @@ interface CreateEC2RunnerConfig { subnets: string[]; launchTemplateName: string; ec2instanceCriteria: RunnerInputParameters['ec2instanceCriteria']; + numberOfRunners?: number; } -function generateRunnerServiceConfig(githubRunnerConfig: CreateGitHubRunnerConfig, token: any) { +function generateRunnerServiceConfig(githubRunnerConfig: CreateGitHubRunnerConfig, token: string) { const labelsArgument = githubRunnerConfig.runnerExtraLabels !== undefined ? `--labels ${githubRunnerConfig.runnerExtraLabels} ` : ''; const runnerGroupArgument = @@ -55,7 +56,11 @@ async function getGithubRunnerRegistrationToken(githubRunnerConfig: CreateGitHub return registrationToken.data.token; } -async function getInstallationId(ghesApiUrl: string, enableOrgLevel: boolean, payload: ActionRequestMessage) { +async function getInstallationId( + ghesApiUrl: string, + enableOrgLevel: boolean, + payload: ActionRequestMessage, +): Promise { if (payload.installationId !== 0) { return payload.installationId; } diff --git a/modules/runners/lambdas/runners/src/simple-pool/simple-pool.test.ts b/modules/runners/lambdas/runners/src/simple-pool/simple-pool.test.ts new file mode 100644 index 0000000000..d329246043 --- /dev/null +++ b/modules/runners/lambdas/runners/src/simple-pool/simple-pool.test.ts @@ -0,0 +1,178 @@ +import { mocked } from 'ts-jest/utils'; +import { adjust } from './simple-pool'; +import * as ghAuth from '../gh-auth/gh-auth'; +import * as scale from '../scale-runners/scale-up'; +import nock from 'nock'; +import { Octokit } from '@octokit/rest'; +import { listEC2Runners } from '../aws/runners'; + +const mockOctokit = { + paginate: jest.fn(), + checks: { get: jest.fn() }, + actions: { + createRegistrationTokenForOrg: jest.fn(), + }, + apps: { + getOrgInstallation: jest.fn(), + }, +}; + +jest.mock('@octokit/rest', () => ({ + Octokit: jest.fn().mockImplementation(() => mockOctokit), +})); + +jest.mock('./../aws/runners'); +jest.mock('./../gh-auth/gh-auth'); + +const mocktokit = Octokit as jest.MockedClass; +const mockedAppAuth = mocked(ghAuth.createGithubAppAuth, true); +const mockedInstallationAuth = mocked(ghAuth.createGithubInstallationAuth, true); +const mockCreateClient = mocked(ghAuth.createOctoClient, true); +const mockListRunners = mocked(listEC2Runners); + +const cleanEnv = process.env; + +const ORG = 'my-org'; + +beforeEach(() => { + nock.disableNetConnect(); + jest.resetModules(); + jest.clearAllMocks(); + process.env = { ...cleanEnv }; + process.env.GITHUB_APP_KEY_BASE64 = 'TEST_CERTIFICATE_DATA'; + process.env.GITHUB_APP_ID = '1337'; + process.env.GITHUB_APP_CLIENT_ID = 'TEST_CLIENT_ID'; + process.env.GITHUB_APP_CLIENT_SECRET = 'TEST_CLIENT_SECRET'; + process.env.RUNNERS_MAXIMUM_COUNT = '3'; + process.env.ENVIRONMENT = 'unit-test-environment'; + process.env.ENABLE_ORGANIZATION_RUNNERS = 'true'; + process.env.LAUNCH_TEMPLATE_NAME = 'lt-1'; + process.env.SUBNET_IDS = 'subnet-123'; + process.env.INSTANCE_TYPES = 'm5.large'; + process.env.INSTANCE_TARGET_CAPACITY_TYPE = 'spot'; + process.env.RUNNER_OWNER = ORG; + + const mockTokenReturnValue = { + data: { + token: '1234abcd', + }, + }; + mockOctokit.actions.createRegistrationTokenForOrg.mockImplementation(() => mockTokenReturnValue); + + mockOctokit.paginate.mockImplementation(() => [ + { + id: 1, + name: 'i-1', + os: 'linux', + status: 'online', + busy: false, + labels: [], + }, + { + id: 2, + name: 'i-2', + os: 'linux', + status: 'online', + busy: true, + labels: [], + }, + { + id: 3, + name: 'i-3', + os: 'linux', + status: 'offline', + busy: false, + labels: [], + }, + { + id: 11, + name: 'j-1', // some runner of another env + os: 'linux', + status: 'online', + busy: false, + labels: [], + }, + { + id: 12, + name: 'j-2', // some runner of another env + os: 'linux', + status: 'online', + busy: true, + labels: [], + }, + ]); + + mockListRunners.mockImplementation(async () => [ + { + instanceId: 'i-1', + launchTime: new Date(), + type: 'Org', + owner: ORG, + }, + { + instanceId: 'i-2', + launchTime: new Date(), + type: 'Org', + owner: ORG, + }, + { + instanceId: 'i-3', + launchTime: new Date(), + type: 'Org', + owner: ORG, + }, + ]); + + const mockInstallationIdReturnValueOrgs = { + data: { + id: 1, + }, + }; + mockOctokit.apps.getOrgInstallation.mockImplementation(() => mockInstallationIdReturnValueOrgs); + + mockedAppAuth.mockResolvedValue({ + type: 'app', + token: 'token', + appId: 1, + expiresAt: 'some-date', + }); + mockedInstallationAuth.mockResolvedValue({ + type: 'token', + tokenType: 'installation', + token: 'token', + createdAt: 'some-date', + expiresAt: 'some-date', + permissions: {}, + repositorySelection: 'all', + }); + + mockCreateClient.mockResolvedValue(new mocktokit()); +}); + +describe('Test simple pool.', () => { + describe('With GitHub Cloud', () => { + it('Top up pool with pool size 2.', async () => { + const spy = jest.spyOn(scale, 'createRunners'); + expect(await adjust({ simplePoolSize: 2 })).resolves; + expect(spy).toBeCalled; + }); + + it('Should not top up if pool size is reached.', async () => { + const spy = jest.spyOn(scale, 'createRunners'); + expect(await adjust({ simplePoolSize: 1 })).resolves; + expect(spy).not.toHaveBeenCalled; + }); + }); + + describe('With GHES', () => { + beforeEach(() => { + process.env.GHES_URL = 'https://github.enterprise.something'; + }); + + it('Top up if the pool size is set to 5', async () => { + const spy = jest.spyOn(scale, 'createRunners'); + expect(await adjust({ simplePoolSize: 5 })).resolves; + expect(spy).toBeCalled; + }); + }); +}); diff --git a/modules/runners/lambdas/runners/src/simple-pool/simple-pool.ts b/modules/runners/lambdas/runners/src/simple-pool/simple-pool.ts new file mode 100644 index 0000000000..702ea04971 --- /dev/null +++ b/modules/runners/lambdas/runners/src/simple-pool/simple-pool.ts @@ -0,0 +1,91 @@ +import yn from 'yn'; +import { logger as rootLogger } from './../logger'; +import { createRunners } from '../scale-runners/scale-up'; +import { createGithubAppAuth, createGithubInstallationAuth, createOctoClient } from '../gh-auth/gh-auth'; +import { listEC2Runners } from '../aws/runners'; + +const logger = rootLogger.getChildLogger({ name: 'simple-pool' }); + +export interface SimplePoolEvent { + simplePoolSize: number; +} + +export async function adjust(event: SimplePoolEvent): Promise { + logger.info(`Adjusting simple pool of size: ${event.simplePoolSize}`); + const runnerExtraLabels = process.env.RUNNER_EXTRA_LABELS; + const runnerGroup = process.env.RUNNER_GROUP_NAME; + const environment = process.env.ENVIRONMENT; + const ghesBaseUrl = process.env.GHES_URL; + const subnets = process.env.SUBNET_IDS.split(','); + const instanceTypes = process.env.INSTANCE_TYPES.split(','); + const instanceTargetTargetCapacityType = process.env.INSTANCE_TARGET_CAPACITY_TYPE; + const ephemeral = yn(process.env.ENABLE_EPHEMERAL_RUNNERS, { default: false }); + const launchTemplateName = process.env.LAUNCH_TEMPLATE_NAME; + const instanceMaxSpotPrice = process.env.INSTANCE_MAX_SPOT_PRICE; + const instanceAllocationStrategy = process.env.INSTANCE_ALLOCATION_STRATEGY || 'lowest-price'; // same as AWS default + const runnerOwner = process.env.RUNNER_OWNER; + + let ghesApiUrl = ''; + if (ghesBaseUrl) { + ghesApiUrl = `${ghesBaseUrl}/api/v3`; + } + + const installationId = await getInstallationId(ghesApiUrl, runnerOwner); + const ghAuth = await createGithubInstallationAuth(installationId, ghesApiUrl); + const githubInstallationClient = await createOctoClient(ghAuth.token, ghesApiUrl); + + // Look up the runners registered in GitHub, could be also non managed by this module. + const runners = await githubInstallationClient.paginate( + githubInstallationClient.actions.listSelfHostedRunnersForOrg, + { + org: runnerOwner, + per_page: 100, + }, + ); + const idleRunners = runners.filter((r) => !r.busy && r.status === 'online').map((r) => r.name); + + // Look up the managed ec2 runners in AWS, but running does not mean idle + const ec2runners = ( + await listEC2Runners({ + environment, + runnerOwner, + runnerType: 'Org', + statuses: ['running'], + }) + ).map((r) => r.instanceId); + + const managedIdleRunners = ec2runners.filter((r) => idleRunners.includes(r)); + const topUp = event.simplePoolSize - managedIdleRunners.length; + if (topUp > 0) { + logger.info(`The pool will be topped up with ${topUp} runners.`); + await createRunners( + { ephemeral, ghesBaseUrl, runnerExtraLabels, runnerGroup, runnerOwner, runnerType: 'Org' }, + { + ec2instanceCriteria: { + instanceTypes, + targetCapacityType: instanceTargetTargetCapacityType, + maxSpotPrice: instanceMaxSpotPrice, + instanceAllocationStrategy: instanceAllocationStrategy, + }, + environment, + launchTemplateName, + subnets, + numberOfRunners: topUp, + }, + githubInstallationClient, + ); + } else { + logger.info(`Pool will not be topped up. Find ${managedIdleRunners} managed idle runners.`); + } +} + +async function getInstallationId(ghesApiUrl: string, org: string): Promise { + const ghAuth = await createGithubAppAuth(undefined, ghesApiUrl); + const githubClient = await createOctoClient(ghAuth.token, ghesApiUrl); + + return ( + await githubClient.apps.getOrgInstallation({ + org, + }) + ).data.id; +} diff --git a/modules/runners/policies/lambda-simple-pool.json b/modules/runners/policies/lambda-simple-pool.json new file mode 100644 index 0000000000..3e00cec501 --- /dev/null +++ b/modules/runners/policies/lambda-simple-pool.json @@ -0,0 +1,49 @@ +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "ec2:DescribeInstances", + "ec2:DescribeTags", + "ec2:RunInstances", + "ec2:CreateFleet", + "ec2:CreateTags" + ], + "Resource": [ + "*" + ] + }, + { + "Effect": "Allow", + "Action": "iam:PassRole", + "Resource": "${arn_runner_instance_role}" + }, + { + "Effect": "Allow", + "Action": [ + "ssm:PutParameter" + ], + "Resource": "*" + }, + { + "Effect": "Allow", + "Action": [ + "ssm:GetParameter" + ], + "Resource": [ + "${github_app_key_base64_arn}", + "${github_app_id_arn}" + ] +%{ if kms_key_arn != "" ~} + }, + { + "Effect": "Allow", + "Action": [ + "kms:Decrypt" + ], + "Resource": "${kms_key_arn}" +%{ endif ~} + } + ] +} diff --git a/modules/runners/simple-pool.tf b/modules/runners/simple-pool.tf new file mode 100644 index 0000000000..139c0a09d1 --- /dev/null +++ b/modules/runners/simple-pool.tf @@ -0,0 +1,124 @@ +resource "aws_lambda_function" "simple_pool" { + count = length(var.simple_pool_config) == 0 ? 0 : 1 + + s3_bucket = var.lambda_s3_bucket != null ? var.lambda_s3_bucket : null + s3_key = var.runners_lambda_s3_key != null ? var.runners_lambda_s3_key : null + s3_object_version = var.runners_lambda_s3_object_version != null ? var.runners_lambda_s3_object_version : null + filename = var.lambda_s3_bucket == null ? local.lambda_zip : null + source_code_hash = var.lambda_s3_bucket == null ? filebase64sha256(local.lambda_zip) : null + function_name = "${var.environment}-simple-pool" + role = aws_iam_role.simple_pool[0].arn + handler = "index.adjustPool" + runtime = "nodejs14.x" + timeout = var.simple_pool_lambda_timeout + reserved_concurrent_executions = var.simple_pool_reserved_concurrent_executions + memory_size = 512 + tags = local.tags + + environment { + variables = { + RUNNER_OWNER = var.simple_pool_runner_owner + ENVIRONMENT = var.environment + GHES_URL = var.ghes_url + LAUNCH_TEMPLATE_NAME = aws_launch_template.runner.name + LOG_LEVEL = var.log_level + LOG_TYPE = var.log_type + NODE_TLS_REJECT_UNAUTHORIZED = var.ghes_url != null && !var.ghes_ssl_verify ? 0 : 1 + PARAMETER_GITHUB_APP_ID_NAME = var.github_app_parameters.id.name + PARAMETER_GITHUB_APP_KEY_BASE64_NAME = var.github_app_parameters.key_base64.name + RUNNER_EXTRA_LABELS = var.runner_extra_labels + RUNNER_GROUP_NAME = var.runner_group_name + SUBNET_IDS = join(",", var.subnet_ids) + ENABLE_EPHEMERAL_RUNNERS = var.enable_ephemeral_runners + INSTANCE_TYPES = join(",", var.instance_types) + INSTANCE_TARGET_CAPACITY_TYPE = var.instance_targeet_capacity_type + INSTANCE_MAX_SPOT_PRICE = var.instance_max_spot_price + INSTANCE_ALLOCATION_STRATEGY = var.instance_allocation_strategy + } + } + + dynamic "vpc_config" { + for_each = var.lambda_subnet_ids != null && var.lambda_security_group_ids != null ? [true] : [] + content { + security_group_ids = var.lambda_security_group_ids + subnet_ids = var.lambda_subnet_ids + } + } +} + +resource "aws_cloudwatch_log_group" "simple_pool" { + count = length(var.simple_pool_config) == 0 ? 0 : 1 + + name = "/aws/lambda/${aws_lambda_function.simple_pool[0].function_name}" + retention_in_days = var.logging_retention_in_days + tags = var.tags +} + +resource "aws_cloudwatch_event_rule" "simple_pool" { + count = length(var.simple_pool_config) == 0 ? 0 : length(var.simple_pool_config) + + name = "${var.environment}-simple-pool-rule" + schedule_expression = var.simple_pool_config[count.index].schedule_expression + tags = var.tags +} + + +resource "aws_cloudwatch_event_target" "simple_pool" { + count = length(var.simple_pool_config) == 0 ? 0 : length(var.simple_pool_config) + + input = jsonencode({ + simplePoolSize = var.simple_pool_config[count.index].pool_size + }) + + rule = aws_cloudwatch_event_rule.simple_pool[count.index].name + arn = aws_lambda_function.simple_pool[0].arn +} + +resource "aws_lambda_permission" "simple_pool" { + count = length(var.simple_pool_config) == 0 ? 0 : 1 + + statement_id = "AllowExecutionFromCloudWatch" + action = "lambda:InvokeFunction" + function_name = aws_lambda_function.simple_pool[0].function_name + principal = "events.amazonaws.com" + source_arn = aws_cloudwatch_event_rule.simple_pool[0].arn +} + +resource "aws_iam_role" "simple_pool" { + count = length(var.simple_pool_config) == 0 ? 0 : 1 + + name = "${var.environment}-action-simple-pool-lambda-role" + assume_role_policy = data.aws_iam_policy_document.lambda_assume_role_policy.json + path = local.role_path + permissions_boundary = var.role_permissions_boundary + tags = local.tags +} + +resource "aws_iam_role_policy" "simple_pool" { + count = length(var.simple_pool_config) == 0 ? 0 : 1 + + name = "${var.environment}-lambda-simple-pool-policy" + role = aws_iam_role.simple_pool[0].name + policy = templatefile("${path.module}/policies/lambda-simple-pool.json", { + arn_runner_instance_role = aws_iam_role.runner.arn + github_app_id_arn = var.github_app_parameters.id.arn + github_app_key_base64_arn = var.github_app_parameters.key_base64.arn + kms_key_arn = local.kms_key_arn + }) +} + +resource "aws_iam_role_policy" "simple_pool_logging" { + count = length(var.simple_pool_config) == 0 ? 0 : 1 + + name = "${var.environment}-lambda-logging" + role = aws_iam_role.simple_pool[0].name + policy = templatefile("${path.module}/policies/lambda-cloudwatch.json", { + log_group_arn = aws_cloudwatch_log_group.simple_pool[0].arn + }) +} + +resource "aws_iam_role_policy_attachment" "simple_pool_vpc_execution_role" { + count = length(var.simple_pool_config) != 0 && length(var.lambda_subnet_ids) > 0 ? 1 : 0 + role = aws_iam_role.simple_pool[0].name + policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole" +} diff --git a/modules/runners/variables.tf b/modules/runners/variables.tf index 59d2791200..5a26c32aa7 100644 --- a/modules/runners/variables.tf +++ b/modules/runners/variables.tf @@ -462,3 +462,30 @@ variable "enable_ephemeral_runners" { type = bool default = false } + +variable "simple_pool_lambda_timeout" { + description = "Time out for the simple pool lambda lambda in seconds." + type = number + default = 60 +} + +variable "simple_pool_runner_owner" { + description = "The simple pool wil deploy runners to an GitHub org, set this value to the org to which you want the runners deployed. Repo level is not supported." + type = string + default = null +} + +variable "simple_pool_reserved_concurrent_executions" { + description = "Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations." + type = number + default = 1 +} + +variable "simple_pool_config" { + description = "The configuration for updating the pool. The `pool_size` to adjust to by the events triggered by the the `schedule_expression. For example you can configure a cron expression for week days to adjust the pool to 10 and another expression for the weekend to adjust the pool to 1." + type = list(object({ + schedule_expression = string + pool_size = number + })) + default = [] +} diff --git a/variables.tf b/variables.tf index 7c744f70bb..5dc0d08092 100644 --- a/variables.tf +++ b/variables.tf @@ -543,7 +543,6 @@ variable "redrive_build_queue" { } } - variable "runner_architecture" { description = "The platform architecture of the runner instance_type." type = string @@ -553,3 +552,30 @@ variable "runner_architecture" { error_message = "`runner_architecture` value not valid, valid values are: `x64` and `arm64`." } } + +variable "simple_pool_lambda_timeout" { + description = "Time out for the simple pool lambda lambda in seconds." + type = number + default = 60 +} + +variable "simple_pool_runner_owner" { + description = "The simple pool wil deploy runners to an GitHub org, set this value to the org to which you want the runners deployed. Repo level is not supported." + type = string + default = null +} + +variable "simple_pool_reserved_concurrent_executions" { + description = "Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations." + type = number + default = 1 +} + +variable "simple_pool_config" { + description = "The configuration for updating the pool. The `pool_size` to adjust to by the events triggered by the the `schedule_expression. For example you can configure a cron expression for week days to adjust the pool to 10 and another expression for the weekend to adjust the pool to 1." + type = list(object({ + schedule_expression = string + pool_size = number + })) + default = [] +} From a360c704693420212482180140a61d5aabb70c09 Mon Sep 17 00:00:00 2001 From: Niek Palm Date: Thu, 6 Jan 2022 20:57:08 +0100 Subject: [PATCH 03/10] Update README.md Co-authored-by: Alix Lourme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d075a15736..c062185192 100644 --- a/README.md +++ b/README.md @@ -256,7 +256,7 @@ module "runners" { The module basically supports two options for keeping a pool of runners. One is via a simple pool which only supports org-level runners, the second option is [keeping runners idle](#idle-runners). -The simple pool is introduced in combination with the ephemeral runners and is primary meant to ensure if any event is unexpected dropped, and no runner was created the pool can pick up the job. THe pool is maintained by a lambda. Each time the lambda is triggered a check is preformed if the number of idler runners managed by the module are meeting the expected pool size. If not, the pool will be adjusted. Keep in mind that the scale down function is still active and will terminate instances that are detected to long as idle. +The simple pool is introduced in combination with the ephemeral runners and is primary meant to ensure if any event is unexpected dropped, and no runner was created the pool can pick up the job. The pool is maintained by a lambda. Each time the lambda is triggered a check is preformed if the number of idler runners managed by the module are meeting the expected pool size. If not, the pool will be adjusted. Keep in mind that the scale down function is still active and will terminate instances that are detected to long as idle. The simple pool is NOT enabled by default can can be enabled by setting the the size of the pool greater then 0. The [ephemeral example](./examples/ephemeral/README.md) contains a configuration options (commented out). From 266472153c763af0f23ba04b40a49f182daa4748 Mon Sep 17 00:00:00 2001 From: Niek Palm Date: Thu, 6 Jan 2022 21:20:06 +0100 Subject: [PATCH 04/10] cleanup and rebase --- examples/ephemeral/main.tf | 2 +- main.tf | 12 ++++++------ modules/runners/simple-pool.tf | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/ephemeral/main.tf b/examples/ephemeral/main.tf index 06533a0337..db52536399 100644 --- a/examples/ephemeral/main.tf +++ b/examples/ephemeral/main.tf @@ -58,7 +58,7 @@ module "runners" { enable_ephemeral_runners = true # # Example of simple pool usages - # simple_pool_runner_owner = "philips-test-runners" + # simple_pool_runner_owner = "my-org" # simple_pool_config = [{ # pool_size = 2 # schedule_expression = "cron(*/2 * * * ? *)" diff --git a/main.tf b/main.tf index 0503f1f8fc..aa85f69f99 100644 --- a/main.tf +++ b/main.tf @@ -92,12 +92,12 @@ module "runners" { s3_bucket_runner_binaries = module.runner_binaries.bucket s3_location_runner_binaries = local.s3_action_runner_url - runner_os = var.runner_os - instance_types = var.instance_types - instance_targeet_capacity_type = var.instance_targeet_capacity_type - instance_allocation_strategy = var.instance_allocation_strategy - instance_max_spot_price = var.instance_max_spot_price - block_device_mappings = var.block_device_mappings + runner_os = var.runner_os + instance_types = var.instance_types + instance_target_capacity_type = var.instance_target_capacity_type + instance_allocation_strategy = var.instance_allocation_strategy + instance_max_spot_price = var.instance_max_spot_price + block_device_mappings = var.block_device_mappings runner_architecture = var.runner_architecture ami_filter = var.ami_filter diff --git a/modules/runners/simple-pool.tf b/modules/runners/simple-pool.tf index 139c0a09d1..952dfb3130 100644 --- a/modules/runners/simple-pool.tf +++ b/modules/runners/simple-pool.tf @@ -31,7 +31,7 @@ resource "aws_lambda_function" "simple_pool" { SUBNET_IDS = join(",", var.subnet_ids) ENABLE_EPHEMERAL_RUNNERS = var.enable_ephemeral_runners INSTANCE_TYPES = join(",", var.instance_types) - INSTANCE_TARGET_CAPACITY_TYPE = var.instance_targeet_capacity_type + INSTANCE_TARGET_CAPACITY_TYPE = var.instance_target_capacity_type INSTANCE_MAX_SPOT_PRICE = var.instance_max_spot_price INSTANCE_ALLOCATION_STRATEGY = var.instance_allocation_strategy } From 2171af899093e261eaf9ee7a02b0f6fe2ef2caa8 Mon Sep 17 00:00:00 2001 From: Niek Palm Date: Fri, 7 Jan 2022 18:10:11 +0100 Subject: [PATCH 05/10] Update modules/runners/lambdas/runners/src/simple-pool/simple-pool.ts Co-authored-by: Scott Guymer --- modules/runners/lambdas/runners/src/simple-pool/simple-pool.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/runners/lambdas/runners/src/simple-pool/simple-pool.ts b/modules/runners/lambdas/runners/src/simple-pool/simple-pool.ts index 702ea04971..e4e050bc1f 100644 --- a/modules/runners/lambdas/runners/src/simple-pool/simple-pool.ts +++ b/modules/runners/lambdas/runners/src/simple-pool/simple-pool.ts @@ -11,7 +11,7 @@ export interface SimplePoolEvent { } export async function adjust(event: SimplePoolEvent): Promise { - logger.info(`Adjusting simple pool of size: ${event.simplePoolSize}`); + logger.info(`Checking current pool size against simple pool of size: ${event.simplePoolSize}`); const runnerExtraLabels = process.env.RUNNER_EXTRA_LABELS; const runnerGroup = process.env.RUNNER_GROUP_NAME; const environment = process.env.ENVIRONMENT; From 572e968d027ae4837b62fc7b6557a2de74a30dd8 Mon Sep 17 00:00:00 2001 From: Niek Palm Date: Mon, 10 Jan 2022 09:17:46 +0100 Subject: [PATCH 06/10] review --- modules/runners/lambdas/runners/src/aws/runners.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/runners/lambdas/runners/src/aws/runners.ts b/modules/runners/lambdas/runners/src/aws/runners.ts index 04030b5920..b069a57d89 100644 --- a/modules/runners/lambdas/runners/src/aws/runners.ts +++ b/modules/runners/lambdas/runners/src/aws/runners.ts @@ -61,10 +61,8 @@ export async function listEC2Runners(filters: ListRunnerFilters | undefined = un } } - // const runningInstances = []; - const runners: RunnerList[] = []; - let nextToken = undefined; + let nextToken; let hasNext = true; while (hasNext) { const runningInstances: EC2.DescribeInstancesResult = await ec2 From e72650a3a68520361592172f6792465f0cdc7977 Mon Sep 17 00:00:00 2001 From: Niek Palm Date: Tue, 11 Jan 2022 09:19:57 +0100 Subject: [PATCH 07/10] Encapsulate module for pool, refactoring --- README.md | 26 ++-- examples/ephemeral/main.tf | 12 +- main.tf | 9 +- modules/runners/README.md | 21 +-- .../lambdas/runners/src/lambda.test.ts | 8 +- modules/runners/lambdas/runners/src/lambda.ts | 4 +- .../{local-simple-pool.ts => local-pool.ts} | 4 +- .../simple-pool.test.ts => pool/pool.test.ts} | 8 +- .../simple-pool.ts => pool/pool.ts} | 14 +- modules/runners/pool.tf | 46 +++++++ modules/runners/pool/README.md | 7 + modules/runners/pool/main.tf | 126 ++++++++++++++++++ .../policies/lambda-pool.json} | 0 modules/runners/pool/variables.tf | 51 +++++++ modules/runners/simple-pool.tf | 124 ----------------- modules/runners/variables.tf | 14 +- variables.tf | 14 +- 17 files changed, 297 insertions(+), 191 deletions(-) rename modules/runners/lambdas/runners/src/{local-simple-pool.ts => local-pool.ts} (55%) rename modules/runners/lambdas/runners/src/{simple-pool/simple-pool.test.ts => pool/pool.test.ts} (95%) rename modules/runners/lambdas/runners/src/{simple-pool/simple-pool.ts => pool/pool.ts} (88%) create mode 100644 modules/runners/pool.tf create mode 100644 modules/runners/pool/README.md create mode 100644 modules/runners/pool/main.tf rename modules/runners/{policies/lambda-simple-pool.json => pool/policies/lambda-pool.json} (100%) create mode 100644 modules/runners/pool/variables.tf delete mode 100644 modules/runners/simple-pool.tf diff --git a/README.md b/README.md index c062185192..8012aad056 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ This [Terraform](https://www.terraform.io/) module creates the required infrastr - [Option 2: App](#option-2-app) - [Install app](#install-app) - [Encryption](#encryption) - - [Simple Pool](#simple-pool) + - [Pool](#pool) - [Idle runners](#idle-runners) - [Ephemeral runners](#ephemeral-runners) - [Prebuilt Images](#prebuilt-images) @@ -252,13 +252,21 @@ module "runners" { ``` -### Simple Pool +### Pool -The module basically supports two options for keeping a pool of runners. One is via a simple pool which only supports org-level runners, the second option is [keeping runners idle](#idle-runners). +The module basically supports two options for keeping a pool of runners. One is via a pool which only supports org-level runners, the second option is [keeping runners idle](#idle-runners). -The simple pool is introduced in combination with the ephemeral runners and is primary meant to ensure if any event is unexpected dropped, and no runner was created the pool can pick up the job. The pool is maintained by a lambda. Each time the lambda is triggered a check is preformed if the number of idler runners managed by the module are meeting the expected pool size. If not, the pool will be adjusted. Keep in mind that the scale down function is still active and will terminate instances that are detected to long as idle. +The pool is introduced in combination with the ephemeral runners and is primary meant to ensure if any event is unexpected dropped, and no runner was created the pool can pick up the job. The pool is maintained by a lambda. Each time the lambda is triggered a check is preformed if the number of idler runners managed by the module are meeting the expected pool size. If not, the pool will be adjusted. Keep in mind that the scale down function is still active and will terminate instances that are detected to long as idle. -The simple pool is NOT enabled by default can can be enabled by setting the the size of the pool greater then 0. The [ephemeral example](./examples/ephemeral/README.md) contains a configuration options (commented out). +```hcl +pool_runner_owner = "my-org" # Org to which the runners are added +pool_config = [{ + size = 20 # size of the pool + schedule_expression = "cron(* * * * ? *)" # cron expression to trigger the adjustment of the pool +}] +``` + +The pool is NOT enabled by default can can be enabled by setting the at least one object to the pool config list. The [ephemeral example](./examples/ephemeral/README.md) contains a configuration options (commented out). ### Idle runners @@ -422,6 +430,10 @@ In case the setup does not work as intended follow the trace of events: | [logging\_retention\_in\_days](#input\_logging\_retention\_in\_days) | Specifies the number of days you want to retain log events for the lambda log group. Possible values are: 0, 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, and 3653. | `number` | `180` | no | | [market\_options](#input\_market\_options) | DEPCRECATED: Replaced by `instance_target_capacity_type`. | `string` | `null` | no | | [minimum\_running\_time\_in\_minutes](#input\_minimum\_running\_time\_in\_minutes) | The time an ec2 action runner should be running at minimum before terminated if not busy. | `number` | `null` | no | +| [pool\_config](#input\_pool\_config) | The configuration for updating the pool. The `pool_size` to adjust to by the events triggered by the the `schedule_expression. For example you can configure a cron expression for week days to adjust the pool to 10 and another expression for the weekend to adjust the pool to 1.` |
list(object({
schedule_expression = string
size = number
}))
| `[]` | no | +| [pool\_lambda\_reserved\_concurrent\_executions](#input\_pool\_lambda\_reserved\_concurrent\_executions) | Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations. | `number` | `1` | no | +| [pool\_lambda\_timeout](#input\_pool\_lambda\_timeout) | Time out for the pool lambda lambda in seconds. | `number` | `60` | no | +| [pool\_runner\_owner](#input\_pool\_runner\_owner) | The pool wil deploy runners to an GitHub org, set this value to the org to which you want the runners deployed. Repo level is not supported. | `string` | `null` | no | | [redrive\_build\_queue](#input\_redrive\_build\_queue) | Set options to attach (optional) a dead letter queue to the build queue, the queue between the webhook and the scale up lambda. You have the following options. 1. Disable by setting, `enalbed' to false. 2. Enable by setting `enabled` to `true`, `maxReceiveCount` to a number of max retries.` |
object({
enabled = bool
maxReceiveCount = number
})
|
{
"enabled": false,
"maxReceiveCount": null
}
| no | | [repository\_white\_list](#input\_repository\_white\_list) | List of repositories allowed to use the github app | `list(string)` | `[]` | no | | [role\_path](#input\_role\_path) | The path that will be added to role path for created roles, if not set the environment name will be used. | `string` | `null` | no | @@ -452,10 +464,6 @@ In case the setup does not work as intended follow the trace of events: | [runners\_scale\_up\_lambda\_timeout](#input\_runners\_scale\_up\_lambda\_timeout) | Time out for the scale up lambda in seconds. | `number` | `30` | no | | [scale\_down\_schedule\_expression](#input\_scale\_down\_schedule\_expression) | Scheduler expression to check every x for scale down. | `string` | `"cron(*/5 * * * ? *)"` | no | | [scale\_up\_reserved\_concurrent\_executions](#input\_scale\_up\_reserved\_concurrent\_executions) | Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations. | `number` | `1` | no | -| [simple\_pool\_config](#input\_simple\_pool\_config) | The configuration for updating the pool. The `pool_size` to adjust to by the events triggered by the the `schedule_expression. For example you can configure a cron expression for week days to adjust the pool to 10 and another expression for the weekend to adjust the pool to 1.` |
list(object({
schedule_expression = string
pool_size = number
}))
| `[]` | no | -| [simple\_pool\_lambda\_timeout](#input\_simple\_pool\_lambda\_timeout) | Time out for the simple pool lambda lambda in seconds. | `number` | `60` | no | -| [simple\_pool\_reserved\_concurrent\_executions](#input\_simple\_pool\_reserved\_concurrent\_executions) | Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations. | `number` | `1` | no | -| [simple\_pool\_runner\_owner](#input\_simple\_pool\_runner\_owner) | The simple pool wil deploy runners to an GitHub org, set this value to the org to which you want the runners deployed. Repo level is not supported. | `string` | `null` | no | | [subnet\_ids](#input\_subnet\_ids) | List of subnets in which the action runners will be launched, the subnets needs to be subnets in the `vpc_id`. | `list(string)` | n/a | yes | | [syncer\_lambda\_s3\_key](#input\_syncer\_lambda\_s3\_key) | S3 key for syncer lambda function. Required if using S3 bucket to specify lambdas. | `any` | `null` | no | | [syncer\_lambda\_s3\_object\_version](#input\_syncer\_lambda\_s3\_object\_version) | S3 object version for syncer lambda function. Useful if S3 versioning is enabled on source bucket. | `any` | `null` | no | diff --git a/examples/ephemeral/main.tf b/examples/ephemeral/main.tf index db52536399..c7b7e5e620 100644 --- a/examples/ephemeral/main.tf +++ b/examples/ephemeral/main.tf @@ -58,16 +58,16 @@ module "runners" { enable_ephemeral_runners = true # # Example of simple pool usages - # simple_pool_runner_owner = "my-org" - # simple_pool_config = [{ - # pool_size = 2 - # schedule_expression = "cron(*/2 * * * ? *)" + # pool_runner_owner = "my-org" + # pool_config = [{ + # size = 20 + # schedule_expression = "cron(* * * * ? *)" # }] # configure your pre-built AMI # enabled_userdata = false - # ami_filter = { name = ["github-runner-amzn2-x86_64-2021*"] } - # ami_owners = [data.aws_caller_identity.current.account_id] + # ami_filter = { name = ["github-runner-amzn2-x86_64-2021*"] } + # ami_owners = [data.aws_caller_identity.current.account_id] # Enable logging log_level = "debug" diff --git a/main.tf b/main.tf index aa85f69f99..292671811c 100644 --- a/main.tf +++ b/main.tf @@ -160,11 +160,10 @@ module "runners" { log_type = var.log_type log_level = var.log_level - simple_pool_config = var.simple_pool_config - simple_pool_lambda_timeout = var.simple_pool_lambda_timeout - simple_pool_runner_owner = var.simple_pool_runner_owner - simple_pool_reserved_concurrent_executions = var.simple_pool_reserved_concurrent_executions - + pool_config = var.pool_config + pool_lambda_timeout = var.pool_lambda_timeout + pool_runner_owner = var.pool_runner_owner + pool_lambda_reserved_concurrent_executions = var.pool_lambda_reserved_concurrent_executions } module "runner_binaries" { diff --git a/modules/runners/README.md b/modules/runners/README.md index 8f1af538e3..771f007c9d 100644 --- a/modules/runners/README.md +++ b/modules/runners/README.md @@ -63,25 +63,23 @@ yarn run dist ## Modules -No modules. +| Name | Source | Version | +|------|--------|---------| +| [pool](#module\_pool) | ./pool | n/a | ## Resources | Name | Type | |------|------| | [aws_cloudwatch_event_rule.scale_down](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_event_rule) | resource | -| [aws_cloudwatch_event_rule.simple_pool](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_event_rule) | resource | | [aws_cloudwatch_event_target.scale_down](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_event_target) | resource | -| [aws_cloudwatch_event_target.simple_pool](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_event_target) | resource | | [aws_cloudwatch_log_group.gh_runners](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_log_group) | resource | | [aws_cloudwatch_log_group.scale_down](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_log_group) | resource | | [aws_cloudwatch_log_group.scale_up](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_log_group) | resource | -| [aws_cloudwatch_log_group.simple_pool](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_log_group) | resource | | [aws_iam_instance_profile.runner](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_instance_profile) | resource | | [aws_iam_role.runner](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource | | [aws_iam_role.scale_down](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource | | [aws_iam_role.scale_up](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource | -| [aws_iam_role.simple_pool](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource | | [aws_iam_role_policy.cloudwatch](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | | [aws_iam_role_policy.describe_tags](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | | [aws_iam_role_policy.dist_bucket](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | @@ -92,20 +90,15 @@ No modules. | [aws_iam_role_policy.scale_up](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | | [aws_iam_role_policy.scale_up_logging](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | | [aws_iam_role_policy.service_linked_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | -| [aws_iam_role_policy.simple_pool](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | -| [aws_iam_role_policy.simple_pool_logging](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | | [aws_iam_role_policy.ssm_parameters](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy) | resource | | [aws_iam_role_policy_attachment.managed_policies](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource | | [aws_iam_role_policy_attachment.scale_down_vpc_execution_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource | | [aws_iam_role_policy_attachment.scale_up_vpc_execution_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource | -| [aws_iam_role_policy_attachment.simple_pool_vpc_execution_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource | | [aws_lambda_event_source_mapping.scale_up](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_event_source_mapping) | resource | | [aws_lambda_function.scale_down](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function) | resource | | [aws_lambda_function.scale_up](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function) | resource | -| [aws_lambda_function.simple_pool](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function) | resource | | [aws_lambda_permission.scale_down](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_permission) | resource | | [aws_lambda_permission.scale_runners_lambda](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_permission) | resource | -| [aws_lambda_permission.simple_pool](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_permission) | resource | | [aws_launch_template.runner](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/launch_template) | resource | | [aws_security_group.runner_sg](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group) | resource | | [aws_ssm_parameter.cloudwatch_agent_config_runner](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ssm_parameter) | resource | @@ -158,6 +151,10 @@ No modules. | [metadata\_options](#input\_metadata\_options) | Metadata options for the ec2 runner instances. | `map(any)` |
{
"http_endpoint": "enabled",
"http_put_response_hop_limit": 1,
"http_tokens": "optional"
}
| no | | [minimum\_running\_time\_in\_minutes](#input\_minimum\_running\_time\_in\_minutes) | The time an ec2 action runner should be running at minimum before terminated if non busy. If not set the default is calculated based on the OS. | `number` | `null` | no | | [overrides](#input\_overrides) | This map provides the possibility to override some defaults. The following attributes are supported: `name_sg` overrides the `Name` tag for all security groups created by this module. `name_runner_agent_instance` overrides the `Name` tag for the ec2 instance defined in the auto launch configuration. `name_docker_machine_runners` overrides the `Name` tag spot instances created by the runner agent. | `map(string)` |
{
"name_runner": "",
"name_sg": ""
}
| no | +| [pool\_config](#input\_pool\_config) | The configuration for updating the pool. The `pool_size` to adjust to by the events triggered by the the `schedule_expression. For example you can configure a cron expression for week days to adjust the pool to 10 and another expression for the weekend to adjust the pool to 1.` |
list(object({
schedule_expression = string
size = number
}))
| `[]` | no | +| [pool\_lambda\_reserved\_concurrent\_executions](#input\_pool\_lambda\_reserved\_concurrent\_executions) | Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations. | `number` | `1` | no | +| [pool\_lambda\_timeout](#input\_pool\_lambda\_timeout) | Time out for the pool lambda lambda in seconds. | `number` | `60` | no | +| [pool\_runner\_owner](#input\_pool\_runner\_owner) | The pool wil deploy runners to an GitHub org, set this value to the org to which you want the runners deployed. Repo level is not supported. | `string` | `null` | no | | [role\_path](#input\_role\_path) | The path that will be added to the role; if not set, the environment name will be used. | `string` | `null` | no | | [role\_permissions\_boundary](#input\_role\_permissions\_boundary) | Permissions boundary that will be added to the created role for the lambda. | `string` | `null` | no | | [runner\_additional\_security\_group\_ids](#input\_runner\_additional\_security\_group\_ids) | (optional) List of additional security groups IDs to apply to the runner | `list(string)` | `[]` | no | @@ -178,10 +175,6 @@ No modules. | [s3\_location\_runner\_binaries](#input\_s3\_location\_runner\_binaries) | S3 location of runner distribution. | `string` | n/a | yes | | [scale\_down\_schedule\_expression](#input\_scale\_down\_schedule\_expression) | Scheduler expression to check every x for scale down. | `string` | `"cron(*/5 * * * ? *)"` | no | | [scale\_up\_reserved\_concurrent\_executions](#input\_scale\_up\_reserved\_concurrent\_executions) | Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations. | `number` | `1` | no | -| [simple\_pool\_config](#input\_simple\_pool\_config) | The configuration for updating the pool. The `pool_size` to adjust to by the events triggered by the the `schedule_expression. For example you can configure a cron expression for week days to adjust the pool to 10 and another expression for the weekend to adjust the pool to 1.` |
list(object({
schedule_expression = string
pool_size = number
}))
| `[]` | no | -| [simple\_pool\_lambda\_timeout](#input\_simple\_pool\_lambda\_timeout) | Time out for the simple pool lambda lambda in seconds. | `number` | `60` | no | -| [simple\_pool\_reserved\_concurrent\_executions](#input\_simple\_pool\_reserved\_concurrent\_executions) | Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations. | `number` | `1` | no | -| [simple\_pool\_runner\_owner](#input\_simple\_pool\_runner\_owner) | The simple pool wil deploy runners to an GitHub org, set this value to the org to which you want the runners deployed. Repo level is not supported. | `string` | `null` | no | | [sqs\_build\_queue](#input\_sqs\_build\_queue) | SQS queue to consume accepted build events. |
object({
arn = string
})
| n/a | yes | | [subnet\_ids](#input\_subnet\_ids) | List of subnets in which the action runners will be launched, the subnets needs to be subnets in the `vpc_id`. | `list(string)` | n/a | yes | | [tags](#input\_tags) | Map of tags that will be added to created resources. By default resources will be tagged with name and environment. | `map(string)` | `{}` | no | diff --git a/modules/runners/lambdas/runners/src/lambda.test.ts b/modules/runners/lambdas/runners/src/lambda.test.ts index b300a41466..2654be67e2 100644 --- a/modules/runners/lambdas/runners/src/lambda.test.ts +++ b/modules/runners/lambdas/runners/src/lambda.test.ts @@ -5,7 +5,7 @@ import { ActionRequestMessage, scaleUp } from './scale-runners/scale-up'; import ScaleError from './scale-runners/ScaleError'; import { logger } from './logger'; import { scaleDown } from './scale-runners/scale-down'; -import { adjust } from './simple-pool/simple-pool'; +import { adjust } from './pool/pool'; const body: ActionRequestMessage = { eventType: 'workflow_job', @@ -59,7 +59,7 @@ const context: Context = { jest.mock('./scale-runners/scale-up'); jest.mock('./scale-runners/scale-down'); -jest.mock('./simple-pool/simple-pool'); +jest.mock('./pool/pool'); jest.mock('./logger'); describe('Test scale up lambda wrapper.', () => { @@ -144,7 +144,7 @@ describe('Adjust pool.', () => { resolve(); }); }); - expect(await adjustPool({ simplePoolSize: 2 }, context)).resolves; + expect(await adjustPool({ poolSize: 2 }, context)).resolves; }); it('Handle error for adjusting pool.', async () => { @@ -152,7 +152,7 @@ describe('Adjust pool.', () => { const error = new Error('errorXYX'); mock.mockRejectedValue(error); const logSpy = jest.spyOn(logger, 'error'); - expect(await adjustPool({ simplePoolSize: 0 }, context)).resolves; + expect(await adjustPool({ poolSize: 0 }, context)).resolves; expect(logSpy).lastCalledWith(error); }); }); diff --git a/modules/runners/lambdas/runners/src/lambda.ts b/modules/runners/lambdas/runners/src/lambda.ts index b27ae25847..f4bed16981 100644 --- a/modules/runners/lambdas/runners/src/lambda.ts +++ b/modules/runners/lambdas/runners/src/lambda.ts @@ -4,7 +4,7 @@ import { SQSEvent, Context } from 'aws-lambda'; import { LogFields, logger } from './logger'; import ScaleError from './scale-runners/ScaleError'; import 'source-map-support/register'; -import { adjust, SimplePoolEvent } from './simple-pool/simple-pool'; +import { adjust, PoolEvent } from './pool/pool'; export async function scaleUpHandler(event: SQSEvent, context: Context): Promise { logger.setSettings({ requestId: context.awsRequestId }); @@ -38,7 +38,7 @@ export async function scaleDownHandler(context: Context): Promise { } } -export async function adjustPool(event: SimplePoolEvent, context: Context): Promise { +export async function adjustPool(event: PoolEvent, context: Context): Promise { logger.setSettings({ requestId: context.awsRequestId }); try { diff --git a/modules/runners/lambdas/runners/src/local-simple-pool.ts b/modules/runners/lambdas/runners/src/local-pool.ts similarity index 55% rename from modules/runners/lambdas/runners/src/local-simple-pool.ts rename to modules/runners/lambdas/runners/src/local-pool.ts index c1d32c817e..ab8c74a1a0 100644 --- a/modules/runners/lambdas/runners/src/local-simple-pool.ts +++ b/modules/runners/lambdas/runners/src/local-pool.ts @@ -1,7 +1,7 @@ -import { adjust } from './simple-pool/simple-pool'; +import { adjust } from './pool/pool'; export function run(): void { - adjust({ simplePoolSize: 1 }) + adjust({ poolSize: 1 }) .then() .catch((e) => { console.log(e); diff --git a/modules/runners/lambdas/runners/src/simple-pool/simple-pool.test.ts b/modules/runners/lambdas/runners/src/pool/pool.test.ts similarity index 95% rename from modules/runners/lambdas/runners/src/simple-pool/simple-pool.test.ts rename to modules/runners/lambdas/runners/src/pool/pool.test.ts index d329246043..f6d237e824 100644 --- a/modules/runners/lambdas/runners/src/simple-pool/simple-pool.test.ts +++ b/modules/runners/lambdas/runners/src/pool/pool.test.ts @@ -1,5 +1,5 @@ import { mocked } from 'ts-jest/utils'; -import { adjust } from './simple-pool'; +import { adjust } from './pool'; import * as ghAuth from '../gh-auth/gh-auth'; import * as scale from '../scale-runners/scale-up'; import nock from 'nock'; @@ -153,13 +153,13 @@ describe('Test simple pool.', () => { describe('With GitHub Cloud', () => { it('Top up pool with pool size 2.', async () => { const spy = jest.spyOn(scale, 'createRunners'); - expect(await adjust({ simplePoolSize: 2 })).resolves; + expect(await adjust({ poolSize: 2 })).resolves; expect(spy).toBeCalled; }); it('Should not top up if pool size is reached.', async () => { const spy = jest.spyOn(scale, 'createRunners'); - expect(await adjust({ simplePoolSize: 1 })).resolves; + expect(await adjust({ poolSize: 1 })).resolves; expect(spy).not.toHaveBeenCalled; }); }); @@ -171,7 +171,7 @@ describe('Test simple pool.', () => { it('Top up if the pool size is set to 5', async () => { const spy = jest.spyOn(scale, 'createRunners'); - expect(await adjust({ simplePoolSize: 5 })).resolves; + expect(await adjust({ poolSize: 5 })).resolves; expect(spy).toBeCalled; }); }); diff --git a/modules/runners/lambdas/runners/src/simple-pool/simple-pool.ts b/modules/runners/lambdas/runners/src/pool/pool.ts similarity index 88% rename from modules/runners/lambdas/runners/src/simple-pool/simple-pool.ts rename to modules/runners/lambdas/runners/src/pool/pool.ts index e4e050bc1f..23849fdc39 100644 --- a/modules/runners/lambdas/runners/src/simple-pool/simple-pool.ts +++ b/modules/runners/lambdas/runners/src/pool/pool.ts @@ -1,17 +1,17 @@ import yn from 'yn'; -import { logger as rootLogger } from './../logger'; +import { logger as rootLogger } from '../logger'; import { createRunners } from '../scale-runners/scale-up'; import { createGithubAppAuth, createGithubInstallationAuth, createOctoClient } from '../gh-auth/gh-auth'; import { listEC2Runners } from '../aws/runners'; -const logger = rootLogger.getChildLogger({ name: 'simple-pool' }); +const logger = rootLogger.getChildLogger({ name: 'pool' }); -export interface SimplePoolEvent { - simplePoolSize: number; +export interface PoolEvent { + poolSize: number; } -export async function adjust(event: SimplePoolEvent): Promise { - logger.info(`Checking current pool size against simple pool of size: ${event.simplePoolSize}`); +export async function adjust(event: PoolEvent): Promise { + logger.info(`Checking current pool size against pool of size: ${event.poolSize}`); const runnerExtraLabels = process.env.RUNNER_EXTRA_LABELS; const runnerGroup = process.env.RUNNER_GROUP_NAME; const environment = process.env.ENVIRONMENT; @@ -55,7 +55,7 @@ export async function adjust(event: SimplePoolEvent): Promise { ).map((r) => r.instanceId); const managedIdleRunners = ec2runners.filter((r) => idleRunners.includes(r)); - const topUp = event.simplePoolSize - managedIdleRunners.length; + const topUp = event.poolSize - managedIdleRunners.length; if (topUp > 0) { logger.info(`The pool will be topped up with ${topUp} runners.`); await createRunners( diff --git a/modules/runners/pool.tf b/modules/runners/pool.tf new file mode 100644 index 0000000000..235ee877dd --- /dev/null +++ b/modules/runners/pool.tf @@ -0,0 +1,46 @@ +module "pool" { + count = length(var.pool_config) == 0 ? 0 : 1 + + source = "./pool" + + config = { + environment = var.environment + ghes = { + ssl_verify = var.ghes_ssl_verify + url = var.ghes_url + } + github_app_parameters = var.github_app_parameters + instance_allocation_strategy = var.instance_allocation_strategy + instance_max_spot_price = var.instance_max_spot_price + instance_target_capacity_type = var.instance_target_capacity_type + instance_types = var.instance_types + kms_key_arn = local.kms_key_arn + lambda = { + log_level = var.log_level + log_type = var.log_type + logging_retention_in_days = var.logging_retention_in_days + reserved_concurrent_executions = var.pool_lambda_reserved_concurrent_executions + s3_bucket = var.lambda_s3_bucket + s3_key = var.runners_lambda_s3_key + s3_object_version = var.runners_lambda_s3_object_version + security_group_ids = var.lambda_security_group_ids + subnet_ids = var.lambda_subnet_ids + timeout = var.pool_lambda_timeout + zip = local.lambda_zip + } + pool = var.pool_config + role_path = local.role_path + role_permissions_boundary = var.role_permissions_boundary + runner = { + ephemeral = var.enable_ephemeral_runners + extra_labels = var.runner_extra_labels + launch_template = aws_launch_template.runner + group_name = var.runner_group_name + pool_owner = var.pool_runner_owner + role = aws_iam_role.runner + } + subnet_ids = var.subnet_ids + tags = local.tags + } + +} diff --git a/modules/runners/pool/README.md b/modules/runners/pool/README.md new file mode 100644 index 0000000000..8fc57732b0 --- /dev/null +++ b/modules/runners/pool/README.md @@ -0,0 +1,7 @@ +# Pool module + +This module creates the AWS resources required to maintain a pool of runners. However terraform modules are always exposed and theoretically can be used anywhere. This module is seen as a strict inner module. + +## Why a submodule for the pool + +The pool is an opt-in feature. To be able to use the count on a module level to avoid counts per resources a module is created. All inputs of the module are already defined on a higher level. See the mapping of the variables in [`pool.tf`](../pool.tf) \ No newline at end of file diff --git a/modules/runners/pool/main.tf b/modules/runners/pool/main.tf new file mode 100644 index 0000000000..03c2ec474d --- /dev/null +++ b/modules/runners/pool/main.tf @@ -0,0 +1,126 @@ +resource "aws_lambda_function" "pool" { + + s3_bucket = var.config.lambda.s3_bucket != null ? var.config.lambda.s3_bucket : null + s3_key = var.config.lambda.s3_key != null ? var.config.lambda.s3_key : null + s3_object_version = var.config.lambda.s3_object_version != null ? var.config.lambda.s3_object_version : null + filename = var.config.lambda.s3_bucket == null ? var.config.lambda.zip : null + source_code_hash = var.config.lambda.s3_bucket == null ? filebase64sha256(var.config.lambda.zip) : null + function_name = "${var.config.environment}-pool" + role = aws_iam_role.pool.arn + handler = "index.adjustPool" + runtime = "nodejs14.x" + timeout = var.config.lambda.timeout + reserved_concurrent_executions = var.config.lambda.reserved_concurrent_executions + memory_size = 512 + tags = var.config.tags + + environment { + variables = { + RUNNER_OWNER = var.config.runner.pool_owner + ENVIRONMENT = var.config.environment + GHES_URL = var.config.ghes.url + LAUNCH_TEMPLATE_NAME = var.config.runner.launch_template.name + LOG_LEVEL = var.config.lambda.log_level + LOG_TYPE = var.config.lambda.log_type + NODE_TLS_REJECT_UNAUTHORIZED = var.config.ghes.url != null && !var.config.ghes.ssl_verify ? 0 : 1 + PARAMETER_GITHUB_APP_ID_NAME = var.config.github_app_parameters.id.name + PARAMETER_GITHUB_APP_KEY_BASE64_NAME = var.config.github_app_parameters.key_base64.name + RUNNER_EXTRA_LABELS = var.config.runner.extra_labels + RUNNER_GROUP_NAME = var.config.runner.group_name + SUBNET_IDS = join(",", var.config.subnet_ids) + ENABLE_EPHEMERAL_RUNNERS = var.config.runner.ephemeral + INSTANCE_TYPES = join(",", var.config.instance_types) + INSTANCE_TARGET_CAPACITY_TYPE = var.config.instance_target_capacity_type + INSTANCE_MAX_SPOT_PRICE = var.config.instance_max_spot_price + INSTANCE_ALLOCATION_STRATEGY = var.config.instance_allocation_strategy + } + } + + dynamic "vpc_config" { + for_each = var.config.lambda.subnet_ids != null && var.config.lambda.security_group_ids != null ? [true] : [] + content { + security_group_ids = var.config.lambda.security_group_ids + subnet_ids = var.config.lambda.subnet_ids + } + } +} + +resource "aws_cloudwatch_log_group" "pool" { + name = "/aws/lambda/${aws_lambda_function.pool.function_name}" + retention_in_days = var.config.lambda.logging_retention_in_days + tags = var.config.tags +} + +resource "aws_iam_role" "pool" { + name = "${var.config.environment}-action-pool-lambda-role" + assume_role_policy = data.aws_iam_policy_document.lambda_assume_role_policy.json + path = var.config.role_path + permissions_boundary = var.config.role_permissions_boundary + tags = var.config.tags +} + +resource "aws_iam_role_policy" "pool" { + name = "${var.config.environment}-lambda-pool-policy" + role = aws_iam_role.pool.name + policy = templatefile("${path.module}/policies/lambda-pool.json", { + arn_runner_instance_role = var.config.runner.role.arn + github_app_id_arn = var.config.github_app_parameters.id.arn + github_app_key_base64_arn = var.config.github_app_parameters.key_base64.arn + kms_key_arn = var.config.kms_key_arn + }) +} + +resource "aws_iam_role_policy" "pool_logging" { + name = "${var.config.environment}-lambda-logging" + role = aws_iam_role.pool.name + policy = templatefile("${path.module}/../policies/lambda-cloudwatch.json", { + log_group_arn = aws_cloudwatch_log_group.pool.arn + }) +} + +resource "aws_iam_role_policy_attachment" "pool_vpc_execution_role" { + count = length(var.config.lambda.subnet_ids) > 0 ? 1 : 0 + role = aws_iam_role.pool.name + policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole" +} + +data "aws_iam_policy_document" "lambda_assume_role_policy" { + statement { + actions = ["sts:AssumeRole"] + + principals { + type = "Service" + identifiers = ["lambda.amazonaws.com"] + } + } +} + +# per config object one trigger is created to trigger the lambda. +resource "aws_cloudwatch_event_rule" "pool" { + count = length(var.config.pool) + + name = "${var.config.environment}-pool-rule" + schedule_expression = var.config.pool[count.index].schedule_expression + tags = var.config.tags +} + +resource "aws_cloudwatch_event_target" "pool" { + count = length(var.config.pool) + + input = jsonencode({ + poolSize = var.config.pool[count.index].size + }) + + rule = aws_cloudwatch_event_rule.pool[count.index].name + arn = aws_lambda_function.pool.arn +} + +resource "aws_lambda_permission" "pool" { + count = length(var.config.pool) + + statement_id = "AllowExecutionFromCloudWatch" + action = "lambda:InvokeFunction" + function_name = aws_lambda_function.pool.function_name + principal = "events.amazonaws.com" + source_arn = aws_cloudwatch_event_rule.pool[count.index].arn +} diff --git a/modules/runners/policies/lambda-simple-pool.json b/modules/runners/pool/policies/lambda-pool.json similarity index 100% rename from modules/runners/policies/lambda-simple-pool.json rename to modules/runners/pool/policies/lambda-pool.json diff --git a/modules/runners/pool/variables.tf b/modules/runners/pool/variables.tf new file mode 100644 index 0000000000..66b8eeadc2 --- /dev/null +++ b/modules/runners/pool/variables.tf @@ -0,0 +1,51 @@ +variable "config" { + type = object({ + lambda = object({ + log_level = string + log_type = string + logging_retention_in_days = number + reserved_concurrent_executions = number + s3_bucket = string + s3_key = string + s3_object_version = string + security_group_ids = list(string) + timeout = number + zip = string + subnet_ids = list(string) + }) + tags = map(string) + ghes = object({ + url = string + ssl_verify = string + }) + github_app_parameters = object({ + key_base64 = map(string) + id = map(string) + }) + subnet_ids = list(string) + runner = object({ + ephemeral = bool + extra_labels = string + launch_template = object({ + name = string + }) + group_name = string + pool_owner = string + role = object({ + arn = string + }) + }) + instance_types = list(string) + instance_target_capacity_type = string + instance_allocation_strategy = string + instance_max_spot_price = string + environment = string + pool = list(object({ + schedule_expression = string + size = number + })) + role_permissions_boundary = string + kms_key_arn = string + role_path = string + }) +} diff --git a/modules/runners/simple-pool.tf b/modules/runners/simple-pool.tf deleted file mode 100644 index 952dfb3130..0000000000 --- a/modules/runners/simple-pool.tf +++ /dev/null @@ -1,124 +0,0 @@ -resource "aws_lambda_function" "simple_pool" { - count = length(var.simple_pool_config) == 0 ? 0 : 1 - - s3_bucket = var.lambda_s3_bucket != null ? var.lambda_s3_bucket : null - s3_key = var.runners_lambda_s3_key != null ? var.runners_lambda_s3_key : null - s3_object_version = var.runners_lambda_s3_object_version != null ? var.runners_lambda_s3_object_version : null - filename = var.lambda_s3_bucket == null ? local.lambda_zip : null - source_code_hash = var.lambda_s3_bucket == null ? filebase64sha256(local.lambda_zip) : null - function_name = "${var.environment}-simple-pool" - role = aws_iam_role.simple_pool[0].arn - handler = "index.adjustPool" - runtime = "nodejs14.x" - timeout = var.simple_pool_lambda_timeout - reserved_concurrent_executions = var.simple_pool_reserved_concurrent_executions - memory_size = 512 - tags = local.tags - - environment { - variables = { - RUNNER_OWNER = var.simple_pool_runner_owner - ENVIRONMENT = var.environment - GHES_URL = var.ghes_url - LAUNCH_TEMPLATE_NAME = aws_launch_template.runner.name - LOG_LEVEL = var.log_level - LOG_TYPE = var.log_type - NODE_TLS_REJECT_UNAUTHORIZED = var.ghes_url != null && !var.ghes_ssl_verify ? 0 : 1 - PARAMETER_GITHUB_APP_ID_NAME = var.github_app_parameters.id.name - PARAMETER_GITHUB_APP_KEY_BASE64_NAME = var.github_app_parameters.key_base64.name - RUNNER_EXTRA_LABELS = var.runner_extra_labels - RUNNER_GROUP_NAME = var.runner_group_name - SUBNET_IDS = join(",", var.subnet_ids) - ENABLE_EPHEMERAL_RUNNERS = var.enable_ephemeral_runners - INSTANCE_TYPES = join(",", var.instance_types) - INSTANCE_TARGET_CAPACITY_TYPE = var.instance_target_capacity_type - INSTANCE_MAX_SPOT_PRICE = var.instance_max_spot_price - INSTANCE_ALLOCATION_STRATEGY = var.instance_allocation_strategy - } - } - - dynamic "vpc_config" { - for_each = var.lambda_subnet_ids != null && var.lambda_security_group_ids != null ? [true] : [] - content { - security_group_ids = var.lambda_security_group_ids - subnet_ids = var.lambda_subnet_ids - } - } -} - -resource "aws_cloudwatch_log_group" "simple_pool" { - count = length(var.simple_pool_config) == 0 ? 0 : 1 - - name = "/aws/lambda/${aws_lambda_function.simple_pool[0].function_name}" - retention_in_days = var.logging_retention_in_days - tags = var.tags -} - -resource "aws_cloudwatch_event_rule" "simple_pool" { - count = length(var.simple_pool_config) == 0 ? 0 : length(var.simple_pool_config) - - name = "${var.environment}-simple-pool-rule" - schedule_expression = var.simple_pool_config[count.index].schedule_expression - tags = var.tags -} - - -resource "aws_cloudwatch_event_target" "simple_pool" { - count = length(var.simple_pool_config) == 0 ? 0 : length(var.simple_pool_config) - - input = jsonencode({ - simplePoolSize = var.simple_pool_config[count.index].pool_size - }) - - rule = aws_cloudwatch_event_rule.simple_pool[count.index].name - arn = aws_lambda_function.simple_pool[0].arn -} - -resource "aws_lambda_permission" "simple_pool" { - count = length(var.simple_pool_config) == 0 ? 0 : 1 - - statement_id = "AllowExecutionFromCloudWatch" - action = "lambda:InvokeFunction" - function_name = aws_lambda_function.simple_pool[0].function_name - principal = "events.amazonaws.com" - source_arn = aws_cloudwatch_event_rule.simple_pool[0].arn -} - -resource "aws_iam_role" "simple_pool" { - count = length(var.simple_pool_config) == 0 ? 0 : 1 - - name = "${var.environment}-action-simple-pool-lambda-role" - assume_role_policy = data.aws_iam_policy_document.lambda_assume_role_policy.json - path = local.role_path - permissions_boundary = var.role_permissions_boundary - tags = local.tags -} - -resource "aws_iam_role_policy" "simple_pool" { - count = length(var.simple_pool_config) == 0 ? 0 : 1 - - name = "${var.environment}-lambda-simple-pool-policy" - role = aws_iam_role.simple_pool[0].name - policy = templatefile("${path.module}/policies/lambda-simple-pool.json", { - arn_runner_instance_role = aws_iam_role.runner.arn - github_app_id_arn = var.github_app_parameters.id.arn - github_app_key_base64_arn = var.github_app_parameters.key_base64.arn - kms_key_arn = local.kms_key_arn - }) -} - -resource "aws_iam_role_policy" "simple_pool_logging" { - count = length(var.simple_pool_config) == 0 ? 0 : 1 - - name = "${var.environment}-lambda-logging" - role = aws_iam_role.simple_pool[0].name - policy = templatefile("${path.module}/policies/lambda-cloudwatch.json", { - log_group_arn = aws_cloudwatch_log_group.simple_pool[0].arn - }) -} - -resource "aws_iam_role_policy_attachment" "simple_pool_vpc_execution_role" { - count = length(var.simple_pool_config) != 0 && length(var.lambda_subnet_ids) > 0 ? 1 : 0 - role = aws_iam_role.simple_pool[0].name - policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole" -} diff --git a/modules/runners/variables.tf b/modules/runners/variables.tf index 5a26c32aa7..ec1c1e52a1 100644 --- a/modules/runners/variables.tf +++ b/modules/runners/variables.tf @@ -463,29 +463,29 @@ variable "enable_ephemeral_runners" { default = false } -variable "simple_pool_lambda_timeout" { - description = "Time out for the simple pool lambda lambda in seconds." +variable "pool_lambda_timeout" { + description = "Time out for the pool lambda lambda in seconds." type = number default = 60 } -variable "simple_pool_runner_owner" { - description = "The simple pool wil deploy runners to an GitHub org, set this value to the org to which you want the runners deployed. Repo level is not supported." +variable "pool_runner_owner" { + description = "The pool wil deploy runners to an GitHub org, set this value to the org to which you want the runners deployed. Repo level is not supported." type = string default = null } -variable "simple_pool_reserved_concurrent_executions" { +variable "pool_lambda_reserved_concurrent_executions" { description = "Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations." type = number default = 1 } -variable "simple_pool_config" { +variable "pool_config" { description = "The configuration for updating the pool. The `pool_size` to adjust to by the events triggered by the the `schedule_expression. For example you can configure a cron expression for week days to adjust the pool to 10 and another expression for the weekend to adjust the pool to 1." type = list(object({ schedule_expression = string - pool_size = number + size = number })) default = [] } diff --git a/variables.tf b/variables.tf index 5dc0d08092..f9cd301ade 100644 --- a/variables.tf +++ b/variables.tf @@ -553,29 +553,29 @@ variable "runner_architecture" { } } -variable "simple_pool_lambda_timeout" { - description = "Time out for the simple pool lambda lambda in seconds." +variable "pool_lambda_timeout" { + description = "Time out for the pool lambda lambda in seconds." type = number default = 60 } -variable "simple_pool_runner_owner" { - description = "The simple pool wil deploy runners to an GitHub org, set this value to the org to which you want the runners deployed. Repo level is not supported." +variable "pool_runner_owner" { + description = "The pool wil deploy runners to an GitHub org, set this value to the org to which you want the runners deployed. Repo level is not supported." type = string default = null } -variable "simple_pool_reserved_concurrent_executions" { +variable "pool_lambda_reserved_concurrent_executions" { description = "Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations." type = number default = 1 } -variable "simple_pool_config" { +variable "pool_config" { description = "The configuration for updating the pool. The `pool_size` to adjust to by the events triggered by the the `schedule_expression. For example you can configure a cron expression for week days to adjust the pool to 10 and another expression for the weekend to adjust the pool to 1." type = list(object({ schedule_expression = string - pool_size = number + size = number })) default = [] } From 9b63aac1fef58e20d6678bd00973c40efd2e123f Mon Sep 17 00:00:00 2001 From: Niek Palm Date: Tue, 11 Jan 2022 09:25:21 +0100 Subject: [PATCH 08/10] Encapsulate module for pool, refactoring --- README.md | 2 +- modules/runners/README.md | 2 +- modules/runners/variables.tf | 2 +- variables.tf | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8012aad056..1f3eb44849 100644 --- a/README.md +++ b/README.md @@ -433,7 +433,7 @@ In case the setup does not work as intended follow the trace of events: | [pool\_config](#input\_pool\_config) | The configuration for updating the pool. The `pool_size` to adjust to by the events triggered by the the `schedule_expression. For example you can configure a cron expression for week days to adjust the pool to 10 and another expression for the weekend to adjust the pool to 1.` |
list(object({
schedule_expression = string
size = number
}))
| `[]` | no | | [pool\_lambda\_reserved\_concurrent\_executions](#input\_pool\_lambda\_reserved\_concurrent\_executions) | Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations. | `number` | `1` | no | | [pool\_lambda\_timeout](#input\_pool\_lambda\_timeout) | Time out for the pool lambda lambda in seconds. | `number` | `60` | no | -| [pool\_runner\_owner](#input\_pool\_runner\_owner) | The pool wil deploy runners to an GitHub org, set this value to the org to which you want the runners deployed. Repo level is not supported. | `string` | `null` | no | +| [pool\_runner\_owner](#input\_pool\_runner\_owner) | The pool will deploy runners to the GitHub org ID, set this value to the org to which you want the runners deployed. Repo level is not supported. | `string` | `null` | no | | [redrive\_build\_queue](#input\_redrive\_build\_queue) | Set options to attach (optional) a dead letter queue to the build queue, the queue between the webhook and the scale up lambda. You have the following options. 1. Disable by setting, `enalbed' to false. 2. Enable by setting `enabled` to `true`, `maxReceiveCount` to a number of max retries.` |
object({
enabled = bool
maxReceiveCount = number
})
|
{
"enabled": false,
"maxReceiveCount": null
}
| no | | [repository\_white\_list](#input\_repository\_white\_list) | List of repositories allowed to use the github app | `list(string)` | `[]` | no | | [role\_path](#input\_role\_path) | The path that will be added to role path for created roles, if not set the environment name will be used. | `string` | `null` | no | diff --git a/modules/runners/README.md b/modules/runners/README.md index 771f007c9d..83bb8d2b91 100644 --- a/modules/runners/README.md +++ b/modules/runners/README.md @@ -154,7 +154,7 @@ yarn run dist | [pool\_config](#input\_pool\_config) | The configuration for updating the pool. The `pool_size` to adjust to by the events triggered by the the `schedule_expression. For example you can configure a cron expression for week days to adjust the pool to 10 and another expression for the weekend to adjust the pool to 1.` |
list(object({
schedule_expression = string
size = number
}))
| `[]` | no | | [pool\_lambda\_reserved\_concurrent\_executions](#input\_pool\_lambda\_reserved\_concurrent\_executions) | Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations. | `number` | `1` | no | | [pool\_lambda\_timeout](#input\_pool\_lambda\_timeout) | Time out for the pool lambda lambda in seconds. | `number` | `60` | no | -| [pool\_runner\_owner](#input\_pool\_runner\_owner) | The pool wil deploy runners to an GitHub org, set this value to the org to which you want the runners deployed. Repo level is not supported. | `string` | `null` | no | +| [pool\_runner\_owner](#input\_pool\_runner\_owner) | The pool will deploy runners to the GitHub org ID, set this value to the org to which you want the runners deployed. Repo level is not supported. | `string` | `null` | no | | [role\_path](#input\_role\_path) | The path that will be added to the role; if not set, the environment name will be used. | `string` | `null` | no | | [role\_permissions\_boundary](#input\_role\_permissions\_boundary) | Permissions boundary that will be added to the created role for the lambda. | `string` | `null` | no | | [runner\_additional\_security\_group\_ids](#input\_runner\_additional\_security\_group\_ids) | (optional) List of additional security groups IDs to apply to the runner | `list(string)` | `[]` | no | diff --git a/modules/runners/variables.tf b/modules/runners/variables.tf index ec1c1e52a1..8072f521f5 100644 --- a/modules/runners/variables.tf +++ b/modules/runners/variables.tf @@ -470,7 +470,7 @@ variable "pool_lambda_timeout" { } variable "pool_runner_owner" { - description = "The pool wil deploy runners to an GitHub org, set this value to the org to which you want the runners deployed. Repo level is not supported." + description = "The pool will deploy runners to the GitHub org ID, set this value to the org to which you want the runners deployed. Repo level is not supported." type = string default = null } diff --git a/variables.tf b/variables.tf index f9cd301ade..a104cc9851 100644 --- a/variables.tf +++ b/variables.tf @@ -560,7 +560,7 @@ variable "pool_lambda_timeout" { } variable "pool_runner_owner" { - description = "The pool wil deploy runners to an GitHub org, set this value to the org to which you want the runners deployed. Repo level is not supported." + description = "The pool will deploy runners to the GitHub org ID, set this value to the org to which you want the runners deployed. Repo level is not supported." type = string default = null } From 6bd3f4c09d436a5287ed7633c3301628ff51e67c Mon Sep 17 00:00:00 2001 From: Niek Palm Date: Wed, 12 Jan 2022 12:20:24 +0100 Subject: [PATCH 09/10] Update async / await for jest according docs - Update async tests according to https://jestjs.io/docs/tutorial-async and align several tests - Add dependency for sorting imports - Add rules for sorting to prettier - Update prefered VSCode plugins - Add exceeption for sonar lint --- .vscode/extensions.json | 5 +- .vscode/settings.json | 7 + modules/runners/lambdas/runners/.prettierrc | 8 +- modules/runners/lambdas/runners/package.json | 2 + .../lambdas/runners/src/aws/runners.test.ts | 3 +- .../lambdas/runners/src/aws/runners.ts | 3 +- .../lambdas/runners/src/aws/ssm.test.ts | 3 +- .../runners/src/gh-auth/gh-auth.test.ts | 15 +- .../lambdas/runners/src/gh-auth/gh-auth.ts | 15 +- .../lambdas/runners/src/lambda.test.ts | 33 +- modules/runners/lambdas/runners/src/lambda.ts | 11 +- modules/runners/lambdas/runners/src/local.ts | 2 +- .../lambdas/runners/src/pool/pool.test.ts | 17 +- .../runners/lambdas/runners/src/pool/pool.ts | 5 +- .../scale-runners/scale-down-config.test.ts | 3 +- .../src/scale-runners/scale-down.test.ts | 29 +- .../runners/src/scale-runners/scale-down.ts | 11 +- .../src/scale-runners/scale-up.test.ts | 15 +- .../runners/src/scale-runners/scale-up.ts | 7 +- modules/runners/lambdas/runners/yarn.lock | 2184 +++++++++-------- 20 files changed, 1235 insertions(+), 1143 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 0c82df1d5e..cb3fc99278 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -5,6 +5,7 @@ // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp "editorconfig.editorconfig", "yzhang.markdown-all-in-one", - "mauve.terraform" + "sonarsource.sonarlint-vscode", + "hashicorp.terraform" ] -} +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..1635e284bb --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "sonarlint.rules": { + "javascript:S4123": { + "level": "off" + } + } +} \ No newline at end of file diff --git a/modules/runners/lambdas/runners/.prettierrc b/modules/runners/lambdas/runners/.prettierrc index 587ffe1a74..3eb40208ef 100644 --- a/modules/runners/lambdas/runners/.prettierrc +++ b/modules/runners/lambdas/runners/.prettierrc @@ -3,4 +3,10 @@ "singleQuote": true, "trailingComma": "all", "semi": true, -} + "importOrderSeparation": true, + "importOrderSortSpecifiers": true, + "importOrder": [ + "", + "^[./]" + ] +} \ No newline at end of file diff --git a/modules/runners/lambdas/runners/package.json b/modules/runners/lambdas/runners/package.json index 4fe7f49625..f45562052e 100644 --- a/modules/runners/lambdas/runners/package.json +++ b/modules/runners/lambdas/runners/package.json @@ -16,6 +16,7 @@ "all": "yarn build && yarn format && yarn lint && yarn test" }, "devDependencies": { + "@trivago/prettier-plugin-sort-imports": "^3.1.1", "@types/aws-lambda": "^8.10.89", "@types/express": "^4.17.11", "@types/jest": "^27.4.0", @@ -25,6 +26,7 @@ "eslint": "^7.32.0", "eslint-plugin-prettier": "4.0.0", "jest": "27.4.5", + "jest-mock": "^27.4.6", "jest-mock-extended": "^2.0.1", "moment-timezone": "^0.5.34", "nock": "^13.2.1", diff --git a/modules/runners/lambdas/runners/src/aws/runners.test.ts b/modules/runners/lambdas/runners/src/aws/runners.test.ts index a836e5f6ea..e02e4f9194 100644 --- a/modules/runners/lambdas/runners/src/aws/runners.test.ts +++ b/modules/runners/lambdas/runners/src/aws/runners.test.ts @@ -1,6 +1,7 @@ import { EC2 } from 'aws-sdk'; -import { listEC2Runners, createRunner, terminateRunner, RunnerInfo, RunnerInputParameters } from './runners'; + import ScaleError from './../scale-runners/ScaleError'; +import { RunnerInfo, RunnerInputParameters, createRunner, listEC2Runners, terminateRunner } from './runners'; const mockEC2 = { describeInstances: jest.fn(), createFleet: jest.fn(), terminateInstances: jest.fn() }; const mockSSM = { putParameter: jest.fn() }; diff --git a/modules/runners/lambdas/runners/src/aws/runners.ts b/modules/runners/lambdas/runners/src/aws/runners.ts index b069a57d89..0252a1fbb4 100644 --- a/modules/runners/lambdas/runners/src/aws/runners.ts +++ b/modules/runners/lambdas/runners/src/aws/runners.ts @@ -1,5 +1,6 @@ import { EC2, SSM } from 'aws-sdk'; -import { logger as rootLogger, LogFields } from '../logger'; + +import { LogFields, logger as rootLogger } from '../logger'; import ScaleError from './../scale-runners/ScaleError'; const logger = rootLogger.getChildLogger({ name: 'runners' }); diff --git a/modules/runners/lambdas/runners/src/aws/ssm.test.ts b/modules/runners/lambdas/runners/src/aws/ssm.test.ts index 817308d89c..8cd82b0d46 100644 --- a/modules/runners/lambdas/runners/src/aws/ssm.test.ts +++ b/modules/runners/lambdas/runners/src/aws/ssm.test.ts @@ -1,6 +1,7 @@ +import { GetParameterCommandOutput, SSM } from '@aws-sdk/client-ssm'; import nock from 'nock'; + import { getParameterValue } from './ssm'; -import { SSM, GetParameterCommandOutput } from '@aws-sdk/client-ssm'; jest.mock('@aws-sdk/client-ssm'); diff --git a/modules/runners/lambdas/runners/src/gh-auth/gh-auth.test.ts b/modules/runners/lambdas/runners/src/gh-auth/gh-auth.test.ts index 22734f8a41..2c6510363a 100644 --- a/modules/runners/lambdas/runners/src/gh-auth/gh-auth.test.ts +++ b/modules/runners/lambdas/runners/src/gh-auth/gh-auth.test.ts @@ -1,14 +1,13 @@ -import { createOctoClient, createGithubAppAuth } from './gh-auth'; -import nock from 'nock'; import { createAppAuth } from '@octokit/auth-app'; - import { StrategyOptions } from '@octokit/auth-app/dist-types/types'; -import { getParameterValue } from './../aws/ssm'; - -import { RequestInterface } from '@octokit/types'; -import { mock, MockProxy } from 'jest-mock-extended'; import { request } from '@octokit/request'; -import { mocked } from 'ts-jest/utils'; +import { RequestInterface } from '@octokit/types'; +import { mocked } from 'jest-mock'; +import { MockProxy, mock } from 'jest-mock-extended'; +import nock from 'nock'; + +import { getParameterValue } from './../aws/ssm'; +import { createGithubAppAuth, createOctoClient } from './gh-auth'; jest.mock('./../aws/ssm'); jest.mock('@octokit/auth-app'); diff --git a/modules/runners/lambdas/runners/src/gh-auth/gh-auth.ts b/modules/runners/lambdas/runners/src/gh-auth/gh-auth.ts index 8195438a60..93ff477fe1 100644 --- a/modules/runners/lambdas/runners/src/gh-auth/gh-auth.ts +++ b/modules/runners/lambdas/runners/src/gh-auth/gh-auth.ts @@ -1,17 +1,18 @@ -import { Octokit } from '@octokit/rest'; -import { request } from '@octokit/request'; import { createAppAuth } from '@octokit/auth-app'; import { - StrategyOptions, - AppAuthentication, AppAuthOptions, - InstallationAuthOptions, - InstallationAccessTokenAuthentication, + AppAuthentication, AuthInterface, + InstallationAccessTokenAuthentication, + InstallationAuthOptions, + StrategyOptions, } from '@octokit/auth-app/dist-types/types'; import { OctokitOptions } from '@octokit/core/dist-types/types'; +import { request } from '@octokit/request'; +import { Octokit } from '@octokit/rest'; + import { getParameterValue } from '../aws/ssm'; -import { logger as rootLogger, LogFields } from '../logger'; +import { LogFields, logger as rootLogger } from '../logger'; const logger = rootLogger.getChildLogger({ name: 'gh-auth' }); diff --git a/modules/runners/lambdas/runners/src/lambda.test.ts b/modules/runners/lambdas/runners/src/lambda.test.ts index 2654be67e2..8fa3b9a6c5 100644 --- a/modules/runners/lambdas/runners/src/lambda.test.ts +++ b/modules/runners/lambdas/runners/src/lambda.test.ts @@ -1,11 +1,12 @@ import { Context, SQSEvent, SQSRecord } from 'aws-lambda'; -import { mocked } from 'ts-jest/utils'; +import { mocked } from 'jest-mock'; + import { adjustPool, scaleDownHandler, scaleUpHandler } from './lambda'; -import { ActionRequestMessage, scaleUp } from './scale-runners/scale-up'; -import ScaleError from './scale-runners/ScaleError'; import { logger } from './logger'; -import { scaleDown } from './scale-runners/scale-down'; import { adjust } from './pool/pool'; +import ScaleError from './scale-runners/ScaleError'; +import { scaleDown } from './scale-runners/scale-down'; +import { ActionRequestMessage, scaleUp } from './scale-runners/scale-up'; const body: ActionRequestMessage = { eventType: 'workflow_job', @@ -62,6 +63,7 @@ jest.mock('./scale-runners/scale-down'); jest.mock('./pool/pool'); jest.mock('./logger'); +// Docs for testing async with jest: https://jestjs.io/docs/tutorial-async describe('Test scale up lambda wrapper.', () => { it('Do not handle multiple record sets.', async () => { await testInvalidRecords([sqsRecord, sqsRecord]); @@ -82,18 +84,17 @@ describe('Test scale up lambda wrapper.', () => { }); it('Non scale should resolve.', async () => { - const error = new Error('some error'); + const error = new Error('Non scale should resolve.'); const mock = mocked(scaleUp); mock.mockRejectedValue(error); - expect(await scaleUpHandler(sqsEvent, context)).resolves; + await expect(scaleUpHandler(sqsEvent, context)).resolves; }); it('Scale should be rejected', async () => { - const error = new ScaleError('some scale error'); + const error = new ScaleError('Scale should be rejected'); const mock = mocked(scaleUp); - mock.mockRejectedValue(error); - expect(scaleUpHandler(sqsEvent, context)).rejects.toThrow(error); + await expect(scaleUpHandler(sqsEvent, context)).rejects.toThrow(error); }); }); @@ -109,7 +110,7 @@ async function testInvalidRecords(sqsRecords: SQSRecord[]) { Records: sqsRecords, }; - expect(await scaleUpHandler(sqsEventMultipleRecords, context)).resolves; + await expect(scaleUpHandler(sqsEventMultipleRecords, context)).resolves; expect(logWarnSpy).toHaveBeenCalledWith( 'Event ignored, only one record at the time can be handled, ensure the lambda batch size is set to 1.', @@ -125,14 +126,14 @@ describe('Test scale down lambda wrapper.', () => { resolve(); }); }); - expect(await scaleDownHandler(context)).resolves; + await expect(scaleDownHandler(context)).resolves; }); it('Scaling down with error.', async () => { - const error = new Error('some error'); + const error = new Error('Scaling down with error.'); const mock = mocked(scaleDown); mock.mockRejectedValue(error); - expect(await scaleDownHandler(context)).resolves; + await expect(await scaleDownHandler(context)).resolves; }); }); @@ -144,15 +145,15 @@ describe('Adjust pool.', () => { resolve(); }); }); - expect(await adjustPool({ poolSize: 2 }, context)).resolves; + await expect(adjustPool({ poolSize: 2 }, context)).resolves; }); it('Handle error for adjusting pool.', async () => { const mock = mocked(adjust); - const error = new Error('errorXYX'); + const error = new Error('Handle error for adjusting pool.'); mock.mockRejectedValue(error); const logSpy = jest.spyOn(logger, 'error'); - expect(await adjustPool({ poolSize: 0 }, context)).resolves; + await adjustPool({ poolSize: 0 }, context); expect(logSpy).lastCalledWith(error); }); }); diff --git a/modules/runners/lambdas/runners/src/lambda.ts b/modules/runners/lambdas/runners/src/lambda.ts index f4bed16981..5e413a36a2 100644 --- a/modules/runners/lambdas/runners/src/lambda.ts +++ b/modules/runners/lambdas/runners/src/lambda.ts @@ -1,10 +1,11 @@ -import { scaleUp } from './scale-runners/scale-up'; -import { scaleDown } from './scale-runners/scale-down'; -import { SQSEvent, Context } from 'aws-lambda'; +import { Context, SQSEvent } from 'aws-lambda'; +import 'source-map-support/register'; + import { LogFields, logger } from './logger'; +import { PoolEvent, adjust } from './pool/pool'; import ScaleError from './scale-runners/ScaleError'; -import 'source-map-support/register'; -import { adjust, PoolEvent } from './pool/pool'; +import { scaleDown } from './scale-runners/scale-down'; +import { scaleUp } from './scale-runners/scale-up'; export async function scaleUpHandler(event: SQSEvent, context: Context): Promise { logger.setSettings({ requestId: context.awsRequestId }); diff --git a/modules/runners/lambdas/runners/src/local.ts b/modules/runners/lambdas/runners/src/local.ts index 1cd8e4f6cc..5c79110d76 100644 --- a/modules/runners/lambdas/runners/src/local.ts +++ b/modules/runners/lambdas/runners/src/local.ts @@ -1,5 +1,5 @@ import { logger } from './logger'; -import { scaleUp, ActionRequestMessage } from './scale-runners/scale-up'; +import { ActionRequestMessage, scaleUp } from './scale-runners/scale-up'; const sqsEvent = { Records: [ diff --git a/modules/runners/lambdas/runners/src/pool/pool.test.ts b/modules/runners/lambdas/runners/src/pool/pool.test.ts index f6d237e824..35237400a2 100644 --- a/modules/runners/lambdas/runners/src/pool/pool.test.ts +++ b/modules/runners/lambdas/runners/src/pool/pool.test.ts @@ -1,10 +1,11 @@ -import { mocked } from 'ts-jest/utils'; -import { adjust } from './pool'; -import * as ghAuth from '../gh-auth/gh-auth'; -import * as scale from '../scale-runners/scale-up'; -import nock from 'nock'; import { Octokit } from '@octokit/rest'; +import { mocked } from 'jest-mock'; +import nock from 'nock'; + import { listEC2Runners } from '../aws/runners'; +import * as ghAuth from '../gh-auth/gh-auth'; +import * as scale from '../scale-runners/scale-up'; +import { adjust } from './pool'; const mockOctokit = { paginate: jest.fn(), @@ -153,13 +154,13 @@ describe('Test simple pool.', () => { describe('With GitHub Cloud', () => { it('Top up pool with pool size 2.', async () => { const spy = jest.spyOn(scale, 'createRunners'); - expect(await adjust({ poolSize: 2 })).resolves; + await expect(adjust({ poolSize: 2 })).resolves; expect(spy).toBeCalled; }); it('Should not top up if pool size is reached.', async () => { const spy = jest.spyOn(scale, 'createRunners'); - expect(await adjust({ poolSize: 1 })).resolves; + await expect(adjust({ poolSize: 1 })).resolves; expect(spy).not.toHaveBeenCalled; }); }); @@ -171,7 +172,7 @@ describe('Test simple pool.', () => { it('Top up if the pool size is set to 5', async () => { const spy = jest.spyOn(scale, 'createRunners'); - expect(await adjust({ poolSize: 5 })).resolves; + await expect(adjust({ poolSize: 5 })).resolves; expect(spy).toBeCalled; }); }); diff --git a/modules/runners/lambdas/runners/src/pool/pool.ts b/modules/runners/lambdas/runners/src/pool/pool.ts index 23849fdc39..eea185ef5d 100644 --- a/modules/runners/lambdas/runners/src/pool/pool.ts +++ b/modules/runners/lambdas/runners/src/pool/pool.ts @@ -1,8 +1,9 @@ import yn from 'yn'; + +import { listEC2Runners } from '../aws/runners'; +import { createGithubAppAuth, createGithubInstallationAuth, createOctoClient } from '../gh-auth/gh-auth'; import { logger as rootLogger } from '../logger'; import { createRunners } from '../scale-runners/scale-up'; -import { createGithubAppAuth, createGithubInstallationAuth, createOctoClient } from '../gh-auth/gh-auth'; -import { listEC2Runners } from '../aws/runners'; const logger = rootLogger.getChildLogger({ name: 'pool' }); diff --git a/modules/runners/lambdas/runners/src/scale-runners/scale-down-config.test.ts b/modules/runners/lambdas/runners/src/scale-runners/scale-down-config.test.ts index fbdbe42194..2bafce8b34 100644 --- a/modules/runners/lambdas/runners/src/scale-runners/scale-down-config.test.ts +++ b/modules/runners/lambdas/runners/src/scale-runners/scale-down-config.test.ts @@ -1,5 +1,6 @@ import moment from 'moment-timezone'; -import { getIdleRunnerCount, ScalingDownConfigList } from './scale-down-config'; + +import { ScalingDownConfigList, getIdleRunnerCount } from './scale-down-config'; const DEFAULT_TIMEZONE = 'America/Los_Angeles'; const DEFAULT_IDLE_COUNT = 1; diff --git a/modules/runners/lambdas/runners/src/scale-runners/scale-down.test.ts b/modules/runners/lambdas/runners/src/scale-runners/scale-down.test.ts index f1336f3605..e17afd79ed 100644 --- a/modules/runners/lambdas/runners/src/scale-runners/scale-down.test.ts +++ b/modules/runners/lambdas/runners/src/scale-runners/scale-down.test.ts @@ -1,11 +1,12 @@ +import { Octokit } from '@octokit/rest'; +import { mocked } from 'jest-mock'; import moment from 'moment'; -import { mocked } from 'ts-jest/utils'; -import { listEC2Runners, terminateRunner, RunnerInfo, RunnerList } from './../aws/runners'; -import { scaleDown } from './scale-down'; -import * as ghAuth from '../gh-auth/gh-auth'; import nock from 'nock'; -import { Octokit } from '@octokit/rest'; + +import * as ghAuth from '../gh-auth/gh-auth'; +import { RunnerInfo, RunnerList, listEC2Runners, terminateRunner } from './../aws/runners'; import { githubCache } from './cache'; +import { scaleDown } from './scale-down'; const mockOctokit = { apps: { @@ -350,7 +351,7 @@ describe('scaleDown', () => { } }); - it('Terminates 0 runners owned by repos', async () => { + it('Terminates 0 runners owned by org', async () => { mockListRunners.mockResolvedValue(RUNNERS_REPO_WITH_AUTO_SCALING_CONFIG); process.env.ENABLE_ORGANIZATION_RUNNERS = 'false'; await scaleDown(); @@ -364,6 +365,22 @@ describe('scaleDown', () => { }); }); + it('No instances terminates when delete runner in github results in a non 204 status.', async () => { + mockListRunners.mockResolvedValue(DEFAULT_RUNNERS); + mockOctokit.actions.deleteSelfHostedRunnerFromOrg.mockImplementation(() => { + return { status: 500 }; + }); + + await scaleDown(); + + expect(listEC2Runners).toBeCalledWith({ + environment: environment, + }); + + expect(mockOctokit.apps.getOrgInstallation).toBeCalled(); + expect(terminateRunner).not.toBeCalled; + }); + it('Terminates 6 runners amongst all owners and all orphaned', async () => { mockListRunners.mockResolvedValue(DEFAULT_RUNNERS); await scaleDown(); diff --git a/modules/runners/lambdas/runners/src/scale-runners/scale-down.ts b/modules/runners/lambdas/runners/src/scale-runners/scale-down.ts index a26b833619..1c48af50e7 100644 --- a/modules/runners/lambdas/runners/src/scale-runners/scale-down.ts +++ b/modules/runners/lambdas/runners/src/scale-runners/scale-down.ts @@ -1,10 +1,11 @@ import { Octokit } from '@octokit/rest'; import moment from 'moment'; -import { listEC2Runners, RunnerInfo, RunnerList, terminateRunner } from './../aws/runners'; -import { getIdleRunnerCount, ScalingDownConfig } from './scale-down-config'; -import { createOctoClient, createGithubAppAuth, createGithubInstallationAuth } from '../gh-auth/gh-auth'; -import { githubCache, GhRunners } from './cache'; -import { logger as rootLogger, LogFields } from '../logger'; + +import { createGithubAppAuth, createGithubInstallationAuth, createOctoClient } from '../gh-auth/gh-auth'; +import { LogFields, logger as rootLogger } from '../logger'; +import { RunnerInfo, RunnerList, listEC2Runners, terminateRunner } from './../aws/runners'; +import { GhRunners, githubCache } from './cache'; +import { ScalingDownConfig, getIdleRunnerCount } from './scale-down-config'; const logger = rootLogger.getChildLogger({ name: 'scale-down' }); diff --git a/modules/runners/lambdas/runners/src/scale-runners/scale-up.test.ts b/modules/runners/lambdas/runners/src/scale-runners/scale-up.test.ts index f7924001f7..00158b9bf4 100644 --- a/modules/runners/lambdas/runners/src/scale-runners/scale-up.test.ts +++ b/modules/runners/lambdas/runners/src/scale-runners/scale-up.test.ts @@ -1,10 +1,11 @@ -import { mocked } from 'ts-jest/utils'; -import * as scaleUpModule from './scale-up'; -import { listEC2Runners, createRunner, RunnerInputParameters } from './../aws/runners'; -import * as ghAuth from '../gh-auth/gh-auth'; -import nock from 'nock'; import { Octokit } from '@octokit/rest'; +import { mocked } from 'jest-mock'; +import nock from 'nock'; + +import * as ghAuth from '../gh-auth/gh-auth'; +import { RunnerInputParameters, createRunner, listEC2Runners } from './../aws/runners'; import ScaleError from './ScaleError'; +import * as scaleUpModule from './scale-up'; const mockOctokit = { checks: { get: jest.fn() }, @@ -149,7 +150,7 @@ describe('scaleUp with GHES', () => { it('ignores non-sqs events', async () => { expect.assertions(1); - expect(scaleUpModule.scaleUp('aws:s3', TEST_DATA)).rejects.toEqual(Error('Cannot handle non-SQS events!')); + await expect(scaleUpModule.scaleUp('aws:s3', TEST_DATA)).rejects.toEqual(Error('Cannot handle non-SQS events!')); }); it('checks queued workflows', async () => { @@ -340,7 +341,7 @@ describe('scaleUp with GHES', () => { describe('scaleUp with public GH', () => { it('ignores non-sqs events', async () => { expect.assertions(1); - expect(scaleUpModule.scaleUp('aws:s3', TEST_DATA)).rejects.toEqual(Error('Cannot handle non-SQS events!')); + await expect(scaleUpModule.scaleUp('aws:s3', TEST_DATA)).rejects.toEqual(Error('Cannot handle non-SQS events!')); }); it('checks queued workflows', async () => { diff --git a/modules/runners/lambdas/runners/src/scale-runners/scale-up.ts b/modules/runners/lambdas/runners/src/scale-runners/scale-up.ts index f2e1e5cc37..8e6106e47f 100644 --- a/modules/runners/lambdas/runners/src/scale-runners/scale-up.ts +++ b/modules/runners/lambdas/runners/src/scale-runners/scale-up.ts @@ -1,8 +1,9 @@ -import { listEC2Runners, createRunner, RunnerInputParameters } from './../aws/runners'; -import { createOctoClient, createGithubAppAuth, createGithubInstallationAuth } from '../gh-auth/gh-auth'; -import yn from 'yn'; import { Octokit } from '@octokit/rest'; +import yn from 'yn'; + +import { createGithubAppAuth, createGithubInstallationAuth, createOctoClient } from '../gh-auth/gh-auth'; import { LogFields, logger as rootLogger } from '../logger'; +import { RunnerInputParameters, createRunner, listEC2Runners } from './../aws/runners'; import ScaleError from './ScaleError'; const logger = rootLogger.getChildLogger({ name: 'scale-up' }); diff --git a/modules/runners/lambdas/runners/yarn.lock b/modules/runners/lambdas/runners/yarn.lock index 72411ab87d..7f62d38f84 100644 --- a/modules/runners/lambdas/runners/yarn.lock +++ b/modules/runners/lambdas/runners/yarn.lock @@ -23,7 +23,7 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" -"@aws-crypto/sha256-js@2.0.0", "@aws-crypto/sha256-js@^2.0.0": +"@aws-crypto/sha256-js@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-2.0.0.tgz#f1f936039bdebd0b9e2dd834d65afdc2aac4efcb" integrity sha512-VZY+mCY4Nmrs5WGfitmNqXzaE873fcIZDu54cbaDaaamsaTOP1DBImV9F4pICc3EHjQXujyE8jig+PFCaew9ig== @@ -32,6 +32,15 @@ "@aws-sdk/types" "^3.1.0" tslib "^1.11.1" +"@aws-crypto/sha256-js@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-2.0.1.tgz#79e1e6cf61f652ef2089c08d471c722ecf1626a9" + integrity sha512-mbHTBSPBvg6o/mN/c18Z/zifM05eJrapj5ggoOIeHIWckvkv5VgGi7r/wYpt+QAO2ySKXLNvH2d8L7bne4xrMQ== + dependencies: + "@aws-crypto/util" "^2.0.1" + "@aws-sdk/types" "^3.1.0" + tslib "^1.11.1" + "@aws-crypto/supports-web-crypto@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-2.0.0.tgz#fd6cde30b88f77d5a4f57b2c37c560d918014f9e" @@ -39,561 +48,561 @@ dependencies: tslib "^1.11.1" -"@aws-crypto/util@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-2.0.0.tgz#17ba6f83c7e447b70fc24b84c5f6714d1e329f4a" - integrity sha512-YDooyH83m2P5A3h6lNH7hm6mIP93sU/dtzRmXIgtO4BCB7SvtX8ysVKQAE8tVky2DQ3HHxPCjNTuUe7YoAMrNQ== +"@aws-crypto/util@^2.0.0", "@aws-crypto/util@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-2.0.1.tgz#976cf619cf85084ca85ec5eb947a6ac6b8b5c98c" + integrity sha512-JJmFFwvbm08lULw4Nm5QOLg8+lAQeC8aCXK5xrtxntYzYXCGfHwUJ4Is3770Q7HmICsXthGQ+ZsDL7C2uH3yBQ== dependencies: "@aws-sdk/types" "^3.1.0" "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" -"@aws-sdk/abort-controller@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.40.0.tgz#e17299776782483835439d9b1b5300add24adc3f" - integrity sha512-S7LzLvNuwuf0q7r4q7zqGzxd/W2xYsn8cpZ90MMb3ObolhbkLySrikUJujmXae8k+2/KFCOr+FVC0YLrATSUgQ== +"@aws-sdk/abort-controller@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.46.0.tgz#7b1297afeb3e2256af99d2f7c8aa4efb09046135" + integrity sha512-XrCocRwajh3jkI/Y2PCZjYUZcJfmCa4DYM5nnW2+w4o7ez7vXEQ1j5FCI+/ogJIqfccnmEIlLZGlfzmc6vVbJw== dependencies: - "@aws-sdk/types" "3.40.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" "@aws-sdk/client-ssm@^3.45.0": - version "3.45.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-ssm/-/client-ssm-3.45.0.tgz#67f932d7aebc7f38984d3cbbfea656f7d2ffb2bb" - integrity sha512-5Yr5ipb9VxgpbJy666KzEfpd4fsZ3V9EutMtR3jnVGRDb4foVzybBBoD7sU4EI9wBDusV0uGnlMwXVMI4tCVCQ== + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-ssm/-/client-ssm-3.46.0.tgz#3f33d7f3ced118c4900131fef1ba5d673e094c0f" + integrity sha512-wIPEX/LHio1X7YAeHdu0/hXXnRHYaQKRlv4ztShcdMtP6j4HWNck5Fwv/yh9B/JBhOAswPYcz1qEXCSRT3Hwpg== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.45.0" - "@aws-sdk/config-resolver" "3.45.0" - "@aws-sdk/credential-provider-node" "3.45.0" - "@aws-sdk/fetch-http-handler" "3.40.0" - "@aws-sdk/hash-node" "3.40.0" - "@aws-sdk/invalid-dependency" "3.40.0" - "@aws-sdk/middleware-content-length" "3.40.0" - "@aws-sdk/middleware-host-header" "3.40.0" - "@aws-sdk/middleware-logger" "3.40.0" - "@aws-sdk/middleware-retry" "3.40.0" - "@aws-sdk/middleware-serde" "3.40.0" - "@aws-sdk/middleware-signing" "3.45.0" - "@aws-sdk/middleware-stack" "3.40.0" - "@aws-sdk/middleware-user-agent" "3.40.0" - "@aws-sdk/node-config-provider" "3.40.0" - "@aws-sdk/node-http-handler" "3.40.0" - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/smithy-client" "3.41.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/url-parser" "3.40.0" - "@aws-sdk/util-base64-browser" "3.37.0" - "@aws-sdk/util-base64-node" "3.37.0" - "@aws-sdk/util-body-length-browser" "3.37.0" - "@aws-sdk/util-body-length-node" "3.37.0" - "@aws-sdk/util-user-agent-browser" "3.40.0" - "@aws-sdk/util-user-agent-node" "3.40.0" - "@aws-sdk/util-utf8-browser" "3.37.0" - "@aws-sdk/util-utf8-node" "3.37.0" - "@aws-sdk/util-waiter" "3.40.0" + "@aws-sdk/client-sts" "3.46.0" + "@aws-sdk/config-resolver" "3.46.0" + "@aws-sdk/credential-provider-node" "3.46.0" + "@aws-sdk/fetch-http-handler" "3.46.0" + "@aws-sdk/hash-node" "3.46.0" + "@aws-sdk/invalid-dependency" "3.46.0" + "@aws-sdk/middleware-content-length" "3.46.0" + "@aws-sdk/middleware-host-header" "3.46.0" + "@aws-sdk/middleware-logger" "3.46.0" + "@aws-sdk/middleware-retry" "3.46.0" + "@aws-sdk/middleware-serde" "3.46.0" + "@aws-sdk/middleware-signing" "3.46.0" + "@aws-sdk/middleware-stack" "3.46.0" + "@aws-sdk/middleware-user-agent" "3.46.0" + "@aws-sdk/node-config-provider" "3.46.0" + "@aws-sdk/node-http-handler" "3.46.0" + "@aws-sdk/protocol-http" "3.46.0" + "@aws-sdk/smithy-client" "3.46.0" + "@aws-sdk/types" "3.46.0" + "@aws-sdk/url-parser" "3.46.0" + "@aws-sdk/util-base64-browser" "3.46.0" + "@aws-sdk/util-base64-node" "3.46.0" + "@aws-sdk/util-body-length-browser" "3.46.0" + "@aws-sdk/util-body-length-node" "3.46.0" + "@aws-sdk/util-user-agent-browser" "3.46.0" + "@aws-sdk/util-user-agent-node" "3.46.0" + "@aws-sdk/util-utf8-browser" "3.46.0" + "@aws-sdk/util-utf8-node" "3.46.0" + "@aws-sdk/util-waiter" "3.46.0" tslib "^2.3.0" uuid "^8.3.2" -"@aws-sdk/client-sso@3.45.0": - version "3.45.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.45.0.tgz#4e6f16096758c4681bd2464507e6a3ec5623ec3c" - integrity sha512-MfsKg4Wq5KvuGEg+M7kYfl6B3TRhxKeL01+5wtxhYbiLqxzr18mfO8PnBAasXMmYCmEQsSGmFepD7GLOld9uHA== +"@aws-sdk/client-sso@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.46.0.tgz#2de5928e1187a7a34a782e83297db0aeed2ac666" + integrity sha512-n+dHT9azUW4pFA7a98gV/qFYdNwoMQ/4Y4tvPE28s9CKx8O0OIDlOwLPrhSBETCuRJNfnug1vNnFIzvOapfCkg== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/config-resolver" "3.45.0" - "@aws-sdk/fetch-http-handler" "3.40.0" - "@aws-sdk/hash-node" "3.40.0" - "@aws-sdk/invalid-dependency" "3.40.0" - "@aws-sdk/middleware-content-length" "3.40.0" - "@aws-sdk/middleware-host-header" "3.40.0" - "@aws-sdk/middleware-logger" "3.40.0" - "@aws-sdk/middleware-retry" "3.40.0" - "@aws-sdk/middleware-serde" "3.40.0" - "@aws-sdk/middleware-stack" "3.40.0" - "@aws-sdk/middleware-user-agent" "3.40.0" - "@aws-sdk/node-config-provider" "3.40.0" - "@aws-sdk/node-http-handler" "3.40.0" - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/smithy-client" "3.41.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/url-parser" "3.40.0" - "@aws-sdk/util-base64-browser" "3.37.0" - "@aws-sdk/util-base64-node" "3.37.0" - "@aws-sdk/util-body-length-browser" "3.37.0" - "@aws-sdk/util-body-length-node" "3.37.0" - "@aws-sdk/util-user-agent-browser" "3.40.0" - "@aws-sdk/util-user-agent-node" "3.40.0" - "@aws-sdk/util-utf8-browser" "3.37.0" - "@aws-sdk/util-utf8-node" "3.37.0" + "@aws-sdk/config-resolver" "3.46.0" + "@aws-sdk/fetch-http-handler" "3.46.0" + "@aws-sdk/hash-node" "3.46.0" + "@aws-sdk/invalid-dependency" "3.46.0" + "@aws-sdk/middleware-content-length" "3.46.0" + "@aws-sdk/middleware-host-header" "3.46.0" + "@aws-sdk/middleware-logger" "3.46.0" + "@aws-sdk/middleware-retry" "3.46.0" + "@aws-sdk/middleware-serde" "3.46.0" + "@aws-sdk/middleware-stack" "3.46.0" + "@aws-sdk/middleware-user-agent" "3.46.0" + "@aws-sdk/node-config-provider" "3.46.0" + "@aws-sdk/node-http-handler" "3.46.0" + "@aws-sdk/protocol-http" "3.46.0" + "@aws-sdk/smithy-client" "3.46.0" + "@aws-sdk/types" "3.46.0" + "@aws-sdk/url-parser" "3.46.0" + "@aws-sdk/util-base64-browser" "3.46.0" + "@aws-sdk/util-base64-node" "3.46.0" + "@aws-sdk/util-body-length-browser" "3.46.0" + "@aws-sdk/util-body-length-node" "3.46.0" + "@aws-sdk/util-user-agent-browser" "3.46.0" + "@aws-sdk/util-user-agent-node" "3.46.0" + "@aws-sdk/util-utf8-browser" "3.46.0" + "@aws-sdk/util-utf8-node" "3.46.0" tslib "^2.3.0" -"@aws-sdk/client-sts@3.45.0": - version "3.45.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.45.0.tgz#753c850e5e3e427ce30bde851eb607a766316d59" - integrity sha512-D+VGhAg+1i7/WQhfkLn7nWHR+Uyp7FPVAQ/N2MBQvZxGbSSb2agU9DN2FnxeFljOEcGJ7NdJ9YSZCFlJo0bLWA== +"@aws-sdk/client-sts@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.46.0.tgz#b11d5ca2c13446f313c0e8d007e158aef39f6f8b" + integrity sha512-iZqMLOYZ0/x19towcaqdL6zEfFRSPQKEZjbBKujeHlWNEi0ldlCt3a5R3V0nntoaPoa6bopUxRYj3VTLGD43Sg== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/config-resolver" "3.45.0" - "@aws-sdk/credential-provider-node" "3.45.0" - "@aws-sdk/fetch-http-handler" "3.40.0" - "@aws-sdk/hash-node" "3.40.0" - "@aws-sdk/invalid-dependency" "3.40.0" - "@aws-sdk/middleware-content-length" "3.40.0" - "@aws-sdk/middleware-host-header" "3.40.0" - "@aws-sdk/middleware-logger" "3.40.0" - "@aws-sdk/middleware-retry" "3.40.0" - "@aws-sdk/middleware-sdk-sts" "3.45.0" - "@aws-sdk/middleware-serde" "3.40.0" - "@aws-sdk/middleware-signing" "3.45.0" - "@aws-sdk/middleware-stack" "3.40.0" - "@aws-sdk/middleware-user-agent" "3.40.0" - "@aws-sdk/node-config-provider" "3.40.0" - "@aws-sdk/node-http-handler" "3.40.0" - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/smithy-client" "3.41.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/url-parser" "3.40.0" - "@aws-sdk/util-base64-browser" "3.37.0" - "@aws-sdk/util-base64-node" "3.37.0" - "@aws-sdk/util-body-length-browser" "3.37.0" - "@aws-sdk/util-body-length-node" "3.37.0" - "@aws-sdk/util-user-agent-browser" "3.40.0" - "@aws-sdk/util-user-agent-node" "3.40.0" - "@aws-sdk/util-utf8-browser" "3.37.0" - "@aws-sdk/util-utf8-node" "3.37.0" + "@aws-sdk/config-resolver" "3.46.0" + "@aws-sdk/credential-provider-node" "3.46.0" + "@aws-sdk/fetch-http-handler" "3.46.0" + "@aws-sdk/hash-node" "3.46.0" + "@aws-sdk/invalid-dependency" "3.46.0" + "@aws-sdk/middleware-content-length" "3.46.0" + "@aws-sdk/middleware-host-header" "3.46.0" + "@aws-sdk/middleware-logger" "3.46.0" + "@aws-sdk/middleware-retry" "3.46.0" + "@aws-sdk/middleware-sdk-sts" "3.46.0" + "@aws-sdk/middleware-serde" "3.46.0" + "@aws-sdk/middleware-signing" "3.46.0" + "@aws-sdk/middleware-stack" "3.46.0" + "@aws-sdk/middleware-user-agent" "3.46.0" + "@aws-sdk/node-config-provider" "3.46.0" + "@aws-sdk/node-http-handler" "3.46.0" + "@aws-sdk/protocol-http" "3.46.0" + "@aws-sdk/smithy-client" "3.46.0" + "@aws-sdk/types" "3.46.0" + "@aws-sdk/url-parser" "3.46.0" + "@aws-sdk/util-base64-browser" "3.46.0" + "@aws-sdk/util-base64-node" "3.46.0" + "@aws-sdk/util-body-length-browser" "3.46.0" + "@aws-sdk/util-body-length-node" "3.46.0" + "@aws-sdk/util-user-agent-browser" "3.46.0" + "@aws-sdk/util-user-agent-node" "3.46.0" + "@aws-sdk/util-utf8-browser" "3.46.0" + "@aws-sdk/util-utf8-node" "3.46.0" entities "2.2.0" fast-xml-parser "3.19.0" tslib "^2.3.0" -"@aws-sdk/config-resolver@3.45.0": - version "3.45.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.45.0.tgz#6c58c789a2e104d1ed8824f0ef541414295fd5c0" - integrity sha512-pk+9jWQGvga2jr4aiB/KR1vAI0vPngvo9HqBbKebbJzaBhpA/RwGVWB1ZJch93oG8DBeyKZ0md9eOJRU1BkTIQ== +"@aws-sdk/config-resolver@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.46.0.tgz#c88e8d2662d51807ee1acbcda9497add288c9dd9" + integrity sha512-R7YGDhvVE1VIS7uyjG3rZE1nrRu/+YVBq/pPlq5f4Tis3EoUooPfr5yYOVAuZI1CGsgycbCi6jnaqLGIfxUFmQ== dependencies: - "@aws-sdk/signature-v4" "3.45.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/util-config-provider" "3.40.0" + "@aws-sdk/signature-v4" "3.46.0" + "@aws-sdk/types" "3.46.0" + "@aws-sdk/util-config-provider" "3.46.0" tslib "^2.3.0" -"@aws-sdk/credential-provider-env@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.40.0.tgz#0ca7611f13520dd6654e8eac7fa3e767d027ede6" - integrity sha512-qHZdf2vxhzZkSygjw2I4SEYFL2dMZxxYvO4QlkqQouKY81OVxs/j69oiNCjPasQzGz5jaZZKI8xEAIfkSyr1lg== +"@aws-sdk/credential-provider-env@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.46.0.tgz#efe2810d3a3597d021a853292064876cd2c75810" + integrity sha512-dBCyVBJ1nVi+lvM1jV6LFw8FpGjdeCglLMTmZUxJLBMh/Lp+GWtnGxd7u38WnH5gxKC4xLnYj9zP1t0ha1tGzQ== dependencies: - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/types" "3.40.0" + "@aws-sdk/property-provider" "3.46.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" -"@aws-sdk/credential-provider-imds@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.40.0.tgz#7c324eff731f85d4d40763c484e78673aa5dedfb" - integrity sha512-Ty/wVa+BQrCFrP06AGl5S1CeLifDt68YrlYXUnkRn603SX4DvxBgVO7XFeDH58G8ziDCiqxfmVl4yjbncPPeSw== +"@aws-sdk/credential-provider-imds@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.46.0.tgz#e28c87136803c2df13820689c4c127679c0d29ab" + integrity sha512-nQidNDq6mjas/wFOi9XvHkvNmzM/XdSB/eRh6CH+wQeb8RjAlGm2Ivg0mpz/iIxjPXDIduW8aI/gFU3+3um6CQ== dependencies: - "@aws-sdk/node-config-provider" "3.40.0" - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/url-parser" "3.40.0" + "@aws-sdk/node-config-provider" "3.46.0" + "@aws-sdk/property-provider" "3.46.0" + "@aws-sdk/types" "3.46.0" + "@aws-sdk/url-parser" "3.46.0" tslib "^2.3.0" -"@aws-sdk/credential-provider-ini@3.45.0": - version "3.45.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.45.0.tgz#fa62ff47a00a0e590d4db3d3a1f49b250021ebbc" - integrity sha512-lfYh8LVW33de01zzfqs6H+4xr20l+++QtvWG8PwKzEAY/71s344ybrOw7KiVUkCDLLbj3SWEmsMJFvBcrvifbA== - dependencies: - "@aws-sdk/credential-provider-env" "3.40.0" - "@aws-sdk/credential-provider-imds" "3.40.0" - "@aws-sdk/credential-provider-sso" "3.45.0" - "@aws-sdk/credential-provider-web-identity" "3.41.0" - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/shared-ini-file-loader" "3.37.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/util-credentials" "3.37.0" +"@aws-sdk/credential-provider-ini@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.46.0.tgz#dee7b8e6aa76e71158b6bc390ee3761c2395a271" + integrity sha512-D+3YLWzCaFUUcbLHAsJIoaI8AhoSpIl3c0a3spVN64f+V1XtwunbJO6VXsIF78RLe0kTP7IA/Rey86ydQVeqcw== + dependencies: + "@aws-sdk/credential-provider-env" "3.46.0" + "@aws-sdk/credential-provider-imds" "3.46.0" + "@aws-sdk/credential-provider-sso" "3.46.0" + "@aws-sdk/credential-provider-web-identity" "3.46.0" + "@aws-sdk/property-provider" "3.46.0" + "@aws-sdk/shared-ini-file-loader" "3.46.0" + "@aws-sdk/types" "3.46.0" + "@aws-sdk/util-credentials" "3.46.0" tslib "^2.3.0" -"@aws-sdk/credential-provider-node@3.45.0": - version "3.45.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.45.0.tgz#a33e6f08f6127165f2e01b9c31490a25aeb31b44" - integrity sha512-ZNqo0JlA7S4k1bAB+Xb8A3KsmNPWVFMmoY3NC25dgXU4xQLVxy0MucQggnfCqRjvshwI4OEdDQsRgl69n/XErQ== - dependencies: - "@aws-sdk/credential-provider-env" "3.40.0" - "@aws-sdk/credential-provider-imds" "3.40.0" - "@aws-sdk/credential-provider-ini" "3.45.0" - "@aws-sdk/credential-provider-process" "3.40.0" - "@aws-sdk/credential-provider-sso" "3.45.0" - "@aws-sdk/credential-provider-web-identity" "3.41.0" - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/shared-ini-file-loader" "3.37.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/util-credentials" "3.37.0" +"@aws-sdk/credential-provider-node@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.46.0.tgz#8ec9fd35ba7922d8502787a244a047cd5dea7ba8" + integrity sha512-TrlGFBpIEHy7SnFOL8bE4IUC1Albxg1aSYgU92dzjGe1HhUSOzFABZhqwzfoo/xTCuS/DnA+2aTVD+hRR9t1Mw== + dependencies: + "@aws-sdk/credential-provider-env" "3.46.0" + "@aws-sdk/credential-provider-imds" "3.46.0" + "@aws-sdk/credential-provider-ini" "3.46.0" + "@aws-sdk/credential-provider-process" "3.46.0" + "@aws-sdk/credential-provider-sso" "3.46.0" + "@aws-sdk/credential-provider-web-identity" "3.46.0" + "@aws-sdk/property-provider" "3.46.0" + "@aws-sdk/shared-ini-file-loader" "3.46.0" + "@aws-sdk/types" "3.46.0" + "@aws-sdk/util-credentials" "3.46.0" tslib "^2.3.0" -"@aws-sdk/credential-provider-process@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.40.0.tgz#b4f16e43ca9c855002e833ac9dc8e409b3c7ca23" - integrity sha512-qsaNCDesW2GasDbzpeOA371gxugi05JWxt3EKonLbUfkGKBK7kmmL6EgLIxZuNm2/Ve4RS07PKp8yBGm4xIx9w== +"@aws-sdk/credential-provider-process@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.46.0.tgz#4bbe107b9d33128ae773840d6b39bd29cd5b67e4" + integrity sha512-uW2+NgsqAJmQDQ6Y5t+U6E3LjLTEc06FCtJZIdYmfSGnsZoVH26DDIDg92G1ptFF8AzV26aypF2kjiRVRhIwDQ== dependencies: - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/shared-ini-file-loader" "3.37.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/util-credentials" "3.37.0" + "@aws-sdk/property-provider" "3.46.0" + "@aws-sdk/shared-ini-file-loader" "3.46.0" + "@aws-sdk/types" "3.46.0" + "@aws-sdk/util-credentials" "3.46.0" tslib "^2.3.0" -"@aws-sdk/credential-provider-sso@3.45.0": - version "3.45.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.45.0.tgz#c3b1b16c1928310dd06b5193421935cd3598a4f6" - integrity sha512-FBMn+QA6rI74A90ieQtCJckbKPBxNn4mgR9rzWyi/R6o5gVuu99yJGL03NXtWtm5N4x/1SygBtezY/XL5UU0Mg== +"@aws-sdk/credential-provider-sso@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.46.0.tgz#31feb9a1959e51ad52a0e761878ad6ab430ca12e" + integrity sha512-y3zv6FtaEu1cjtun6vQ1S/2aya70cPjCcoQhSrsH9TDYXp/ZRk4PN6xdVGGpkZX2kZhowGU5DvhOGK48IqrNZg== dependencies: - "@aws-sdk/client-sso" "3.45.0" - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/shared-ini-file-loader" "3.37.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/util-credentials" "3.37.0" + "@aws-sdk/client-sso" "3.46.0" + "@aws-sdk/property-provider" "3.46.0" + "@aws-sdk/shared-ini-file-loader" "3.46.0" + "@aws-sdk/types" "3.46.0" + "@aws-sdk/util-credentials" "3.46.0" tslib "^2.3.0" -"@aws-sdk/credential-provider-web-identity@3.41.0": - version "3.41.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.41.0.tgz#7f0e9cc5650eaf6ac32ef359fb0e0dea2ca0ce78" - integrity sha512-VqvVoEh9C8xTXl4stKyJC5IKQhS8g1Gi5k6B9HPHLIxFRRfKxkE73DT4pMN6npnus7o0yi0MTFGQFQGYSrFO2g== +"@aws-sdk/credential-provider-web-identity@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.46.0.tgz#0ee7cfa192338208aca134e223e8a0d4d44818b8" + integrity sha512-VUNTS9HjwLRmS2OQ+i4tqVJBUpk/DjIT0sWUDnKBcC6UCyGOkVmBVisCvUHpwyCLCgYbCvTab1SfrJ8dZsN83w== dependencies: - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/types" "3.40.0" + "@aws-sdk/property-provider" "3.46.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" -"@aws-sdk/fetch-http-handler@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.40.0.tgz#5e6ecfb7fe1f32a5709e4e9c13b0536073477737" - integrity sha512-w1HiZromoU+/bbEo89uO81l6UO/M+c2uOMnXntZqe6t3ZHUUUo3AbvhKh0QGVFqRQa+Oi0+95KqWmTHa72/9Iw== +"@aws-sdk/fetch-http-handler@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.46.0.tgz#6440a0b97fb92900dc414af47e1b6727607fd5a7" + integrity sha512-uOfdwbUCG+2LQ4iMkxD/izlzjnIrB5P5HtH7L5w1EFIsdxDXeFnnql0FaEcOvaEEg2rs9z0t+oLwMJZnNNtqAg== dependencies: - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/querystring-builder" "3.40.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/util-base64-browser" "3.37.0" + "@aws-sdk/protocol-http" "3.46.0" + "@aws-sdk/querystring-builder" "3.46.0" + "@aws-sdk/types" "3.46.0" + "@aws-sdk/util-base64-browser" "3.46.0" tslib "^2.3.0" -"@aws-sdk/hash-node@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.40.0.tgz#bf4d31a41652cbc3c937055087c80096cfab67ae" - integrity sha512-yOXXK85DdGDktdnQtXgMdaVKii4wtMjEhJ1mrvx2A9nMFNaPhxvERkVVIUKSWlJRa9ZujOw5jWOx8d2R51/Kjg== +"@aws-sdk/hash-node@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.46.0.tgz#e8cbb3fa64a8875d82ddbc326bc2bfbe8004aa2f" + integrity sha512-rABF9k5uSJdqmwBeYnu+2+iWEmPNVsoBy9bwLvEmGfh557wAwh3dL5IDf+NiIFrd8GTOF/2HV1477XXBl15C0g== dependencies: - "@aws-sdk/types" "3.40.0" - "@aws-sdk/util-buffer-from" "3.37.0" + "@aws-sdk/types" "3.46.0" + "@aws-sdk/util-buffer-from" "3.46.0" tslib "^2.3.0" -"@aws-sdk/invalid-dependency@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.40.0.tgz#023e37abfb2882676c3cef02da630342634aa429" - integrity sha512-axIWtDwCBDDqEgAJipX1FB1ZNpWYXquVwKDMo+7G+ftPBZ4FEq4M1ELhXJL3hhNJ9ZmCQzv+4F6Wnt8dwuzUaQ== +"@aws-sdk/invalid-dependency@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.46.0.tgz#f4cc92b36aea473a14850db3114740c40658e4e2" + integrity sha512-KumWtDstAKpKRQbHA95AeHpBNtxCXHVbUk+nFAiXcBP281yEalUbyK0W5Q2bDl26L3z6zHodg3OJllHYavJKMg== dependencies: - "@aws-sdk/types" "3.40.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" -"@aws-sdk/is-array-buffer@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/is-array-buffer/-/is-array-buffer-3.37.0.tgz#aa87619f8172b1a2a7ac8d573032025d98ae6c50" - integrity sha512-XLjA/a6AuGnCvcJZLsMTy2jxF2upgGhqCCkoIJgLlzzXHSihur13KcmPvW/zcaGnCRj0SvKWXiJHl4vDlW75VQ== +"@aws-sdk/is-array-buffer@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/is-array-buffer/-/is-array-buffer-3.46.0.tgz#c578762a2095c5bf61f55d155dd819ece4cddeff" + integrity sha512-HcQtJgZDQgo7ivD79GF82pTf+zYGjsgzKG7lkUBEetSfkV0W8h6XfhN6DmuYQuCcu1Pt9IkN7haYNPiPdfDhvg== dependencies: tslib "^2.3.0" -"@aws-sdk/middleware-content-length@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.40.0.tgz#affe235fc0eb43c7b8e21189f85a238fdd0b4c3f" - integrity sha512-sybAJb8v7I/vvL08R3+TI/XDAg9gybQTZ2treC24Ap4+jAOz4QBTHJPMKaUlEeFlMUcq4rj6/u2897ebYH6opw== +"@aws-sdk/middleware-content-length@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.46.0.tgz#871b49af25fa5c989c1b0e2abb6f25e99589c0b0" + integrity sha512-Vf17vKAZ9n2ZlkMoHmCXMHAJegw3djC8qxe2sGdHSGyozfJNpA77ec32ldLvBtQ82LPmSaqdhcbP0/oYCalnzA== dependencies: - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/types" "3.40.0" + "@aws-sdk/protocol-http" "3.46.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" -"@aws-sdk/middleware-host-header@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.40.0.tgz#a6a1d52ab0da7f8e65a199c27d71750f8329eccc" - integrity sha512-/wocR7JFOLM7/+BQM1DgAd6KCFYcdxYu1P7AhI451GlVNuYa5f89zh7p0gt3SRC6monI5lXgpL7RudhDm8fTrA== +"@aws-sdk/middleware-host-header@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.46.0.tgz#0358c215e8de0825aa344dba90d1a51474dfbdbe" + integrity sha512-I+WsUzpyzS9l5Dt64kyp7v+9KeYPOCviYmVw2kM1EZRdAeo+jiCRxU5LnDJ9ORxfRwGcEmQV7xb4UpqXcn2N6Q== dependencies: - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/types" "3.40.0" + "@aws-sdk/protocol-http" "3.46.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" -"@aws-sdk/middleware-logger@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.40.0.tgz#29d9616bd39dafa1493cef333a32363e4df2c607" - integrity sha512-19kx0Xg5ymVRKoupmhdmfTBkROcv3DZj508agpyG2YAo0abOObMlIP4Jltg0VD4PhNjGzNh0jFGJnvhjdwv4/A== +"@aws-sdk/middleware-logger@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.46.0.tgz#a8a1e840c5d5a659a459eaa112627e1e5c4707ae" + integrity sha512-xkB98tfZc1pSeks0a7jagYIVHxJfoxHX7wcASzBa3IjyodZpSqDW392edF9c3kSCv6G6PGRbG+F1F6j7ZTVpRQ== dependencies: - "@aws-sdk/types" "3.40.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" -"@aws-sdk/middleware-retry@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.40.0.tgz#5cffe046b1fd208a62a09495de6659be48ef86f3" - integrity sha512-SMUJrukugLL7YJE5X8B2ToukxMWMPwnf7jAFr84ptycCe8bdWv8x8klQ3EtVWpyqochtNlbTi6J/tTQBniUX7A== +"@aws-sdk/middleware-retry@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.46.0.tgz#dc3cb55ea52fd644199eb021632c63f8b3c010af" + integrity sha512-YkNNs2dUcriLwy4pYG7nfa850tD8dtFUeE/IQ+YBMbWDedT31UFkCfHUdjBK1GFbIv+G1N+ZVGBCkWq1OuhKXw== dependencies: - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/service-error-classification" "3.40.0" - "@aws-sdk/types" "3.40.0" + "@aws-sdk/protocol-http" "3.46.0" + "@aws-sdk/service-error-classification" "3.46.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" uuid "^8.3.2" -"@aws-sdk/middleware-sdk-sts@3.45.0": - version "3.45.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.45.0.tgz#67a39b91913a2a30d56dd95bf8469bb7335d0024" - integrity sha512-nvvzoKItzyZF44+0/VdygbUDgBG8wxYqDK0i+aPYLmmTu2NTBcREeMDiYO/aHZIzMNemyJqSdB3p8sdf2BYTAA== +"@aws-sdk/middleware-sdk-sts@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.46.0.tgz#0e19dafb476f34332ac8ebaeeba80fc6da8477f7" + integrity sha512-JcLwMBqg0ZsHU79e4VixU7e2YI+pktRuI9HXKc4Aoic+h65TXOzB3KjAllweUNjQtc6ZZvqYdd9WJ6PFs1X93A== dependencies: - "@aws-sdk/middleware-signing" "3.45.0" - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/signature-v4" "3.45.0" - "@aws-sdk/types" "3.40.0" + "@aws-sdk/middleware-signing" "3.46.0" + "@aws-sdk/property-provider" "3.46.0" + "@aws-sdk/protocol-http" "3.46.0" + "@aws-sdk/signature-v4" "3.46.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" -"@aws-sdk/middleware-serde@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.40.0.tgz#90124ff60a7f23963bbcd00a5cc95862b29dddd9" - integrity sha512-uOWfZjlAoBy6xPqp0d4ka83WNNbEVCWn9WwfqBUXThyoTdTooYSpXe5y2YzN0BJa8b+tEZTyWpgamnBpFLp47g== +"@aws-sdk/middleware-serde@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.46.0.tgz#ab368854460859491602cbb7dc15cabf7323cfed" + integrity sha512-5M56VUm/stsSabauHxFrv1BSoH0VPyMB1V4vewAD3cp5YGiUpChYxjhcBbzi0QvI65HLxa6nLedwrE+g1uVJ1Q== dependencies: - "@aws-sdk/types" "3.40.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" -"@aws-sdk/middleware-signing@3.45.0": - version "3.45.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.45.0.tgz#614935fc1f1ae79c09a17ea59d0650392f5b5d5b" - integrity sha512-MUtKe0mRWgWimGlbDX9KWHnxcQz8g1N+gEjfkcxzw+HMIxxQIKYFgUyllhFZ3HvYIje/wLlFYuDKXRBrJjUxYQ== +"@aws-sdk/middleware-signing@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.46.0.tgz#91c6e2351b85d9909e97dedc25031390eb750ed3" + integrity sha512-wyv58cufJ2mWtpgfdMYs2ZPnyGadgnaZpWpdoVTpSte8PyUXjRiaR8dLkj84DWUurT6m1h7NEPIHgL6+W1Wwfg== dependencies: - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/signature-v4" "3.45.0" - "@aws-sdk/types" "3.40.0" + "@aws-sdk/property-provider" "3.46.0" + "@aws-sdk/protocol-http" "3.46.0" + "@aws-sdk/signature-v4" "3.46.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" -"@aws-sdk/middleware-stack@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.40.0.tgz#5aa614e49a4fc76cc63986fb45302f7afab6db87" - integrity sha512-hby9HvESUYJxpdALX+6Dn2LPmS5jtMVurGB/+j3MWOvIcDYB4bcSXgVRvXzYnTKwbSupIdbX9zOE2ZAx2SJpUQ== +"@aws-sdk/middleware-stack@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.46.0.tgz#300eeeca80c933534e19ec37721b96b3a023dc4c" + integrity sha512-+3SmpYo12i9Gn7L/HEJqAv5+OieZL9zfXungFKr96rTpcvYDZWQblTP3tugBtvGV6V4tzvebMkUTWxBB6p+dhQ== dependencies: tslib "^2.3.0" -"@aws-sdk/middleware-user-agent@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.40.0.tgz#bf03d2deddc00689c85e7eadd9b4e02f24b61c08" - integrity sha512-dzC2fxWnanetFJ1oYgil8df3N36bR1yc/OCOpbdfQNiUk1FrXiCXqH5rHNO8zCvnwJAj8GHFwpFGd9a2Qube2w== +"@aws-sdk/middleware-user-agent@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.46.0.tgz#767374d15bd5174b6df710971b0969234648c560" + integrity sha512-n9VEWlIXxbJXCr2IpocNJQUW7dhCdAcPKmxV0T5LZ/AygKsLvbWy40u2Qm9/eB1MYpqiheeb5MsY3UXxHgnOlg== dependencies: - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/types" "3.40.0" + "@aws-sdk/protocol-http" "3.46.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" -"@aws-sdk/node-config-provider@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.40.0.tgz#54a8abc4f6d78503093b270e6dff3d6174c59f95" - integrity sha512-AmokjgUDECG8osoMfdRsPNweqI+L1pn4bYGk5iTLmzbBi0o4ot0U1FdX8Rf0qJZZwS4t1TXc3s8/PDVknmPxKg== +"@aws-sdk/node-config-provider@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.46.0.tgz#94016ebb5c290bd59596a1eb653cc67574b6dced" + integrity sha512-Hzz860d1GNZSSX74TywfUu125l8BT6JkJuKG0QDhuC+9xklNfC1hgziihldHu6xL7DzY5UKgjyzdNBQfqCqLbw== dependencies: - "@aws-sdk/property-provider" "3.40.0" - "@aws-sdk/shared-ini-file-loader" "3.37.0" - "@aws-sdk/types" "3.40.0" + "@aws-sdk/property-provider" "3.46.0" + "@aws-sdk/shared-ini-file-loader" "3.46.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" -"@aws-sdk/node-http-handler@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.40.0.tgz#26491f11dabbd673c6318376d06af154adc123df" - integrity sha512-qjda6IbxDhbYr8NHmrMurKkbjgLUkfTMVgagDErDK24Nm3Dn5VaO6J4n6c0Q4OLHlmFaRcUfZSTrOo5DAubqCw== +"@aws-sdk/node-http-handler@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.46.0.tgz#afca10c3497d7354016fe3fe3f9cdfd1d8c4a8f1" + integrity sha512-SqeKskt47u/ZIeN5b6lmjOAx0yLiY/WDQ6N9Z6LRJCYiSZ7oHflA1jPWkX20qWOKioa2iHBVTNNX2lu8yFkWbg== dependencies: - "@aws-sdk/abort-controller" "3.40.0" - "@aws-sdk/protocol-http" "3.40.0" - "@aws-sdk/querystring-builder" "3.40.0" - "@aws-sdk/types" "3.40.0" + "@aws-sdk/abort-controller" "3.46.0" + "@aws-sdk/protocol-http" "3.46.0" + "@aws-sdk/querystring-builder" "3.46.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" -"@aws-sdk/property-provider@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.40.0.tgz#243cb1e87e36b1123ddc66d40d344e7580f80470" - integrity sha512-Mx4lkShjsYRwW9ujHA1pcnuubrWQ4kF5/DXWNfUiXuSIO/0Lojp1qTLheyBm4vzkJIlx5umyP6NvRAUkEHSN4Q== +"@aws-sdk/property-provider@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.46.0.tgz#da1491283708a932948d210cfd4707cc971312e5" + integrity sha512-e3Jcds7G1Hg5VDvwLox0HlQq4G2fvmkO1BRPvM8WfRGvxRNK40dqoelm2NMtbNK0KgFPIpKsGeX1UhZDt9Od9w== dependencies: - "@aws-sdk/types" "3.40.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" -"@aws-sdk/protocol-http@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.40.0.tgz#ce6c7170a59e0a0eb63df5cd7cec87fe05bae680" - integrity sha512-f4ea7/HZkjpvGBrnRIuzc/bhrExWrgDv7eulj4htPukZGHdTqSJD3Jk8lEXWvFuX2vUKQDGhEhCDsqup7YWJQQ== +"@aws-sdk/protocol-http@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.46.0.tgz#ad6d05608e335865e2fdc1b25e5feb561b1c119a" + integrity sha512-hKqHYEp/JDfOl5kZKp0CRgvbsg+c52Ss4KwuRoU9vA56VZ5TpfgHznajdme97xedsE40hnZeitv2BKEMbkYCqg== dependencies: - "@aws-sdk/types" "3.40.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" -"@aws-sdk/querystring-builder@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.40.0.tgz#f57212e60519d2d79ce6173cbe00fbe17a69bc0d" - integrity sha512-gO24oipnNaxJRBXB7lhLfa96vIMOd8gtMBqJTjelTjS2e1ZP1YY12CNKKTWwafSk8Ge021erZAG/YTOaXGpv+g== +"@aws-sdk/querystring-builder@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.46.0.tgz#4f3fcc15a738696521a91cee1668613383a9242e" + integrity sha512-YYGRK291ro+KR3TX0jjyGRdMGHn6D2CBD89oXj8tAV3djeMIpFSGDrEL+NKeJvp7aBNlEnQ9kSfzyQuzQVvJWA== dependencies: - "@aws-sdk/types" "3.40.0" - "@aws-sdk/util-uri-escape" "3.37.0" + "@aws-sdk/types" "3.46.0" + "@aws-sdk/util-uri-escape" "3.46.0" tslib "^2.3.0" -"@aws-sdk/querystring-parser@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.40.0.tgz#5a5ba9c095ad3125a0daf37c33ed1cc8a600d53e" - integrity sha512-XZIyaKQIiZAM6zelCBcsLHhVDOLafi7XIOd3jy6SymGN8ajj3HqUJ/vdQ5G6ISTk18OrqgqcCOI9oNzv+nrBcA== +"@aws-sdk/querystring-parser@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.46.0.tgz#33657e281bf4ecebca823fd07f695840cd95502b" + integrity sha512-xxTnIXLbx4Jq16Utza7wh4HpPfVyCL0c+6NU2t+kXZ2sgOWhx2XAhShcZVbEkA/61UAMEIhyNBVE+z9OFz6X5g== dependencies: - "@aws-sdk/types" "3.40.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" -"@aws-sdk/service-error-classification@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.40.0.tgz#c98cbb781bd50e5d90649742ff954d754201c44d" - integrity sha512-c8btKmkvjXczWudXubGdbO3JgmjySBUVC/gCrZDNfwNGsG8RYJJQYYcnmt1gWjelUZsgMDl/2PIzxTlxVF91rA== +"@aws-sdk/service-error-classification@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.46.0.tgz#3650c0ed104190230ddab1aeda16f2d9e7f1ba0c" + integrity sha512-hFDh/qtvKX9xUPxjGiDvumKsoO/3+eL4hi6X3qWN8lHg49wixjwcwlCEPn9jhdFJ9TRXc20CgPxWv4+V96Yf/A== -"@aws-sdk/shared-ini-file-loader@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.37.0.tgz#ca595d9745150f46805f68be6a6c1607d618ad94" - integrity sha512-+vRBSlfa48R9KL7DpQt3dsu5/+5atjRgoCISblWo3SLpjrx41pKcjKneo7a1u0aP1Xc2oG2TfIyqTWZuOXsmEQ== +"@aws-sdk/shared-ini-file-loader@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.46.0.tgz#11dd34c8a2dfa8a61dd13e9f7c14d3f480743933" + integrity sha512-Rp7Z1X23kvyRCziOxXu2PYCCPT5CQ5t8O4WoKrEkMT9Vqm2gluXOcCnL4iOpRkSRGEZT7lfe5OCM8ApNRTIHpQ== dependencies: tslib "^2.3.0" -"@aws-sdk/signature-v4@3.45.0": - version "3.45.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.45.0.tgz#1852f3ad0447c9788f2454a7cfec2182b30eadac" - integrity sha512-73dwNe4R4Ytgn82gV8B99tE6UqrWjHE1JIAXpEZeXsBPJtg+8wpgd9sujs6JH9JW2cvnSnIsCXs1gQGD9+bZ0A== +"@aws-sdk/signature-v4@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.46.0.tgz#fa3f4a7aeb4078716647387f7b8f2c91afb3fe71" + integrity sha512-qtI1t0CrEhVCxaezmmBpMe1WmQxdxho8oPiMEKWIUkkXQFg78Eg3jnXlLhjL4+MGHMqBB3mV7nGO6k8qu8H9rA== dependencies: - "@aws-sdk/is-array-buffer" "3.37.0" - "@aws-sdk/types" "3.40.0" - "@aws-sdk/util-hex-encoding" "3.37.0" - "@aws-sdk/util-uri-escape" "3.37.0" + "@aws-sdk/is-array-buffer" "3.46.0" + "@aws-sdk/types" "3.46.0" + "@aws-sdk/util-hex-encoding" "3.46.0" + "@aws-sdk/util-uri-escape" "3.46.0" tslib "^2.3.0" -"@aws-sdk/smithy-client@3.41.0": - version "3.41.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.41.0.tgz#61154b4813a01dc079e7083805a20e1bc05d3199" - integrity sha512-ldhS0Pf3v6yHCd//kk5DvKcdyeUkKEwxNDRanAp+ekTW68J3XcYgKaPC9sNDhVTDH1zrywTvtEz5zWHEvXjQow== +"@aws-sdk/smithy-client@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.46.0.tgz#04a8f6fcd0861df7d617f1feeb59ae07cef9a0d0" + integrity sha512-Dzx4CR+rOkr5hXbLhnOfnrPWmSs4O9BTjFWD+4oh+RTXq0It8g+fWZxPcdvRCDU4GjS9Gtbkw0f0pN3FMCEszQ== dependencies: - "@aws-sdk/middleware-stack" "3.40.0" - "@aws-sdk/types" "3.40.0" + "@aws-sdk/middleware-stack" "3.46.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" -"@aws-sdk/types@3.40.0", "@aws-sdk/types@^3.1.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.40.0.tgz#a9d7926fcb9b699bc46be975033559d2293e60d1" - integrity sha512-KpILcfvRaL88TLvo3SY4OuCCg90SvcNLPyjDwUuBqiOyWODjrKShHtAPJzej4CLp92lofh+ul0UnBfV9Jb/5PA== +"@aws-sdk/types@3.46.0", "@aws-sdk/types@^3.1.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.46.0.tgz#4f64871a6e32547403e5b3229b66d318909619b3" + integrity sha512-yhrkVVyv4RUt3KqDDyEayjBM5dRBtuS486THeqtSghUYNV7M/cW18TA3gdMC0pRGgUqfKrOysdBZjCyPrYNvuA== -"@aws-sdk/url-parser@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.40.0.tgz#9ccd00a2026605d5eaef630e94b6632cc9598ec3" - integrity sha512-HwNV+HX7bHgLk5FzTOgdXANsC0SeVz5PMC4Nh+TLz2IoeQnrw4H8dsA4YNonncjern5oC5veKRjQeOoCL5SlSQ== +"@aws-sdk/url-parser@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.46.0.tgz#b90c39f7475b6fdc52ec0bc8b440609bb1bbc2b3" + integrity sha512-foMB0AC3QDy+KfvRxsMXvJQZXr9CMzdupcNIXwKRZog82tEEc09dVeUjuJrO4H+A2eK84SyawRfy+ow+LRqvqw== dependencies: - "@aws-sdk/querystring-parser" "3.40.0" - "@aws-sdk/types" "3.40.0" + "@aws-sdk/querystring-parser" "3.46.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" -"@aws-sdk/util-base64-browser@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64-browser/-/util-base64-browser-3.37.0.tgz#4bf105de91e5e17ded644557dac6851c30e992d2" - integrity sha512-o4s/rHVm5k8eC/T7grJQINyYA/mKfDmEWKMA9wk5iBroXlI2rUm7x649TBk5hzoddufk/mffEeNz/1wM7yTmlg== +"@aws-sdk/util-base64-browser@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64-browser/-/util-base64-browser-3.46.0.tgz#be65210f50b4c25345a0570351e3f40fc59cc5f1" + integrity sha512-oDlExDHYVOXsHFwFCA+CxZlGiHWeO53l0xoohpTIwGV6u48jED/4GrNM6iWVT6Vwd4skqtRMM41IHXjtiCtp/g== dependencies: tslib "^2.3.0" -"@aws-sdk/util-base64-node@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64-node/-/util-base64-node-3.37.0.tgz#81ff164d227db8faeb910af33ff5f861269d6d67" - integrity sha512-1UPxly1GPrGZtlIWvbNCDIAund4Oyp8cFi9neA43TeNACvrmEQu/nG01pDbOoo0ENoVSVJrNAVBeqKEpqjH2GA== +"@aws-sdk/util-base64-node@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64-node/-/util-base64-node-3.46.0.tgz#b9c2aadf777136ea45eafe42dbe00c0bf40f3f5a" + integrity sha512-/ruNBm21Ptk+IGhwTphs8j5oDCjNIrUSipDoRtUuMGQR9TnNzup0e+sJDqP0BrKKM+tcvqEUhz+MScxbwJrwmg== dependencies: - "@aws-sdk/util-buffer-from" "3.37.0" + "@aws-sdk/util-buffer-from" "3.46.0" tslib "^2.3.0" -"@aws-sdk/util-body-length-browser@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.37.0.tgz#2e3a375ac191a9bacd40a6b3479ee402dcb5769d" - integrity sha512-tClmH1uYelqWT43xxmnOsVFbCQJiIwizp6y4E109G2LIof07inxrO0L8nbwBpjhugVplx6NZr9IaqTFqbdM1gA== +"@aws-sdk/util-body-length-browser@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.46.0.tgz#fcb14d7a44d37efdb487c1236ee69159c85cec40" + integrity sha512-OJgMlBv4gEdmHCdZO9htysz9GMw0mS7qB3I5CbZ2aBOM0NvmaU7nqI6zYCoEmGh0keq0CnMBlNZhBBAwtiKYqg== dependencies: tslib "^2.3.0" -"@aws-sdk/util-body-length-node@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-node/-/util-body-length-node-3.37.0.tgz#d6170dafd351799687d583f818a4a3924b61cbec" - integrity sha512-aY3mXdbEajruRi9CHgq/heM89R+Gectj/Xrs1naewmamaN8NJrvjDm3s+cw//lqqSOW903LYHXDgm7wvCzUnFA== +"@aws-sdk/util-body-length-node@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-body-length-node/-/util-body-length-node-3.46.0.tgz#ac390c9f79a306f135b6cddef1e1efbd4226651c" + integrity sha512-jyD+2c7iaD4Aih93Fm4I183SbdhSy4FNmSlK49PctMVVF+QSpzQxAJvv/nTwq37Kb8orVvs+sgy2FF3lxfOUJg== dependencies: tslib "^2.3.0" -"@aws-sdk/util-buffer-from@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-buffer-from/-/util-buffer-from-3.37.0.tgz#298d4a925b9f0ca23f99617648cd9fb3896b573c" - integrity sha512-aa3SBwjLwImuJoE4+hxDIWQ9REz3UFb3p7KFPe9qopdXb/yB12RTcbrXVb4whUux4i4mO6KRij0ZNjFZrjrKPg== +"@aws-sdk/util-buffer-from@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-buffer-from/-/util-buffer-from-3.46.0.tgz#fb931c744b690a5c4bfc5ffa0ea1c98b92bd2e90" + integrity sha512-e3avbwAUULpPCk4ke9ctrhAwxcXvMv8FYymNJDEN7+9lqZ4XqAjPt+R+IEEFMEbWmIPeZ8TpLw3yuru1Z74iuA== dependencies: - "@aws-sdk/is-array-buffer" "3.37.0" + "@aws-sdk/is-array-buffer" "3.46.0" tslib "^2.3.0" -"@aws-sdk/util-config-provider@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-config-provider/-/util-config-provider-3.40.0.tgz#acefff264d6650450a1f8b056a63830a454b756d" - integrity sha512-NjZGrA4mqhpr6gkVCAUweurP0Z9d3vFyXJCtulC0BFbpKAnKCf/crSK56NwUaNhAEMCkSuBvjRFzkbfT+HO8bA== +"@aws-sdk/util-config-provider@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-config-provider/-/util-config-provider-3.46.0.tgz#48c1d7db7200dc412098261c7e4e5612a28cd76d" + integrity sha512-KzzusGkvmb1uy3EItl+9YRxOOtjmU6iaAi9pBzHR2fiv13EMVNZrycVFPeGwz6LrsAEumKmTAZjR6c8BRbxtjw== dependencies: tslib "^2.3.0" -"@aws-sdk/util-credentials@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-credentials/-/util-credentials-3.37.0.tgz#76261c3d7c20bee5d28e5c17741adf19558b3b67" - integrity sha512-zcLhSZDKgBLhUjSU5HoQpuQiP3v8oE86NmV/tiZVPEaO6YVULEAB2Cfj1hpM/b/JXWzjSHfT06KXT7QUODKS+A== +"@aws-sdk/util-credentials@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-credentials/-/util-credentials-3.46.0.tgz#3a58d2e45149c225ddede25ef87d501386a5d3ef" + integrity sha512-d5bDyCDVYi6ThBY8AntAKooExayFuLUnCXsDkmmWpHlp26JZv9s1/DsXR219ELgu8jIAWiID54HjfEYf8qa6Vw== dependencies: - "@aws-sdk/shared-ini-file-loader" "3.37.0" + "@aws-sdk/shared-ini-file-loader" "3.46.0" tslib "^2.3.0" -"@aws-sdk/util-hex-encoding@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.37.0.tgz#40ce21b5ff682e811e98ac7476692ee55ae61493" - integrity sha512-tn5UpfaeM+rZWqynoNqB8lwtcAXil5YYO3HLGH9himpWAdft/2Z7LK6bsYDpctaAI1WHgMDcL0bw3Id04ZUbhA== +"@aws-sdk/util-hex-encoding@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.46.0.tgz#89cf6213762e4d4959f9be1d1eea13dcc5ef925f" + integrity sha512-A831jS32tbdjki4ihS0BIZ3HAi1gv2PtLmAjAW+PHVvBd0S4OpbQApKxKPu0w+NKsp9XQYfkEkeFKCcMqN1zhg== dependencies: tslib "^2.3.0" "@aws-sdk/util-locate-window@^3.0.0": - version "3.34.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.34.0.tgz#612cc17701cd712069fe7eea8b806731dfccd954" - integrity sha512-/xZs6dJ+00H/vNi4+tRoj32XfkhDCYWiASI/wVMzpZG/F15SOipe9MWxUWrH7FAm+BSp5cHcdnLtzFoJmI5cCQ== + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.46.0.tgz#b1ad7eaae6b8f6dea61b3b1e7ddfcb51a0de9d14" + integrity sha512-g6V/7mozjlP2HhwHHgGgoOvcNRJasIQjh7ClkCMrMilfthD4WNtkWfcAZQD+BaPKkSgj8MnIOFvFzqULGeNQXA== dependencies: tslib "^2.3.0" -"@aws-sdk/util-uri-escape@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-uri-escape/-/util-uri-escape-3.37.0.tgz#42b8393a51dcc04f228e70d1c94c2fe38a738994" - integrity sha512-8pKf4YJTELP5lm/CEgYw2atyJBB1RWWqFa0sZx6YJmTlOtLF5G6raUdAi4iDa2hldGt2B6IAdIIyuusT8zeU8Q== +"@aws-sdk/util-uri-escape@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-uri-escape/-/util-uri-escape-3.46.0.tgz#20d3e1910548d7f9fd23078ae115d530e03e6ecd" + integrity sha512-drAHEt3YnI6H6NpiTFLFT8e75bOhaO94ZP+kqz/0hluQiKX47Pow3Ar3Diaf/CUMLctH0IX3AaN3T2ve5v19lQ== dependencies: tslib "^2.3.0" -"@aws-sdk/util-user-agent-browser@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.40.0.tgz#d9f4f49af35895df260598a333a8b792b56e9f76" - integrity sha512-C69sTI26bV2EprTv3DTXu9XP7kD9Wu4YVPBzqztOYArd2GDYw3w+jS8SEg3XRbjAKY/mOPZ2Thw4StjpZlWZiA== +"@aws-sdk/util-user-agent-browser@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.46.0.tgz#f79ce481add7ba6a520c28e5c190703629f71787" + integrity sha512-wwUh4H6+ur9akctoSgaz41J8JuRrOqey4aY68DmDQ0did3UjhRlbPD3xu0umXoPSgmtqQyl34oMPqCOfA70Z0Q== dependencies: - "@aws-sdk/types" "3.40.0" + "@aws-sdk/types" "3.46.0" bowser "^2.11.0" tslib "^2.3.0" -"@aws-sdk/util-user-agent-node@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.40.0.tgz#76240a4ee05e409ad1267854761c53e746e9bcdf" - integrity sha512-cjIzd0hRZFTTh7iLJD6Bciu++Em1iaM1clyG02xRl0JD5DEtDSR1zO02uu+AeM7GSLGOxIvwOkK2j8ySPAOmBA== +"@aws-sdk/util-user-agent-node@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.46.0.tgz#15abb0796ff6d67117185b438bdda1e917c97e79" + integrity sha512-JCY8mKWPic0aXtz7amKXWyjbX8fhdOkRcgsCCnevOHc/7KOxwa97VnDT555GNQ76LO+cEDgYueHklUayV3u+IA== dependencies: - "@aws-sdk/node-config-provider" "3.40.0" - "@aws-sdk/types" "3.40.0" + "@aws-sdk/node-config-provider" "3.46.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" -"@aws-sdk/util-utf8-browser@3.37.0", "@aws-sdk/util-utf8-browser@^3.0.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.37.0.tgz#d896899f4c475ceeaf8b77c5d7cdc453e5fe6b83" - integrity sha512-tuiOxzfqet1kKGYzlgpMGfhr64AHJnYsFx2jZiH/O6Yq8XQg43ryjQlbJlim/K/XHGNzY0R+nabeJg34q3Ua1g== +"@aws-sdk/util-utf8-browser@3.46.0", "@aws-sdk/util-utf8-browser@^3.0.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.46.0.tgz#03fb14499d5a01203322709cc2822dbf6e915921" + integrity sha512-zafI5Y7hRVC0vhJ77FPUyBckmpF2v2ZEKFC79AdwdFX11l7XNmq0hY/4CWVYeZ2L0Fyk0UV6eeKyk/TNdce0mg== dependencies: tslib "^2.3.0" -"@aws-sdk/util-utf8-node@3.37.0": - version "3.37.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-node/-/util-utf8-node-3.37.0.tgz#300912cce55d72c18213190237d6ab943e17b5bf" - integrity sha512-fUAgd7UTCULL36j9/vnXHxVhxvswnq23mYgTCIT8NQ7wHN30q2a89ym1e9DwGeQkJEBOkOcKLn6nsMsN7YQMDQ== +"@aws-sdk/util-utf8-node@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-node/-/util-utf8-node-3.46.0.tgz#6337d5b62cea1e9ede714c26df2c1d4126fd65b7" + integrity sha512-Uk9hQrWQowU4ymtSxrxiIp7GnBoZfkKGSeWDy2h/1Biaexq9FQclbgwa0ZhA5lKLDj/nUxnXoT/ZcY90mTdzzQ== dependencies: - "@aws-sdk/util-buffer-from" "3.37.0" + "@aws-sdk/util-buffer-from" "3.46.0" tslib "^2.3.0" -"@aws-sdk/util-waiter@3.40.0": - version "3.40.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.40.0.tgz#91c537efc9d0129fb24d9bdab86acbfd797ddf1f" - integrity sha512-jdxwNEZdID49ZvyAnxaeNm5w2moIfMLOwj/q6TxKlxYoXMs16FQWkhyfGue0vEASzchS49ewbyt+KBqpT31Ebg== +"@aws-sdk/util-waiter@3.46.0": + version "3.46.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.46.0.tgz#83e73b6568ff01af2a6259ecc4d6b4955b68fa20" + integrity sha512-rn1bf9whuHfarNTFSRnFIupRlfN+L28hRZL8PClgyxa0WqpzG0goN6M+opuYnbKrTazyqktxpUTg/fHHoQiveA== dependencies: - "@aws-sdk/abort-controller" "3.40.0" - "@aws-sdk/types" "3.40.0" + "@aws-sdk/abort-controller" "3.46.0" + "@aws-sdk/types" "3.46.0" tslib "^2.3.0" "@babel/code-frame@7.12.11": @@ -603,177 +612,196 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" - integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== - dependencies: - "@babel/highlight" "^7.14.5" - -"@babel/compat-data@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" - integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== - -"@babel/core@^7.1.0", "@babel/core@^7.7.2", "@babel/core@^7.7.5": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.0.tgz#749e57c68778b73ad8082775561f67f5196aafa8" - integrity sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.0" - "@babel/helper-compilation-targets" "^7.15.0" - "@babel/helper-module-transforms" "^7.15.0" - "@babel/helpers" "^7.14.8" - "@babel/parser" "^7.15.0" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" +"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.16.4": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.8.tgz#31560f9f29fdf1868de8cb55049538a1b9732a60" + integrity sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q== + +"@babel/core@7.13.10": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.10.tgz#07de050bbd8193fcd8a3c27918c0890613a94559" + integrity sha512-bfIYcT0BdKeAZrovpMqX2Mx5NrgAckGbwT982AkdS5GNfn3KMGiprlBAtmBcFZRUmpaufS6WZFP8trvx8ptFDw== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.13.9" + "@babel/helper-compilation-targets" "^7.13.10" + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helpers" "^7.13.10" + "@babel/parser" "^7.13.10" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.1.2" + lodash "^4.17.19" semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.15.0", "@babel/generator@^7.7.2": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.0.tgz#a7d0c172e0d814974bad5aa77ace543b97917f15" - integrity sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ== - dependencies: - "@babel/types" "^7.15.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-compilation-targets@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz#973df8cbd025515f3ff25db0c05efc704fa79818" - integrity sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A== - dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.16.6" +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.7.tgz#db990f931f6d40cb9b87a0dc7d2adc749f1dcbcf" + integrity sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA== + dependencies: + "@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/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" semver "^6.3.0" + source-map "^0.5.0" -"@babel/helper-function-name@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" - integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== - dependencies: - "@babel/helper-get-function-arity" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-get-function-arity@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" - integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-hoist-variables@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d" - integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-member-expression-to-functions@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz#0ddaf5299c8179f27f37327936553e9bba60990b" - integrity sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg== - dependencies: - "@babel/types" "^7.15.0" - -"@babel/helper-module-imports@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" - integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-module-transforms@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz#679275581ea056373eddbe360e1419ef23783b08" - integrity sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg== - dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-replace-supers" "^7.15.0" - "@babel/helper-simple-access" "^7.14.8" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.9" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" - -"@babel/helper-optimise-call-expression@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" - integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== - -"@babel/helper-replace-supers@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz#ace07708f5bf746bf2e6ba99572cce79b5d4e7f4" - integrity sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.15.0" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" - -"@babel/helper-simple-access@^7.14.8": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz#82e1fec0644a7e775c74d305f212c39f8fe73924" - integrity sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg== +"@babel/generator@7.13.9": + version "7.13.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39" + integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw== dependencies: - "@babel/types" "^7.14.8" + "@babel/types" "^7.13.0" + jsesc "^2.5.1" + source-map "^0.5.0" -"@babel/helper-split-export-declaration@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a" - integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA== +"@babel/generator@^7.13.0", "@babel/generator@^7.13.9", "@babel/generator@^7.16.7", "@babel/generator@^7.16.8", "@babel/generator@^7.7.2": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" + integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9": - version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" - integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== - -"@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + "@babel/types" "^7.16.8" + jsesc "^2.5.1" + source-map "^0.5.0" -"@babel/helpers@^7.14.8": - version "7.14.8" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.8.tgz#839f88f463025886cff7f85a35297007e2da1b77" - integrity sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw== +"@babel/helper-compilation-targets@^7.13.10", "@babel/helper-compilation-targets@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" + integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== dependencies: - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.8" - "@babel/types" "^7.14.8" + "@babel/compat-data" "^7.16.4" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.17.5" + semver "^6.3.0" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" +"@babel/helper-environment-visitor@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" + integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-function-name@^7.12.13", "@babel/helper-function-name@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" + integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== + dependencies: + "@babel/helper-get-function-arity" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/helper-get-function-arity@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" + integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" + integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.16.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" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" + integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== + +"@babel/helper-simple-access@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" + integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-split-export-declaration@^7.12.13", "@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-validator-identifier@^7.12.11", "@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helpers@^7.13.10", "@babel/helpers@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc" + integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.7.tgz#81a01d7d675046f0d96f82450d9d9578bdfd6b0b" + integrity sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.5", "@babel/parser@^7.15.0", "@babel/parser@^7.7.2": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.0.tgz#b6d6e29058ca369127b0eeca2a1c4b5794f1b6b9" - integrity sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ== +"@babel/parser@7.14.6": + version "7.14.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.6.tgz#d85cc68ca3cac84eae384c06f032921f5227f4b2" + integrity sha512-oG0ej7efjEXxb4UgE+klVx+3j4MVo+A2vCzm7OUN4CLo6WhQ+vSOD2yJ8m7B+DghObxtLxt3EfgMWpq+AsWehQ== + +"@babel/parser@^7.1.0", "@babel/parser@^7.13.0", "@babel/parser@^7.13.10", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.16.8": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.8.tgz#61c243a3875f7d0b0962b0543a33ece6ff2f1f17" + integrity sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -860,42 +888,67 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" - integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz#39c9b55ee153151990fb038651d58d3fd03f98f8" + integrity sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A== dependencies: - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-plugin-utils" "^7.16.7" -"@babel/template@^7.14.5", "@babel/template@^7.3.3": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" - integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.14.8", "@babel/traverse@^7.15.0", "@babel/traverse@^7.7.2": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.0.tgz#4cca838fd1b2a03283c1f38e141f639d60b3fc98" - integrity sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.0" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/parser" "^7.15.0" - "@babel/types" "^7.15.0" +"@babel/template@^7.12.13", "@babel/template@^7.16.7", "@babel/template@^7.3.3": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.0.tgz#6d95752475f86ee7ded06536de309a65fc8966cc" + integrity sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.13.0" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.13.0" + "@babel/types" "^7.13.0" debug "^4.1.0" globals "^11.1.0" + lodash "^4.17.19" + +"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.7.2": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.8.tgz#bab2f2b09a5fe8a8d9cad22cbfe3ba1d126fef9c" + integrity sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.16.8" + "@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.16.8" + "@babel/types" "^7.16.8" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.0.tgz#74424d2816f0171b4100f0ab34e9a374efdf7f80" + integrity sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + lodash "^4.17.19" + to-fast-properties "^2.0.0" -"@babel/types@^7.0.0", "@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.15.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd" - integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ== +"@babel/types@^7.0.0", "@babel/types@^7.13.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.16.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" + integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== dependencies: - "@babel/helper-validator-identifier" "^7.14.9" + "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -940,9 +993,9 @@ minimatch "^3.0.4" "@humanwhocodes/object-schema@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" - integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -960,27 +1013,27 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^27.4.2": - version "27.4.2" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.4.2.tgz#7a95612d38c007ddb528ee446fe5e5e785e685ce" - integrity sha512-xknHThRsPB/To1FUbi6pCe43y58qFC03zfb6R7fDb/FfC7k2R3i1l+izRBJf8DI46KhYGRaF14Eo9A3qbBoixg== +"@jest/console@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.4.6.tgz#0742e6787f682b22bdad56f9db2a8a77f6a86107" + integrity sha512-jauXyacQD33n47A44KrlOVeiXHEXDqapSdfb9kTekOchH/Pd18kBIO1+xxJQRLuG+LUuljFCwTG92ra4NW7SpA== dependencies: "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^27.4.2" + jest-message-util "^27.4.6" jest-util "^27.4.2" slash "^3.0.0" -"@jest/core@^27.4.5": - version "27.4.5" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.4.5.tgz#cae2dc34259782f4866c6606c3b480cce920ed4c" - integrity sha512-3tm/Pevmi8bDsgvo73nX8p/WPng6KWlCyScW10FPEoN1HU4pwI83tJ3TsFvi1FfzsjwUlMNEPowgb/rPau/LTQ== +"@jest/core@^27.4.5", "@jest/core@^27.4.7": + version "27.4.7" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.4.7.tgz#84eabdf42a25f1fa138272ed229bcf0a1b5e6913" + integrity sha512-n181PurSJkVMS+kClIFSX/LLvw9ExSb+4IMtD6YnfxZVerw9ANYtW0bPrm0MJu2pfe9SY9FJ9FtQ+MdZkrZwjg== dependencies: - "@jest/console" "^27.4.2" - "@jest/reporters" "^27.4.5" - "@jest/test-result" "^27.4.2" - "@jest/transform" "^27.4.5" + "@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" "@types/node" "*" ansi-escapes "^4.2.1" @@ -989,63 +1042,63 @@ exit "^0.1.2" graceful-fs "^4.2.4" jest-changed-files "^27.4.2" - jest-config "^27.4.5" - jest-haste-map "^27.4.5" - jest-message-util "^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.5" - jest-resolve-dependencies "^27.4.5" - jest-runner "^27.4.5" - jest-runtime "^27.4.5" - jest-snapshot "^27.4.5" + 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.2" - jest-watcher "^27.4.2" + jest-validate "^27.4.6" + jest-watcher "^27.4.6" micromatch "^4.0.4" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^27.4.4": - version "27.4.4" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.4.4.tgz#66ebebc79673d84aad29d2bb70a8c51e6c29bb4d" - integrity sha512-q+niMx7cJgt/t/b6dzLOh4W8Ef/8VyKG7hxASK39jakijJzbFBGpptx3RXz13FFV7OishQ9lTbv+dQ5K3EhfDQ== +"@jest/environment@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.4.6.tgz#1e92885d64f48c8454df35ed9779fbcf31c56d8b" + integrity sha512-E6t+RXPfATEEGVidr84WngLNWZ8ffCPky8RqqRK6u1Bn0LK92INe0MDttyPl/JOzaq92BmDzOeuqk09TvM22Sg== dependencies: - "@jest/fake-timers" "^27.4.2" + "@jest/fake-timers" "^27.4.6" "@jest/types" "^27.4.2" "@types/node" "*" - jest-mock "^27.4.2" + jest-mock "^27.4.6" -"@jest/fake-timers@^27.4.2": - version "27.4.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.4.2.tgz#d217f86c3ba2027bf29e0b731fd0cb761a72d093" - integrity sha512-f/Xpzn5YQk5adtqBgvw1V6bF8Nx3hY0OIRRpCvWcfPl0EAjdqWPdhH3t/3XpiWZqtjIEHDyMKP9ajpva1l4Zmg== +"@jest/fake-timers@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.4.6.tgz#e026ae1671316dbd04a56945be2fa251204324e8" + integrity sha512-mfaethuYF8scV8ntPpiVGIHQgS0XIALbpY2jt2l7wb/bvq4Q5pDLk4EP4D7SAvYT1QrPOPVZAtbdGAOOyIgs7A== dependencies: "@jest/types" "^27.4.2" "@sinonjs/fake-timers" "^8.0.1" "@types/node" "*" - jest-message-util "^27.4.2" - jest-mock "^27.4.2" + jest-message-util "^27.4.6" + jest-mock "^27.4.6" jest-util "^27.4.2" -"@jest/globals@^27.4.4": - version "27.4.4" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.4.4.tgz#fe501a80c23ea2dab585c42be2a519bb5e38530d" - integrity sha512-bqpqQhW30BOreXM8bA8t8JbOQzsq/WnPTnBl+It3UxAD9J8yxEAaBEylHx1dtBapAr/UBk8GidXbzmqnee8tYQ== +"@jest/globals@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.4.6.tgz#3f09bed64b0fd7f5f996920258bd4be8f52f060a" + integrity sha512-kAiwMGZ7UxrgPzu8Yv9uvWmXXxsy0GciNejlHvfPIfWkSxChzv6bgTS3YqBkGuHcis+ouMFI2696n2t+XYIeFw== dependencies: - "@jest/environment" "^27.4.4" + "@jest/environment" "^27.4.6" "@jest/types" "^27.4.2" - expect "^27.4.2" + expect "^27.4.6" -"@jest/reporters@^27.4.5": - version "27.4.5" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.4.5.tgz#e229acca48d18ea39e805540c1c322b075ae63ad" - integrity sha512-3orsG4vi8zXuBqEoy2LbnC1kuvkg1KQUgqNxmxpQgIOQEPeV0onvZu+qDQnEoX8qTQErtqn/xzcnbpeTuOLSiA== +"@jest/reporters@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.4.6.tgz#b53dec3a93baf9b00826abf95b932de919d6d8dd" + integrity sha512-+Zo9gV81R14+PSq4wzee4GC2mhAN9i9a7qgJWL90Gpx7fHYkWpTBvwWNZUXvJByYR9tAVBdc8VxDWqfJyIUrIQ== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.4.2" - "@jest/test-result" "^27.4.2" - "@jest/transform" "^27.4.5" + "@jest/console" "^27.4.6" + "@jest/test-result" "^27.4.6" + "@jest/transform" "^27.4.6" "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" @@ -1054,14 +1107,14 @@ glob "^7.1.2" graceful-fs "^4.2.4" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.3" + istanbul-lib-instrument "^5.1.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^27.4.5" - jest-resolve "^27.4.5" + 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.5" + jest-worker "^27.4.6" slash "^3.0.0" source-map "^0.6.0" string-length "^4.0.1" @@ -1077,43 +1130,43 @@ graceful-fs "^4.2.4" source-map "^0.6.0" -"@jest/test-result@^27.4.2": - version "27.4.2" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.4.2.tgz#05fd4a5466ec502f3eae0b39dff2b93ea4d5d9ec" - integrity sha512-kr+bCrra9jfTgxHXHa2UwoQjxvQk3Am6QbpAiJ5x/50LW8llOYrxILkqY0lZRW/hu8FXesnudbql263+EW9iNA== +"@jest/test-result@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.4.6.tgz#b3df94c3d899c040f602cea296979844f61bdf69" + integrity sha512-fi9IGj3fkOrlMmhQqa/t9xum8jaJOOAi/lZlm6JXSc55rJMXKHxNDN1oCP39B0/DhNOa2OMupF9BcKZnNtXMOQ== dependencies: - "@jest/console" "^27.4.2" + "@jest/console" "^27.4.6" "@jest/types" "^27.4.2" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^27.4.5": - version "27.4.5" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.4.5.tgz#1d7e026844d343b60d2ca7fd82c579a17b445d7d" - integrity sha512-n5woIn/1v+FT+9hniymHPARA9upYUmfi5Pw9ewVwXCDlK4F5/Gkees9v8vdjGdAIJ2MPHLHodiajLpZZanWzEQ== +"@jest/test-sequencer@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.4.6.tgz#447339b8a3d7b5436f50934df30854e442a9d904" + integrity sha512-3GL+nsf6E1PsyNsJuvPyIz+DwFuCtBdtvPpm/LMXVkBJbdFvQYCDpccYT56qq5BGniXWlE81n2qk1sdXfZebnw== dependencies: - "@jest/test-result" "^27.4.2" + "@jest/test-result" "^27.4.6" graceful-fs "^4.2.4" - jest-haste-map "^27.4.5" - jest-runtime "^27.4.5" + jest-haste-map "^27.4.6" + jest-runtime "^27.4.6" -"@jest/transform@^27.4.5": - version "27.4.5" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.4.5.tgz#3dfe2e3680cd4aa27356172bf25617ab5b94f195" - integrity sha512-PuMet2UlZtlGzwc6L+aZmR3I7CEBpqadO03pU40l2RNY2fFJ191b9/ITB44LNOhVtsyykx0OZvj0PCyuLm7Eew== +"@jest/transform@^27.4.6": + version "27.4.6" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.4.6.tgz#153621940b1ed500305eacdb31105d415dc30231" + integrity sha512-9MsufmJC8t5JTpWEQJ0OcOOAXaH5ioaIX6uHVBLBMoCZPfKKQF+EqP8kACAvCZ0Y1h2Zr3uOccg8re+Dr5jxyw== dependencies: "@babel/core" "^7.1.0" "@jest/types" "^27.4.2" - babel-plugin-istanbul "^6.0.0" + 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.5" + jest-haste-map "^27.4.6" jest-regex-util "^27.4.0" jest-util "^27.4.2" micromatch "^4.0.4" - pirates "^4.0.1" + pirates "^4.0.4" slash "^3.0.0" source-map "^0.6.1" write-file-atomic "^3.0.0" @@ -1240,14 +1293,14 @@ universal-user-agent "^6.0.0" "@octokit/oauth-authorization-url@^4.3.1": - version "4.3.2" - resolved "https://registry.yarnpkg.com/@octokit/oauth-authorization-url/-/oauth-authorization-url-4.3.2.tgz#b8272a152c137e06789233eec0b623de3584d192" - integrity sha512-CkKc5+clTSd8nNAtwQWzBewASIpgxO8tEtU75AbVsjDuwDIDj9F0uJ5fjGvsa2rwkc8kP4CxTk5dvEe38SfbLA== + version "4.3.3" + resolved "https://registry.yarnpkg.com/@octokit/oauth-authorization-url/-/oauth-authorization-url-4.3.3.tgz#6a6ef38f243086fec882b62744f39b517528dfb9" + integrity sha512-lhP/t0i8EwTmayHG4dqLXgU+uPVys4WD/qUNvC+HfB1S1dyqULm5Yx9uKc1x79aP66U1Cb4OZeW8QU/RA9A4XA== "@octokit/oauth-methods@^1.1.0": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@octokit/oauth-methods/-/oauth-methods-1.2.4.tgz#5f2706b29f09d309233aee61c99b66aedec0511a" - integrity sha512-85hen2Dkpnmy2PGfVFe7Ke9rUo//nlqUcHE4GiQBHJ7D95rAm19GcRO49LlH6NOXOMdEFj7i/Ay5GVDRrAk38w== + version "1.2.6" + resolved "https://registry.yarnpkg.com/@octokit/oauth-methods/-/oauth-methods-1.2.6.tgz#b9ac65e374b2cc55ee9dd8dcdd16558550438ea7" + integrity sha512-nImHQoOtKnSNn05uk2o76om1tJWiAo4lOu2xMAHYsNr0fwopP+Dv+2MlGvaMMlFjoqVd3fF3X5ZDTKCsqgmUaQ== dependencies: "@octokit/oauth-authorization-url" "^4.3.1" "@octokit/request" "^5.4.14" @@ -1290,9 +1343,9 @@ once "^1.4.0" "@octokit/request@^5.3.0", "@octokit/request@^5.4.14", "@octokit/request@^5.6.0": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.1.tgz#f97aff075c37ab1d427c49082fefeef0dba2d8ce" - integrity sha512-Ls2cfs1OfXaOKzkcxnqw5MR6drMA/zWX/LIS/p8Yjdz7QKTPQLMsB3R+OvoxE6XnXeXEE2X7xe4G4l4X0gRiKQ== + version "5.6.2" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.2.tgz#1aa74d5da7b9e04ac60ef232edd9a7438dcf32d8" + integrity sha512-je66CvSEVf0jCpRISxkUcCa0UkxmFs6eGDRSbfJtAVwbLH5ceqF+YEyC8lj8ystKyZTy8adWr0qmkY52EfOeLA== dependencies: "@octokit/endpoint" "^6.0.1" "@octokit/request-error" "^2.1.0" @@ -1326,9 +1379,9 @@ type-detect "4.0.8" "@sinonjs/fake-timers@^8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.0.1.tgz#1c1c9a91419f804e59ae8df316a07dd1c3a76b94" - integrity sha512-AU7kwFxreVd6OAXcAFlKSmZquiRUU0FvYm44k1Y1QbK7Co4m0aqfGMhjykIeQp/H6rcl+nFmj0zfdUcGVs9Dew== + version "8.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== dependencies: "@sinonjs/commons" "^1.7.0" @@ -1337,6 +1390,19 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@trivago/prettier-plugin-sort-imports@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-3.1.1.tgz#101e34eadb252572ec32aea6d5487d93b90a0037" + integrity sha512-T9EJNEOugWts4WxdmpWeY+sp+2fUHhvGh9QSBCowEGJfcbnu355HQRqok5bKwejdieMaI1+uGZhuTNMZwjqOCQ== + dependencies: + "@babel/core" "7.13.10" + "@babel/generator" "7.13.9" + "@babel/parser" "7.14.6" + "@babel/traverse" "7.13.0" + "@babel/types" "7.13.0" + javascript-natural-sort "0.7.1" + lodash "4.17.21" + "@tsconfig/node10@^1.0.7": version "1.0.8" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" @@ -1363,9 +1429,9 @@ integrity sha512-jwtSuEZj4rY4R2pAEOXi+RutS8RWbwMzoGlRVukdyOpnfqA/XPkAf8QoGWmg4o/UaNpQ8Mj0Xhkp5SZ1t/Zq4Q== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.1.15" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.15.tgz#2ccfb1ad55a02c83f8e0ad327cbc332f55eb1024" - integrity sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew== + version "7.1.18" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8" + integrity sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1374,9 +1440,9 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" - integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== dependencies: "@babel/types" "^7.0.0" @@ -1396,9 +1462,9 @@ "@babel/types" "^7.3.0" "@types/body-parser@*": - version "1.19.1" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.1.tgz#0c0174c42a7d017b818303d4b5d969cb0b75929c" - integrity sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg== + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== dependencies: "@types/connect" "*" "@types/node" "*" @@ -1416,9 +1482,9 @@ "@types/node" "*" "@types/express-serve-static-core@^4.17.18": - version "4.17.24" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07" - integrity sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA== + version "4.17.28" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" + integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== dependencies: "@types/node" "*" "@types/qs" "*" @@ -1442,9 +1508,9 @@ "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" - integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": version "3.0.0" @@ -1474,9 +1540,9 @@ integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== "@types/jsonwebtoken@^8.3.3": - version "8.5.4" - resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.4.tgz#50ccaf0aa6f5d7b9956e70fe323b76e582991913" - integrity sha512-4L8msWK31oXwdtC81RmRBAULd0ShnAHjBuKT9MRQpjP0piNrZdXyTRcKY9/UIfhGeKIT4PvF5amOOUbbT/9Wpg== + version "8.5.6" + resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-8.5.6.tgz#1913e5a61e70a192c5a444623da4901a7b1a9d42" + integrity sha512-+P3O/xC7nzVizIi5VbF34YtqSonFsdnbXBnWUCYRiKOi1f9gA4sEFvXkrGr/QVV23IbMYvcoerI7nnhDUiWXRQ== dependencies: "@types/node" "*" @@ -1491,14 +1557,14 @@ integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== "@types/node@*", "@types/node@^17.0.7": - version "17.0.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.7.tgz#4a53d8332bb65a45470a2f9e2611f1ced637a5cb" - integrity sha512-1QUk+WAUD4t8iR+Oj+UgI8oJa6yyxaB8a8pHaC8uqM6RrS1qbL7bf3Pwl5rHv0psm2CuDErgho6v5N+G+5fwtQ== + version "17.0.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.8.tgz#50d680c8a8a78fe30abe6906453b21ad8ab0ad7b" + integrity sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg== "@types/prettier@^2.1.5": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.3.2.tgz#fc8c2825e4ed2142473b4a81064e6e081463d1b3" - integrity sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog== + version "2.4.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.3.tgz#a3c65525b91fca7da00ab1a3ac2b5a2a4afbffbf" + integrity sha512-QzSuZMBuG5u8HqYz01qtMdg/Jfctlnvj1z/lYnIDXs/golxw0fxtRAHd9KrzjR7Yxz1qVeI00o0kiO3PmVdJ9w== "@types/qs@*": version "6.9.7" @@ -1654,9 +1720,9 @@ acorn@^7.1.1, acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.2.4, acorn@^8.4.1: - version "8.5.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" - integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== + version "8.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" + integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== agent-base@6: version "6.0.2" @@ -1676,9 +1742,9 @@ ajv@^6.10.0, ajv@^6.12.4: uri-js "^4.2.2" ajv@^8.0.1: - version "8.6.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571" - integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== + version "8.8.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb" + integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -1697,7 +1763,7 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.21.3" -ansi-regex@^5.0.0, ansi-regex@^5.0.1: +ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== @@ -1757,9 +1823,9 @@ asynckit@^0.4.0: integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= aws-sdk@^2.1048.0: - version "2.1048.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1048.0.tgz#02f2f35e0f51dd4510462e05c7a48fd4649d33f8" - integrity sha512-mVwWo+Udiuc/yEZ/DgJQGqOEtfiQjgUdtshx/t6ISe3+jW3TF9hUACwADwx2Sr/fuJyyJ3QD5JYLt5Cw35wQpA== + version "2.1055.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1055.0.tgz#07beb86650d5a313f7c899807c51b12b5e2f4117" + integrity sha512-99drH3mvXakw9we8Rs2cDQmi2pS7PVAC9pvTlB7lHPUwLYftMlko5cFMceZxvTHeyLkdvg98iNIHI3hbnzitoQ== dependencies: buffer "4.9.2" events "1.1.1" @@ -1771,29 +1837,29 @@ aws-sdk@^2.1048.0: uuid "3.3.2" xml2js "0.4.19" -babel-jest@^27.4.5: - version "27.4.5" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.4.5.tgz#d38bd0be8ea71d8b97853a5fc9f76deeb095c709" - integrity sha512-3uuUTjXbgtODmSv/DXO9nZfD52IyC2OYTFaXGRzL0kpykzroaquCrD5+lZNafTvZlnNqZHt5pb0M08qVBZnsnA== +babel-jest@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.4.6.tgz#4d024e69e241cdf4f396e453a07100f44f7ce314" + integrity sha512-qZL0JT0HS1L+lOuH+xC2DVASR3nunZi/ozGhpgauJHgmI7f8rudxf6hUjEHympdQ/J64CdKmPkgfJ+A3U6QCrg== dependencies: - "@jest/transform" "^27.4.5" + "@jest/transform" "^27.4.6" "@jest/types" "^27.4.2" "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.0.0" + babel-plugin-istanbul "^6.1.1" babel-preset-jest "^27.4.0" chalk "^4.0.0" graceful-fs "^4.2.4" slash "^3.0.0" -babel-plugin-istanbul@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765" - integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ== +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@istanbuljs/load-nyc-config" "^1.0.0" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^4.0.0" + istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" babel-plugin-jest-hoist@^27.4.0: @@ -1877,16 +1943,16 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.16.6: - version "4.16.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.7.tgz#108b0d1ef33c4af1b587c54f390e7041178e4335" - integrity sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA== +browserslist@^4.17.5: + version "4.19.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" + integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== dependencies: - caniuse-lite "^1.0.30001248" - colorette "^1.2.2" - electron-to-chromium "^1.3.793" + caniuse-lite "^1.0.30001286" + electron-to-chromium "^1.4.17" escalade "^3.1.1" - node-releases "^1.1.73" + node-releases "^2.0.1" + picocolors "^1.0.0" bs-logger@0.x: version "0.2.6" @@ -1937,14 +2003,14 @@ camelcase@^5.3.1: integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001248: - version "1.0.30001249" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001249.tgz#90a330057f8ff75bfe97a94d047d5e14fabb2ee8" - integrity sha512-vcX4U8lwVXPdqzPWi6cAJ3FnQaqXbBqy/GZseKNQzRj37J7qZdGcBtxq/QLFNLLlfsoXLUdHw8Iwenri86Tagw== +caniuse-lite@^1.0.30001286: + version "1.0.30001299" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001299.tgz#d753bf6444ed401eb503cbbe17aa3e1451b5a68c" + integrity sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw== chalk@^2.0.0: version "2.4.2" @@ -1984,9 +2050,9 @@ chokidar@^3.5.1: fsevents "~2.3.2" ci-info@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" - integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== + version "3.3.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" + integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== cjs-module-lexer@^1.0.0: version "1.2.2" @@ -2036,11 +2102,6 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colorette@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== - combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -2108,9 +2169,9 @@ data-urls@^2.0.0: whatwg-url "^8.0.0" debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== dependencies: ms "2.1.2" @@ -2125,9 +2186,9 @@ dedent@^0.7.0: integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.2.2: version "4.2.2" @@ -2194,10 +2255,10 @@ ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer "^5.0.1" -electron-to-chromium@^1.3.793: - version "1.3.796" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.796.tgz#bd74a4367902c9d432d129f265bf4542cddd9f54" - integrity sha512-agwJFgM0FUC1UPPbQ4aII3HamaaJ09fqWGAWYHmzxDWqdmTleCHyyA0kt3fJlTd5M440IaeuBfzXzXzCotnZcQ== +electron-to-chromium@^1.4.17: + version "1.4.43" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.43.tgz#665c0cd8d5e7cce0ba78d90a514c8c813ca3bdbe" + integrity sha512-PO3kEfcxPrti/4STbXvCkNIF4fgWvCKl2508e6UI7KomCDffpIfeBZLXsh5DK/XGsjUw3kwq6WEsi0MJTlGAdg== emittery@^0.8.1: version "0.8.1" @@ -2372,9 +2433,9 @@ estraverse@^4.1.1: integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" @@ -2406,17 +2467,15 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -expect@^27.4.2: - version "27.4.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-27.4.2.tgz#4429b0f7e307771d176de9bdf23229b101db6ef6" - integrity sha512-BjAXIDC6ZOW+WBFNg96J22D27Nq5ohn+oGcuP2rtOtcjuxNoV9McpQ60PcQWhdFOSBIQdR72e+4HdnbZTFSTyg== +expect@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.4.6.tgz#f335e128b0335b6ceb4fcab67ece7cbd14c942e6" + integrity sha512-1M/0kAALIaj5LaG66sFJTbRsWTADnylly82cu4bspI0nl+pgP4E6Bh/aqdHlTUjul06K7xQnnrAoqfxVU0+/ag== dependencies: "@jest/types" "^27.4.2" - ansi-styles "^5.0.0" jest-get-type "^27.4.0" - jest-matcher-utils "^27.4.2" - jest-message-util "^27.4.2" - jest-regex-util "^27.4.0" + jest-matcher-utils "^27.4.6" + jest-message-util "^27.4.6" fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" @@ -2428,10 +2487,10 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^3.1.1: - version "3.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== +fast-glob@^3.2.9: + version "3.2.10" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.10.tgz#2734f83baa7f43b7fd41e13bc34438f4ffe284ee" + integrity sha512-s9nFhFnvR63wls6/kM88kQqDhMu0AfdjqouE2l5GVQPbqLgyFjjU5ry/r2yKsJxpb9Py1EYNqieFrmMaX4v++A== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -2499,9 +2558,9 @@ flat-cache@^3.0.4: rimraf "^3.0.2" flatted@^3.1.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" - integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== + version "3.2.4" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" + integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw== form-data@^3.0.0: version "3.0.1" @@ -2560,9 +2619,9 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: is-glob "^4.0.1" glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -2577,28 +2636,28 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: - version "13.10.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.10.0.tgz#60ba56c3ac2ca845cfbf4faeca727ad9dd204676" - integrity sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g== + version "13.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e" + integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg== dependencies: type-fest "^0.20.2" globby@^11.0.3: - version "11.0.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" - integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" slash "^3.0.0" graceful-fs@^4.2.4: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== has-flag@^3.0.0: version "3.0.0" @@ -2673,10 +2732,10 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.4, ignore@^5.1.8: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +ignore@^5.1.8, ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" @@ -2687,9 +2746,9 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: resolve-from "^4.0.0" import-local@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" - integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -2719,10 +2778,10 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-core-module@^2.2.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.5.0.tgz#f754843617c70bfd29b7bd87327400cda5c18491" - integrity sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg== +is-core-module@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== dependencies: has "^1.0.3" @@ -2741,14 +2800,7 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^4.0.0, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-glob@^4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -2790,19 +2842,20 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -istanbul-lib-coverage@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" + integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== dependencies: - "@babel/core" "^7.7.5" + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" + istanbul-lib-coverage "^3.2.0" semver "^6.3.0" istanbul-lib-report@^3.0.0: @@ -2815,22 +2868,27 @@ istanbul-lib-report@^3.0.0: supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" - integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw== +istanbul-reports@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.3.tgz#4bcae3103b94518117930d51283690960b50d3c2" + integrity sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +javascript-natural-sort@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz#f9e2303d4507f6d74355a73664d1440fb5a0ef59" + integrity sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k= + jest-changed-files@^27.4.2: version "27.4.2" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.4.2.tgz#da2547ea47c6e6a5f6ed336151bd2075736eb4a5" @@ -2840,86 +2898,86 @@ jest-changed-files@^27.4.2: execa "^5.0.0" throat "^6.0.1" -jest-circus@^27.4.5: - version "27.4.5" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.4.5.tgz#70bfb78e0200cab9b84747bf274debacaa538467" - integrity sha512-eTNWa9wsvBwPykhMMShheafbwyakcdHZaEYh5iRrQ0PFJxkDP/e3U/FvzGuKWu2WpwUA3C3hPlfpuzvOdTVqnw== +jest-circus@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.4.6.tgz#d3af34c0eb742a967b1919fbb351430727bcea6c" + integrity sha512-UA7AI5HZrW4wRM72Ro80uRR2Fg+7nR0GESbSI/2M+ambbzVuA63mn5T1p3Z/wlhntzGpIG1xx78GP2YIkf6PhQ== dependencies: - "@jest/environment" "^27.4.4" - "@jest/test-result" "^27.4.2" + "@jest/environment" "^27.4.6" + "@jest/test-result" "^27.4.6" "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" - expect "^27.4.2" + expect "^27.4.6" is-generator-fn "^2.0.0" - jest-each "^27.4.2" - jest-matcher-utils "^27.4.2" - jest-message-util "^27.4.2" - jest-runtime "^27.4.5" - jest-snapshot "^27.4.5" + 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.2" + pretty-format "^27.4.6" slash "^3.0.0" stack-utils "^2.0.3" throat "^6.0.1" jest-cli@^27.4.5: - version "27.4.5" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.4.5.tgz#8708f54c28d13681f3255ec9026a2b15b03d41e8" - integrity sha512-hrky3DSgE0u7sQxaCL7bdebEPHx5QzYmrGuUjaPLmPE8jx5adtvGuOlRspvMoVLTTDOHRnZDoRLYJuA+VCI7Hg== + version "27.4.7" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.4.7.tgz#d00e759e55d77b3bcfea0715f527c394ca314e5a" + integrity sha512-zREYhvjjqe1KsGV15mdnxjThKNDgza1fhDT+iUsXWLCq3sxe9w5xnvyctcYVT5PcdLSjv7Y5dCwTS3FCF1tiuw== dependencies: - "@jest/core" "^27.4.5" - "@jest/test-result" "^27.4.2" + "@jest/core" "^27.4.7" + "@jest/test-result" "^27.4.6" "@jest/types" "^27.4.2" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.4" import-local "^3.0.2" - jest-config "^27.4.5" + jest-config "^27.4.7" jest-util "^27.4.2" - jest-validate "^27.4.2" + jest-validate "^27.4.6" prompts "^2.0.1" yargs "^16.2.0" -jest-config@^27.4.5: - version "27.4.5" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.4.5.tgz#77ed7f2ba7bcfd7d740ade711d0d13512e08a59e" - integrity sha512-t+STVJtPt+fpqQ8GBw850NtSQbnDOw/UzdPfzDaHQ48/AylQlW7LHj3dH+ndxhC1UxJ0Q3qkq7IH+nM1skwTwA== +jest-config@^27.4.7: + version "27.4.7" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.4.7.tgz#4f084b2acbd172c8b43aa4cdffe75d89378d3972" + integrity sha512-xz/o/KJJEedHMrIY9v2ParIoYSrSVY6IVeE4z5Z3i101GoA5XgfbJz+1C8EYPsv7u7f39dS8F9v46BHDhn0vlw== dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^27.4.5" + "@babel/core" "^7.8.0" + "@jest/test-sequencer" "^27.4.6" "@jest/types" "^27.4.2" - babel-jest "^27.4.5" + babel-jest "^27.4.6" 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.5" - jest-environment-jsdom "^27.4.4" - jest-environment-node "^27.4.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.5" + jest-jasmine2 "^27.4.6" jest-regex-util "^27.4.0" - jest-resolve "^27.4.5" - jest-runner "^27.4.5" + jest-resolve "^27.4.6" + jest-runner "^27.4.6" jest-util "^27.4.2" - jest-validate "^27.4.2" + jest-validate "^27.4.6" micromatch "^4.0.4" - pretty-format "^27.4.2" + pretty-format "^27.4.6" slash "^3.0.0" -jest-diff@^27.0.0, jest-diff@^27.4.2: - version "27.4.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.4.2.tgz#786b2a5211d854f848e2dcc1e324448e9481f36f" - integrity sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q== +jest-diff@^27.0.0, jest-diff@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.4.6.tgz#93815774d2012a2cbb6cf23f84d48c7a2618f98d" + integrity sha512-zjaB0sh0Lb13VyPsd92V7HkqF6yKRH9vm33rwBt7rPYrpQvS1nCvlIy2pICbKta+ZjWngYLNn4cCK4nyZkjS/w== dependencies: chalk "^4.0.0" diff-sequences "^27.4.0" jest-get-type "^27.4.0" - pretty-format "^27.4.2" + pretty-format "^27.4.6" jest-docblock@^27.4.0: version "27.4.0" @@ -2928,40 +2986,40 @@ jest-docblock@^27.4.0: dependencies: detect-newline "^3.0.0" -jest-each@^27.4.2: - version "27.4.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.4.2.tgz#19364c82a692d0d26557642098d1f4619c9ee7d3" - integrity sha512-53V2MNyW28CTruB3lXaHNk6PkiIFuzdOC9gR3C6j8YE/ACfrPnz+slB0s17AgU1TtxNzLuHyvNlLJ+8QYw9nBg== +jest-each@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.4.6.tgz#e7e8561be61d8cc6dbf04296688747ab186c40ff" + integrity sha512-n6QDq8y2Hsmn22tRkgAk+z6MCX7MeVlAzxmZDshfS2jLcaBlyhpF3tZSJLR+kXmh23GEvS0ojMR8i6ZeRvpQcA== dependencies: "@jest/types" "^27.4.2" chalk "^4.0.0" jest-get-type "^27.4.0" jest-util "^27.4.2" - pretty-format "^27.4.2" + pretty-format "^27.4.6" -jest-environment-jsdom@^27.4.4: - version "27.4.4" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.4.4.tgz#94f738e99514d7a880e8ed8e03e3a321d43b49db" - integrity sha512-cYR3ndNfHBqQgFvS1RL7dNqSvD//K56j/q1s2ygNHcfTCAp12zfIromO1w3COmXrxS8hWAh7+CmZmGCIoqGcGA== +jest-environment-jsdom@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.4.6.tgz#c23a394eb445b33621dfae9c09e4c8021dea7b36" + integrity sha512-o3dx5p/kHPbUlRvSNjypEcEtgs6LmvESMzgRFQE6c+Prwl2JLA4RZ7qAnxc5VM8kutsGRTB15jXeeSbJsKN9iA== dependencies: - "@jest/environment" "^27.4.4" - "@jest/fake-timers" "^27.4.2" + "@jest/environment" "^27.4.6" + "@jest/fake-timers" "^27.4.6" "@jest/types" "^27.4.2" "@types/node" "*" - jest-mock "^27.4.2" + jest-mock "^27.4.6" jest-util "^27.4.2" jsdom "^16.6.0" -jest-environment-node@^27.4.4: - version "27.4.4" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.4.4.tgz#42fe5e3b224cb69b99811ebf6f5eaa5a59618514" - integrity sha512-D+v3lbJ2GjQTQR23TK0kY3vFVmSeea05giInI41HHOaJnAwOnmUHTZgUaZL+VxUB43pIzoa7PMwWtCVlIUoVoA== +jest-environment-node@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.4.6.tgz#ee8cd4ef458a0ef09d087c8cd52ca5856df90242" + integrity sha512-yfHlZ9m+kzTKZV0hVfhVu6GuDxKAYeFHrfulmy7Jxwsq4V7+ZK7f+c0XP/tbVDMQW7E4neG2u147hFkuVz0MlQ== dependencies: - "@jest/environment" "^27.4.4" - "@jest/fake-timers" "^27.4.2" + "@jest/environment" "^27.4.6" + "@jest/fake-timers" "^27.4.6" "@jest/types" "^27.4.2" "@types/node" "*" - jest-mock "^27.4.2" + jest-mock "^27.4.6" jest-util "^27.4.2" jest-get-type@^27.4.0: @@ -2969,10 +3027,10 @@ jest-get-type@^27.4.0: resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.4.0.tgz#7503d2663fffa431638337b3998d39c5e928e9b5" integrity sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ== -jest-haste-map@^27.4.5: - version "27.4.5" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.4.5.tgz#c2921224a59223f91e03ec15703905978ef0cc1a" - integrity sha512-oJm1b5qhhPs78K24EDGifWS0dELYxnoBiDhatT/FThgB9yxqUm5F6li3Pv+Q+apMBmmPNzOBnZ7ZxWMB1Leq1Q== +jest-haste-map@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.4.6.tgz#c60b5233a34ca0520f325b7e2cc0a0140ad0862a" + integrity sha512-0tNpgxg7BKurZeFkIOvGCkbmOHbLFf4LUQOxrQSMjvrQaQe3l6E8x6jYC1NuWkGo5WDdbr8FEzUxV2+LWNawKQ== dependencies: "@jest/types" "^27.4.2" "@types/graceful-fs" "^4.1.2" @@ -2983,58 +3041,57 @@ jest-haste-map@^27.4.5: jest-regex-util "^27.4.0" jest-serializer "^27.4.0" jest-util "^27.4.2" - jest-worker "^27.4.5" + jest-worker "^27.4.6" micromatch "^4.0.4" walker "^1.0.7" optionalDependencies: fsevents "^2.3.2" -jest-jasmine2@^27.4.5: - version "27.4.5" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.4.5.tgz#ff79d11561679ff6c89715b0cd6b1e8c0dfbc6dc" - integrity sha512-oUnvwhJDj2LhOiUB1kdnJjkx8C5PwgUZQb9urF77mELH9DGR4e2GqpWQKBOYXWs5+uTN9BGDqRz3Aeg5Wts7aw== +jest-jasmine2@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.4.6.tgz#109e8bc036cb455950ae28a018f983f2abe50127" + integrity sha512-uAGNXF644I/whzhsf7/qf74gqy9OuhvJ0XYp8SDecX2ooGeaPnmJMjXjKt0mqh1Rl5dtRGxJgNrHlBQIBfS5Nw== dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^27.4.4" + "@jest/environment" "^27.4.6" "@jest/source-map" "^27.4.0" - "@jest/test-result" "^27.4.2" + "@jest/test-result" "^27.4.6" "@jest/types" "^27.4.2" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" - expect "^27.4.2" + expect "^27.4.6" is-generator-fn "^2.0.0" - jest-each "^27.4.2" - jest-matcher-utils "^27.4.2" - jest-message-util "^27.4.2" - jest-runtime "^27.4.5" - jest-snapshot "^27.4.5" + 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.2" + pretty-format "^27.4.6" throat "^6.0.1" -jest-leak-detector@^27.4.2: - version "27.4.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.4.2.tgz#7fc3120893a7a911c553f3f2bdff9faa4454abbb" - integrity sha512-ml0KvFYZllzPBJWDei3mDzUhyp/M4ubKebX++fPaudpe8OsxUE+m+P6ciVLboQsrzOCWDjE20/eXew9QMx/VGw== +jest-leak-detector@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.4.6.tgz#ed9bc3ce514b4c582637088d9faf58a33bd59bf4" + integrity sha512-kkaGixDf9R7CjHm2pOzfTxZTQQQ2gHTIWKY/JZSiYTc90bZp8kSZnUMS3uLAfwTZwc0tcMRoEX74e14LG1WapA== dependencies: jest-get-type "^27.4.0" - pretty-format "^27.4.2" + pretty-format "^27.4.6" -jest-matcher-utils@^27.4.2: - version "27.4.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.4.2.tgz#d17c5038607978a255e0a9a5c32c24e984b6c60b" - integrity sha512-jyP28er3RRtMv+fmYC/PKG8wvAmfGcSNproVTW2Y0P/OY7/hWUOmsPfxN1jOhM+0u2xU984u2yEagGivz9OBGQ== +jest-matcher-utils@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.4.6.tgz#53ca7f7b58170638590e946f5363b988775509b8" + integrity sha512-XD4PKT3Wn1LQnRAq7ZsTI0VRuEc9OrCPFiO1XL7bftTGmfNF0DcEwMHRgqiu7NGf8ZoZDREpGrCniDkjt79WbA== dependencies: chalk "^4.0.0" - jest-diff "^27.4.2" + jest-diff "^27.4.6" jest-get-type "^27.4.0" - pretty-format "^27.4.2" + pretty-format "^27.4.6" -jest-message-util@^27.4.2: - version "27.4.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.4.2.tgz#07f3f1bf207d69cf798ce830cc57f1a849f99388" - integrity sha512-OMRqRNd9E0DkBLZpFtZkAGYOXl6ZpoMtQJWTAREJKDOFa0M6ptB7L67tp+cszMBkvSgKOhNtQp2Vbcz3ZZKo/w== +jest-message-util@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.4.6.tgz#9fdde41a33820ded3127465e1a5896061524da31" + integrity sha512-0p5szriFU0U74czRSFjH6RyS7UYIAkn/ntwMuOwTGWrQIOh5NzXXrq72LOqIkJKKvFbPq+byZKuBz78fjBERBA== dependencies: "@babel/code-frame" "^7.12.13" "@jest/types" "^27.4.2" @@ -3042,7 +3099,7 @@ jest-message-util@^27.4.2: chalk "^4.0.0" graceful-fs "^4.2.4" micromatch "^4.0.4" - pretty-format "^27.4.2" + pretty-format "^27.4.6" slash "^3.0.0" stack-utils "^2.0.3" @@ -3053,10 +3110,10 @@ jest-mock-extended@^2.0.1: dependencies: ts-essentials "^7.0.3" -jest-mock@^27.4.2: - version "27.4.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.4.2.tgz#184ff197a25491bfe4570c286daa5d62eb760b88" - integrity sha512-PDDPuyhoukk20JrQKeofK12hqtSka7mWH0QQuxSNgrdiPsrnYYLS6wbzu/HDlxZRzji5ylLRULeuI/vmZZDrYA== +jest-mock@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.4.6.tgz#77d1ba87fbd33ccb8ef1f061697e7341b7635195" + integrity sha512-kvojdYRkst8iVSZ1EJ+vc1RRD9llueBjKzXzeCytH3dMM7zvPV/ULcfI2nr0v0VUgm3Bjt3hBCQvOeaBz+ZTHw== dependencies: "@jest/types" "^27.4.2" "@types/node" "*" @@ -3071,40 +3128,40 @@ jest-regex-util@^27.4.0: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.4.0.tgz#e4c45b52653128843d07ad94aec34393ea14fbca" integrity sha512-WeCpMpNnqJYMQoOjm1nTtsgbR4XHAk1u00qDoNBQoykM280+/TmgA5Qh5giC1ecy6a5d4hbSsHzpBtu5yvlbEg== -jest-resolve-dependencies@^27.4.5: - version "27.4.5" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.5.tgz#9398af854bdb12d6a9e5a8a536ee401f889a3ecf" - integrity sha512-elEVvkvRK51y037NshtEkEnukMBWvlPzZHiL847OrIljJ8yIsujD2GXRPqDXC4rEVKbcdsy7W0FxoZb4WmEs7w== +jest-resolve-dependencies@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.4.6.tgz#fc50ee56a67d2c2183063f6a500cc4042b5e2327" + integrity sha512-W85uJZcFXEVZ7+MZqIPCscdjuctruNGXUZ3OHSXOfXR9ITgbUKeHj+uGcies+0SsvI5GtUfTw4dY7u9qjTvQOw== dependencies: "@jest/types" "^27.4.2" jest-regex-util "^27.4.0" - jest-snapshot "^27.4.5" + jest-snapshot "^27.4.6" -jest-resolve@^27.4.5: - version "27.4.5" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.4.5.tgz#8dc44f5065fb8d58944c20f932cb7b9fe9760cca" - integrity sha512-xU3z1BuOz/hUhVUL+918KqUgK+skqOuUsAi7A+iwoUldK6/+PW+utK8l8cxIWT9AW7IAhGNXjSAh1UYmjULZZw== +jest-resolve@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.4.6.tgz#2ec3110655e86d5bfcfa992e404e22f96b0b5977" + integrity sha512-SFfITVApqtirbITKFAO7jOVN45UgFzcRdQanOFzjnbd+CACDoyeX7206JyU92l4cRr73+Qy/TlW51+4vHGt+zw== dependencies: "@jest/types" "^27.4.2" chalk "^4.0.0" graceful-fs "^4.2.4" - jest-haste-map "^27.4.5" + jest-haste-map "^27.4.6" jest-pnp-resolver "^1.2.2" jest-util "^27.4.2" - jest-validate "^27.4.2" + jest-validate "^27.4.6" resolve "^1.20.0" resolve.exports "^1.1.0" slash "^3.0.0" -jest-runner@^27.4.5: - version "27.4.5" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.4.5.tgz#daba2ba71c8f34137dc7ac45616add35370a681e" - integrity sha512-/irauncTfmY1WkTaRQGRWcyQLzK1g98GYG/8QvIPviHgO1Fqz1JYeEIsSfF+9mc/UTA6S+IIHFgKyvUrtiBIZg== +jest-runner@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.4.6.tgz#1d390d276ec417e9b4d0d081783584cbc3e24773" + integrity sha512-IDeFt2SG4DzqalYBZRgbbPmpwV3X0DcntjezPBERvnhwKGWTW7C5pbbA5lVkmvgteeNfdd/23gwqv3aiilpYPg== dependencies: - "@jest/console" "^27.4.2" - "@jest/environment" "^27.4.4" - "@jest/test-result" "^27.4.2" - "@jest/transform" "^27.4.5" + "@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" "@types/node" "*" chalk "^4.0.0" @@ -3112,49 +3169,45 @@ jest-runner@^27.4.5: exit "^0.1.2" graceful-fs "^4.2.4" jest-docblock "^27.4.0" - jest-environment-jsdom "^27.4.4" - jest-environment-node "^27.4.4" - jest-haste-map "^27.4.5" - jest-leak-detector "^27.4.2" - jest-message-util "^27.4.2" - jest-resolve "^27.4.5" - jest-runtime "^27.4.5" + 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.5" + jest-worker "^27.4.6" source-map-support "^0.5.6" throat "^6.0.1" -jest-runtime@^27.4.5: - version "27.4.5" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.4.5.tgz#97703ad2a1799d4f50ab59049bd21a9ceaed2813" - integrity sha512-CIYqwuJQXHQtPd/idgrx4zgJ6iCb6uBjQq1RSAGQrw2S8XifDmoM1Ot8NRd80ooAm+ZNdHVwsktIMGlA1F1FAQ== +jest-runtime@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.4.6.tgz#83ae923818e3ea04463b22f3597f017bb5a1cffa" + integrity sha512-eXYeoR/MbIpVDrjqy5d6cGCFOYBFFDeKaNWqTp0h6E74dK0zLHzASQXJpl5a2/40euBmKnprNLJ0Kh0LCndnWQ== dependencies: - "@jest/console" "^27.4.2" - "@jest/environment" "^27.4.4" - "@jest/globals" "^27.4.4" + "@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.2" - "@jest/transform" "^27.4.5" + "@jest/test-result" "^27.4.6" + "@jest/transform" "^27.4.6" "@jest/types" "^27.4.2" - "@types/yargs" "^16.0.0" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" execa "^5.0.0" - exit "^0.1.2" glob "^7.1.3" graceful-fs "^4.2.4" - jest-haste-map "^27.4.5" - jest-message-util "^27.4.2" - jest-mock "^27.4.2" + 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.5" - jest-snapshot "^27.4.5" + jest-resolve "^27.4.6" + jest-snapshot "^27.4.6" jest-util "^27.4.2" - jest-validate "^27.4.2" slash "^3.0.0" strip-bom "^4.0.0" - yargs "^16.2.0" jest-serializer@^27.4.0: version "27.4.0" @@ -3164,34 +3217,32 @@ jest-serializer@^27.4.0: "@types/node" "*" graceful-fs "^4.2.4" -jest-snapshot@^27.4.5: - version "27.4.5" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.4.5.tgz#2ea909b20aac0fe62504bc161331f730b8a7ecc7" - integrity sha512-eCi/iM1YJFrJWiT9de4+RpWWWBqsHiYxFG9V9o/n0WXs6GpW4lUt4FAHAgFPTLPqCUVzrMQmSmTZSgQzwqR7IQ== +jest-snapshot@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.4.6.tgz#e2a3b4fff8bdce3033f2373b2e525d8b6871f616" + integrity sha512-fafUCDLQfzuNP9IRcEqaFAMzEe7u5BF7mude51wyWv7VRex60WznZIC7DfKTgSIlJa8aFzYmXclmN328aqSDmQ== dependencies: "@babel/core" "^7.7.2" "@babel/generator" "^7.7.2" - "@babel/parser" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.0.0" - "@jest/transform" "^27.4.5" + "@jest/transform" "^27.4.6" "@jest/types" "^27.4.2" "@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.2" + expect "^27.4.6" graceful-fs "^4.2.4" - jest-diff "^27.4.2" + jest-diff "^27.4.6" jest-get-type "^27.4.0" - jest-haste-map "^27.4.5" - jest-matcher-utils "^27.4.2" - jest-message-util "^27.4.2" - jest-resolve "^27.4.5" + jest-haste-map "^27.4.6" + jest-matcher-utils "^27.4.6" + jest-message-util "^27.4.6" jest-util "^27.4.2" natural-compare "^1.4.0" - pretty-format "^27.4.2" + pretty-format "^27.4.6" semver "^7.3.2" jest-util@^27.0.0, jest-util@^27.4.2: @@ -3206,24 +3257,24 @@ jest-util@^27.0.0, jest-util@^27.4.2: graceful-fs "^4.2.4" picomatch "^2.2.3" -jest-validate@^27.4.2: - version "27.4.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.4.2.tgz#eecfcc1b1c9429aa007da08a2bae4e32a81bbbc3" - integrity sha512-hWYsSUej+Fs8ZhOm5vhWzwSLmVaPAxRy+Mr+z5MzeaHm9AxUpXdoVMEW4R86y5gOobVfBsMFLk4Rb+QkiEpx1A== +jest-validate@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.4.6.tgz#efc000acc4697b6cf4fa68c7f3f324c92d0c4f1f" + integrity sha512-872mEmCPVlBqbA5dToC57vA3yJaMRfIdpCoD3cyHWJOMx+SJwLNw0I71EkWs41oza/Er9Zno9XuTkRYCPDUJXQ== dependencies: "@jest/types" "^27.4.2" camelcase "^6.2.0" chalk "^4.0.0" jest-get-type "^27.4.0" leven "^3.1.0" - pretty-format "^27.4.2" + pretty-format "^27.4.6" -jest-watcher@^27.4.2: - version "27.4.2" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.4.2.tgz#c9037edfd80354c9fe90de4b6f8b6e2b8e736744" - integrity sha512-NJvMVyyBeXfDezhWzUOCOYZrUmkSCiatpjpm+nFUid74OZEHk6aMLrZAukIiFDwdbqp6mTM6Ui1w4oc+8EobQg== +jest-watcher@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.4.6.tgz#673679ebeffdd3f94338c24f399b85efc932272d" + integrity sha512-yKQ20OMBiCDigbD0quhQKLkBO+ObGN79MO4nT7YaCuQ5SM+dkBNWE8cZX0FjU6czwMvWw6StWbe+Wv4jJPJ+fw== dependencies: - "@jest/test-result" "^27.4.2" + "@jest/test-result" "^27.4.6" "@jest/types" "^27.4.2" "@types/node" "*" ansi-escapes "^4.2.1" @@ -3231,10 +3282,10 @@ jest-watcher@^27.4.2: jest-util "^27.4.2" string-length "^4.0.1" -jest-worker@^27.4.5: - version "27.4.5" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.5.tgz#d696e3e46ae0f24cff3fa7195ffba22889262242" - integrity sha512-f2s8kEdy15cv9r7q4KkzGXvlY0JTcmCbMHZBfSQDwW77REr45IDWwd0lksDFeVHH2jJ5pqb90T77XscrjeGzzg== +jest-worker@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.6.tgz#5d2d93db419566cb680752ca0792780e71b3273e" + integrity sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw== dependencies: "@types/node" "*" merge-stream "^2.0.0" @@ -3398,11 +3449,6 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" @@ -3458,7 +3504,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= -lodash@^4.7.0: +lodash@4.17.21, lodash@^4.17.19, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3487,19 +3533,19 @@ make-error@1.x, make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: - tmpl "1.0.x" + tmpl "1.0.5" merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -merge2@^1.3.0: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -3512,17 +3558,17 @@ micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" -mime-db@1.49.0: - version "1.49.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" - integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== +mime-db@1.51.0: + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== mime-types@^2.1.12: - version "2.1.32" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" - integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: - mime-db "1.49.0" + mime-db "1.51.0" mimic-fn@^2.1.0: version "2.1.0" @@ -3574,9 +3620,9 @@ natural-compare@^1.4.0: integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= nock@^13.2.1: - version "13.2.1" - resolved "https://registry.yarnpkg.com/nock/-/nock-13.2.1.tgz#fcf5bdb9bb9f0554a84c25d3333166c0ffd80858" - integrity sha512-CoHAabbqq/xZEknubuyQMjq6Lfi5b7RtK6SoNK6m40lebGp3yiMagWtIoYaw2s9sISD7wPuCfwFpivVHX/35RA== + version "13.2.2" + resolved "https://registry.yarnpkg.com/nock/-/nock-13.2.2.tgz#29a6942250278209c2b3e7a38310f703581b21fa" + integrity sha512-PcBHuvl9i6zfaJ50A7LS55oU+nFLv8htXIhffJO+FxyfibdZ4jEvd9kTuvkrJireBFIGMZ+oUIRpMK5gU9h//g== dependencies: debug "^4.1.0" json-stringify-safe "^5.0.1" @@ -3584,9 +3630,9 @@ nock@^13.2.1: propagate "^2.0.0" node-fetch@^2.6.1: - version "2.6.5" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.5.tgz#42735537d7f080a7e5f78b6c549b7146be1742fd" - integrity sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ== + version "2.6.6" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89" + integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA== dependencies: whatwg-url "^5.0.0" @@ -3595,15 +3641,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= -node-modules-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" - integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= - -node-releases@^1.1.73: - version "1.1.73" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20" - integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg== +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -3706,7 +3747,7 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: +path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -3716,17 +3757,20 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pirates@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" - integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA== - dependencies: - node-modules-regexp "^1.0.0" +pirates@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.4.tgz#07df81e61028e402735cdd49db701e4885b4e6e6" + integrity sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw== pkg-dir@^4.2.0: version "4.2.0" @@ -3757,12 +3801,11 @@ prettier@2.5.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== -pretty-format@^27.0.0, pretty-format@^27.4.2: - version "27.4.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.4.2.tgz#e4ce92ad66c3888423d332b40477c87d1dac1fb8" - integrity sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw== +pretty-format@^27.0.0, pretty-format@^27.4.6: + version "27.4.6" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.4.6.tgz#1b784d2f53c68db31797b2348fa39b49e31846b7" + integrity sha512-NblstegA1y/RJW2VyML+3LlpFjzx62cUrtBIKIWDXEDkjNeleA7Od7nrzcs/VLQvAeV4CgSYhrN39DRN88Qi/g== dependencies: - "@jest/types" "^27.4.2" ansi-regex "^5.0.1" ansi-styles "^5.0.0" react-is "^17.0.1" @@ -3773,9 +3816,9 @@ progress@^2.0.0: integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== prompts@^2.0.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" - integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" sisteransi "^1.0.5" @@ -3860,12 +3903,13 @@ resolve.exports@^1.1.0: integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== resolve@^1.0.0, resolve@^1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + version "1.21.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.21.0.tgz#b51adc97f3472e6a5cf4444d34bc9d6b9037591f" + integrity sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA== dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" + is-core-module "^2.8.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" reusify@^1.0.4: version "1.0.4" @@ -3955,9 +3999,9 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + version "3.0.6" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== sisteransi@^1.0.5: version "1.0.5" @@ -4007,9 +4051,9 @@ sprintf-js@~1.0.2: integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= stack-utils@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" - integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== + version "2.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== dependencies: escape-string-regexp "^2.0.0" @@ -4021,21 +4065,21 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^5.0.0" + ansi-regex "^5.0.1" strip-bom@^3.0.0: version "3.0.0" @@ -4091,22 +4135,26 @@ supports-hyperlinks@^2.0.0: has-flag "^4.0.0" supports-color "^7.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== table@^6.0.9: - version "6.7.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" - integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== + version "6.8.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== dependencies: ajv "^8.0.1" - lodash.clonedeep "^4.5.0" lodash.truncate "^4.4.2" slice-ansi "^4.0.0" - string-width "^4.2.0" - strip-ansi "^6.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" terminal-link@^2.0.0: version "2.1.1" @@ -4135,7 +4183,7 @@ throat@^6.0.1: resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== -tmpl@1.0.x: +tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== @@ -4367,9 +4415,9 @@ v8-compile-cache@^2.0.3: integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== v8-to-istanbul@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz#0aeb763894f1a0a1676adf8a8b7612a38902446c" - integrity sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA== + version "8.1.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" + integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" @@ -4390,11 +4438,11 @@ w3c-xmlserializer@^2.0.0: xml-name-validator "^3.0.0" walker@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: - makeerror "1.0.x" + makeerror "1.0.12" webidl-conversions@^3.0.0: version "3.0.1" @@ -4477,9 +4525,9 @@ write-file-atomic@^3.0.0: typedarray-to-buffer "^3.1.5" ws@^7.4.6: - version "7.5.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74" - integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg== + version "7.5.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" + integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== xml-name-validator@^3.0.0: version "3.0.0" From 5c8d8e0046ea22d98450efb092f79958151b601c Mon Sep 17 00:00:00 2001 From: Niek Palm Date: Wed, 12 Jan 2022 12:59:46 +0100 Subject: [PATCH 10/10] update to mock new version gh-auth --- modules/runners/lambdas/runners/src/pool/pool.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/runners/lambdas/runners/src/pool/pool.test.ts b/modules/runners/lambdas/runners/src/pool/pool.test.ts index 35237400a2..b4c705417e 100644 --- a/modules/runners/lambdas/runners/src/pool/pool.test.ts +++ b/modules/runners/lambdas/runners/src/pool/pool.test.ts @@ -145,6 +145,7 @@ beforeEach(() => { expiresAt: 'some-date', permissions: {}, repositorySelection: 'all', + installationId: 0, }); mockCreateClient.mockResolvedValue(new mocktokit());