diff --git a/.github/workflows/prod-web-deploy.yml b/.github/workflows/prod-web-deploy.yml index f9df64b..ab53507 100644 --- a/.github/workflows/prod-web-deploy.yml +++ b/.github/workflows/prod-web-deploy.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 cache: yarn cache-dependency-path: website/yarn.lock diff --git a/.github/workflows/preview-web-deploy.yml b/.github/workflows/test-web-deploy.yml similarity index 91% rename from .github/workflows/preview-web-deploy.yml rename to .github/workflows/test-web-deploy.yml index 7fedf60..1e2ef91 100644 --- a/.github/workflows/preview-web-deploy.yml +++ b/.github/workflows/test-web-deploy.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 cache: yarn cache-dependency-path: website/yarn.lock diff --git a/.gitignore b/.gitignore index ae1db4f..5028b94 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,9 @@ testcreds/ *.log venv/ .venv/ +nohup.out + +/.ruff_cache # Byte-compiled / optimized / DLL files __pycache__/ @@ -87,3 +90,4 @@ docs/_build/ venv/ .DS_Store +myenv/ diff --git a/CHANGELOG.md b/CHANGELOG.md index be70b7a..5febd97 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,14 @@ # Changelog +## 1.8.5 (2025-06-30) + +- Added support for resource scoped variables +- Added developer credits in `info` + ## 1.8.3 (2025-02-08) - Added walkthrough for databricks bootstrap on aws. -- Bugfix for expport variables on dry run. +- Bugfix for export variables on dry run. ## 1.8.2 (2025-01-16) diff --git a/MANIFEST.in b/MANIFEST.in index 29faca7..b4d760a 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,4 @@ # MANIFEST.in include README.rst recursive-include stackql_deploy/templates *.template +include stackql_deploy/inc/contributors.csv diff --git a/README.md b/README.md index c295d43..15065dd 100644 --- a/README.md +++ b/README.md @@ -265,14 +265,16 @@ To distribute **stackql-deploy** on PyPI, you'll need to ensure that you have al First, ensure you have the latest versions of `setuptools` and `wheel` installed: -``` +```bash +python3 -m venv venv +source venv/bin/activate # pip install --upgrade setuptools wheel pip install --upgrade build ``` Then, navigate to your project root directory and build the distribution files: -``` +```bash rm dist/stackql_deploy* python3 -m build # or diff --git a/examples/databricks/all-purpose-cluster/README.md b/examples/databricks/classic/README.md similarity index 95% rename from examples/databricks/all-purpose-cluster/README.md rename to examples/databricks/classic/README.md index 6a80f71..404f7bc 100644 --- a/examples/databricks/all-purpose-cluster/README.md +++ b/examples/databricks/classic/README.md @@ -26,7 +26,7 @@ Now, is is convenient to use environment variables for context. Note that for o ```bash #!/usr/bin/env bash -export ASSETS_AWS_REGION='us-east-1' # or wherever you want +export AWS_REGION='us-east-1' # or wherever you want export AWS_ACCOUNT_ID='' export DATABRICKS_ACCOUNT_ID='' export DATABRICKS_AWS_ACCOUNT_ID='' @@ -46,28 +46,20 @@ export AWS_ACCESS_KEY_ID='' Now, let us do some sanity checks and housekeeping with `stackql`. This is purely optional. From the root of this repository: ``` - source examples/databricks/all-purpose-cluster/convenience.sh - stackql shell - ``` This will start a `stackql` interactive shell. Here are some commands you can run (I will not place output here, that will be shared in a corresponding video): ```sql - registry pull databricks_account v24.12.00279; - registry pull databricks_workspace v24.12.00279; -- This will fail if accounts, subscription, or credentials are in error. select account_id FROM databricks_account.provisioning.credentials WHERE account_id = ''; - - select account_id, workspace_name, workspace_id, workspace_status from databricks_account.provisioning.workspaces where account_id = ''; - ``` For extra credit, you can (asynchronously) delete the unnecessary workspace with `delete from databricks_account.provisioning.workspaces where account_id = '' and workspace_id = '';`, where you obtain the workspace id from the above query. I have noted that due to some reponse caching it takes a while to disappear from select queries (much longer than disappearance from the web page), and you may want to bounce the `stackql` session to hurry things along. This is not happening on the `stackql` side, but session bouncing forces a token refresh which can help cache busting. @@ -77,20 +69,20 @@ For extra credit, you can (asynchronously) delete the unnecessary workspace with Time to get down to business. From the root of this repository: ```bash - +python3 -m venv myenv source examples/databricks/all-purpose-cluster/convenience.sh - -source ./.venv/bin/activate - - +source venv/bin/activate +pip install stackql-deploy ``` +> alternatively set the `AWS_REGION`, `AWS_ACCOUNT_ID`, `DATABRICKS_ACCOUNT_ID`, `DATABRICKS_AWS_ACCOUNT_ID` along with provider credentials `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `DATABRICKS_CLIENT_ID`, `DATABRICKS_CLIENT_SECRET` + Then, do a dry run (good for catching **some** environmental issues): ```bash stackql-deploy build \ examples/databricks/all-purpose-cluster dev \ --e AWS_REGION=${ASSETS_AWS_REGION} \ +-e AWS_REGION=${AWS_REGION} \ -e AWS_ACCOUNT_ID=${AWS_ACCOUNT_ID} \ -e DATABRICKS_ACCOUNT_ID=${DATABRICKS_ACCOUNT_ID} \ -e DATABRICKS_AWS_ACCOUNT_ID=${DATABRICKS_AWS_ACCOUNT_ID} \ @@ -105,7 +97,7 @@ Now, let use do it for real: ```bash stackql-deploy build \ examples/databricks/all-purpose-cluster dev \ --e AWS_REGION=${ASSETS_AWS_REGION} \ +-e AWS_REGION=${AWS_REGION} \ -e AWS_ACCOUNT_ID=${AWS_ACCOUNT_ID} \ -e DATABRICKS_ACCOUNT_ID=${DATABRICKS_ACCOUNT_ID} \ -e DATABRICKS_AWS_ACCOUNT_ID=${DATABRICKS_AWS_ACCOUNT_ID} \ @@ -128,7 +120,7 @@ We can also use `stackql-deploy` to assess if our infra is shipshape: ```bash stackql-deploy test \ examples/databricks/all-purpose-cluster dev \ --e AWS_REGION=${ASSETS_AWS_REGION} \ +-e AWS_REGION=${AWS_REGION} \ -e AWS_ACCOUNT_ID=${AWS_ACCOUNT_ID} \ -e DATABRICKS_ACCOUNT_ID=${DATABRICKS_ACCOUNT_ID} \ -e DATABRICKS_AWS_ACCOUNT_ID=${DATABRICKS_AWS_ACCOUNT_ID} \ @@ -151,7 +143,7 @@ Now, let us teardown our `stackql-deploy` managed infra: ```bash stackql-deploy teardown \ examples/databricks/all-purpose-cluster dev \ --e AWS_REGION=${ASSETS_AWS_REGION} \ +-e AWS_REGION=${AWS_REGION} \ -e AWS_ACCOUNT_ID=${AWS_ACCOUNT_ID} \ -e DATABRICKS_ACCOUNT_ID=${DATABRICKS_ACCOUNT_ID} \ -e DATABRICKS_AWS_ACCOUNT_ID=${DATABRICKS_AWS_ACCOUNT_ID} \ diff --git a/examples/databricks/all-purpose-cluster/assets/auto-provisioned-worskpace.png b/examples/databricks/classic/assets/auto-provisioned-worskpace.png similarity index 100% rename from examples/databricks/all-purpose-cluster/assets/auto-provisioned-worskpace.png rename to examples/databricks/classic/assets/auto-provisioned-worskpace.png diff --git a/examples/databricks/all-purpose-cluster/assets/awaiting-subscription-resources.png b/examples/databricks/classic/assets/awaiting-subscription-resources.png similarity index 100% rename from examples/databricks/all-purpose-cluster/assets/awaiting-subscription-resources.png rename to examples/databricks/classic/assets/awaiting-subscription-resources.png diff --git a/examples/databricks/all-purpose-cluster/assets/capture-cross-databricks-aws-account-id.png b/examples/databricks/classic/assets/capture-cross-databricks-aws-account-id.png similarity index 100% rename from examples/databricks/all-purpose-cluster/assets/capture-cross-databricks-aws-account-id.png rename to examples/databricks/classic/assets/capture-cross-databricks-aws-account-id.png diff --git a/examples/databricks/all-purpose-cluster/assets/capture-databricks-account-id.png b/examples/databricks/classic/assets/capture-databricks-account-id.png similarity index 100% rename from examples/databricks/all-purpose-cluster/assets/capture-databricks-account-id.png rename to examples/databricks/classic/assets/capture-databricks-account-id.png diff --git a/examples/databricks/all-purpose-cluster/assets/create-aws-databricks-subscription.png b/examples/databricks/classic/assets/create-aws-databricks-subscription.png similarity index 100% rename from examples/databricks/all-purpose-cluster/assets/create-aws-databricks-subscription.png rename to examples/databricks/classic/assets/create-aws-databricks-subscription.png diff --git a/examples/databricks/all-purpose-cluster/assets/create-cicd-agent.png b/examples/databricks/classic/assets/create-cicd-agent.png similarity index 100% rename from examples/databricks/all-purpose-cluster/assets/create-cicd-agent.png rename to examples/databricks/classic/assets/create-cicd-agent.png diff --git a/examples/databricks/all-purpose-cluster/assets/generate-secret-ui.png b/examples/databricks/classic/assets/generate-secret-ui.png similarity index 100% rename from examples/databricks/all-purpose-cluster/assets/generate-secret-ui.png rename to examples/databricks/classic/assets/generate-secret-ui.png diff --git a/examples/databricks/all-purpose-cluster/assets/grant-account-admin-cicd-agent.png b/examples/databricks/classic/assets/grant-account-admin-cicd-agent.png similarity index 100% rename from examples/databricks/all-purpose-cluster/assets/grant-account-admin-cicd-agent.png rename to examples/databricks/classic/assets/grant-account-admin-cicd-agent.png diff --git a/examples/databricks/all-purpose-cluster/convenience.sh b/examples/databricks/classic/convenience.sh similarity index 93% rename from examples/databricks/all-purpose-cluster/convenience.sh rename to examples/databricks/classic/convenience.sh index 81f73c7..d4913f6 100644 --- a/examples/databricks/all-purpose-cluster/convenience.sh +++ b/examples/databricks/classic/convenience.sh @@ -10,9 +10,9 @@ then source "${REPOSITORY_ROOT}/examples/databricks/all-purpose-cluster/sec/env.sh" fi -if [ "${ASSETS_AWS_REGION}" = "" ]; +if [ "${AWS_REGION}" = "" ]; then - ASSETS_AWS_REGION='us-east-1' + AWS_REGION='us-east-1' fi if [ "${AWS_ACCOUNT_ID}" = "" ]; @@ -57,7 +57,7 @@ then exit 1 fi -export ASSETS_AWS_REGION +export AWS_REGION export AWS_ACCOUNT_ID export DATABRICKS_ACCOUNT_ID export DATABRICKS_AWS_ACCOUNT_ID diff --git a/examples/databricks/all-purpose-cluster/resources/aws_iam_cross_account_role.iql b/examples/databricks/classic/resources/aws/iam/iam_role.iql similarity index 92% rename from examples/databricks/all-purpose-cluster/resources/aws_iam_cross_account_role.iql rename to examples/databricks/classic/resources/aws/iam/iam_role.iql index f7e8750..eebcfcd 100644 --- a/examples/databricks/all-purpose-cluster/resources/aws_iam_cross_account_role.iql +++ b/examples/databricks/classic/resources/aws/iam/iam_role.iql @@ -49,7 +49,8 @@ AND path = '{{ path }}'; /*+ exports, retries=3, retry_delay=5 */ SELECT -arn as aws_iam_cross_account_role_arn +'{{ role_name }}' as aws_iam_role_name, +arn as aws_iam_role_arn FROM aws.iam.roles WHERE data__Identifier = '{{ role_name }}' diff --git a/examples/databricks/all-purpose-cluster/resources/aws_s3_workspace_bucket.iql b/examples/databricks/classic/resources/aws/s3/workspace_bucket.iql similarity index 100% rename from examples/databricks/all-purpose-cluster/resources/aws_s3_workspace_bucket.iql rename to examples/databricks/classic/resources/aws/s3/workspace_bucket.iql diff --git a/examples/databricks/all-purpose-cluster/resources/aws_s3_workspace_bucket_policy.iql b/examples/databricks/classic/resources/aws/s3/workspace_bucket_policy.iql similarity index 100% rename from examples/databricks/all-purpose-cluster/resources/aws_s3_workspace_bucket_policy.iql rename to examples/databricks/classic/resources/aws/s3/workspace_bucket_policy.iql diff --git a/examples/databricks/classic/resources/aws/vpc/elastic_ip.iql b/examples/databricks/classic/resources/aws/vpc/elastic_ip.iql new file mode 100644 index 0000000..d4dd982 --- /dev/null +++ b/examples/databricks/classic/resources/aws/vpc/elastic_ip.iql @@ -0,0 +1,56 @@ +/*+ exists */ +SELECT COUNT(*) as count FROM +( +SELECT allocation_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.eip_tags +WHERE region = '{{ region }}' +GROUP BY allocation_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t + +/*+ create */ +INSERT INTO aws.ec2.eips ( + NetworkBorderGroup, + Tags, + ClientToken, + region +) +SELECT +'{{ region }}', +'{{ tags }}', +'{{ idempotency_token }}', +'{{ region }}' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( +SELECT allocation_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.eip_tags +WHERE region = '{{ region }}' +GROUP BY allocation_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t + +/*+ exports, retries=3, retry_delay=5 */ +SELECT allocation_id as eip_allocation_id, public_ip as eip_public_id FROM +( +SELECT allocation_id, public_ip, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.eip_tags +WHERE region = '{{ region }}' +GROUP BY allocation_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t + +/*+ delete */ +DELETE FROM aws.ec2.eips +WHERE data__Identifier = '{{ eip_public_id }}|{{ eip_allocation_id}}' +AND region = '{{ region }}' diff --git a/examples/databricks/all-purpose-cluster/resources/aws_get_main_route_table_id.iql b/examples/databricks/classic/resources/aws/vpc/get_main_route_table_id.iql similarity index 75% rename from examples/databricks/all-purpose-cluster/resources/aws_get_main_route_table_id.iql rename to examples/databricks/classic/resources/aws/vpc/get_main_route_table_id.iql index 72595ff..7679dd2 100644 --- a/examples/databricks/all-purpose-cluster/resources/aws_get_main_route_table_id.iql +++ b/examples/databricks/classic/resources/aws/vpc/get_main_route_table_id.iql @@ -1,6 +1,6 @@ /*+ exports, retries=3, retry_delay=5 */ SELECT -route_table_id +route_table_id as main_route_table_id FROM aws.ec2.route_tables WHERE region = '{{ region }}' AND vpc_id = '{{ vpc_id }}'; \ No newline at end of file diff --git a/examples/databricks/all-purpose-cluster/resources/aws_vpc_inet_gateway.iql b/examples/databricks/classic/resources/aws/vpc/inet_gateway.iql similarity index 100% rename from examples/databricks/all-purpose-cluster/resources/aws_vpc_inet_gateway.iql rename to examples/databricks/classic/resources/aws/vpc/inet_gateway.iql diff --git a/examples/databricks/all-purpose-cluster/resources/aws_vpc_inet_gw_attachment.iql b/examples/databricks/classic/resources/aws/vpc/inet_gw_attachment.iql similarity index 100% rename from examples/databricks/all-purpose-cluster/resources/aws_vpc_inet_gw_attachment.iql rename to examples/databricks/classic/resources/aws/vpc/inet_gw_attachment.iql diff --git a/examples/databricks/all-purpose-cluster/resources/aws_vpc_inet_route.iql b/examples/databricks/classic/resources/aws/vpc/inet_route.iql similarity index 100% rename from examples/databricks/all-purpose-cluster/resources/aws_vpc_inet_route.iql rename to examples/databricks/classic/resources/aws/vpc/inet_route.iql diff --git a/examples/databricks/classic/resources/aws/vpc/nat_gateway.iql b/examples/databricks/classic/resources/aws/vpc/nat_gateway.iql new file mode 100644 index 0000000..081fbd2 --- /dev/null +++ b/examples/databricks/classic/resources/aws/vpc/nat_gateway.iql @@ -0,0 +1,53 @@ +/*+ exists */ +SELECT COUNT(*) as count FROM +( +SELECT nat_gateway_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.nat_gateway_tags +WHERE region = '{{ region }}' +GROUP BY allocation_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t + +/*+ create */ +INSERT INTO aws.ec2.nat_gateways ( + AllocationId, + SubnetId, + Tags, + region +) +SELECT + '{{ eip_allocation_id }}', + '{{ nat_subnet_id }}', + '{{ tags }}', + '{{ region }}'; + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( +SELECT nat_gateway_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.nat_gateway_tags +WHERE region = '{{ region }}' +GROUP BY allocation_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t + +/*+ exports, retries=3, retry_delay=5 */ +SELECT nat_gateway_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.nat_gateway_tags +WHERE region = '{{ region }}' +GROUP BY allocation_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' + +/*+ delete */ +DELETE FROM aws.ec2.nat_gateways +WHERE data__Identifier = '{{ nat_gateway_id }}' +AND region = '{{ region }}'; \ No newline at end of file diff --git a/examples/databricks/classic/resources/aws/vpc/nat_inet_route.iql b/examples/databricks/classic/resources/aws/vpc/nat_inet_route.iql new file mode 100644 index 0000000..9e750f6 --- /dev/null +++ b/examples/databricks/classic/resources/aws/vpc/nat_inet_route.iql @@ -0,0 +1,41 @@ +/*+ exists */ +SELECT COUNT(*) as count FROM +( +SELECT data__Identifier +FROM aws.ec2.routes +WHERE region = '{{ region }}' +AND data__Identifier = '{{ route_table_id }}|0.0.0.0/0' +) t + +/*+ create */ +INSERT INTO aws.ec2.routes ( + DestinationCidrBlock, + NatGatewayId, + RouteTableId, + region +) +SELECT + '0.0.0.0/0', + '{{ nat_gateway_id }}', + '{{ route_table_id }}', + '{{ region }}'; + +/*+ statecheck, retries=5, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( +SELECT data__Identifier +FROM aws.ec2.routes +WHERE region = '{{ region }}' +AND data__Identifier = '{{ route_table_id }}|0.0.0.0/0' +) t + +/*+ exports, retries=3, retry_delay=5 */ +SELECT data__Identifier as nat_inet_route_indentifer +FROM aws.ec2.routes +WHERE region = '{{ region }}' +AND data__Identifier = '{{ route_table_id }}|0.0.0.0/0'; + +/*+ delete */ +DELETE FROM aws.ec2.routes +WHERE data__Identifier = '{{ inet_route_indentifer }}' +AND region = '{{ region }}'; \ No newline at end of file diff --git a/examples/databricks/classic/resources/aws/vpc/route_table.iql b/examples/databricks/classic/resources/aws/vpc/route_table.iql new file mode 100644 index 0000000..7b0aa76 --- /dev/null +++ b/examples/databricks/classic/resources/aws/vpc/route_table.iql @@ -0,0 +1,54 @@ +/*+ exists */ +SELECT COUNT(*) as count FROM +( +SELECT route_table_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.route_table_tags +WHERE region = '{{ region }}' +GROUP BY route_table_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +AND json_extract(tags, '$.Name') = '{{ route_table_name }}' +) t + +/*+ create */ +INSERT INTO aws.ec2.route_tables ( + VpcId, + Tags, + region +) +SELECT + '{{ vpc_id }}', + '{{ tags }}', + '{{ region }}'; + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( +SELECT route_table_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.route_table_tags +WHERE region = '{{ region }}' +GROUP BY route_table_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +AND json_extract(tags, '$.Name') = '{{ route_table_name }}' +) t + +/*+ exports, retries=3, retry_delay=5 */ +SELECT route_table_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.route_table_tags +WHERE region = '{{ region }}' +GROUP BY route_table_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +AND json_extract(tags, '$.Name') = '{{ route_table_name }}' + +/*+ delete */ +DELETE FROM aws.ec2.route_tables +WHERE data__Identifier = '{{ route_table_id }}' +AND region = '{{ region }}'; \ No newline at end of file diff --git a/examples/databricks/all-purpose-cluster/resources/aws_vpc_security_group.iql b/examples/databricks/classic/resources/aws/vpc/security_group.iql similarity index 100% rename from examples/databricks/all-purpose-cluster/resources/aws_vpc_security_group.iql rename to examples/databricks/classic/resources/aws/vpc/security_group.iql diff --git a/examples/databricks/all-purpose-cluster/resources/aws_vpc_security_group_rules.iql b/examples/databricks/classic/resources/aws/vpc/security_group_rules.iql similarity index 100% rename from examples/databricks/all-purpose-cluster/resources/aws_vpc_security_group_rules.iql rename to examples/databricks/classic/resources/aws/vpc/security_group_rules.iql diff --git a/examples/databricks/all-purpose-cluster/resources/aws_vpc_subnet.iql b/examples/databricks/classic/resources/aws/vpc/subnet.iql similarity index 100% rename from examples/databricks/all-purpose-cluster/resources/aws_vpc_subnet.iql rename to examples/databricks/classic/resources/aws/vpc/subnet.iql diff --git a/examples/databricks/all-purpose-cluster/resources/aws_vpc_subnet_rt_assn.iql b/examples/databricks/classic/resources/aws/vpc/subnet_rt_assn.iql similarity index 100% rename from examples/databricks/all-purpose-cluster/resources/aws_vpc_subnet_rt_assn.iql rename to examples/databricks/classic/resources/aws/vpc/subnet_rt_assn.iql diff --git a/examples/databricks/all-purpose-cluster/resources/aws_tag_main_vpc_route_table.iql b/examples/databricks/classic/resources/aws/vpc/tag_main_vpc_route_table.iql similarity index 74% rename from examples/databricks/all-purpose-cluster/resources/aws_tag_main_vpc_route_table.iql rename to examples/databricks/classic/resources/aws/vpc/tag_main_vpc_route_table.iql index f307613..cc03c2a 100644 --- a/examples/databricks/all-purpose-cluster/resources/aws_tag_main_vpc_route_table.iql +++ b/examples/databricks/classic/resources/aws/vpc/tag_main_vpc_route_table.iql @@ -4,4 +4,4 @@ set data__PatchDocument = string('{{ { "Tags": tags } | generate_patch_document }}') WHERE region = '{{ region }}' -AND data__Identifier = '{{ route_table_id }}'; \ No newline at end of file +AND data__Identifier = '{{ main_route_table_id }}'; \ No newline at end of file diff --git a/examples/databricks/all-purpose-cluster/resources/aws_vpc.iql b/examples/databricks/classic/resources/aws/vpc/vpc.iql similarity index 100% rename from examples/databricks/all-purpose-cluster/resources/aws_vpc.iql rename to examples/databricks/classic/resources/aws/vpc/vpc.iql diff --git a/examples/databricks/classic/resources/aws/vpc/vpc_endpoint.iql b/examples/databricks/classic/resources/aws/vpc/vpc_endpoint.iql new file mode 100644 index 0000000..d40f522 --- /dev/null +++ b/examples/databricks/classic/resources/aws/vpc/vpc_endpoint.iql @@ -0,0 +1,60 @@ +/*+ exists */ +SELECT COUNT(*) as count FROM +( + SELECT id, + json_group_object(tag_key, tag_value) as tags + FROM aws.ec2.vpc_endpoint_tags + WHERE region = '{{ region }}' + AND service_name = '{{ service_name }}' + GROUP BY id + HAVING json_extract(tags, '$.Provisioner') = 'stackql' + AND json_extract(tags, '$.StackName') = '{{ stack_name }}' + AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t; + +/*+ create */ +INSERT INTO aws.ec2.vpc_endpoints ( + ServiceName, + VpcEndpointType, + VpcId, + RouteTableIds, + Tags, + region +) +SELECT + '{{ service_name }}', + '{{ vpc_endpoint_type }}', + '{{ vpc_id }}', + '{{ route_table_ids }}', + '{{ tags }}', + '{{ region }}'; + +/*+ statecheck, retries=5, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( + SELECT id, + json_group_object(tag_key, tag_value) as tags + FROM aws.ec2.vpc_endpoint_tags + WHERE region = '{{ region }}' + AND service_name = '{{ service_name }}' + GROUP BY id + HAVING json_extract(tags, '$.Provisioner') = 'stackql' + AND json_extract(tags, '$.StackName') = '{{ stack_name }}' + AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t; + +/*+ exports, retries=3, retry_delay=5 */ +SELECT id as s3_gateway_endpoint_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.vpc_endpoint_tags +WHERE region = '{{ region }}' +AND service_name = '{{ service_name }}' +GROUP BY id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}'; + +/*+ delete */ +DELETE FROM aws.ec2.vpc_endpoints +WHERE data__Identifier = 's3_gateway_endpoint_id' +AND region = 'us-east-1'; \ No newline at end of file diff --git a/examples/databricks/all-purpose-cluster/resources/databricks_credentials.iql b/examples/databricks/classic/resources/databricks_account/credentials.iql similarity index 88% rename from examples/databricks/all-purpose-cluster/resources/databricks_credentials.iql rename to examples/databricks/classic/resources/databricks_account/credentials.iql index d83abc6..c0d8327 100644 --- a/examples/databricks/all-purpose-cluster/resources/databricks_credentials.iql +++ b/examples/databricks/classic/resources/databricks_account/credentials.iql @@ -27,7 +27,9 @@ AND JSON_EXTRACT(aws_credentials, '$.sts_role.role_arn') = '{{ aws_iam_cross_acc ) t /*+ exports */ -SELECT credentials_id as databricks_credentials_id, +SELECT +'{{ credentials_name }}' as databricks_credentials_name, +credentials_id as databricks_credentials_id, JSON_EXTRACT(aws_credentials, '$.sts_role.external_id') as databricks_role_external_id FROM databricks_account.provisioning.credentials WHERE account_id = '{{ databricks_account_id }}' diff --git a/examples/databricks/classic/resources/databricks_account/get_users.iql b/examples/databricks/classic/resources/databricks_account/get_users.iql new file mode 100644 index 0000000..2a978d7 --- /dev/null +++ b/examples/databricks/classic/resources/databricks_account/get_users.iql @@ -0,0 +1,6 @@ +/*+ exports, retries=3, retry_delay=5 */ +SELECT +JSON_GROUP_ARRAY(JSON_OBJECT('value', id)) as databricks_workspace_group_members +FROM databricks_account.iam.users +WHERE account_id = 'ebfcc5a9-9d49-4c93-b651-b3ee6cf1c9ce' +AND userName in {{ users | sql_list }}; \ No newline at end of file diff --git a/examples/databricks/all-purpose-cluster/resources/databricks_network.iql b/examples/databricks/classic/resources/databricks_account/network.iql similarity index 100% rename from examples/databricks/all-purpose-cluster/resources/databricks_network.iql rename to examples/databricks/classic/resources/databricks_account/network.iql diff --git a/examples/databricks/all-purpose-cluster/resources/databricks_storage_configuration.iql b/examples/databricks/classic/resources/databricks_account/storage_configuration.iql similarity index 100% rename from examples/databricks/all-purpose-cluster/resources/databricks_storage_configuration.iql rename to examples/databricks/classic/resources/databricks_account/storage_configuration.iql diff --git a/examples/databricks/classic/resources/databricks_account/update_group_membership.iql b/examples/databricks/classic/resources/databricks_account/update_group_membership.iql new file mode 100644 index 0000000..375d926 --- /dev/null +++ b/examples/databricks/classic/resources/databricks_account/update_group_membership.iql @@ -0,0 +1,6 @@ +/*+ command */ +update databricks_account.iam.groups +set data__schemas = '["urn:ietf:params:scim:api:messages:2.0:PatchOp"]', +data__Operations = '[{"op": "replace", "path": "members", "value": {{ databricks_workspace_group_members }} }]' +WHERE account_id = '{{ databricks_account_id }}' +AND id = '{{ databricks_group_id }}'; diff --git a/examples/databricks/all-purpose-cluster/resources/databricks_workspace.iql b/examples/databricks/classic/resources/databricks_account/workspace.iql similarity index 88% rename from examples/databricks/all-purpose-cluster/resources/databricks_workspace.iql rename to examples/databricks/classic/resources/databricks_account/workspace.iql index 8ba84f7..9da2dea 100644 --- a/examples/databricks/all-purpose-cluster/resources/databricks_workspace.iql +++ b/examples/databricks/classic/resources/databricks_account/workspace.iql @@ -8,7 +8,6 @@ AND workspace_name = '{{ workspace_name }}' INSERT INTO databricks_account.provisioning.workspaces ( account_id, data__workspace_name, -data__network_id, data__aws_region, data__credentials_id, data__storage_configuration_id, @@ -17,7 +16,6 @@ data__pricing_tier SELECT '{{ databricks_account_id }}', '{{ workspace_name }}', -'{{ network_id }}', '{{ aws_region }}', '{{ credentials_id }}', '{{ storage_configuration_id }}', @@ -28,14 +26,14 @@ SELECT COUNT(*) as count FROM databricks_account.provisioning.workspaces WHERE account_id = '{{ databricks_account_id }}' AND workspace_name = '{{ workspace_name }}' -AND network_id = '{{ network_id }}' AND aws_region = '{{ aws_region }}' AND credentials_id = '{{ credentials_id }}' AND storage_configuration_id = '{{ storage_configuration_id }}' AND pricing_tier = '{{ pricing_tier }}' /*+ exports */ -SELECT workspace_id AS databricks_workspace_id +SELECT workspace_id AS databricks_workspace_id, +deployment_name AS databricks_deployment_name FROM databricks_account.provisioning.workspaces WHERE account_id = '{{ databricks_account_id }}' AND workspace_name = '{{ workspace_name }}' diff --git a/examples/databricks/classic/resources/databricks_account/workspace_group.iql b/examples/databricks/classic/resources/databricks_account/workspace_group.iql new file mode 100644 index 0000000..4d3494a --- /dev/null +++ b/examples/databricks/classic/resources/databricks_account/workspace_group.iql @@ -0,0 +1,31 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM databricks_account.iam.groups +WHERE account_id = '{{ databricks_account_id }}' +AND displayName = '{{ display_name }}' + +/*+ create */ +INSERT INTO databricks_account.iam.groups ( +account_id, +data__displayName +) +SELECT +'{{ databricks_account_id }}', +'{{ display_name }}' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count +FROM databricks_account.iam.groups +WHERE account_id = '{{ databricks_account_id }}' +AND displayName = '{{ display_name }}' + +/*+ exports */ +SELECT id AS databricks_group_id +FROM databricks_account.iam.groups +WHERE account_id = '{{ databricks_account_id }}' +AND displayName = '{{ display_name }}' + +/*+ delete */ +DELETE FROM databricks_account.iam.groups +WHERE account_id = '{{ databricks_account_id }}' AND +id = '{{ databricks_group_id }}'; \ No newline at end of file diff --git a/examples/databricks/classic/resources/databricks_account/workspace_permission_assignments.iql b/examples/databricks/classic/resources/databricks_account/workspace_permission_assignments.iql new file mode 100644 index 0000000..00387e3 --- /dev/null +++ b/examples/databricks/classic/resources/databricks_account/workspace_permission_assignments.iql @@ -0,0 +1,32 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM databricks_account.iam.workspace_permission_assignments +WHERE account_id = '{{ databricks_account_id }}' AND +workspace_id = '{{ databricks_workspace_id }}' +AND JSON_EXTRACT(principal, '$.principal_id') = {{ databricks_group_id }} + +/*+ createorupdate */ +INSERT INTO databricks_account.iam.workspace_permission_assignments ( +account_id, +principal_id, +workspace_id, +data__permissions +) +SELECT +'{{ databricks_account_id }}', +'{{ databricks_group_id }}', +'{{ databricks_workspace_id }}', +'["ADMIN"]' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count +FROM databricks_account.iam.workspace_permission_assignments +WHERE account_id = '{{ databricks_account_id }}' AND +workspace_id = '{{ databricks_workspace_id }}' +AND JSON_EXTRACT(principal, '$.principal_id') = {{ databricks_group_id }} + +/*+ delete */ +DELETE FROM databricks_account.iam.workspace_permission_assignments +WHERE account_id = '{{ databricks_account_id }}' AND +principal_id = '{{ databricks_group_id }}' AND +workspace_id = '{{ databricks_workspace_id }}' \ No newline at end of file diff --git a/examples/databricks/classic/resources/databricks_workspace/all_purpose_cluster.iql b/examples/databricks/classic/resources/databricks_workspace/all_purpose_cluster.iql new file mode 100644 index 0000000..44b3703 --- /dev/null +++ b/examples/databricks/classic/resources/databricks_workspace/all_purpose_cluster.iql @@ -0,0 +1,52 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM databricks_workspace.compute.clusters +WHERE deployment_name = '{{ databricks_deployment_name }}' +AND cluster_name = '{{ cluster_name }}' + +/*+ create */ +INSERT INTO databricks_workspace.compute.clusters ( +deployment_name, +data__cluster_name, +data__num_workers, +data__is_single_node, +data__kind, +data__spark_version, +data__node_type_id, +data__data_security_mode, +data__runtime_engine, +data__single_user_name, +data__aws_attributes, +data__custom_tags +) +SELECT +'{{ databricks_deployment_name }}', +'{{ cluster_name }}', + {{ num_workers }}, + {{ is_single_node }}, +'{{ kind }}', +'{{ spark_version }}', +'{{ node_type_id }}', +'{{ data_security_mode }}', +'{{ runtime_engine }}', +'{{ single_user_name }}', +'{{ aws_attributes }}', +'{{ custom_tags }}' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count +FROM databricks_workspace.compute.clusters +WHERE deployment_name = '{{ databricks_deployment_name }}' +AND cluster_name = '{{ cluster_name }}' + +/*+ exports */ +SELECT cluster_id AS databricks_cluster_id, +state AS databricks_cluster_state +FROM databricks_workspace.compute.clusters +WHERE deployment_name = '{{ databricks_deployment_name }}' +AND cluster_name = '{{ cluster_name }}' + +/*+ delete */ +DELETE FROM databricks_workspace.compute.clusters +WHERE deployment_name = '{{ databricks_deployment_name }}' +AND cluster_id = '{{ databricks_cluster_id }}' diff --git a/examples/databricks/all-purpose-cluster/sec/.gitignore b/examples/databricks/classic/sec/.gitignore similarity index 100% rename from examples/databricks/all-purpose-cluster/sec/.gitignore rename to examples/databricks/classic/sec/.gitignore diff --git a/examples/databricks/classic/stackql_manifest.yml b/examples/databricks/classic/stackql_manifest.yml new file mode 100644 index 0000000..f9be4d1 --- /dev/null +++ b/examples/databricks/classic/stackql_manifest.yml @@ -0,0 +1,1059 @@ +version: 1 +name: "databricks-all-purpose-cluster" +description: creates a databricks workspace and all-purpose cluster +providers: + - aws + - databricks_account + - databricks_workspace +globals: + - name: databricks_account_id + description: databricks account id + value: "{{ DATABRICKS_ACCOUNT_ID }}" + - name: databricks_aws_account_id + description: databricks AWS account id + value: "{{ DATABRICKS_AWS_ACCOUNT_ID }}" + - name: aws_account + description: aws_account id + value: "{{ AWS_ACCOUNT_ID }}" + - name: region + description: aws region + value: "{{ AWS_REGION }}" + - name: global_tags + value: + - Key: Provisioner + Value: stackql + - Key: StackName + Value: "{{ stack_name }}" + - Key: StackEnv + Value: "{{ stack_env }}" +resources: +# ==================================================================================== +# AWS IAM +# ==================================================================================== + + - name: aws/iam/cross_account_role + file: aws/iam/iam_role.iql + props: + - name: role_name + value: "{{ stack_name }}-{{ stack_env }}-role" + - name: assume_role_policy_document + value: + Version: "2012-10-17" + Statement: + - Sid: "" + Effect: "Allow" + Principal: + AWS: "arn:aws:iam::{{ databricks_aws_account_id }}:root" + Action: "sts:AssumeRole" + Condition: + StringEquals: + sts:ExternalId: "{{ databricks_account_id }}" + - name: description + value: 'allows Databricks to access resources in ({{ stack_name }}-{{ stack_env }})' + - name: path + value: '/' + - name: policies + value: + - PolicyDocument: + Statement: + - Sid: Stmt1403287045000 + Effect: Allow + Action: + - "ec2:AllocateAddress" + - "ec2:AssociateDhcpOptions" + - "ec2:AssociateIamInstanceProfile" + - "ec2:AssociateRouteTable" + - "ec2:AttachInternetGateway" + - "ec2:AttachVolume" + - "ec2:AuthorizeSecurityGroupEgress" + - "ec2:AuthorizeSecurityGroupIngress" + - "ec2:CancelSpotInstanceRequests" + - "ec2:CreateDhcpOptions" + - "ec2:CreateInternetGateway" + - "ec2:CreateKeyPair" + - "ec2:CreateNatGateway" + - "ec2:CreatePlacementGroup" + - "ec2:CreateRoute" + - "ec2:CreateRouteTable" + - "ec2:CreateSecurityGroup" + - "ec2:CreateSubnet" + - "ec2:CreateTags" + - "ec2:CreateVolume" + - "ec2:CreateVpc" + - "ec2:CreateVpcEndpoint" + - "ec2:DeleteDhcpOptions" + - "ec2:DeleteInternetGateway" + - "ec2:DeleteKeyPair" + - "ec2:DeleteNatGateway" + - "ec2:DeletePlacementGroup" + - "ec2:DeleteRoute" + - "ec2:DeleteRouteTable" + - "ec2:DeleteSecurityGroup" + - "ec2:DeleteSubnet" + - "ec2:DeleteTags" + - "ec2:DeleteVolume" + - "ec2:DeleteVpc" + - "ec2:DeleteVpcEndpoints" + - "ec2:DescribeAvailabilityZones" + - "ec2:DescribeIamInstanceProfileAssociations" + - "ec2:DescribeInstanceStatus" + - "ec2:DescribeInstances" + - "ec2:DescribeInternetGateways" + - "ec2:DescribeNatGateways" + - "ec2:DescribePlacementGroups" + - "ec2:DescribePrefixLists" + - "ec2:DescribeReservedInstancesOfferings" + - "ec2:DescribeRouteTables" + - "ec2:DescribeSecurityGroups" + - "ec2:DescribeSpotInstanceRequests" + - "ec2:DescribeSpotPriceHistory" + - "ec2:DescribeSubnets" + - "ec2:DescribeVolumes" + - "ec2:DescribeVpcs" + - "ec2:DescribeVpcAttribute" + - "ec2:DescribeNetworkAcls" + - "ec2:DetachInternetGateway" + - "ec2:DisassociateIamInstanceProfile" + - "ec2:DisassociateRouteTable" + - "ec2:ModifyVpcAttribute" + - "ec2:ReleaseAddress" + - "ec2:ReplaceIamInstanceProfileAssociation" + - "ec2:ReplaceRoute" + - "ec2:RequestSpotInstances" + - "ec2:RevokeSecurityGroupEgress" + - "ec2:RevokeSecurityGroupIngress" + - "ec2:RunInstances" + - "ec2:TerminateInstances" + Resource: + - "*" + - Effect: Allow + Action: + - "iam:CreateServiceLinkedRole" + - "iam:PutRolePolicy" + Resource: + - arn:aws:iam::*:role/aws-service-role/spot.amazonaws.com/AWSServiceRoleForEC2Spot + Condition: + StringLike: + "iam:AWSServiceName": spot.amazonaws.com + Version: '2012-10-17' + PolicyName: "{{ stack_name }}-{{ stack_env }}-policy" + exports: + - aws_iam_role_name: aws_iam_cross_account_role_name + - aws_iam_role_arn: aws_iam_cross_account_role_arn + + - name: databricks_account/credentials + props: + - name: credentials_name + value: "{{ stack_name }}-{{ stack_env }}-credentials" + - name: aws_credentials + value: + sts_role: + role_arn: "{{ aws_iam_cross_account_role_arn }}" + exports: + - databricks_credentials_name + - databricks_credentials_id + - databricks_role_external_id + + - name: aws/iam/databricks_compute_role + file: aws/iam/iam_role.iql + props: + - name: role_name + value: "{{ stack_name }}-{{ stack_env }}-compute-role" + - name: assume_role_policy_document + value: + Version: "2012-10-17" + Statement: + - Action: "sts:AssumeRole" + Effect: "Allow" + Principal: + AWS: "{{ 'arn:aws:iam::314146311478:root' if trustInternalAccount == 'true' else 'arn:aws:iam::414351767826:root' }}" + Condition: + StringEquals: + sts:ExternalId: "{{ databricks_account_id }}" + - name: description + value: 'allows Databricks to access compute resources in ({{ stack_name }}-{{ stack_env }})' + - name: path + value: '/' + - name: policies + value: + - PolicyName: "Base" + PolicyDocument: + Version: "2012-10-17" + Statement: + - Sid: "CreateEC2ResourcesWithRequestTag" + Effect: "Allow" + Action: + - "ec2:CreateFleet" + - "ec2:CreateLaunchTemplate" + - "ec2:CreateVolume" + - "ec2:RequestSpotInstances" + - "ec2:RunInstances" + Resource: ["*"] + Condition: + StringEquals: + aws:RequestTag/Vendor: "Databricks" + - Sid: "AllowDatabricksTagOnCreate" + Effect: "Allow" + Action: ["ec2:CreateTags"] + Resource: ["*"] + Condition: + StringEquals: + ec2:CreateAction: + - "CreateFleet" + - "CreateLaunchTemplate" + - "CreateVolume" + - "RequestSpotInstances" + - "RunInstances" + - Sid: "UpdateByResourceTags" + Effect: "Allow" + Action: + - "ec2:AssignPrivateIpAddresses" + - "ec2:AssociateIamInstanceProfile" + - "ec2:AttachVolume" + - "ec2:AuthorizeSecurityGroupEgress" + - "ec2:AuthorizeSecurityGroupIngress" + - "ec2:CancelSpotInstanceRequests" + - "ec2:CreateFleet" + - "ec2:CreateLaunchTemplate" + - "ec2:CreateLaunchTemplateVersion" + - "ec2:CreateVolume" + - "ec2:DetachVolume" + - "ec2:DisassociateIamInstanceProfile" + - "ec2:ModifyFleet" + - "ec2:ModifyLaunchTemplate" + - "ec2:RequestSpotInstances" + - "ec2:RevokeSecurityGroupEgress" + - "ec2:RevokeSecurityGroupIngress" + - "ec2:RunInstances" + Resource: ["*"] + Condition: + StringEquals: + ec2:ResourceTag/Vendor: "Databricks" + - Sid: "GetByResourceTags" + Effect: "Allow" + Action: ["ec2:GetLaunchTemplateData"] + Resource: ["*"] + Condition: + StringEquals: + ec2:ResourceTag/Vendor: "Databricks" + - Sid: "DeleteByResourceTags" + Effect: "Allow" + Action: + - "ec2:DeleteFleets" + - "ec2:DeleteLaunchTemplate" + - "ec2:DeleteLaunchTemplateVersions" + - "ec2:DeleteTags" + - "ec2:DeleteVolume" + - "ec2:TerminateInstances" + Resource: ["*"] + Condition: + StringEquals: + ec2:ResourceTag/Vendor: "Databricks" + - Sid: "DescribeResources" + Effect: "Allow" + Action: + - "ec2:DescribeAvailabilityZones" + - "ec2:DescribeFleets" + - "ec2:DescribeIamInstanceProfileAssociations" + - "ec2:DescribeInstances" + - "ec2:DescribeInstanceStatus" + - "ec2:DescribeInternetGateways" + - "ec2:DescribeLaunchTemplates" + - "ec2:DescribeLaunchTemplateVersions" + - "ec2:DescribeNatGateways" + - "ec2:DescribeNetworkAcls" + - "ec2:DescribePrefixLists" + - "ec2:DescribeReservedInstancesOfferings" + - "ec2:DescribeRouteTables" + - "ec2:DescribeSecurityGroups" + - "ec2:DescribeSpotInstanceRequests" + - "ec2:DescribeSpotPriceHistory" + - "ec2:DescribeSubnets" + - "ec2:DescribeVolumes" + - "ec2:DescribeVpcs" + - "ec2:GetSpotPlacementScores" + Resource: ["*"] + exports: + - aws_iam_role_name: databricks_compute_role_name + - aws_iam_role_arn: databricks_compute_role_arn + +# ==================================================================================== +# UC Metastore with KMS Encryption +# ==================================================================================== + + # - name: aws/kms/metastore_key + # props: + # - name: description + # value: "KMS key for {{ stack_name }}-{{ stack_env }} Unity Catalog metastore encryption" + # - name: key_policy + # value: + # Version: "2012-10-17" + # Statement: + # - Sid: "Enable IAM User Permissions" + # Effect: "Allow" + # Principal: + # AWS: "arn:aws:iam::{{ aws_account }}:root" + # Action: "kms:*" + # Resource: "*" + # - Sid: "Allow Metastore Role to Use Key" + # Effect: "Allow" + # Principal: + # AWS: "arn:aws:iam::{{ aws_account }}:role/{{ stack_name }}-{{ stack_env }}-metastore-role" + # Action: + # - "kms:Decrypt" + # - "kms:Encrypt" + # - "kms:GenerateDataKey" + # - "kms:DescribeKey" + # - "kms:CreateGrant" + # - "kms:RetireGrant" + # Resource: "*" + # - Sid: "Allow Databricks to Use Key" + # Effect: "Allow" + # Principal: + # AWS: "arn:aws:iam::{{ databricks_aws_account_id }}:root" + # Action: + # - "kms:Decrypt" + # - "kms:GenerateDataKey" + # - "kms:DescribeKey" + # Resource: "*" + # Condition: + # StringEquals: + # "kms:ViaService": "s3.{{ region }}.amazonaws.com" + # - name: tags + # value: + # - Key: Purpose + # Value: "UC Metastore Encryption" + # merge: + # - global_tags + # exports: + # - key_id: metastore_kms_key_id + # - key_arn: metastore_kms_key_arn + + # - name: aws/kms/metastore_key_alias + # props: + # - name: alias_name + # value: "alias/{{ stack_name }}-{{ stack_env }}-metastore" + # - name: target_key_id + # value: "{{ metastore_kms_key_id }}" + + # - name: aws/s3/metastore_bucket + # props: + # - name: bucket_name + # value: "{{ stack_name }}-{{ stack_env }}-metastore" + # - name: ownership_controls + # value: + # Rules: + # - ObjectOwnership: "BucketOwnerPreferred" + # - name: bucket_encryption + # value: + # ServerSideEncryptionConfiguration: + # - BucketKeyEnabled: true + # ServerSideEncryptionByDefault: + # SSEAlgorithm: "aws:kms" + # KMSMasterKeyID: "{{ metastore_kms_key_arn }}" + # - name: public_access_block_configuration + # value: + # BlockPublicAcls: true + # IgnorePublicAcls: true + # BlockPublicPolicy: true + # RestrictPublicBuckets: true + # - name: versioning_configuration + # value: + # Status: "Enabled" + # - name: lifecycle_configuration + # value: + # Rules: + # - Id: "DeleteOldVersions" + # Status: "Enabled" + # NoncurrentVersionExpiration: + # NoncurrentDays: 30 + # AbortIncompleteMultipartUpload: + # DaysAfterInitiation: 7 + # - name: logging_configuration + # value: + # TargetBucket: "{{ stack_name }}-{{ stack_env }}-logs" + # TargetPrefix: "s3-access-logs/metastore/" + # - name: tags + # value: + # - Key: Purpose + # Value: "Unity Catalog Metastore" + # - Key: DataClassification + # Value: "Metadata" + # merge: + # - global_tags + # exports: + # - bucket_name: aws_s3_metastore_bucket_name + # - bucket_arn: aws_s3_metastore_bucket_arn + + # - name: aws/iam/metastore_access_role + # file: aws/iam/iam_role.iql + # props: + # - name: role_name + # value: "{{ stack_name }}-{{ stack_env }}-metastore-role" + # - name: assume_role_policy_document + # value: + # Version: "2012-10-17" + # Statement: + # - Effect: "Allow" + # Principal: + # AWS: + # - "arn:aws:iam::414351767826:role/unity-catalog-prod-UCMasterRole-14S5ZJVKOTYTL" + # Action: "sts:AssumeRole" + # Condition: + # StringEquals: + # sts:ExternalId: "0000" # Placeholder + # - name: description + # value: 'Unity Catalog metastore access role for ({{ stack_name }}-{{ stack_env }})' + # - name: path + # value: '/' + # - name: policies + # value: + # - PolicyName: "MetastoreS3Access" + # PolicyDocument: + # Version: "2012-10-17" + # Statement: + # - Sid: "S3MetastoreBucketAccess" + # Effect: "Allow" + # Action: + # - "s3:GetObject" + # - "s3:PutObject" + # - "s3:DeleteObject" + # - "s3:ListBucket" + # - "s3:GetBucketLocation" + # - "s3:GetLifecycleConfiguration" + # - "s3:PutLifecycleConfiguration" + # - "s3:ListBucketMultipartUploads" + # - "s3:ListMultipartUploadParts" + # - "s3:AbortMultipartUpload" + # Resource: + # - "{{ aws_s3_metastore_bucket_arn }}/*" + # - "{{ aws_s3_metastore_bucket_arn }}" + # - Sid: "AssumeRoleSelfTrust" + # Effect: "Allow" + # Action: ["sts:AssumeRole"] + # Resource: ["arn:aws:iam::{{ aws_account }}:role/{{ stack_name }}-{{ stack_env }}-metastore-role"] + # - PolicyName: "MetastoreKMSAccess" + # PolicyDocument: + # Version: "2012-10-17" + # Statement: + # - Sid: "KMSKeyAccess" + # Effect: "Allow" + # Action: + # - "kms:Decrypt" + # - "kms:Encrypt" + # - "kms:GenerateDataKey" + # - "kms:DescribeKey" + # - "kms:CreateGrant" + # - "kms:RetireGrant" + # Resource: + # - "{{ metastore_kms_key_arn }}" + # Condition: + # StringEquals: + # "kms:ViaService": "s3.{{ region }}.amazonaws.com" + # - PolicyName: "MetastoreFileEvents" + # PolicyDocument: + # Version: "2012-10-17" + # Statement: + # - Sid: "ManagedFileEventsSetupStatement" + # Effect: "Allow" + # Action: + # - "s3:GetBucketNotification" + # - "s3:PutBucketNotification" + # - "sns:ListSubscriptionsByTopic" + # - "sns:GetTopicAttributes" + # - "sns:SetTopicAttributes" + # - "sns:CreateTopic" + # - "sns:TagResource" + # - "sns:Publish" + # - "sns:Subscribe" + # - "sqs:CreateQueue" + # - "sqs:DeleteMessage" + # - "sqs:ReceiveMessage" + # - "sqs:SendMessage" + # - "sqs:GetQueueUrl" + # - "sqs:GetQueueAttributes" + # - "sqs:SetQueueAttributes" + # - "sqs:TagQueue" + # - "sqs:ChangeMessageVisibility" + # - "sqs:PurgeQueue" + # Resource: + # - "{{ aws_s3_metastore_bucket_arn }}" + # - "arn:aws:sqs:{{ region }}:{{ aws_account }}:csms-*" + # - "arn:aws:sns:{{ region }}:{{ aws_account }}:csms-*" + # - Sid: "ManagedFileEventsListStatement" + # Effect: "Allow" + # Action: ["sqs:ListQueues", "sqs:ListQueueTags", "sns:ListTopics"] + # Resource: "*" + # - Sid: "ManagedFileEventsTeardownStatement" + # Effect: "Allow" + # Action: ["sns:Unsubscribe", "sns:DeleteTopic", "sqs:DeleteQueue"] + # Resource: + # - "arn:aws:sqs:{{ region }}:{{ aws_account }}:csms-*" + # - "arn:aws:sns:{{ region }}:{{ aws_account }}:csms-*" + # - name: tags + # value: + # - Key: Purpose + # Value: "Unity Catalog Storage Credential" + # merge: + # - global_tags + # exports: + # - aws_iam_role_arn: metastore_access_role_arn + + # - name: databricks_account/metastore + # props: + # - name: name + # value: "{{ stack_name }}-{{ stack_env }}-metastore" + # - name: storage_root + # value: "s3://{{ aws_s3_metastore_bucket_name }}" + # - name: region + # value: "{{ region }}" + # exports: + # - metastore_id: databricks_metastore_id + + # - name: databricks_account/uc_storage_credentials + # props: + # - name: metastore_id + # value: "{{ databricks_metastore_id }}" + # - name: credential_info + # value: + # name: "{{ stack_name }}-{{ stack_env }}-storage-credential" + # comment: "Storage credential for {{ stack_name }} {{ stack_env }} metastore S3 access" + # read_only: false + # aws_iam_role: + # role_arn: "{{ metastore_access_role_arn }}" + # skip_validation: false + # exports: + # - credential_id: storage_credential_id + # - external_id: storage_credential_external_id + + # - name: aws/iam/update_metastore_role_trust_policy + # type: command + # props: + # - name: role_name + # value: "{{ stack_name }}-{{ stack_env }}-metastore-role" + # - name: assume_role_policy_document + # value: + # Version: "2012-10-17" + # Statement: + # - Effect: "Allow" + # Principal: + # AWS: + # - "arn:aws:iam::414351767826:role/unity-catalog-prod-UCMasterRole-14S5ZJVKOTYTL" + # - "arn:aws:iam::{{ aws_account }}:role/{{ stack_name }}-{{ stack_env }}-metastore-role" + # Action: "sts:AssumeRole" + # Condition: + # StringEquals: + # sts:ExternalId: "{{ storage_credential_external_id }}" + + # - name: databricks_account/validate_storage_credential + # type: command + # props: + # - name: credential_id + # value: "{{ storage_credential_id }}" + # - name: metastore_id + # value: "{{ databricks_metastore_id }}" + + # - name: databricks_account/external_location + # props: + # - name: metastore_id + # value: "{{ databricks_metastore_id }}" + # - name: name + # value: "{{ stack_name }}-{{ stack_env }}-metastore-location" + # - name: url + # value: "s3://{{ aws_s3_metastore_bucket_name }}/" + # - name: credential_name + # value: "{{ stack_name }}-{{ stack_env }}-storage-credential" + # - name: comment + # value: "External location for {{ stack_name }} {{ stack_env }} metastore root" + # exports: + # - external_location_id + + # - name: databricks_account/catalog + # props: + # - name: metastore_id + # value: "{{ databricks_metastore_id }}" + # - name: name + # value: "{{ stack_name }}_{{ stack_env }}" + # - name: comment + # value: "Main catalog for {{ stack_name }} {{ stack_env }} environment" + # - name: storage_root + # value: "s3://{{ aws_s3_metastore_bucket_name }}/catalogs/{{ stack_name }}_{{ stack_env }}" + # exports: + # - catalog_id + + # - name: databricks_account/metastore_assignment + # props: + # - name: workspace_id + # value: "{{ databricks_workspace_id }}" + # - name: metastore_id + # value: "{{ databricks_metastore_id }}" + # - name: default_catalog_name + # value: "{{ stack_name }}_{{ stack_env }}" + + # - name: databricks_account/catalog_workspace_binding + # props: + # - name: catalog_name + # value: "{{ stack_name }}_{{ stack_env }}" + # - name: workspace_id + # value: "{{ databricks_workspace_id }}" + + # - name: databricks_account/catalog_permissions + # props: + # - name: catalog_name + # value: "{{ stack_name }}_{{ stack_env }}" + # - name: principal + # value: "{{ databricks_group_id }}" + # - name: privileges + # value: + # - "USE_CATALOG" + # - "CREATE_SCHEMA" + # - "CREATE_TABLE" + # - "CREATE_FUNCTION" + +# ==================================================================================== +# AWS VPC Networking +# ==================================================================================== + + # - name: aws/vpc/vpc + # props: + # - name: cidr_block + # values: + # prd: + # value: "10.53.0.0/16" + # sit: + # value: "10.1.0.0/16" + # dev: + # value: "10.2.0.0/16" + # - name: tags + # value: + # - Key: Name + # Value: "{{ stack_name }}-{{ stack_env }}-vpc" + # merge: + # - global_tags + # - name: idempotency_token + # value: 019447a0-b84a-7b7f-bca5-2ee320207e51 + # exports: + # - vpc_id + + # - name: aws/vpc/nat_subnet + # file: aws/vpc/subnet.iql + # props: + # - name: availability_zone + # value: "us-east-1a" + # - name: cidr_block + # values: + # prd: + # value: "10.53.0.0/24" + # sit: + # value: "10.1.0.0/19" + # dev: + # value: "10.2.0.0/19" + # - name: tags + # value: + # - Key: Name + # Value: "{{ stack_name }}-{{ stack_env }}-nat-subnet" + # merge: + # - global_tags + # exports: + # - subnet_id: nat_subnet_id + + # - name: aws/vpc/cluster_subnet1 + # file: aws/vpc/subnet.iql + # props: + # - name: availability_zone + # value: "us-east-1b" + # - name: cidr_block + # values: + # prd: + # value: "10.53.160.0/19" + # sit: + # value: "10.1.0.0/19" + # dev: + # value: "10.2.0.0/19" + # - name: tags + # value: + # - Key: Name + # Value: "{{ stack_name }}-{{ stack_env }}-subnet-1" + # merge: + # - global_tags + # exports: + # - subnet_id: cluster_subnet1_id + + # - name: aws/vpc/cluster_subnet2 + # file: aws/vpc/subnet.iql + # props: + # - name: availability_zone + # value: "us-east-1c" + # - name: cidr_block + # values: + # prd: + # value: "10.53.192.0/19" + # sit: + # value: "10.1.32.0/19" + # dev: + # value: "10.2.32.0/19" + # - name: tags + # value: + # - Key: Name + # Value: "{{ stack_name }}-{{ stack_env }}-subnet-2" + # merge: + # - global_tags + # exports: + # - subnet_id: cluster_subnet2_id + + # - name: aws/vpc/inet_gateway + # props: + # - name: tags + # value: + # - Key: Name + # Value: "{{ stack_name }}-{{ stack_env }}-inet-gateway" + # merge: ['global_tags'] + # - name: idempotency_token + # value: 019447a5-f076-75f8-9173-092df5a66d35 + # exports: + # - internet_gateway_id + + # - name: aws/vpc/inet_gw_attachment + # props: [] + + # - name: aws/vpc/nat_route_table + # file: aws/vpc/route_table.iql + # props: + # - name: route_table_name + # value: "{{ stack_name }}-{{ stack_env }}-nat-route-table" + # - name: tags + # value: + # - Key: Name + # Value: "{{ stack_name }}-{{ stack_env }}-nat-route-table" + # merge: ['global_tags'] + # exports: + # - route_table_id: nat_route_table_id + + # - name: aws/vpc/nat_route_to_inet + # file: aws/vpc/inet_route.iql + # props: + # - name: route_table_id + # value: "{{ nat_route_table_id }}" + # exports: + # - inet_route_indentifer: nat_inet_route_indentifer + + # - name: aws/vpc/nat_subnet_rt_assn + # file: aws/vpc/subnet_rt_assn.iql + # props: + # - name: subnet_id + # value: "{{ nat_subnet_id }}" + # - name: route_table_id + # value: "{{ nat_route_table_id }}" + # - name: idempotency_token + # value: 3eaf3040-1c8e-41a6-8be6-512ccaf5ff4e + # exports: + # - route_table_assn_id: nat_subnet_rt_assn_id + + # - name: aws/vpc/private_route_table + # file: aws/vpc/route_table.iql + # props: + # - name: route_table_name + # value: "{{ stack_name }}-{{ stack_env }}-private-route-table" + # - name: tags + # value: + # - Key: Name + # Value: "{{ stack_name }}-{{ stack_env }}-private-route-table" + # merge: ['global_tags'] + # exports: + # - route_table_id: private_route_table_id + + # - name: aws/vpc/subnet_rt_assn1 + # file: aws/vpc/subnet_rt_assn.iql + # props: + # - name: route_table_id + # value: "{{ private_route_table_id }}" + # - name: subnet_id + # value: "{{ cluster_subnet1_id }}" + # - name: idempotency_token + # value: 019447aa-1c7a-775b-91dc-04db7c49f4a7 + # exports: + # - route_table_assn_id: cluster_subnet1_rt_assn_id + + # - name: aws/vpc/subnet_rt_assn2 + # file: aws/vpc/subnet_rt_assn.iql + # props: + # - name: route_table_id + # value: "{{ private_route_table_id }}" + # - name: subnet_id + # value: "{{ cluster_subnet2_id }}" + # - name: idempotency_token + # value: c19c9077-c25d-46a4-a299-7bd93d773e58 + # exports: + # - route_table_assn_id: cluster_subnet2_rt_assn_id + + # - name: aws/vpc/elastic_ip + # props: + # - name: tags + # value: + # - Key: Name + # Value: "{{ stack_name }}-{{ stack_env }}-eip" + # merge: ['global_tags'] + # - name: idempotency_token + # value: 01945908-b80d-7e51-b52c-5e93dea9cbdb + # exports: + # - eip_allocation_id + # - eip_public_id + + # - name: aws/vpc/nat_gateway + # props: + # - name: tags + # value: + # - Key: Name + # Value: "{{ stack_name }}-{{ stack_env }}-nat-gateway" + # merge: ['global_tags'] + # - name: idempotency_token + # value: 019447a5-f076-75f8-9173-092df5a66d35 + # exports: + # - nat_gateway_id + + # - name: aws/vpc/nat_inet_route + # props: + # - name: route_table_id + # value: "{{ private_route_table_id }}" + # - name: nat_gateway_id + # value: "{{ nat_gateway_id }}" + # exports: + # - nat_inet_route_indentifer + + # - name: aws/vpc/security_group + # props: + # - name: group_name + # value: "{{ stack_name }}-{{ stack_env }}-sg" + # - name: group_description + # value: "security group for {{ stack_name }} ({{ stack_env }} environment)" + # - name: tags + # value: + # - Key: Name + # Value: "{{ stack_name }}-{{ stack_env }}-sg" + # merge: ['global_tags'] + # exports: + # - security_group_id + + # - name: aws/vpc/security_group_rules + # props: + # - name: security_group_ingress + # value: + # - FromPort: 0 + # ToPort: 65535 + # SourceSecurityGroupOwnerId: "{{ aws_account }}" + # IpProtocol: tcp + # SourceSecurityGroupId: "{{ security_group_id }}" + # - FromPort: 0 + # ToPort: 65535 + # SourceSecurityGroupOwnerId: "{{ aws_account }}" + # IpProtocol: "udp" + # SourceSecurityGroupId: "{{ security_group_id }}" + # - CidrIp: "3.237.73.224/28" + # FromPort: 443 + # ToPort: 443 + # IpProtocol: "tcp" + # - CidrIp: "54.156.226.103/32" + # FromPort: 443 + # ToPort: 443 + # IpProtocol: "tcp" + # - name: security_group_egress + # value: + # - FromPort: 0 + # ToPort: 65535 + # IpProtocol: "tcp" + # DestinationSecurityGroupId: "{{ security_group_id }}" + # Description: "Allow all TCP outbound access to the same security group" + # - CidrIp: "0.0.0.0/0" + # Description: Allow all outbound traffic + # FromPort: -1 + # ToPort: -1 + # IpProtocol: "-1" + # - CidrIp: "0.0.0.0/0" + # FromPort: 3306 + # ToPort: 3306 + # IpProtocol: "tcp" + # Description: "Allow accessing the Databricks metastore" + # - FromPort: 0 + # ToPort: 65535 + # IpProtocol: "udp" + # DestinationSecurityGroupId: "{{ security_group_id }}" + # Description: "Allow all UDP outbound access to the same security group" + # - CidrIp: "0.0.0.0/0" + # FromPort: 443 + # ToPort: 443 + # IpProtocol: "tcp" + # Description: "Allow accessing Databricks infrastructure, cloud data sources, and library repositories" + + # - name: databricks_account/network + # props: + # - name: databricks_network_name + # value: "{{ stack_name }}-{{ stack_env }}-network" + # - name: subnet_ids + # value: + # - "{{ cluster_subnet1_id }}" + # - "{{ cluster_subnet2_id }}" + # - name: security_group_ids + # value: + # - "{{ security_group_id }}" + # exports: + # - databricks_network_id + +# ==================================================================================== +# AWS Storage +# ==================================================================================== + + # - name: aws/s3/workspace_bucket + # props: + # - name: bucket_name + # value: "{{ stack_name }}-{{ stack_env }}-root-bucket" + # - name: ownership_controls + # value: + # Rules: + # - ObjectOwnership: "BucketOwnerPreferred" + # - name: bucket_encryption + # value: + # ServerSideEncryptionConfiguration: + # - BucketKeyEnabled: true + # ServerSideEncryptionByDefault: + # SSEAlgorithm: "AES256" + # - name: public_access_block_configuration + # value: + # BlockPublicAcls: true + # IgnorePublicAcls: true + # BlockPublicPolicy: true + # RestrictPublicBuckets: true + # - name: versioning_configuration + # value: + # Status: "Suspended" + # exports: + # - aws_s3_workspace_bucket_name + # - aws_s3_workspace_bucket_arn + + # - name: aws/s3/workspace_bucket_policy + # props: + # - name: policy_document + # value: + # Version: "2012-10-17" + # Statement: + # - Sid: Grant Databricks Access + # Effect: Allow + # Principal: + # AWS: "arn:aws:iam::{{ databricks_aws_account_id }}:root" + # Action: + # - "s3:GetObject" + # - "s3:GetObjectVersion" + # - "s3:PutObject" + # - "s3:DeleteObject" + # - "s3:ListBucket" + # - "s3:GetBucketLocation" + # Resource: + # - "{{ aws_s3_workspace_bucket_arn }}/*" + # - "{{ aws_s3_workspace_bucket_arn }}" + + # - name: aws/vpc/vpc_endpoint + # props: + # - name: service_name + # value: "com.amazonaws.{{ region }}.s3" + # - name: vpc_endpoint_type + # value: "Gateway" + # - name: route_table_ids + # value: + # - "{{ private_route_table_id }}" + # - name: tags + # value: + # - Key: Name + # Value: "{{ stack_name }}-{{ stack_env }}-s3-vpc-endpoint" + # merge: + # - global_tags + # exports: + # - s3_gateway_endpoint_id + + # - name: databricks_account/storage_configuration + # props: + # - name: storage_configuration_name + # value: "{{ stack_name }}-{{ stack_env }}-storage" + # - name: root_bucket_info + # value: + # bucket_name: "{{ aws_s3_workspace_bucket_name }}" + # exports: + # - databricks_storage_configuration_id + +# ==================================================================================== +# DBX Workspace +# ==================================================================================== + + # - name: databricks_account/workspace + # props: + # - name: workspace_name + # value: "{{ stack_name }}-{{ stack_env }}-workspace" + # - name: network_id + # value: "{{ databricks_network_id }}" + # - name: aws_region + # value: "{{ region }}" + # - name: credentials_id + # value: "{{ databricks_credentials_id }}" + # - name: storage_configuration_id + # value: "{{ databricks_storage_configuration_id }}" + # - name: pricing_tier + # value: PREMIUM + # exports: + # - databricks_workspace_id + # - databricks_deployment_name + + # - name: databricks_account/workspace_group + # props: + # - name: display_name + # value: "{{ stack_name }}-{{ stack_env }}-workspace-admins" + # exports: + # - databricks_group_id + + # - name: databricks_account/get_users + # type: query + # props: + # - name: users + # value: + # - "javen@stackql.io" + # - "krimmer@stackql.io" + # exports: + # - databricks_workspace_group_members + + # - name: databricks_account/update_group_membership + # type: command + # props: [] + + # - name: databricks_account/workspace_permission_assignments + # props: [] + + # - name: databricks_workspace/all_purpose_cluster + # props: + # - name: cluster_name + # value: single-user-single-node-cluster + # - name: num_workers + # value: 0 + # - name: is_single_node + # value: true + # - name: kind + # value: CLASSIC_PREVIEW + # - name: spark_version + # value: 15.4.x-scala2.12 + # - name: node_type_id + # value: m7g.large + # - name: data_security_mode + # value: SINGLE_USER + # - name: runtime_engine + # value: PHOTON + # - name: single_user_name + # value: javen@stackql.io + # - name: aws_attributes + # value: + # ebs_volume_count: 1 + # ebs_volume_size: 100 + # - name: custom_tags + # description: Additional tags for cluster resources (max 45 tags) + # value: + # Provisioner: stackql + # StackName: "{{ stack_name }}" + # StackEnv: "{{ stack_env }}" + # exports: + # - databricks_cluster_id + # - databricks_cluster_state diff --git a/examples/databricks/serverless/README.md b/examples/databricks/serverless/README.md new file mode 100644 index 0000000..409894d --- /dev/null +++ b/examples/databricks/serverless/README.md @@ -0,0 +1,245 @@ +# `stackql-deploy` example project for `databricks` + +This exercise is to bootstrap a databricks / aws tenancy using `stackql-deploy`. It is an important use case for platform bootstrap and we are excited to perform it with the `stackql` toolchain. We hope you enjoy and find this valuable. Please drop us a note with your forthright opinion on this and check out our issues on github. + +## A word of caution + +Please take the greatest care in performing this exercise; it will incur expenses, as it involves creating (and destroying) resources which cost money. Please be aware that you **must** cancel your databricks subscription after completing this exercise, otherwise you will incur ongoing expenses. That is, do **not** skip the section [Cancel databricks subscription](#cancel-databricks-subsription). We strongly advise that you verify all resources are destroyed at the conclusion of this exercise. Web pages and certain behaviours may change, so please be thorough in your verification. We will keep this page up-to-date on a best effort basis only. It is very much a case of owner onus applies. + +## Manual Setup + +Dependencies: + +- aws Account Created. +- Required clickops to set up databricks on aws: + - Turn on aws Marketplace `databricks` offering, using [the aws manage subscriptions page](https://console.aws.amazon.com/marketplace/home#/subscriptions), per Figure S1. + - Follow the suggested setup flow as directed, from this page. These clickops steps are necessary at this time for initial account setup. The way I followed this, it created a workspace for me at setup, per Figure S3. We shall not use this one and rather, later on we shall dispose of it; because we do not trust auto-created resources out of hand. In the process of creating the databricks subscription, a second aws account is created. + - Copy the databricks account id from basically any web page in the databricks console. This is done by clicking on the user icon at the top RHS and then the UI provides a copy shortcut, per Fugure U1. Save this locally for later use, expanded below. + - We need the aws account id that was created for the databricks subscription. It is not exactly heralded by the web pages, nor is it actively hidden. It can be captured in a couple of places, including the databricks storage account creatted in the subscription flow, per Figure XA1. copy and save this locally for later use, expanded below. + - Create a service principal to use as a "CICD agent", using the page shown in Figure S4. + - Grant the CICD agent account admin role, using the page shown in Figure S5. + - Create a secret for the CICD agent, using the page shown in Figure S6. At the time you create this, you will need to safely store the client secret and client id, as prompted by the web page. These will be used below. +- Setup your virtual environment, from the root of this repository `cicd/setup/setup-env.sh`. + +Now, is is convenient to use environment variables for context. Note that for our example, there is only one aws account apropos, however this is not always the case for an active professional, so while `DATABRICKS_AWS_ACCOUNT_ID` is the same as `AWS_ACCOUNT_ID` here, it need not always be the case. Create a file in the path `examples/databricks/serverless/sec/env.sh` (relative to the root of this repository) with contents of the form: + +```bash +#!/usr/bin/env bash + +export AWS_REGION='us-east-1' # or wherever you want +export AWS_ACCOUNT_ID='' +export DATABRICKS_ACCOUNT_ID='' +export DATABRICKS_AWS_ACCOUNT_ID='' + +# These need to be created by clickops under [the account level user managment page](https://accounts.cloud.databricks.com/user-management). +export DATABRICKS_CLIENT_ID='' +export DATABRICKS_CLIENT_SECRET='' + +## These can be skipped if you run on [aws cloud shell](https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html). +export AWS_SECRET_ACCESS_KEY='' +export AWS_ACCESS_KEY_ID='' + +``` + +## Optional step: sanity checks with stackql + +Now, let us do some sanity checks and housekeeping with `stackql`. This is purely optional. From the root of this repository: + +``` +source examples/databricks/serverless/convenience.sh +stackql shell +``` + +This will start a `stackql` interactive shell. Here are some commands you can run (I will not place output here, that will be shared in a corresponding video): + + +```sql +registry pull databricks_account v24.12.00279; +registry pull databricks_workspace v24.12.00279; + +-- This will fail if accounts, subscription, or credentials are in error. +select account_id FROM databricks_account.provisioning.credentials WHERE account_id = ''; +select account_id, workspace_name, workspace_id, workspace_status from databricks_account.provisioning.workspaces where account_id = ''; +``` + +For extra credit, you can (asynchronously) delete the unnecessary workspace with `delete from databricks_account.provisioning.workspaces where account_id = '' and workspace_id = '';`, where you obtain the workspace id from the above query. I have noted that due to some reponse caching it takes a while to disappear from select queries (much longer than disappearance from the web page), and you may want to bounce the `stackql` session to hurry things along. This is not happening on the `stackql` side, but session bouncing forces a token refresh which can help cache busting. + +## Lifecycle management + +Time to get down to business. From the root of this repository: + +```bash +python3 -m venv myenv +source examples/databricks/serverless/convenience.sh +source venv/bin/activate +pip install stackql-deploy +``` + +> alternatively set the `AWS_REGION`, `AWS_ACCOUNT_ID`, `DATABRICKS_ACCOUNT_ID`, `DATABRICKS_AWS_ACCOUNT_ID` along with provider credentials `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `DATABRICKS_CLIENT_ID`, `DATABRICKS_CLIENT_SECRET` + +Then, do a dry run (good for catching **some** environmental issues): + +```bash +stackql-deploy build \ +examples/databricks/serverless dev \ +-e AWS_REGION=${AWS_REGION} \ +-e AWS_ACCOUNT_ID=${AWS_ACCOUNT_ID} \ +-e DATABRICKS_ACCOUNT_ID=${DATABRICKS_ACCOUNT_ID} \ +-e DATABRICKS_AWS_ACCOUNT_ID=${DATABRICKS_AWS_ACCOUNT_ID} \ +--dry-run +``` + +You will see a verbose rendition of what `stackql-deploy` intends to do. + + +Now, let use do it for real: + +```bash +stackql-deploy build \ +examples/databricks/serverless dev \ +-e AWS_REGION=${AWS_REGION} \ +-e AWS_ACCOUNT_ID=${AWS_ACCOUNT_ID} \ +-e DATABRICKS_ACCOUNT_ID=${DATABRICKS_ACCOUNT_ID} \ +-e DATABRICKS_AWS_ACCOUNT_ID=${DATABRICKS_AWS_ACCOUNT_ID} \ +--show-queries +``` + +The output is quite verbose, concludes in: + +``` +2025-02-08 12:51:25,914 - stackql-deploy - INFO - 📤 set [databricks_workspace_id] to [482604062392118] in exports +2025-02-08 12:51:25,915 - stackql-deploy - INFO - ✅ successfully deployed databricks_workspace +2025-02-08 12:51:25,915 - stackql-deploy - INFO - deployment completed in 0:04:09.603631 +🚀 build complete +``` + +Success!!! + +We can also use `stackql-deploy` to assess if our infra is shipshape: + +```bash +stackql-deploy test \ +examples/databricks/serverless dev \ +-e AWS_REGION=${AWS_REGION} \ +-e AWS_ACCOUNT_ID=${AWS_ACCOUNT_ID} \ +-e DATABRICKS_ACCOUNT_ID=${DATABRICKS_ACCOUNT_ID} \ +-e DATABRICKS_AWS_ACCOUNT_ID=${DATABRICKS_AWS_ACCOUNT_ID} \ +--show-queries +``` + +Again, the output is quite verbose, concludes in: + +``` +2025-02-08 13:15:45,821 - stackql-deploy - INFO - 📤 set [databricks_workspace_id] to [482604062392118] in exports +2025-02-08 13:15:45,821 - stackql-deploy - INFO - ✅ test passed for databricks_workspace +2025-02-08 13:15:45,821 - stackql-deploy - INFO - deployment completed in 0:02:30.255860 +🔍 tests complete (dry run: False) +``` + +Success!!! + +Now, let us teardown our `stackql-deploy` managed infra: + +```bash +stackql-deploy teardown \ +examples/databricks/serverless dev \ +-e AWS_REGION=${AWS_REGION} \ +-e AWS_ACCOUNT_ID=${AWS_ACCOUNT_ID} \ +-e DATABRICKS_ACCOUNT_ID=${DATABRICKS_ACCOUNT_ID} \ +-e DATABRICKS_AWS_ACCOUNT_ID=${DATABRICKS_AWS_ACCOUNT_ID} \ +--show-queries +``` + +Takes its time, again verbose, concludes in: + +``` +2025-02-08 13:24:17,941 - stackql-deploy - INFO - ✅ successfully deleted AWS_iam_cross_account_role +2025-02-08 13:24:17,942 - stackql-deploy - INFO - deployment completed in 0:03:21.191788 +🚧 teardown complete (dry run: False) +``` + +Success!!! + +## Optional step: verify destruction with stackql + +Now, let us do some sanity checks and housekeeping with `stackql`. This is purely optional. From the root of this repository: + +``` + +source examples/databricks/serverless/convenience.sh + +stackql shell + +``` + +This will start a `stackql` interactive shell. Here are some commands you can run (I will not place output here): + + +```sql + +registry pull databricks_account v24.12.00279; + +registry pull databricks_workspace v24.12.00279; + + + +select account_id, workspace_name, workspace_id, workspace_status from databricks_account.provisioning.workspaces where account_id = ''; + +``` + +## Cancel databricks subsription + +This is **very** important. + +Go to [the aws Marketplace manage subscriptions page](https://console.aws.amazon.com/marketplace/home#/subscriptions), navigate to databricks and then cancel the subscription. + +## Figures + + +![Create aws databricks subscription](/examples/databricks/serverless/assets/create-aws-databricks-subscription.png) + +**Figure S1**: Create aws databricks subscription. + +--- + +![Awaiting aws databricks subscription resources](/examples/databricks/serverless/assets/awaiting-subscription-resources.png) + +**Figure S2**: Awaiting aws databricks subscription resources. + +--- + +![Auto provisioned workspace](/examples/databricks/serverless/assets/auto-provisioned-worskpace.png) + +**Figure S3**: Auto provisioned workspace. + +--- + +![Capture databricks account id](/examples/databricks/serverless/assets/capture-databricks-account-id.png) + +**Figure U1**: Capture databricks account id. + +--- + +![Capture cross databricks aws account id](/examples/databricks/serverless/assets/capture-cross-databricks-aws-account-id.png) + +**Figure XA1**: Capture cross databricks aws account id. + +--- + +![Create CICD agent](/examples/databricks/serverless/assets/create-cicd-agent.png) + +**Figure S4**: Create CICD agent. + +--- + +![Grant account admin to CICD agent](/examples/databricks/serverless/assets/grant-account-admin-cicd-agent.png) + +**Figure S5**: Grant account admin to CICD agent. + +--- + +![Generate secret for CICD agent](/examples/databricks/serverless/assets/generate-secret-ui.png) + +**Figure S6**: Generate secret for CICD agent. + +--- diff --git a/examples/databricks/serverless/assets/auto-provisioned-worskpace.png b/examples/databricks/serverless/assets/auto-provisioned-worskpace.png new file mode 100644 index 0000000..a9fbcb6 Binary files /dev/null and b/examples/databricks/serverless/assets/auto-provisioned-worskpace.png differ diff --git a/examples/databricks/serverless/assets/awaiting-subscription-resources.png b/examples/databricks/serverless/assets/awaiting-subscription-resources.png new file mode 100644 index 0000000..9505100 Binary files /dev/null and b/examples/databricks/serverless/assets/awaiting-subscription-resources.png differ diff --git a/examples/databricks/serverless/assets/capture-cross-databricks-aws-account-id.png b/examples/databricks/serverless/assets/capture-cross-databricks-aws-account-id.png new file mode 100644 index 0000000..6fdb3c4 Binary files /dev/null and b/examples/databricks/serverless/assets/capture-cross-databricks-aws-account-id.png differ diff --git a/examples/databricks/serverless/assets/capture-databricks-account-id.png b/examples/databricks/serverless/assets/capture-databricks-account-id.png new file mode 100644 index 0000000..c890299 Binary files /dev/null and b/examples/databricks/serverless/assets/capture-databricks-account-id.png differ diff --git a/examples/databricks/serverless/assets/create-aws-databricks-subscription.png b/examples/databricks/serverless/assets/create-aws-databricks-subscription.png new file mode 100644 index 0000000..b5c9e7f Binary files /dev/null and b/examples/databricks/serverless/assets/create-aws-databricks-subscription.png differ diff --git a/examples/databricks/serverless/assets/create-cicd-agent.png b/examples/databricks/serverless/assets/create-cicd-agent.png new file mode 100644 index 0000000..faf1643 Binary files /dev/null and b/examples/databricks/serverless/assets/create-cicd-agent.png differ diff --git a/examples/databricks/serverless/assets/generate-secret-ui.png b/examples/databricks/serverless/assets/generate-secret-ui.png new file mode 100644 index 0000000..daf4f23 Binary files /dev/null and b/examples/databricks/serverless/assets/generate-secret-ui.png differ diff --git a/examples/databricks/serverless/assets/grant-account-admin-cicd-agent.png b/examples/databricks/serverless/assets/grant-account-admin-cicd-agent.png new file mode 100644 index 0000000..f50e0c0 Binary files /dev/null and b/examples/databricks/serverless/assets/grant-account-admin-cicd-agent.png differ diff --git a/examples/databricks/serverless/convenience.sh b/examples/databricks/serverless/convenience.sh new file mode 100644 index 0000000..290ef42 --- /dev/null +++ b/examples/databricks/serverless/convenience.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +export REPOSITORY_ROOT="$(realpath $CURRENT_DIR/../../..)" + + +if [ -f "${REPOSITORY_ROOT}/examples/databricks/serverless/sec/env.sh" ]; +then + source "${REPOSITORY_ROOT}/examples/databricks/serverless/sec/env.sh" +fi + +if [ "${AWS_REGION}" = "" ]; +then + AWS_REGION='us-east-1' +fi + +if [ "${AWS_ACCOUNT_ID}" = "" ]; +then + echo "AWS_ACCOUNT_ID must be set" >&2 + exit 1s +fi + +if [ "${DATABRICKS_ACCOUNT_ID}" = "" ]; +then + echo "DATABRICKS_ACCOUNT_ID must be set" >&2 + exit 1 +fi + +if [ "${DATABRICKS_AWS_ACCOUNT_ID}" = "" ]; +then + echo "DATABRICKS_AWS_ACCOUNT_ID must be set" >&2 + exit 1 +fi + +if [ "${DATABRICKS_CLIENT_ID}" = "" ]; +then + echo "DATABRICKS_CLIENT_ID must be set" >&2 + exit 1 +fi + +if [ "${DATABRICKS_CLIENT_SECRET}" = "" ]; +then + echo "DATABRICKS_CLIENT_SECRET must be set" >&2 + exit 1 +fi + +if [ "${AWS_SECRET_ACCESS_KEY}" = "" ]; +then + echo "AWS_SECRET_ACCESS_KEY must be set" >&2 + exit 1 +fi + +if [ "${AWS_ACCESS_KEY_ID}" = "" ]; +then + echo "AWS_ACCESS_KEY_ID must be set" >&2 + exit 1 +fi + +export AWS_REGION +export AWS_ACCOUNT_ID +export DATABRICKS_ACCOUNT_ID +export DATABRICKS_AWS_ACCOUNT_ID + +export DATABRICKS_CLIENT_ID +export DATABRICKS_CLIENT_SECRET + + +export AWS_SECRET_ACCESS_KEY +export AWS_ACCESS_KEY_ID + + diff --git a/examples/databricks/serverless/resources/aws/DELETE_kms/metastore_key.iql b/examples/databricks/serverless/resources/aws/DELETE_kms/metastore_key.iql new file mode 100644 index 0000000..2669e91 --- /dev/null +++ b/examples/databricks/serverless/resources/aws/DELETE_kms/metastore_key.iql @@ -0,0 +1,50 @@ +/*+ exists */ +SELECT COUNT(*) as count FROM +( + SELECT key_id, + json_group_object(tag_key, tag_value) as tags + FROM aws.kms.key_tags + GROUP BY key_id + HAVING json_extract(tags, '$.Provisioner') = 'stackql' + AND json_extract(tags, '$.StackName') = '{{ stack_name }}' + AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' + AND json_extract(tags, '$.Purpose') = 'UC Metastore Encryption' +) t + +/*+ create */ +INSERT INTO aws.kms.keys ( + Description, + KeyPolicy, + Tags, + region +) +SELECT +'{{ description }}', +'{{ key_policy }}', +'{{ tags }}', +'{{ region }}'; + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( + SELECT key_id, + json_group_object(tag_key, tag_value) as tags + FROM aws.kms.key_tags + WHERE description = '{{ description }}' + GROUP BY key_id + HAVING json_extract(tags, '$.Provisioner') = 'stackql' + AND json_extract(tags, '$.StackName') = '{{ stack_name }}' + AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' + AND json_extract(tags, '$.Purpose') = 'UC Metastore Encryption' +) t + +/*+ exports, retries=3, retry_delay=5 */ +SELECT key_id, arn as key_arn, +json_group_object(tag_key, tag_value) as tags +FROM aws.kms.key_tags +WHERE description = '{{ description }}' +GROUP BY key_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +AND json_extract(tags, '$.Purpose') = 'UC Metastore Encryption' diff --git a/examples/databricks/serverless/resources/aws/DELETE_vpc/elastic_ip.iql b/examples/databricks/serverless/resources/aws/DELETE_vpc/elastic_ip.iql new file mode 100644 index 0000000..d4dd982 --- /dev/null +++ b/examples/databricks/serverless/resources/aws/DELETE_vpc/elastic_ip.iql @@ -0,0 +1,56 @@ +/*+ exists */ +SELECT COUNT(*) as count FROM +( +SELECT allocation_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.eip_tags +WHERE region = '{{ region }}' +GROUP BY allocation_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t + +/*+ create */ +INSERT INTO aws.ec2.eips ( + NetworkBorderGroup, + Tags, + ClientToken, + region +) +SELECT +'{{ region }}', +'{{ tags }}', +'{{ idempotency_token }}', +'{{ region }}' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( +SELECT allocation_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.eip_tags +WHERE region = '{{ region }}' +GROUP BY allocation_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t + +/*+ exports, retries=3, retry_delay=5 */ +SELECT allocation_id as eip_allocation_id, public_ip as eip_public_id FROM +( +SELECT allocation_id, public_ip, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.eip_tags +WHERE region = '{{ region }}' +GROUP BY allocation_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t + +/*+ delete */ +DELETE FROM aws.ec2.eips +WHERE data__Identifier = '{{ eip_public_id }}|{{ eip_allocation_id}}' +AND region = '{{ region }}' diff --git a/examples/databricks/serverless/resources/aws/DELETE_vpc/get_main_route_table_id.iql b/examples/databricks/serverless/resources/aws/DELETE_vpc/get_main_route_table_id.iql new file mode 100644 index 0000000..7679dd2 --- /dev/null +++ b/examples/databricks/serverless/resources/aws/DELETE_vpc/get_main_route_table_id.iql @@ -0,0 +1,6 @@ +/*+ exports, retries=3, retry_delay=5 */ +SELECT +route_table_id as main_route_table_id +FROM aws.ec2.route_tables +WHERE region = '{{ region }}' +AND vpc_id = '{{ vpc_id }}'; \ No newline at end of file diff --git a/examples/databricks/serverless/resources/aws/DELETE_vpc/inet_gateway.iql b/examples/databricks/serverless/resources/aws/DELETE_vpc/inet_gateway.iql new file mode 100644 index 0000000..dc42032 --- /dev/null +++ b/examples/databricks/serverless/resources/aws/DELETE_vpc/inet_gateway.iql @@ -0,0 +1,54 @@ +/*+ exists */ +SELECT COUNT(*) as count FROM +( +SELECT internet_gateway_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.internet_gateway_tags +WHERE region = '{{ region }}' +GROUP BY internet_gateway_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t + +/*+ create */ +INSERT INTO aws.ec2.internet_gateways ( + Tags, + ClientToken, + region +) +SELECT +'{{ tags }}', +'{{ idempotency_token }}', +'{{ region }}'; + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( +SELECT internet_gateway_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.internet_gateway_tags +WHERE region = '{{ region }}' +GROUP BY internet_gateway_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t + +/*+ exports, retries=3, retry_delay=5 */ +SELECT internet_gateway_id FROM +( +SELECT internet_gateway_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.internet_gateway_tags +WHERE region = '{{ region }}' +GROUP BY internet_gateway_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t; + +/*+ delete */ +DELETE FROM aws.ec2.internet_gateways +WHERE data__Identifier = '{{ internet_gateway_id }}' +AND region = '{{ region }}'; diff --git a/examples/databricks/serverless/resources/aws/DELETE_vpc/inet_gw_attachment.iql b/examples/databricks/serverless/resources/aws/DELETE_vpc/inet_gw_attachment.iql new file mode 100644 index 0000000..31b9d25 --- /dev/null +++ b/examples/databricks/serverless/resources/aws/DELETE_vpc/inet_gw_attachment.iql @@ -0,0 +1,39 @@ +/*+ exists */ +SELECT COUNT(*) as count FROM +( +SELECT +attachment_type, +vpc_id +FROM aws.ec2.vpc_gateway_attachments +WHERE region = '{{ region }}' +AND internet_gateway_id = '{{ internet_gateway_id }}' +AND vpc_id = '{{ vpc_id }}' +) t + +/*+ create */ +INSERT INTO aws.ec2.vpc_gateway_attachments ( + InternetGatewayId, + VpcId, + region +) +SELECT + '{{ internet_gateway_id }}', + '{{ vpc_id }}', + '{{ region }}'; + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( +SELECT +attachment_type, +vpc_id +FROM aws.ec2.vpc_gateway_attachments +WHERE region = '{{ region }}' +AND internet_gateway_id = '{{ internet_gateway_id }}' +AND vpc_id = '{{ vpc_id }}' +) t + +/*+ delete */ +DELETE FROM aws.ec2.vpc_gateway_attachments +WHERE data__Identifier = 'IGW|{{ vpc_id }}' +AND region = '{{ region }}'; \ No newline at end of file diff --git a/examples/databricks/serverless/resources/aws/DELETE_vpc/inet_route.iql b/examples/databricks/serverless/resources/aws/DELETE_vpc/inet_route.iql new file mode 100644 index 0000000..b46cc0f --- /dev/null +++ b/examples/databricks/serverless/resources/aws/DELETE_vpc/inet_route.iql @@ -0,0 +1,41 @@ +/*+ exists */ +SELECT COUNT(*) as count FROM +( +SELECT data__Identifier +FROM aws.ec2.routes +WHERE region = '{{ region }}' +AND data__Identifier = '{{ route_table_id }}|0.0.0.0/0' +) t + +/*+ create */ +INSERT INTO aws.ec2.routes ( + DestinationCidrBlock, + GatewayId, + RouteTableId, + region +) +SELECT + '0.0.0.0/0', + '{{ internet_gateway_id }}', + '{{ route_table_id }}', + '{{ region }}'; + +/*+ statecheck, retries=5, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( +SELECT data__Identifier +FROM aws.ec2.routes +WHERE region = '{{ region }}' +AND data__Identifier = '{{ route_table_id }}|0.0.0.0/0' +) t + +/*+ exports, retries=3, retry_delay=5 */ +SELECT data__Identifier as inet_route_indentifer +FROM aws.ec2.routes +WHERE region = '{{ region }}' +AND data__Identifier = '{{ route_table_id }}|0.0.0.0/0'; + +/*+ delete */ +DELETE FROM aws.ec2.routes +WHERE data__Identifier = '{{ inet_route_indentifer }}' +AND region = '{{ region }}'; \ No newline at end of file diff --git a/examples/databricks/serverless/resources/aws/DELETE_vpc/nat_gateway.iql b/examples/databricks/serverless/resources/aws/DELETE_vpc/nat_gateway.iql new file mode 100644 index 0000000..081fbd2 --- /dev/null +++ b/examples/databricks/serverless/resources/aws/DELETE_vpc/nat_gateway.iql @@ -0,0 +1,53 @@ +/*+ exists */ +SELECT COUNT(*) as count FROM +( +SELECT nat_gateway_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.nat_gateway_tags +WHERE region = '{{ region }}' +GROUP BY allocation_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t + +/*+ create */ +INSERT INTO aws.ec2.nat_gateways ( + AllocationId, + SubnetId, + Tags, + region +) +SELECT + '{{ eip_allocation_id }}', + '{{ nat_subnet_id }}', + '{{ tags }}', + '{{ region }}'; + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( +SELECT nat_gateway_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.nat_gateway_tags +WHERE region = '{{ region }}' +GROUP BY allocation_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t + +/*+ exports, retries=3, retry_delay=5 */ +SELECT nat_gateway_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.nat_gateway_tags +WHERE region = '{{ region }}' +GROUP BY allocation_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' + +/*+ delete */ +DELETE FROM aws.ec2.nat_gateways +WHERE data__Identifier = '{{ nat_gateway_id }}' +AND region = '{{ region }}'; \ No newline at end of file diff --git a/examples/databricks/serverless/resources/aws/DELETE_vpc/nat_inet_route.iql b/examples/databricks/serverless/resources/aws/DELETE_vpc/nat_inet_route.iql new file mode 100644 index 0000000..9e750f6 --- /dev/null +++ b/examples/databricks/serverless/resources/aws/DELETE_vpc/nat_inet_route.iql @@ -0,0 +1,41 @@ +/*+ exists */ +SELECT COUNT(*) as count FROM +( +SELECT data__Identifier +FROM aws.ec2.routes +WHERE region = '{{ region }}' +AND data__Identifier = '{{ route_table_id }}|0.0.0.0/0' +) t + +/*+ create */ +INSERT INTO aws.ec2.routes ( + DestinationCidrBlock, + NatGatewayId, + RouteTableId, + region +) +SELECT + '0.0.0.0/0', + '{{ nat_gateway_id }}', + '{{ route_table_id }}', + '{{ region }}'; + +/*+ statecheck, retries=5, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( +SELECT data__Identifier +FROM aws.ec2.routes +WHERE region = '{{ region }}' +AND data__Identifier = '{{ route_table_id }}|0.0.0.0/0' +) t + +/*+ exports, retries=3, retry_delay=5 */ +SELECT data__Identifier as nat_inet_route_indentifer +FROM aws.ec2.routes +WHERE region = '{{ region }}' +AND data__Identifier = '{{ route_table_id }}|0.0.0.0/0'; + +/*+ delete */ +DELETE FROM aws.ec2.routes +WHERE data__Identifier = '{{ inet_route_indentifer }}' +AND region = '{{ region }}'; \ No newline at end of file diff --git a/examples/databricks/serverless/resources/aws/DELETE_vpc/route_table.iql b/examples/databricks/serverless/resources/aws/DELETE_vpc/route_table.iql new file mode 100644 index 0000000..7b0aa76 --- /dev/null +++ b/examples/databricks/serverless/resources/aws/DELETE_vpc/route_table.iql @@ -0,0 +1,54 @@ +/*+ exists */ +SELECT COUNT(*) as count FROM +( +SELECT route_table_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.route_table_tags +WHERE region = '{{ region }}' +GROUP BY route_table_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +AND json_extract(tags, '$.Name') = '{{ route_table_name }}' +) t + +/*+ create */ +INSERT INTO aws.ec2.route_tables ( + VpcId, + Tags, + region +) +SELECT + '{{ vpc_id }}', + '{{ tags }}', + '{{ region }}'; + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( +SELECT route_table_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.route_table_tags +WHERE region = '{{ region }}' +GROUP BY route_table_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +AND json_extract(tags, '$.Name') = '{{ route_table_name }}' +) t + +/*+ exports, retries=3, retry_delay=5 */ +SELECT route_table_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.route_table_tags +WHERE region = '{{ region }}' +GROUP BY route_table_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +AND json_extract(tags, '$.Name') = '{{ route_table_name }}' + +/*+ delete */ +DELETE FROM aws.ec2.route_tables +WHERE data__Identifier = '{{ route_table_id }}' +AND region = '{{ region }}'; \ No newline at end of file diff --git a/examples/databricks/serverless/resources/aws/DELETE_vpc/security_group.iql b/examples/databricks/serverless/resources/aws/DELETE_vpc/security_group.iql new file mode 100644 index 0000000..15e9061 --- /dev/null +++ b/examples/databricks/serverless/resources/aws/DELETE_vpc/security_group.iql @@ -0,0 +1,41 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM aws.ec2.security_groups +WHERE region = '{{ region }}' +AND vpc_id = '{{ vpc_id }}' +AND group_name = '{{ group_name }}' + +/*+ create */ +INSERT INTO aws.ec2.security_groups ( + GroupName, + GroupDescription, + VpcId, + Tags, + region +) +SELECT + '{{ group_name }}', + '{{ group_description }}', + '{{ vpc_id }}', + '{{ tags }}', + '{{ region }}'; + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count +FROM aws.ec2.security_groups +WHERE region = '{{ region }}' +AND vpc_id = '{{ vpc_id }}' +AND group_name = '{{ group_name }}' +AND group_description = '{{ group_description }}' + +/*+ exports, retries=3, retry_delay=5 */ +SELECT group_id as security_group_id +FROM aws.ec2.security_groups +WHERE region = '{{ region }}' +AND vpc_id = '{{ vpc_id }}' +AND group_name = '{{ group_name }}' + +/*+ delete */ +DELETE FROM aws.ec2.security_groups +WHERE data__Identifier = '{{ security_group_id }}' +AND region = '{{ region }}'; \ No newline at end of file diff --git a/examples/databricks/serverless/resources/aws/DELETE_vpc/security_group_rules.iql b/examples/databricks/serverless/resources/aws/DELETE_vpc/security_group_rules.iql new file mode 100644 index 0000000..62f79eb --- /dev/null +++ b/examples/databricks/serverless/resources/aws/DELETE_vpc/security_group_rules.iql @@ -0,0 +1,27 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM aws.ec2.security_groups +WHERE region = '{{ region }}' +AND data__Identifier = '{{ security_group_id }}' + +/*+ createorupdate */ +update aws.ec2.security_groups +set data__PatchDocument = string('{{ { + "SecurityGroupIngress": security_group_ingress, + "SecurityGroupEgress": security_group_egress + } | generate_patch_document }}') +WHERE region = '{{ region }}' +AND data__Identifier = '{{ security_group_id }}' + +/*+ statecheck, retries=5, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( + SELECT + JSON_EQUAL(security_group_ingress, '{{ security_group_ingress }}') as ingress_test, + JSON_EQUAL(security_group_egress, '{{ security_group_egress }}') as egress_test + FROM aws.ec2.security_groups + WHERE region = '{{ region }}' + AND data__Identifier = '{{ security_group_id }}' + AND ingress_test = 1 + AND egress_test = 1 +) t; diff --git a/examples/databricks/serverless/resources/aws/DELETE_vpc/subnet.iql b/examples/databricks/serverless/resources/aws/DELETE_vpc/subnet.iql new file mode 100644 index 0000000..83667f5 --- /dev/null +++ b/examples/databricks/serverless/resources/aws/DELETE_vpc/subnet.iql @@ -0,0 +1,43 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM aws.ec2.subnets +WHERE region = '{{ region }}' +AND vpc_id = '{{ vpc_id }}' +AND cidr_block = '{{ cidr_block }}' + +/*+ create */ +INSERT INTO aws.ec2.subnets ( + VpcId, + CidrBlock, + AvailabilityZone, + MapPublicIpOnLaunch, + Tags, + region +) +SELECT + '{{ vpc_id }}', + '{{ cidr_block }}', + '{{ availability_zone }}', + false, + '{{ tags }}', + '{{ region }}'; + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count +FROM aws.ec2.subnets +WHERE region = '{{ region }}' +AND vpc_id = '{{ vpc_id }}' +AND cidr_block = '{{ cidr_block }}' +AND availability_zone = '{{ availability_zone }}'; + +/*+ exports, retries=3, retry_delay=5 */ +SELECT subnet_id +FROM aws.ec2.subnets +WHERE region = '{{ region }}' +AND vpc_id = '{{ vpc_id }}' +AND cidr_block = '{{ cidr_block }}'; + +/*+ delete */ +DELETE FROM aws.ec2.subnets +WHERE data__Identifier = '{{ subnet_id }}' +AND region = '{{ region }}'; \ No newline at end of file diff --git a/examples/databricks/serverless/resources/aws/DELETE_vpc/subnet_rt_assn.iql b/examples/databricks/serverless/resources/aws/DELETE_vpc/subnet_rt_assn.iql new file mode 100644 index 0000000..d0c8b33 --- /dev/null +++ b/examples/databricks/serverless/resources/aws/DELETE_vpc/subnet_rt_assn.iql @@ -0,0 +1,34 @@ +/*+ exists */ +select regexp_like(associationSet, '.*{{ subnet_id }}.*') as count from +aws.ec2_native.route_tables where region = '{{ region }}' +and routeTableId = '{{ route_table_id }}' + +/*+ create */ +INSERT INTO aws.ec2.subnet_route_table_associations ( + RouteTableId, + SubnetId, + ClientToken, + region +) +SELECT + '{{ route_table_id }}', + '{{ subnet_id }}', + '{{ idempotency_token }}', + '{{ region }}'; + +/*+ statecheck, retries=5, retry_delay=5 */ +select regexp_like(associationSet, '.*{{ subnet_id }}.*') as count from +aws.ec2_native.route_tables where region = '{{ region }}' +and routeTableId = '{{ route_table_id }}' + +/*+ exports, retries=5, retry_delay=5 */ +SELECT id as route_table_assn_id +FROM aws.ec2.subnet_route_table_associations +WHERE region = '{{ region }}' +AND route_table_id = '{{ route_table_id }}' +AND subnet_id = '{{ subnet_id }}'; + +/*+ delete */ +DELETE FROM aws.ec2.subnet_route_table_associations +WHERE data__Identifier = '{{ route_table_assn_id }}' +AND region = '{{ region }}'; \ No newline at end of file diff --git a/examples/databricks/serverless/resources/aws/DELETE_vpc/tag_main_vpc_route_table.iql b/examples/databricks/serverless/resources/aws/DELETE_vpc/tag_main_vpc_route_table.iql new file mode 100644 index 0000000..cc03c2a --- /dev/null +++ b/examples/databricks/serverless/resources/aws/DELETE_vpc/tag_main_vpc_route_table.iql @@ -0,0 +1,7 @@ +/*+ command */ +update aws.ec2.route_tables +set data__PatchDocument = string('{{ { + "Tags": tags + } | generate_patch_document }}') +WHERE region = '{{ region }}' +AND data__Identifier = '{{ main_route_table_id }}'; \ No newline at end of file diff --git a/examples/databricks/serverless/resources/aws/DELETE_vpc/vpc.iql b/examples/databricks/serverless/resources/aws/DELETE_vpc/vpc.iql new file mode 100644 index 0000000..56e1c54 --- /dev/null +++ b/examples/databricks/serverless/resources/aws/DELETE_vpc/vpc.iql @@ -0,0 +1,60 @@ +/*+ exists */ +SELECT COUNT(*) as count FROM +( + SELECT vpc_id, + json_group_object(tag_key, tag_value) as tags + FROM aws.ec2.vpc_tags + WHERE region = '{{ region }}' + AND cidr_block = '{{ cidr_block }}' + GROUP BY vpc_id + HAVING json_extract(tags, '$.Provisioner') = 'stackql' + AND json_extract(tags, '$.StackName') = '{{ stack_name }}' + AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t + +/*+ create */ +INSERT INTO aws.ec2.vpcs ( + CidrBlock, + Tags, + EnableDnsSupport, + EnableDnsHostnames, + ClientToken, + region +) +SELECT + '{{ cidr_block }}', + '{{ tags }}', + true, + true, + '{{ idempotency_token }}', + '{{ region }}' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( + SELECT vpc_id, + json_group_object(tag_key, tag_value) as tags + FROM aws.ec2.vpc_tags + WHERE region = '{{ region }}' + AND cidr_block = '{{ cidr_block }}' + GROUP BY vpc_id + HAVING json_extract(tags, '$.Provisioner') = 'stackql' + AND json_extract(tags, '$.StackName') = '{{ stack_name }}' + AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t + +/*+ exports, retries=3, retry_delay=5 */ +SELECT vpc_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.vpc_tags +WHERE region = '{{ region }}' +AND cidr_block = '{{ cidr_block }}' +GROUP BY vpc_id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' + +/*+ delete */ +DELETE FROM aws.ec2.vpcs +WHERE data__Identifier = '{{ vpc_id}}' +AND region = '{{ region }}'; \ No newline at end of file diff --git a/examples/databricks/serverless/resources/aws/DELETE_vpc/vpc_endpoint.iql b/examples/databricks/serverless/resources/aws/DELETE_vpc/vpc_endpoint.iql new file mode 100644 index 0000000..d40f522 --- /dev/null +++ b/examples/databricks/serverless/resources/aws/DELETE_vpc/vpc_endpoint.iql @@ -0,0 +1,60 @@ +/*+ exists */ +SELECT COUNT(*) as count FROM +( + SELECT id, + json_group_object(tag_key, tag_value) as tags + FROM aws.ec2.vpc_endpoint_tags + WHERE region = '{{ region }}' + AND service_name = '{{ service_name }}' + GROUP BY id + HAVING json_extract(tags, '$.Provisioner') = 'stackql' + AND json_extract(tags, '$.StackName') = '{{ stack_name }}' + AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t; + +/*+ create */ +INSERT INTO aws.ec2.vpc_endpoints ( + ServiceName, + VpcEndpointType, + VpcId, + RouteTableIds, + Tags, + region +) +SELECT + '{{ service_name }}', + '{{ vpc_endpoint_type }}', + '{{ vpc_id }}', + '{{ route_table_ids }}', + '{{ tags }}', + '{{ region }}'; + +/*+ statecheck, retries=5, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( + SELECT id, + json_group_object(tag_key, tag_value) as tags + FROM aws.ec2.vpc_endpoint_tags + WHERE region = '{{ region }}' + AND service_name = '{{ service_name }}' + GROUP BY id + HAVING json_extract(tags, '$.Provisioner') = 'stackql' + AND json_extract(tags, '$.StackName') = '{{ stack_name }}' + AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}' +) t; + +/*+ exports, retries=3, retry_delay=5 */ +SELECT id as s3_gateway_endpoint_id, +json_group_object(tag_key, tag_value) as tags +FROM aws.ec2.vpc_endpoint_tags +WHERE region = '{{ region }}' +AND service_name = '{{ service_name }}' +GROUP BY id +HAVING json_extract(tags, '$.Provisioner') = 'stackql' +AND json_extract(tags, '$.StackName') = '{{ stack_name }}' +AND json_extract(tags, '$.StackEnv') = '{{ stack_env }}'; + +/*+ delete */ +DELETE FROM aws.ec2.vpc_endpoints +WHERE data__Identifier = 's3_gateway_endpoint_id' +AND region = 'us-east-1'; \ No newline at end of file diff --git a/examples/databricks/serverless/resources/aws/iam/iam_role.iql b/examples/databricks/serverless/resources/aws/iam/iam_role.iql new file mode 100644 index 0000000..ee628c4 --- /dev/null +++ b/examples/databricks/serverless/resources/aws/iam/iam_role.iql @@ -0,0 +1,60 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM aws.iam.roles +WHERE data__Identifier = '{{ role_name }}' + +/*+ create */ +INSERT INTO aws.iam.roles ( + RoleName, + Description, + Path, + AssumeRolePolicyDocument, + Policies, + Tags, + region +) +SELECT +'{{ role_name }}', +'{{ description }}', +'{{ path }}', +'{{ assume_role_policy_document }}', +'{{ policies }}', +'{{ global_tags }}', +'us-east-1' + +/*+ update */ +update aws.iam.roles +set data__PatchDocument = string('{{ { + "Description": description, + "Path": path, + "AssumeRolePolicyDocument": assume_role_policy_document, + "Policies": policies, + "Tags": global_tags + } | generate_patch_document }}') +WHERE data__Identifier = '{{ role_name }}' +AND region = 'us-east-1'; + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count FROM ( + SELECT + max_session_duration, + path, + AWS_POLICY_EQUAL(assume_role_policy_document, '{{ assume_role_policy_document }}') as test_assume_role_policy_doc, + AWS_POLICY_EQUAL(policies, '{{ policies }}') as test_policies + FROM aws.iam.roles + WHERE data__Identifier = '{{ role_name }}')t +WHERE test_assume_role_policy_doc = 1 +AND test_policies = 1 +AND path = '{{ path }}'; + +/*+ exports, retries=3, retry_delay=5 */ +SELECT +'{{ role_name }}' as aws_iam_role_name, +arn as aws_iam_role_arn +FROM aws.iam.roles +WHERE data__Identifier = '{{ role_name }}' + +/*+ delete */ +DELETE FROM aws.iam.roles +WHERE data__Identifier = '{{ role_name }}' +AND region = 'us-east-1' \ No newline at end of file diff --git a/examples/databricks/serverless/resources/aws/iam/update_metastore_access_role.iql b/examples/databricks/serverless/resources/aws/iam/update_metastore_access_role.iql new file mode 100644 index 0000000..2339232 --- /dev/null +++ b/examples/databricks/serverless/resources/aws/iam/update_metastore_access_role.iql @@ -0,0 +1,7 @@ +/*+ command */ +update aws.iam.roles +set data__PatchDocument = string('{{ { + "AssumeRolePolicyDocument": assume_role_policy_document + } | generate_patch_document }}') +WHERE data__Identifier = '{{ role_name }}' +AND region = 'us-east-1'; \ No newline at end of file diff --git a/examples/databricks/serverless/resources/aws/s3/s3_bucket.iql b/examples/databricks/serverless/resources/aws/s3/s3_bucket.iql new file mode 100644 index 0000000..c6032c6 --- /dev/null +++ b/examples/databricks/serverless/resources/aws/s3/s3_bucket.iql @@ -0,0 +1,61 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM aws.s3.buckets +WHERE region = '{{ region }}' +AND data__Identifier = '{{ bucket_name }}' + +/*+ create */ +INSERT INTO aws.s3.buckets ( + BucketName, + OwnershipControls, + BucketEncryption, + PublicAccessBlockConfiguration, + VersioningConfiguration, + Tags, + region +) +SELECT + '{{ bucket_name }}', + '{{ ownership_controls }}', + '{{ bucket_encryption }}', + '{{ public_access_block_configuration }}', + '{{ versioning_configuration }}', + '{{ global_tags }}', + '{{ region }}' + +/*+ update */ +update aws.s3.buckets +set data__PatchDocument = string('{{ { + "OwnershipControls": ownership_controls, + "BucketEncryption": bucket_encryption, + "PublicAccessBlockConfiguration": public_access_block_configuration, + "VersioningConfiguration": versioning_configuration, + "Tags": global_tags + } | generate_patch_document }}') +WHERE +region = '{{ region }}' +AND data__Identifier = '{{ bucket_name }}' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count FROM ( + SELECT + JSON_EQUAL(ownership_controls, '{{ ownership_controls }}') as test_ownership_controls, + JSON_EQUAL(bucket_encryption, '{{ bucket_encryption }}') as test_encryption, + JSON_EQUAL(public_access_block_configuration, '{{ public_access_block_configuration }}') as test_public_access_block_configuration, + JSON_EQUAL(versioning_configuration, '{{ versioning_configuration }}') as test_versioning_configuration + FROM aws.s3.buckets + WHERE region = '{{ region }}' + AND data__Identifier = '{{ bucket_name }}' +)t +WHERE test_ownership_controls = 1 +AND test_encryption = 1 +AND test_public_access_block_configuration = 1 +AND test_versioning_configuration = 1 + +/*+ exports, retries=3, retry_delay=5 */ +SELECT +arn, +bucket_name +FROM aws.s3.buckets +WHERE region = '{{ region }}' +AND data__Identifier = '{{ bucket_name }}' diff --git a/examples/databricks/serverless/resources/aws/s3/s3_bucket_policy.iql b/examples/databricks/serverless/resources/aws/s3/s3_bucket_policy.iql new file mode 100644 index 0000000..cead151 --- /dev/null +++ b/examples/databricks/serverless/resources/aws/s3/s3_bucket_policy.iql @@ -0,0 +1,36 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM aws.s3.bucket_policies +WHERE region = '{{ region }}' +AND bucket = '{{ aws_s3_workspace_bucket_name }}'; + +/*+ create */ +INSERT INTO aws.s3.bucket_policies ( + Bucket, + PolicyDocument, + ClientToken, + region +) +SELECT + '{{ aws_s3_workspace_bucket_name }}', + '{{ policy_document }}', + '{{ uuid() }}', + '{{ region }}' + +/*+ update */ +update aws.s3.bucket_policies +set data__PatchDocument = string('{{ { + "PolicyDocument": policy_document + } | generate_patch_document }}') +WHERE +region = '{{ region }}' +AND data__Identifier = '{{ aws_s3_workspace_bucket_name }}'; + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count FROM ( + SELECT + JSON_EQUAL(policy_document, '{{ policy_document }}') as test_policy_document + FROM aws.s3.bucket_policies + WHERE region = '{{ region }}' + AND data__Identifier = '{{ aws_s3_workspace_bucket_name }}')t +WHERE test_policy_document = 1; diff --git a/examples/databricks/serverless/resources/databricks_account/credentials.iql b/examples/databricks/serverless/resources/databricks_account/credentials.iql new file mode 100644 index 0000000..c0d8327 --- /dev/null +++ b/examples/databricks/serverless/resources/databricks_account/credentials.iql @@ -0,0 +1,41 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM databricks_account.provisioning.credentials +WHERE account_id = '{{ databricks_account_id }}' +AND credentials_name = '{{ credentials_name }}' + +/*+ create */ +INSERT INTO databricks_account.provisioning.credentials ( +account_id, +data__credentials_name, +data__aws_credentials +) +SELECT +'{{ databricks_account_id }}', +'{{ credentials_name }}', +'{{ aws_credentials }}' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( +SELECT +credentials_id +FROM databricks_account.provisioning.credentials +WHERE account_id = '{{ databricks_account_id }}' +AND credentials_name = '{{ credentials_name }}' +AND JSON_EXTRACT(aws_credentials, '$.sts_role.role_arn') = '{{ aws_iam_cross_account_role_arn }}' +) t + +/*+ exports */ +SELECT +'{{ credentials_name }}' as databricks_credentials_name, +credentials_id as databricks_credentials_id, +JSON_EXTRACT(aws_credentials, '$.sts_role.external_id') as databricks_role_external_id +FROM databricks_account.provisioning.credentials +WHERE account_id = '{{ databricks_account_id }}' +AND credentials_name = '{{ credentials_name }}' + +/*+ delete */ +DELETE FROM databricks_account.provisioning.credentials +WHERE account_id = '{{ databricks_account_id }}' AND +credentials_id = '{{ databricks_credentials_id }}'; \ No newline at end of file diff --git a/examples/databricks/serverless/resources/databricks_account/get_users.iql b/examples/databricks/serverless/resources/databricks_account/get_users.iql new file mode 100644 index 0000000..e94c2d7 --- /dev/null +++ b/examples/databricks/serverless/resources/databricks_account/get_users.iql @@ -0,0 +1,6 @@ +/*+ exports, retries=3, retry_delay=5 */ +SELECT +JSON_GROUP_ARRAY(JSON_OBJECT('value', id)) as databricks_workspace_group_members +FROM databricks_account.iam.users +WHERE account_id = '{{ databricks_account_id }}' +AND userName in {{ users | sql_list }}; \ No newline at end of file diff --git a/examples/databricks/serverless/resources/databricks_account/network.iql b/examples/databricks/serverless/resources/databricks_account/network.iql new file mode 100644 index 0000000..45e0b0a --- /dev/null +++ b/examples/databricks/serverless/resources/databricks_account/network.iql @@ -0,0 +1,46 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM databricks_account.provisioning.networks +WHERE account_id = '{{ databricks_account_id }}' +AND network_name = '{{ databricks_network_name }}' + +/*+ create */ +INSERT INTO databricks_account.provisioning.networks ( +account_id, +data__network_name, +data__vpc_id, +data__subnet_ids, +data__security_group_ids +) +SELECT +'{{ databricks_account_id }}', +'{{ databricks_network_name }}', +'{{ vpc_id }}', +'{{ subnet_ids }}', +'{{ security_group_ids }}' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( +SELECT +JSON_EQUAL(subnet_ids, '{{ subnet_ids }}') as subnet_test, +JSON_EQUAL(security_group_ids, '{{ security_group_ids }}') as sg_test +FROM databricks_account.provisioning.networks +WHERE account_id = '{{ databricks_account_id }}' +AND network_name = '{{ databricks_network_name }}' +AND vpc_id = '{{ vpc_id }}' +AND subnet_test = 1 +AND sg_test = 1 +)t + +/*+ exports */ +SELECT +network_id as databricks_network_id +FROM databricks_account.provisioning.networks +WHERE account_id = '{{ databricks_account_id }}' AND +network_name = '{{ databricks_network_name }}' + +/*+ delete */ +DELETE FROM databricks_account.provisioning.networks +WHERE account_id = '{{ databricks_account_id }}' AND +network_id = '{{ databricks_network_id }}' \ No newline at end of file diff --git a/examples/databricks/serverless/resources/databricks_account/storage_configuration.iql b/examples/databricks/serverless/resources/databricks_account/storage_configuration.iql new file mode 100644 index 0000000..4e60cfc --- /dev/null +++ b/examples/databricks/serverless/resources/databricks_account/storage_configuration.iql @@ -0,0 +1,35 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM databricks_account.provisioning.storage +WHERE account_id = '{{ databricks_account_id }}' +AND storage_configuration_name = '{{ storage_configuration_name }}' + +/*+ create */ +INSERT INTO databricks_account.provisioning.storage ( +account_id, +data__storage_configuration_name, +data__root_bucket_info +) +SELECT +'{{ databricks_account_id }}', +'{{ storage_configuration_name }}', +'{{ root_bucket_info }}' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count +FROM databricks_account.provisioning.storage +WHERE account_id = '{{ databricks_account_id }}' +AND storage_configuration_name = '{{ storage_configuration_name }}' +AND JSON_EXTRACT(root_bucket_info, '$.bucket_name') = '{{ aws_s3_workspace_bucket_name }}' + +/*+ exports */ +SELECT +storage_configuration_id as databricks_storage_configuration_id +FROM databricks_account.provisioning.storage +WHERE account_id = '{{ databricks_account_id }}' +AND storage_configuration_name = '{{ storage_configuration_name }}' + +/*+ delete */ +DELETE FROM databricks_account.provisioning.storage +WHERE account_id = '{{ databricks_account_id }}' AND +storage_configuration_id = '{{ databricks_storage_configuration_id }}' \ No newline at end of file diff --git a/examples/databricks/serverless/resources/databricks_account/update_group_membership.iql b/examples/databricks/serverless/resources/databricks_account/update_group_membership.iql new file mode 100644 index 0000000..375d926 --- /dev/null +++ b/examples/databricks/serverless/resources/databricks_account/update_group_membership.iql @@ -0,0 +1,6 @@ +/*+ command */ +update databricks_account.iam.groups +set data__schemas = '["urn:ietf:params:scim:api:messages:2.0:PatchOp"]', +data__Operations = '[{"op": "replace", "path": "members", "value": {{ databricks_workspace_group_members }} }]' +WHERE account_id = '{{ databricks_account_id }}' +AND id = '{{ databricks_group_id }}'; diff --git a/examples/databricks/serverless/resources/databricks_account/workspace.iql b/examples/databricks/serverless/resources/databricks_account/workspace.iql new file mode 100644 index 0000000..9da2dea --- /dev/null +++ b/examples/databricks/serverless/resources/databricks_account/workspace.iql @@ -0,0 +1,44 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM databricks_account.provisioning.workspaces +WHERE account_id = '{{ databricks_account_id }}' +AND workspace_name = '{{ workspace_name }}' + +/*+ create */ +INSERT INTO databricks_account.provisioning.workspaces ( +account_id, +data__workspace_name, +data__aws_region, +data__credentials_id, +data__storage_configuration_id, +data__pricing_tier +) +SELECT +'{{ databricks_account_id }}', +'{{ workspace_name }}', +'{{ aws_region }}', +'{{ credentials_id }}', +'{{ storage_configuration_id }}', +'{{ pricing_tier }}' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count +FROM databricks_account.provisioning.workspaces +WHERE account_id = '{{ databricks_account_id }}' +AND workspace_name = '{{ workspace_name }}' +AND aws_region = '{{ aws_region }}' +AND credentials_id = '{{ credentials_id }}' +AND storage_configuration_id = '{{ storage_configuration_id }}' +AND pricing_tier = '{{ pricing_tier }}' + +/*+ exports */ +SELECT workspace_id AS databricks_workspace_id, +deployment_name AS databricks_deployment_name +FROM databricks_account.provisioning.workspaces +WHERE account_id = '{{ databricks_account_id }}' +AND workspace_name = '{{ workspace_name }}' + +/*+ delete */ +DELETE FROM databricks_account.provisioning.workspaces +WHERE account_id = '{{ databricks_account_id }}' AND +workspace_id = '{{ databricks_workspace_id }}' \ No newline at end of file diff --git a/examples/databricks/serverless/resources/databricks_account/workspace_group.iql b/examples/databricks/serverless/resources/databricks_account/workspace_group.iql new file mode 100644 index 0000000..733b6f4 --- /dev/null +++ b/examples/databricks/serverless/resources/databricks_account/workspace_group.iql @@ -0,0 +1,32 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM databricks_account.iam.groups +WHERE account_id = '{{ databricks_account_id }}' +AND displayName = '{{ display_name }}' + +/*+ create */ +INSERT INTO databricks_account.iam.groups ( +account_id, +data__displayName +) +SELECT +'{{ databricks_account_id }}', +'{{ display_name }}' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count +FROM databricks_account.iam.groups +WHERE account_id = '{{ databricks_account_id }}' +AND displayName = '{{ display_name }}' + +/*+ exports */ +SELECT id AS databricks_group_id, +displayName AS databricks_group_name +FROM databricks_account.iam.groups +WHERE account_id = '{{ databricks_account_id }}' +AND displayName = '{{ display_name }}' + +/*+ delete */ +DELETE FROM databricks_account.iam.groups +WHERE account_id = '{{ databricks_account_id }}' AND +id = '{{ databricks_group_id }}'; \ No newline at end of file diff --git a/examples/databricks/serverless/resources/databricks_account/workspace_permission_assignments.iql b/examples/databricks/serverless/resources/databricks_account/workspace_permission_assignments.iql new file mode 100644 index 0000000..00387e3 --- /dev/null +++ b/examples/databricks/serverless/resources/databricks_account/workspace_permission_assignments.iql @@ -0,0 +1,32 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM databricks_account.iam.workspace_permission_assignments +WHERE account_id = '{{ databricks_account_id }}' AND +workspace_id = '{{ databricks_workspace_id }}' +AND JSON_EXTRACT(principal, '$.principal_id') = {{ databricks_group_id }} + +/*+ createorupdate */ +INSERT INTO databricks_account.iam.workspace_permission_assignments ( +account_id, +principal_id, +workspace_id, +data__permissions +) +SELECT +'{{ databricks_account_id }}', +'{{ databricks_group_id }}', +'{{ databricks_workspace_id }}', +'["ADMIN"]' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count +FROM databricks_account.iam.workspace_permission_assignments +WHERE account_id = '{{ databricks_account_id }}' AND +workspace_id = '{{ databricks_workspace_id }}' +AND JSON_EXTRACT(principal, '$.principal_id') = {{ databricks_group_id }} + +/*+ delete */ +DELETE FROM databricks_account.iam.workspace_permission_assignments +WHERE account_id = '{{ databricks_account_id }}' AND +principal_id = '{{ databricks_group_id }}' AND +workspace_id = '{{ databricks_workspace_id }}' \ No newline at end of file diff --git a/examples/databricks/serverless/resources/databricks_workspace/storage_credential.iql b/examples/databricks/serverless/resources/databricks_workspace/storage_credential.iql new file mode 100644 index 0000000..b63f288 --- /dev/null +++ b/examples/databricks/serverless/resources/databricks_workspace/storage_credential.iql @@ -0,0 +1,43 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM databricks_workspace.unitycatalog.storage_credentials +WHERE name = '{{ name | replace('-', '_') | upper }}' AND +deployment_name = '{{ databricks_deployment_name }}'; + +/*+ create */ +INSERT INTO databricks_workspace.unitycatalog.storage_credentials ( +deployment_name, +data__name, +data__comment, +data__read_only, +data__aws_iam_role, +data__skip_validation +) +SELECT +'{{ databricks_deployment_name }}', +'{{ name | replace('-', '_') | upper }}', +'{{ comment }}', +'{{ read_only }}', +'{{ aws_iam_role }}', +'{{ skip_validation }}' +; + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count +FROM databricks_workspace.unitycatalog.storage_credentials +WHERE name = '{{ name | replace('-', '_') | upper }}' AND +deployment_name = '{{ databricks_deployment_name }}' AND +JSON_EXTRACT(aws_iam_role, '$.role_arn') = '{{ metastore_access_role_arn }}'; + +/*+ exports */ +SELECT +name as storage_credential_name, +JSON_EXTRACT(aws_iam_role, '$.external_id') as storage_credential_external_id +FROM databricks_workspace.unitycatalog.storage_credentials +WHERE name = '{{ name | replace('-', '_') | upper }}' AND +deployment_name = '{{ databricks_deployment_name }}'; + +/*+ delete */ +DELETE FROM databricks_workspace.unitycatalog.storage_credentials +WHERE name = '{{ name | replace('-', '_') | upper }}' AND +deployment_name = '{{ databricks_deployment_name }}'; \ No newline at end of file diff --git a/examples/databricks/serverless/sec/.gitignore b/examples/databricks/serverless/sec/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/examples/databricks/serverless/sec/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/examples/databricks/all-purpose-cluster/stackql_manifest.yml b/examples/databricks/serverless/stackql_manifest.yml similarity index 52% rename from examples/databricks/all-purpose-cluster/stackql_manifest.yml rename to examples/databricks/serverless/stackql_manifest.yml index 4d1d463..02118dd 100644 --- a/examples/databricks/all-purpose-cluster/stackql_manifest.yml +++ b/examples/databricks/serverless/stackql_manifest.yml @@ -1,6 +1,6 @@ version: 1 -name: "databricks-all-purpose-cluster" -description: creates a databricks workspace and all-purpose cluster +name: "stackql-serverless" +description: creates a serverless databricks workspace providers: - aws - databricks_account @@ -18,6 +18,9 @@ globals: - name: region description: aws region value: "{{ AWS_REGION }}" + - name: region + description: aws region + value: "{{ AWS_REGION }}" - name: global_tags value: - Key: Provisioner @@ -27,10 +30,13 @@ globals: - Key: StackEnv Value: "{{ stack_env }}" resources: + # ==================================================================================== -# AWS IAM +# IAM and Cloud Credentials # ==================================================================================== - - name: aws_iam_cross_account_role + + - name: aws/iam/cross_account_role + file: aws/iam/iam_role.iql props: - name: role_name value: "{{ stack_name }}-{{ stack_env }}-role" @@ -136,8 +142,10 @@ resources: Version: '2012-10-17' PolicyName: "{{ stack_name }}-{{ stack_env }}-policy" exports: - - aws_iam_cross_account_role_arn - - name: databricks_credentials + - aws_iam_role_name: aws_iam_cross_account_role_name + - aws_iam_role_arn: aws_iam_cross_account_role_arn + + - name: databricks_account/credentials props: - name: credentials_name value: "{{ stack_name }}-{{ stack_env }}-credentials" @@ -146,179 +154,16 @@ resources: sts_role: role_arn: "{{ aws_iam_cross_account_role_arn }}" exports: + - databricks_credentials_name - databricks_credentials_id - databricks_role_external_id + # ==================================================================================== -# AWS VPC Networking +# Storage # ==================================================================================== - - name: aws_vpc - props: - - name: cidr_block - values: - prd: - value: "10.0.0.0/16" - sit: - value: "10.1.0.0/16" - dev: - value: "10.2.0.0/16" - - name: tags - value: - - Key: Name - Value: "{{ stack_name }}-{{ stack_env }}-vpc" - merge: - - global_tags - - name: idempotency_token - value: 019447a0-b84a-7b7f-bca5-2ee320207e51 - exports: - - vpc_id - - name: aws_get_main_route_table_id - type: query - exports: - - route_table_id - - name: aws_tag_main_vpc_route_table - type: command - props: - - name: tags - value: - - Key: Name - Value: "{{ stack_name }}-{{ stack_env }}-route-table" - merge: ['global_tags'] - - name: aws_vpc_subnet1 - file: aws_vpc_subnet.iql - props: - - name: availability_zone - value: "us-east-1a" - - name: cidr_block - values: - prd: - value: "10.0.0.0/19" - sit: - value: "10.1.0.0/19" - dev: - value: "10.2.0.0/19" - - name: tags - value: - - Key: Name - Value: "{{ stack_name }}-{{ stack_env }}-subnet-1" - merge: - - global_tags - exports: - - subnet_id: aws_vpc_subnet1_id - - name: aws_vpc_subnet2 - file: aws_vpc_subnet.iql - props: - - name: availability_zone - value: "us-east-1b" - - name: cidr_block - values: - prd: - value: "10.0.32.0/19" - sit: - value: "10.1.32.0/19" - dev: - value: "10.2.32.0/19" - - name: tags - value: - - Key: Name - Value: "{{ stack_name }}-{{ stack_env }}-subnet-2" - merge: - - global_tags - exports: - - subnet_id: aws_vpc_subnet2_id - - name: aws_vpc_inet_gateway - props: - - name: tags - value: - - Key: Name - Value: "{{ stack_name }}-{{ stack_env }}-inet-gateway" - merge: ['global_tags'] - - name: idempotency_token - value: 019447a5-f076-75f8-9173-092df5a66d35 - exports: - - internet_gateway_id - - name: aws_vpc_inet_gw_attachment - props: [] - - name: aws_vpc_subnet_rt_assn1 - file: aws_vpc_subnet_rt_assn.iql - props: - - name: subnet_id - value: "{{ aws_vpc_subnet1_id }}" - - name: idempotency_token - value: 019447aa-1c7a-775b-91dc-04db7c49f4a7 - exports: - - route_table_assn_id: aws_vpc_subnet1_rt_assn_id - - name: aws_vpc_subnet_rt_assn2 - file: aws_vpc_subnet_rt_assn.iql - props: - - name: subnet_id - value: "{{ aws_vpc_subnet2_id }}" - - name: idempotency_token - value: 019447ab-1302-754a-a580-99071f1ad814 - exports: - - route_table_assn_id: aws_vpc_subnet2_rt_assn_id - - name: aws_vpc_inet_route - props: [] - exports: - - inet_route_indentifer - - name: aws_vpc_security_group - props: - - name: group_name - value: "{{ stack_name }}-{{ stack_env }}-sg" - - name: group_description - value: "security group for {{ stack_name }} ({{ stack_env }} environment)" - - name: tags - value: - - Key: Name - Value: "{{ stack_name }}-{{ stack_env }}-sg" - merge: ['global_tags'] - exports: - - security_group_id - - name: aws_vpc_security_group_rules - props: - - name: security_group_ingress - value: - - FromPort: 1025 - ToPort: 65535 - SourceSecurityGroupOwnerId: "{{ aws_account }}" - IpProtocol: tcp - SourceSecurityGroupId: "{{ security_group_id }}" - - FromPort: 1025 - ToPort: 65535 - SourceSecurityGroupOwnerId: "{{ aws_account }}" - IpProtocol: udp - SourceSecurityGroupId: "{{ security_group_id }}" - - CidrIp: "3.237.73.224/28" - FromPort: 443 - ToPort: 443 - IpProtocol: "tcp" - - CidrIp: "54.156.226.103/32" - FromPort: 443 - ToPort: 443 - IpProtocol: "tcp" - - name: security_group_egress - value: - - CidrIp: "0.0.0.0/0" - Description: Allow all outbound traffic - FromPort: -1 - ToPort: -1 - IpProtocol: "-1" - - name: databricks_network - props: - - name: databricks_network_name - value: "{{ stack_name }}-{{ stack_env }}-network" - - name: subnet_ids - value: - - "{{ aws_vpc_subnet1_id }}" - - "{{ aws_vpc_subnet2_id }}" - - name: security_group_ids - value: - - "{{ security_group_id }}" - exports: - - databricks_network_id -# ==================================================================================== -# AWS Storage -# ==================================================================================== - - name: aws_s3_workspace_bucket + + - name: aws/s3/workspace_bucket + file: aws/s3/s3_bucket.iql props: - name: bucket_name value: "{{ stack_name }}-{{ stack_env }}-root-bucket" @@ -342,9 +187,11 @@ resources: value: Status: "Suspended" exports: - - aws_s3_workspace_bucket_name - - aws_s3_workspace_bucket_arn - - name: aws_s3_workspace_bucket_policy + - arn: aws_s3_workspace_bucket_arn + - bucket_name: aws_s3_workspace_bucket_name + + - name: aws/s3/workspace_bucket_policy + file: aws/s3/s3_bucket_policy.iql props: - name: policy_document value: @@ -364,7 +211,8 @@ resources: Resource: - "{{ aws_s3_workspace_bucket_arn }}/*" - "{{ aws_s3_workspace_bucket_arn }}" - - name: databricks_storage_configuration + + - name: databricks_account/storage_configuration props: - name: storage_configuration_name value: "{{ stack_name }}-{{ stack_env }}-storage" @@ -373,15 +221,157 @@ resources: bucket_name: "{{ aws_s3_workspace_bucket_name }}" exports: - databricks_storage_configuration_id + +# ==================================================================================== +# UC Storage Credential and Metastore Catalog Bucket +# ==================================================================================== + + - name: aws/s3/metastore_bucket + file: aws/s3/s3_bucket.iql + props: + - name: bucket_name + value: "{{ stack_name }}-{{ stack_env }}-metastore" + - name: ownership_controls + value: + Rules: + - ObjectOwnership: "BucketOwnerPreferred" + - name: bucket_encryption + value: + ServerSideEncryptionConfiguration: + - BucketKeyEnabled: true + ServerSideEncryptionByDefault: + SSEAlgorithm: "AES256" + - name: public_access_block_configuration + value: + BlockPublicAcls: true + IgnorePublicAcls: true + BlockPublicPolicy: true + RestrictPublicBuckets: true + - name: versioning_configuration + value: + Status: "Suspended" + exports: + - arn: aws_s3_metastore_bucket_arn + - bucket_name: aws_s3_metastore_bucket_name + + - name: aws/iam/metastore_access_role + file: aws/iam/iam_role.iql + props: + - name: role_name + value: "{{ stack_name }}-{{ stack_env }}-metastore-role" + - name: assume_role_policy_document + value: + Version: "2012-10-17" + Statement: + - Effect: "Allow" + Principal: + AWS: + - "arn:aws:iam::414351767826:role/unity-catalog-prod-UCMasterRole-14S5ZJVKOTYTL" + Action: "sts:AssumeRole" + Condition: + StringEquals: + sts:ExternalId: "0000" # Placeholder + - name: description + value: 'Unity Catalog metastore access role for ({{ stack_name }}-{{ stack_env }})' + - name: path + value: '/' + - name: policies + value: + - PolicyName: "MetastoreS3Policy" + PolicyDocument: + Version: "2012-10-17" + Statement: + - Effect: "Allow" + Action: + - "s3:GetObject" + - "s3:PutObject" + - "s3:DeleteObject" + - "s3:ListBucket" + - "s3:GetBucketLocation" + - "s3:ListBucketMultipartUploads" + - "s3:ListMultipartUploadParts" + - "s3:AbortMultipartUpload" + Resource: + - "{{ aws_s3_metastore_bucket_arn }}/*" + - "{{ aws_s3_metastore_bucket_arn }}" + + # - Effect: "Allow" + # Action: + # - "kms:Decrypt" + # - "kms:Encrypt" + # - "kms:GenerateDataKey*" + # Resource: + # - "arn:aws:kms:" + + - Effect: "Allow" + Action: + - "sts:AssumeRole" + Resource: + - "arn:aws:iam::{{ databricks_aws_account_id }}:role/{{ stack_name }}-{{ stack_env }}-metastore-role" + + - Sid: "ManagedFileEventsSetupStatement" + Effect: "Allow" + Action: + - "s3:GetBucketNotification" + - "s3:PutBucketNotification" + - "sns:ListSubscriptionsByTopic" + - "sns:GetTopicAttributes" + - "sns:SetTopicAttributes" + - "sns:CreateTopic" + - "sns:TagResource" + - "sns:Publish" + - "sns:Subscribe" + - "sqs:CreateQueue" + - "sqs:DeleteMessage" + - "sqs:ReceiveMessage" + - "sqs:SendMessage" + - "sqs:GetQueueUrl" + - "sqs:GetQueueAttributes" + - "sqs:SetQueueAttributes" + - "sqs:TagQueue" + - "sqs:ChangeMessageVisibility" + - "sqs:PurgeQueue" + Resource: + - "{{ aws_s3_metastore_bucket_arn }}" + - "arn:aws:sqs:*:*:csms-*" + - "arn:aws:sns:*:*:csms-*" + + - Sid: "ManagedFileEventsListStatement" + Effect: "Allow" + Action: + - "sqs:ListQueues" + - "sqs:ListQueueTags" + - "sns:ListTopics" + Resource: + - "arn:aws:sqs:*:*:csms-*" + - "arn:aws:sns:*:*:csms-*" + + - Sid: "ManagedFileEventsTeardownStatement" + Effect: "Allow" + Action: + - "sns:Unsubscribe" + - "sns:DeleteTopic" + - "sqs:DeleteQueue" + Resource: + - "arn:aws:sqs:*:*:csms-*" + - "arn:aws:sns:*:*:csms-*" + - name: tags + value: + - Key: Purpose + Value: "Unity Catalog Storage Credential" + merge: + - global_tags + exports: + - aws_iam_role_arn: metastore_access_role_arn + # ==================================================================================== # DBX Workspace # ==================================================================================== - - name: databricks_workspace + + - name: databricks_account/workspace props: - name: workspace_name value: "{{ stack_name }}-{{ stack_env }}-workspace" - - name: network_id - value: "{{ databricks_network_id }}" - name: aws_region value: "{{ region }}" - name: credentials_id @@ -391,4 +381,80 @@ resources: - name: pricing_tier value: PREMIUM exports: - - databricks_workspace_id + - databricks_workspace_id + - databricks_deployment_name + + - name: databricks_account/workspace_group + props: + - name: display_name + value: "{{ stack_name }}-{{ stack_env }}-workspace-admins" + exports: + - databricks_group_id + - databricks_group_name + + - name: databricks_account/get_users + type: query + props: + - name: users + value: + - "javen@stackql.io" + - "krimmer@stackql.io" + exports: + - databricks_workspace_group_members + + - name: databricks_account/update_group_membership + type: command + props: [] + + - name: databricks_account/workspace_permission_assignments + props: [] + + - name: databricks_workspace/storage_credential + props: + - name: name + value: "{{ stack_name }}-{{ stack_env }}-storage-credential" + - name: comment + value: "Storage credential for {{ stack_name }} {{ stack_env }} metastore S3 access" + - name: read_only + value: false + - name: aws_iam_role + value: + role_arn: "{{ metastore_access_role_arn }}" + - name: skip_validation + value: false + exports: + - storage_credential_name + - storage_credential_external_id + + - name: databricks_workspace/unitycatalog/grants + type: command + props: + - name: privileges + value: + - "ALL_PRIVILEGES" + - "MANAGE" + sql: | + UPDATE databricks_workspace.unitycatalog.grants + SET data__changes = '[{"add": {{ privileges }},"principal": "{{ databricks_group_name }}"}]' + WHERE full_name = '{{ storage_credential_name }}' AND + securable_type = 'storage_credential' AND + deployment_name = '{{ databricks_deployment_name }}'; + + - name: aws/iam/update_metastore_access_role + type: command + props: + - name: role_name + value: "{{ stack_name }}-{{ stack_env }}-metastore-role" + - name: assume_role_policy_document + value: + Version: "2012-10-17" + Statement: + - Effect: "Allow" + Principal: + AWS: + - "arn:aws:iam::414351767826:role/unity-catalog-prod-UCMasterRole-14S5ZJVKOTYTL" + - "{{ metastore_access_role_arn }}" + Action: "sts:AssumeRole" + Condition: + StringEquals: + sts:ExternalId: "{{ storage_credential_external_id }}" diff --git a/examples/databricks/snowflake-interoperability/README.md b/examples/databricks/snowflake-interoperability/README.md new file mode 100644 index 0000000..409894d --- /dev/null +++ b/examples/databricks/snowflake-interoperability/README.md @@ -0,0 +1,245 @@ +# `stackql-deploy` example project for `databricks` + +This exercise is to bootstrap a databricks / aws tenancy using `stackql-deploy`. It is an important use case for platform bootstrap and we are excited to perform it with the `stackql` toolchain. We hope you enjoy and find this valuable. Please drop us a note with your forthright opinion on this and check out our issues on github. + +## A word of caution + +Please take the greatest care in performing this exercise; it will incur expenses, as it involves creating (and destroying) resources which cost money. Please be aware that you **must** cancel your databricks subscription after completing this exercise, otherwise you will incur ongoing expenses. That is, do **not** skip the section [Cancel databricks subscription](#cancel-databricks-subsription). We strongly advise that you verify all resources are destroyed at the conclusion of this exercise. Web pages and certain behaviours may change, so please be thorough in your verification. We will keep this page up-to-date on a best effort basis only. It is very much a case of owner onus applies. + +## Manual Setup + +Dependencies: + +- aws Account Created. +- Required clickops to set up databricks on aws: + - Turn on aws Marketplace `databricks` offering, using [the aws manage subscriptions page](https://console.aws.amazon.com/marketplace/home#/subscriptions), per Figure S1. + - Follow the suggested setup flow as directed, from this page. These clickops steps are necessary at this time for initial account setup. The way I followed this, it created a workspace for me at setup, per Figure S3. We shall not use this one and rather, later on we shall dispose of it; because we do not trust auto-created resources out of hand. In the process of creating the databricks subscription, a second aws account is created. + - Copy the databricks account id from basically any web page in the databricks console. This is done by clicking on the user icon at the top RHS and then the UI provides a copy shortcut, per Fugure U1. Save this locally for later use, expanded below. + - We need the aws account id that was created for the databricks subscription. It is not exactly heralded by the web pages, nor is it actively hidden. It can be captured in a couple of places, including the databricks storage account creatted in the subscription flow, per Figure XA1. copy and save this locally for later use, expanded below. + - Create a service principal to use as a "CICD agent", using the page shown in Figure S4. + - Grant the CICD agent account admin role, using the page shown in Figure S5. + - Create a secret for the CICD agent, using the page shown in Figure S6. At the time you create this, you will need to safely store the client secret and client id, as prompted by the web page. These will be used below. +- Setup your virtual environment, from the root of this repository `cicd/setup/setup-env.sh`. + +Now, is is convenient to use environment variables for context. Note that for our example, there is only one aws account apropos, however this is not always the case for an active professional, so while `DATABRICKS_AWS_ACCOUNT_ID` is the same as `AWS_ACCOUNT_ID` here, it need not always be the case. Create a file in the path `examples/databricks/serverless/sec/env.sh` (relative to the root of this repository) with contents of the form: + +```bash +#!/usr/bin/env bash + +export AWS_REGION='us-east-1' # or wherever you want +export AWS_ACCOUNT_ID='' +export DATABRICKS_ACCOUNT_ID='' +export DATABRICKS_AWS_ACCOUNT_ID='' + +# These need to be created by clickops under [the account level user managment page](https://accounts.cloud.databricks.com/user-management). +export DATABRICKS_CLIENT_ID='' +export DATABRICKS_CLIENT_SECRET='' + +## These can be skipped if you run on [aws cloud shell](https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html). +export AWS_SECRET_ACCESS_KEY='' +export AWS_ACCESS_KEY_ID='' + +``` + +## Optional step: sanity checks with stackql + +Now, let us do some sanity checks and housekeeping with `stackql`. This is purely optional. From the root of this repository: + +``` +source examples/databricks/serverless/convenience.sh +stackql shell +``` + +This will start a `stackql` interactive shell. Here are some commands you can run (I will not place output here, that will be shared in a corresponding video): + + +```sql +registry pull databricks_account v24.12.00279; +registry pull databricks_workspace v24.12.00279; + +-- This will fail if accounts, subscription, or credentials are in error. +select account_id FROM databricks_account.provisioning.credentials WHERE account_id = ''; +select account_id, workspace_name, workspace_id, workspace_status from databricks_account.provisioning.workspaces where account_id = ''; +``` + +For extra credit, you can (asynchronously) delete the unnecessary workspace with `delete from databricks_account.provisioning.workspaces where account_id = '' and workspace_id = '';`, where you obtain the workspace id from the above query. I have noted that due to some reponse caching it takes a while to disappear from select queries (much longer than disappearance from the web page), and you may want to bounce the `stackql` session to hurry things along. This is not happening on the `stackql` side, but session bouncing forces a token refresh which can help cache busting. + +## Lifecycle management + +Time to get down to business. From the root of this repository: + +```bash +python3 -m venv myenv +source examples/databricks/serverless/convenience.sh +source venv/bin/activate +pip install stackql-deploy +``` + +> alternatively set the `AWS_REGION`, `AWS_ACCOUNT_ID`, `DATABRICKS_ACCOUNT_ID`, `DATABRICKS_AWS_ACCOUNT_ID` along with provider credentials `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, `DATABRICKS_CLIENT_ID`, `DATABRICKS_CLIENT_SECRET` + +Then, do a dry run (good for catching **some** environmental issues): + +```bash +stackql-deploy build \ +examples/databricks/serverless dev \ +-e AWS_REGION=${AWS_REGION} \ +-e AWS_ACCOUNT_ID=${AWS_ACCOUNT_ID} \ +-e DATABRICKS_ACCOUNT_ID=${DATABRICKS_ACCOUNT_ID} \ +-e DATABRICKS_AWS_ACCOUNT_ID=${DATABRICKS_AWS_ACCOUNT_ID} \ +--dry-run +``` + +You will see a verbose rendition of what `stackql-deploy` intends to do. + + +Now, let use do it for real: + +```bash +stackql-deploy build \ +examples/databricks/serverless dev \ +-e AWS_REGION=${AWS_REGION} \ +-e AWS_ACCOUNT_ID=${AWS_ACCOUNT_ID} \ +-e DATABRICKS_ACCOUNT_ID=${DATABRICKS_ACCOUNT_ID} \ +-e DATABRICKS_AWS_ACCOUNT_ID=${DATABRICKS_AWS_ACCOUNT_ID} \ +--show-queries +``` + +The output is quite verbose, concludes in: + +``` +2025-02-08 12:51:25,914 - stackql-deploy - INFO - 📤 set [databricks_workspace_id] to [482604062392118] in exports +2025-02-08 12:51:25,915 - stackql-deploy - INFO - ✅ successfully deployed databricks_workspace +2025-02-08 12:51:25,915 - stackql-deploy - INFO - deployment completed in 0:04:09.603631 +🚀 build complete +``` + +Success!!! + +We can also use `stackql-deploy` to assess if our infra is shipshape: + +```bash +stackql-deploy test \ +examples/databricks/serverless dev \ +-e AWS_REGION=${AWS_REGION} \ +-e AWS_ACCOUNT_ID=${AWS_ACCOUNT_ID} \ +-e DATABRICKS_ACCOUNT_ID=${DATABRICKS_ACCOUNT_ID} \ +-e DATABRICKS_AWS_ACCOUNT_ID=${DATABRICKS_AWS_ACCOUNT_ID} \ +--show-queries +``` + +Again, the output is quite verbose, concludes in: + +``` +2025-02-08 13:15:45,821 - stackql-deploy - INFO - 📤 set [databricks_workspace_id] to [482604062392118] in exports +2025-02-08 13:15:45,821 - stackql-deploy - INFO - ✅ test passed for databricks_workspace +2025-02-08 13:15:45,821 - stackql-deploy - INFO - deployment completed in 0:02:30.255860 +🔍 tests complete (dry run: False) +``` + +Success!!! + +Now, let us teardown our `stackql-deploy` managed infra: + +```bash +stackql-deploy teardown \ +examples/databricks/serverless dev \ +-e AWS_REGION=${AWS_REGION} \ +-e AWS_ACCOUNT_ID=${AWS_ACCOUNT_ID} \ +-e DATABRICKS_ACCOUNT_ID=${DATABRICKS_ACCOUNT_ID} \ +-e DATABRICKS_AWS_ACCOUNT_ID=${DATABRICKS_AWS_ACCOUNT_ID} \ +--show-queries +``` + +Takes its time, again verbose, concludes in: + +``` +2025-02-08 13:24:17,941 - stackql-deploy - INFO - ✅ successfully deleted AWS_iam_cross_account_role +2025-02-08 13:24:17,942 - stackql-deploy - INFO - deployment completed in 0:03:21.191788 +🚧 teardown complete (dry run: False) +``` + +Success!!! + +## Optional step: verify destruction with stackql + +Now, let us do some sanity checks and housekeeping with `stackql`. This is purely optional. From the root of this repository: + +``` + +source examples/databricks/serverless/convenience.sh + +stackql shell + +``` + +This will start a `stackql` interactive shell. Here are some commands you can run (I will not place output here): + + +```sql + +registry pull databricks_account v24.12.00279; + +registry pull databricks_workspace v24.12.00279; + + + +select account_id, workspace_name, workspace_id, workspace_status from databricks_account.provisioning.workspaces where account_id = ''; + +``` + +## Cancel databricks subsription + +This is **very** important. + +Go to [the aws Marketplace manage subscriptions page](https://console.aws.amazon.com/marketplace/home#/subscriptions), navigate to databricks and then cancel the subscription. + +## Figures + + +![Create aws databricks subscription](/examples/databricks/serverless/assets/create-aws-databricks-subscription.png) + +**Figure S1**: Create aws databricks subscription. + +--- + +![Awaiting aws databricks subscription resources](/examples/databricks/serverless/assets/awaiting-subscription-resources.png) + +**Figure S2**: Awaiting aws databricks subscription resources. + +--- + +![Auto provisioned workspace](/examples/databricks/serverless/assets/auto-provisioned-worskpace.png) + +**Figure S3**: Auto provisioned workspace. + +--- + +![Capture databricks account id](/examples/databricks/serverless/assets/capture-databricks-account-id.png) + +**Figure U1**: Capture databricks account id. + +--- + +![Capture cross databricks aws account id](/examples/databricks/serverless/assets/capture-cross-databricks-aws-account-id.png) + +**Figure XA1**: Capture cross databricks aws account id. + +--- + +![Create CICD agent](/examples/databricks/serverless/assets/create-cicd-agent.png) + +**Figure S4**: Create CICD agent. + +--- + +![Grant account admin to CICD agent](/examples/databricks/serverless/assets/grant-account-admin-cicd-agent.png) + +**Figure S5**: Grant account admin to CICD agent. + +--- + +![Generate secret for CICD agent](/examples/databricks/serverless/assets/generate-secret-ui.png) + +**Figure S6**: Generate secret for CICD agent. + +--- diff --git a/examples/databricks/snowflake-interoperability/resources/databricks_account/credentials.iql b/examples/databricks/snowflake-interoperability/resources/databricks_account/credentials.iql new file mode 100644 index 0000000..c0d8327 --- /dev/null +++ b/examples/databricks/snowflake-interoperability/resources/databricks_account/credentials.iql @@ -0,0 +1,41 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM databricks_account.provisioning.credentials +WHERE account_id = '{{ databricks_account_id }}' +AND credentials_name = '{{ credentials_name }}' + +/*+ create */ +INSERT INTO databricks_account.provisioning.credentials ( +account_id, +data__credentials_name, +data__aws_credentials +) +SELECT +'{{ databricks_account_id }}', +'{{ credentials_name }}', +'{{ aws_credentials }}' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( +SELECT +credentials_id +FROM databricks_account.provisioning.credentials +WHERE account_id = '{{ databricks_account_id }}' +AND credentials_name = '{{ credentials_name }}' +AND JSON_EXTRACT(aws_credentials, '$.sts_role.role_arn') = '{{ aws_iam_cross_account_role_arn }}' +) t + +/*+ exports */ +SELECT +'{{ credentials_name }}' as databricks_credentials_name, +credentials_id as databricks_credentials_id, +JSON_EXTRACT(aws_credentials, '$.sts_role.external_id') as databricks_role_external_id +FROM databricks_account.provisioning.credentials +WHERE account_id = '{{ databricks_account_id }}' +AND credentials_name = '{{ credentials_name }}' + +/*+ delete */ +DELETE FROM databricks_account.provisioning.credentials +WHERE account_id = '{{ databricks_account_id }}' AND +credentials_id = '{{ databricks_credentials_id }}'; \ No newline at end of file diff --git a/examples/databricks/snowflake-interoperability/resources/databricks_account/get_users.iql b/examples/databricks/snowflake-interoperability/resources/databricks_account/get_users.iql new file mode 100644 index 0000000..e94c2d7 --- /dev/null +++ b/examples/databricks/snowflake-interoperability/resources/databricks_account/get_users.iql @@ -0,0 +1,6 @@ +/*+ exports, retries=3, retry_delay=5 */ +SELECT +JSON_GROUP_ARRAY(JSON_OBJECT('value', id)) as databricks_workspace_group_members +FROM databricks_account.iam.users +WHERE account_id = '{{ databricks_account_id }}' +AND userName in {{ users | sql_list }}; \ No newline at end of file diff --git a/examples/databricks/snowflake-interoperability/resources/databricks_account/network.iql b/examples/databricks/snowflake-interoperability/resources/databricks_account/network.iql new file mode 100644 index 0000000..45e0b0a --- /dev/null +++ b/examples/databricks/snowflake-interoperability/resources/databricks_account/network.iql @@ -0,0 +1,46 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM databricks_account.provisioning.networks +WHERE account_id = '{{ databricks_account_id }}' +AND network_name = '{{ databricks_network_name }}' + +/*+ create */ +INSERT INTO databricks_account.provisioning.networks ( +account_id, +data__network_name, +data__vpc_id, +data__subnet_ids, +data__security_group_ids +) +SELECT +'{{ databricks_account_id }}', +'{{ databricks_network_name }}', +'{{ vpc_id }}', +'{{ subnet_ids }}', +'{{ security_group_ids }}' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count FROM +( +SELECT +JSON_EQUAL(subnet_ids, '{{ subnet_ids }}') as subnet_test, +JSON_EQUAL(security_group_ids, '{{ security_group_ids }}') as sg_test +FROM databricks_account.provisioning.networks +WHERE account_id = '{{ databricks_account_id }}' +AND network_name = '{{ databricks_network_name }}' +AND vpc_id = '{{ vpc_id }}' +AND subnet_test = 1 +AND sg_test = 1 +)t + +/*+ exports */ +SELECT +network_id as databricks_network_id +FROM databricks_account.provisioning.networks +WHERE account_id = '{{ databricks_account_id }}' AND +network_name = '{{ databricks_network_name }}' + +/*+ delete */ +DELETE FROM databricks_account.provisioning.networks +WHERE account_id = '{{ databricks_account_id }}' AND +network_id = '{{ databricks_network_id }}' \ No newline at end of file diff --git a/examples/databricks/snowflake-interoperability/resources/databricks_account/storage_configuration.iql b/examples/databricks/snowflake-interoperability/resources/databricks_account/storage_configuration.iql new file mode 100644 index 0000000..4e60cfc --- /dev/null +++ b/examples/databricks/snowflake-interoperability/resources/databricks_account/storage_configuration.iql @@ -0,0 +1,35 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM databricks_account.provisioning.storage +WHERE account_id = '{{ databricks_account_id }}' +AND storage_configuration_name = '{{ storage_configuration_name }}' + +/*+ create */ +INSERT INTO databricks_account.provisioning.storage ( +account_id, +data__storage_configuration_name, +data__root_bucket_info +) +SELECT +'{{ databricks_account_id }}', +'{{ storage_configuration_name }}', +'{{ root_bucket_info }}' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count +FROM databricks_account.provisioning.storage +WHERE account_id = '{{ databricks_account_id }}' +AND storage_configuration_name = '{{ storage_configuration_name }}' +AND JSON_EXTRACT(root_bucket_info, '$.bucket_name') = '{{ aws_s3_workspace_bucket_name }}' + +/*+ exports */ +SELECT +storage_configuration_id as databricks_storage_configuration_id +FROM databricks_account.provisioning.storage +WHERE account_id = '{{ databricks_account_id }}' +AND storage_configuration_name = '{{ storage_configuration_name }}' + +/*+ delete */ +DELETE FROM databricks_account.provisioning.storage +WHERE account_id = '{{ databricks_account_id }}' AND +storage_configuration_id = '{{ databricks_storage_configuration_id }}' \ No newline at end of file diff --git a/examples/databricks/snowflake-interoperability/resources/databricks_account/update_group_membership.iql b/examples/databricks/snowflake-interoperability/resources/databricks_account/update_group_membership.iql new file mode 100644 index 0000000..375d926 --- /dev/null +++ b/examples/databricks/snowflake-interoperability/resources/databricks_account/update_group_membership.iql @@ -0,0 +1,6 @@ +/*+ command */ +update databricks_account.iam.groups +set data__schemas = '["urn:ietf:params:scim:api:messages:2.0:PatchOp"]', +data__Operations = '[{"op": "replace", "path": "members", "value": {{ databricks_workspace_group_members }} }]' +WHERE account_id = '{{ databricks_account_id }}' +AND id = '{{ databricks_group_id }}'; diff --git a/examples/databricks/snowflake-interoperability/resources/databricks_account/workspace.iql b/examples/databricks/snowflake-interoperability/resources/databricks_account/workspace.iql new file mode 100644 index 0000000..9da2dea --- /dev/null +++ b/examples/databricks/snowflake-interoperability/resources/databricks_account/workspace.iql @@ -0,0 +1,44 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM databricks_account.provisioning.workspaces +WHERE account_id = '{{ databricks_account_id }}' +AND workspace_name = '{{ workspace_name }}' + +/*+ create */ +INSERT INTO databricks_account.provisioning.workspaces ( +account_id, +data__workspace_name, +data__aws_region, +data__credentials_id, +data__storage_configuration_id, +data__pricing_tier +) +SELECT +'{{ databricks_account_id }}', +'{{ workspace_name }}', +'{{ aws_region }}', +'{{ credentials_id }}', +'{{ storage_configuration_id }}', +'{{ pricing_tier }}' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count +FROM databricks_account.provisioning.workspaces +WHERE account_id = '{{ databricks_account_id }}' +AND workspace_name = '{{ workspace_name }}' +AND aws_region = '{{ aws_region }}' +AND credentials_id = '{{ credentials_id }}' +AND storage_configuration_id = '{{ storage_configuration_id }}' +AND pricing_tier = '{{ pricing_tier }}' + +/*+ exports */ +SELECT workspace_id AS databricks_workspace_id, +deployment_name AS databricks_deployment_name +FROM databricks_account.provisioning.workspaces +WHERE account_id = '{{ databricks_account_id }}' +AND workspace_name = '{{ workspace_name }}' + +/*+ delete */ +DELETE FROM databricks_account.provisioning.workspaces +WHERE account_id = '{{ databricks_account_id }}' AND +workspace_id = '{{ databricks_workspace_id }}' \ No newline at end of file diff --git a/examples/databricks/snowflake-interoperability/resources/databricks_account/workspace_group.iql b/examples/databricks/snowflake-interoperability/resources/databricks_account/workspace_group.iql new file mode 100644 index 0000000..733b6f4 --- /dev/null +++ b/examples/databricks/snowflake-interoperability/resources/databricks_account/workspace_group.iql @@ -0,0 +1,32 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM databricks_account.iam.groups +WHERE account_id = '{{ databricks_account_id }}' +AND displayName = '{{ display_name }}' + +/*+ create */ +INSERT INTO databricks_account.iam.groups ( +account_id, +data__displayName +) +SELECT +'{{ databricks_account_id }}', +'{{ display_name }}' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count +FROM databricks_account.iam.groups +WHERE account_id = '{{ databricks_account_id }}' +AND displayName = '{{ display_name }}' + +/*+ exports */ +SELECT id AS databricks_group_id, +displayName AS databricks_group_name +FROM databricks_account.iam.groups +WHERE account_id = '{{ databricks_account_id }}' +AND displayName = '{{ display_name }}' + +/*+ delete */ +DELETE FROM databricks_account.iam.groups +WHERE account_id = '{{ databricks_account_id }}' AND +id = '{{ databricks_group_id }}'; \ No newline at end of file diff --git a/examples/databricks/snowflake-interoperability/resources/databricks_account/workspace_permission_assignments.iql b/examples/databricks/snowflake-interoperability/resources/databricks_account/workspace_permission_assignments.iql new file mode 100644 index 0000000..00387e3 --- /dev/null +++ b/examples/databricks/snowflake-interoperability/resources/databricks_account/workspace_permission_assignments.iql @@ -0,0 +1,32 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM databricks_account.iam.workspace_permission_assignments +WHERE account_id = '{{ databricks_account_id }}' AND +workspace_id = '{{ databricks_workspace_id }}' +AND JSON_EXTRACT(principal, '$.principal_id') = {{ databricks_group_id }} + +/*+ createorupdate */ +INSERT INTO databricks_account.iam.workspace_permission_assignments ( +account_id, +principal_id, +workspace_id, +data__permissions +) +SELECT +'{{ databricks_account_id }}', +'{{ databricks_group_id }}', +'{{ databricks_workspace_id }}', +'["ADMIN"]' + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count +FROM databricks_account.iam.workspace_permission_assignments +WHERE account_id = '{{ databricks_account_id }}' AND +workspace_id = '{{ databricks_workspace_id }}' +AND JSON_EXTRACT(principal, '$.principal_id') = {{ databricks_group_id }} + +/*+ delete */ +DELETE FROM databricks_account.iam.workspace_permission_assignments +WHERE account_id = '{{ databricks_account_id }}' AND +principal_id = '{{ databricks_group_id }}' AND +workspace_id = '{{ databricks_workspace_id }}' \ No newline at end of file diff --git a/examples/databricks/snowflake-interoperability/resources/databricks_workspace/storage_credential.iql b/examples/databricks/snowflake-interoperability/resources/databricks_workspace/storage_credential.iql new file mode 100644 index 0000000..b63f288 --- /dev/null +++ b/examples/databricks/snowflake-interoperability/resources/databricks_workspace/storage_credential.iql @@ -0,0 +1,43 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM databricks_workspace.unitycatalog.storage_credentials +WHERE name = '{{ name | replace('-', '_') | upper }}' AND +deployment_name = '{{ databricks_deployment_name }}'; + +/*+ create */ +INSERT INTO databricks_workspace.unitycatalog.storage_credentials ( +deployment_name, +data__name, +data__comment, +data__read_only, +data__aws_iam_role, +data__skip_validation +) +SELECT +'{{ databricks_deployment_name }}', +'{{ name | replace('-', '_') | upper }}', +'{{ comment }}', +'{{ read_only }}', +'{{ aws_iam_role }}', +'{{ skip_validation }}' +; + +/*+ statecheck, retries=3, retry_delay=5 */ +SELECT COUNT(*) as count +FROM databricks_workspace.unitycatalog.storage_credentials +WHERE name = '{{ name | replace('-', '_') | upper }}' AND +deployment_name = '{{ databricks_deployment_name }}' AND +JSON_EXTRACT(aws_iam_role, '$.role_arn') = '{{ metastore_access_role_arn }}'; + +/*+ exports */ +SELECT +name as storage_credential_name, +JSON_EXTRACT(aws_iam_role, '$.external_id') as storage_credential_external_id +FROM databricks_workspace.unitycatalog.storage_credentials +WHERE name = '{{ name | replace('-', '_') | upper }}' AND +deployment_name = '{{ databricks_deployment_name }}'; + +/*+ delete */ +DELETE FROM databricks_workspace.unitycatalog.storage_credentials +WHERE name = '{{ name | replace('-', '_') | upper }}' AND +deployment_name = '{{ databricks_deployment_name }}'; \ No newline at end of file diff --git a/examples/databricks/snowflake-interoperability/stackql_manifest.yml b/examples/databricks/snowflake-interoperability/stackql_manifest.yml new file mode 100644 index 0000000..791062b --- /dev/null +++ b/examples/databricks/snowflake-interoperability/stackql_manifest.yml @@ -0,0 +1,497 @@ +version: 1 +name: "snowflake-interoperability" +description: "Databricks Snowflake Interoperability Example" +providers: + - snowflake + - databricks_account + - databricks_workspace +globals: + - name: databricks_account_id + description: databricks account id + value: "{{ DATABRICKS_ACCOUNT_ID }}" + - name: snowflake_org + description: snowflake org + value: "{{ SNOWFLAKE_ORG }}" + - name: snowflake_account + description: snowflake account + value: "{{ SNOWFLAKE_ACCOUNT }}" + - name: global_tags + value: + - Key: Provisioner + Value: stackql + - Key: StackName + Value: "{{ stack_name }}" + - Key: StackEnv + Value: "{{ stack_env }}" +resources: + +# ==================================================================================== +# IAM and Cloud Credentials +# ==================================================================================== + + - name: aws/iam/cross_account_role + file: aws/iam/iam_role.iql + props: + - name: role_name + value: "{{ stack_name }}-{{ stack_env }}-role" + - name: assume_role_policy_document + value: + Version: "2012-10-17" + Statement: + - Sid: "" + Effect: "Allow" + Principal: + AWS: "arn:aws:iam::{{ databricks_aws_account_id }}:root" + Action: "sts:AssumeRole" + Condition: + StringEquals: + sts:ExternalId: "{{ databricks_account_id }}" + - name: description + value: 'allows Databricks to access resources in ({{ stack_name }}-{{ stack_env }})' + - name: path + value: '/' + - name: policies + value: + - PolicyDocument: + Statement: + - Sid: Stmt1403287045000 + Effect: Allow + Action: + - "ec2:AllocateAddress" + - "ec2:AssociateDhcpOptions" + - "ec2:AssociateIamInstanceProfile" + - "ec2:AssociateRouteTable" + - "ec2:AttachInternetGateway" + - "ec2:AttachVolume" + - "ec2:AuthorizeSecurityGroupEgress" + - "ec2:AuthorizeSecurityGroupIngress" + - "ec2:CancelSpotInstanceRequests" + - "ec2:CreateDhcpOptions" + - "ec2:CreateInternetGateway" + - "ec2:CreateKeyPair" + - "ec2:CreateNatGateway" + - "ec2:CreatePlacementGroup" + - "ec2:CreateRoute" + - "ec2:CreateRouteTable" + - "ec2:CreateSecurityGroup" + - "ec2:CreateSubnet" + - "ec2:CreateTags" + - "ec2:CreateVolume" + - "ec2:CreateVpc" + - "ec2:CreateVpcEndpoint" + - "ec2:DeleteDhcpOptions" + - "ec2:DeleteInternetGateway" + - "ec2:DeleteKeyPair" + - "ec2:DeleteNatGateway" + - "ec2:DeletePlacementGroup" + - "ec2:DeleteRoute" + - "ec2:DeleteRouteTable" + - "ec2:DeleteSecurityGroup" + - "ec2:DeleteSubnet" + - "ec2:DeleteTags" + - "ec2:DeleteVolume" + - "ec2:DeleteVpc" + - "ec2:DeleteVpcEndpoints" + - "ec2:DescribeAvailabilityZones" + - "ec2:DescribeIamInstanceProfileAssociations" + - "ec2:DescribeInstanceStatus" + - "ec2:DescribeInstances" + - "ec2:DescribeInternetGateways" + - "ec2:DescribeNatGateways" + - "ec2:DescribePlacementGroups" + - "ec2:DescribePrefixLists" + - "ec2:DescribeReservedInstancesOfferings" + - "ec2:DescribeRouteTables" + - "ec2:DescribeSecurityGroups" + - "ec2:DescribeSpotInstanceRequests" + - "ec2:DescribeSpotPriceHistory" + - "ec2:DescribeSubnets" + - "ec2:DescribeVolumes" + - "ec2:DescribeVpcs" + - "ec2:DescribeVpcAttribute" + - "ec2:DescribeNetworkAcls" + - "ec2:DetachInternetGateway" + - "ec2:DisassociateIamInstanceProfile" + - "ec2:DisassociateRouteTable" + - "ec2:ModifyVpcAttribute" + - "ec2:ReleaseAddress" + - "ec2:ReplaceIamInstanceProfileAssociation" + - "ec2:ReplaceRoute" + - "ec2:RequestSpotInstances" + - "ec2:RevokeSecurityGroupEgress" + - "ec2:RevokeSecurityGroupIngress" + - "ec2:RunInstances" + - "ec2:TerminateInstances" + Resource: + - "*" + - Effect: Allow + Action: + - "iam:CreateServiceLinkedRole" + - "iam:PutRolePolicy" + Resource: + - arn:aws:iam::*:role/aws-service-role/spot.amazonaws.com/AWSServiceRoleForEC2Spot + Condition: + StringLike: + "iam:AWSServiceName": spot.amazonaws.com + Version: '2012-10-17' + PolicyName: "{{ stack_name }}-{{ stack_env }}-policy" + exports: + - aws_iam_role_name: aws_iam_cross_account_role_name + - aws_iam_role_arn: aws_iam_cross_account_role_arn + + - name: databricks_account/credentials + props: + - name: credentials_name + value: "{{ stack_name }}-{{ stack_env }}-credentials" + - name: aws_credentials + value: + sts_role: + role_arn: "{{ aws_iam_cross_account_role_arn }}" + exports: + - databricks_credentials_name + - databricks_credentials_id + - databricks_role_external_id + +# ==================================================================================== +# Storage +# ==================================================================================== + + - name: aws/s3/workspace_bucket + file: aws/s3/s3_bucket.iql + props: + - name: bucket_name + value: "{{ stack_name }}-{{ stack_env }}-root-bucket" + - name: ownership_controls + value: + Rules: + - ObjectOwnership: "BucketOwnerPreferred" + - name: bucket_encryption + value: + ServerSideEncryptionConfiguration: + - BucketKeyEnabled: true + ServerSideEncryptionByDefault: + SSEAlgorithm: "AES256" + - name: public_access_block_configuration + value: + BlockPublicAcls: true + IgnorePublicAcls: true + BlockPublicPolicy: true + RestrictPublicBuckets: true + - name: versioning_configuration + value: + Status: "Suspended" + exports: + - arn: aws_s3_workspace_bucket_arn + - bucket_name: aws_s3_workspace_bucket_name + + - name: aws/s3/workspace_bucket_policy + file: aws/s3/s3_bucket_policy.iql + props: + - name: policy_document + value: + Version: "2012-10-17" + Statement: + - Sid: Grant Databricks Access + Effect: Allow + Principal: + AWS: "arn:aws:iam::{{ databricks_aws_account_id }}:root" + Action: + - "s3:GetObject" + - "s3:GetObjectVersion" + - "s3:PutObject" + - "s3:DeleteObject" + - "s3:ListBucket" + - "s3:GetBucketLocation" + Resource: + - "{{ aws_s3_workspace_bucket_arn }}/*" + - "{{ aws_s3_workspace_bucket_arn }}" + + - name: databricks_account/storage_configuration + props: + - name: storage_configuration_name + value: "{{ stack_name }}-{{ stack_env }}-storage" + - name: root_bucket_info + value: + bucket_name: "{{ aws_s3_workspace_bucket_name }}" + exports: + - databricks_storage_configuration_id + +# ==================================================================================== +# UC Storage Credential and Metastore Catalog Bucket +# ==================================================================================== + + - name: aws/s3/metastore_bucket + file: aws/s3/s3_bucket.iql + props: + - name: bucket_name + value: "{{ stack_name }}-{{ stack_env }}-metastore" + - name: ownership_controls + value: + Rules: + - ObjectOwnership: "BucketOwnerPreferred" + - name: bucket_encryption + value: + ServerSideEncryptionConfiguration: + - BucketKeyEnabled: true + ServerSideEncryptionByDefault: + SSEAlgorithm: "AES256" + - name: public_access_block_configuration + value: + BlockPublicAcls: true + IgnorePublicAcls: true + BlockPublicPolicy: true + RestrictPublicBuckets: true + - name: versioning_configuration + value: + Status: "Suspended" + exports: + - arn: aws_s3_metastore_bucket_arn + - bucket_name: aws_s3_metastore_bucket_name + + - name: aws/iam/metastore_access_role + file: aws/iam/iam_role.iql + props: + - name: role_name + value: "{{ stack_name }}-{{ stack_env }}-metastore-role" + - name: assume_role_policy_document + value: + Version: "2012-10-17" + Statement: + - Effect: "Allow" + Principal: + AWS: + - "arn:aws:iam::414351767826:role/unity-catalog-prod-UCMasterRole-14S5ZJVKOTYTL" + Action: "sts:AssumeRole" + Condition: + StringEquals: + sts:ExternalId: "0000" # Placeholder + - name: description + value: 'Unity Catalog metastore access role for ({{ stack_name }}-{{ stack_env }})' + - name: path + value: '/' + - name: policies + value: + - PolicyName: "MetastoreS3Policy" + PolicyDocument: + Version: "2012-10-17" + Statement: + - Effect: "Allow" + Action: + - "s3:GetObject" + - "s3:PutObject" + - "s3:DeleteObject" + - "s3:ListBucket" + - "s3:GetBucketLocation" + - "s3:ListBucketMultipartUploads" + - "s3:ListMultipartUploadParts" + - "s3:AbortMultipartUpload" + Resource: + - "{{ aws_s3_metastore_bucket_arn }}/*" + - "{{ aws_s3_metastore_bucket_arn }}" + + # - Effect: "Allow" + # Action: + # - "kms:Decrypt" + # - "kms:Encrypt" + # - "kms:GenerateDataKey*" + # Resource: + # - "arn:aws:kms:" + + - Effect: "Allow" + Action: + - "sts:AssumeRole" + Resource: + - "arn:aws:iam::{{ databricks_aws_account_id }}:role/{{ stack_name }}-{{ stack_env }}-metastore-role" + + - Sid: "ManagedFileEventsSetupStatement" + Effect: "Allow" + Action: + - "s3:GetBucketNotification" + - "s3:PutBucketNotification" + - "sns:ListSubscriptionsByTopic" + - "sns:GetTopicAttributes" + - "sns:SetTopicAttributes" + - "sns:CreateTopic" + - "sns:TagResource" + - "sns:Publish" + - "sns:Subscribe" + - "sqs:CreateQueue" + - "sqs:DeleteMessage" + - "sqs:ReceiveMessage" + - "sqs:SendMessage" + - "sqs:GetQueueUrl" + - "sqs:GetQueueAttributes" + - "sqs:SetQueueAttributes" + - "sqs:TagQueue" + - "sqs:ChangeMessageVisibility" + - "sqs:PurgeQueue" + Resource: + - "{{ aws_s3_metastore_bucket_arn }}" + - "arn:aws:sqs:*:*:csms-*" + - "arn:aws:sns:*:*:csms-*" + + - Sid: "ManagedFileEventsListStatement" + Effect: "Allow" + Action: + - "sqs:ListQueues" + - "sqs:ListQueueTags" + - "sns:ListTopics" + Resource: + - "arn:aws:sqs:*:*:csms-*" + - "arn:aws:sns:*:*:csms-*" + + - Sid: "ManagedFileEventsTeardownStatement" + Effect: "Allow" + Action: + - "sns:Unsubscribe" + - "sns:DeleteTopic" + - "sqs:DeleteQueue" + Resource: + - "arn:aws:sqs:*:*:csms-*" + - "arn:aws:sns:*:*:csms-*" + - name: tags + value: + - Key: Purpose + Value: "Unity Catalog Storage Credential" + merge: + - global_tags + exports: + - aws_iam_role_arn: metastore_access_role_arn + +# ==================================================================================== +# DBX Workspace +# ==================================================================================== + + - name: databricks_account/workspace + props: + - name: workspace_name + value: "{{ stack_name }}-{{ stack_env }}-workspace" + - name: aws_region + value: "{{ region }}" + - name: credentials_id + value: "{{ databricks_credentials_id }}" + - name: storage_configuration_id + value: "{{ databricks_storage_configuration_id }}" + - name: pricing_tier + value: PREMIUM + exports: + - databricks_workspace_id + - databricks_deployment_name + + - name: databricks_account/workspace_group + props: + - name: display_name + value: "{{ stack_name }}-{{ stack_env }}-workspace-admins" + exports: + - databricks_group_id + - databricks_group_name + + - name: databricks_account/get_users + type: query + props: + - name: users + value: + - "javen@stackql.io" + - "krimmer@stackql.io" + exports: + - databricks_workspace_group_members + + - name: databricks_account/update_group_membership + type: command + props: [] + + - name: databricks_account/workspace_permission_assignments + props: [] + + - name: databricks_workspace/storage_credential + props: + - name: name + value: "{{ stack_name }}-{{ stack_env }}-storage-credential" + - name: comment + value: "Storage credential for {{ stack_name }} {{ stack_env }} metastore S3 access" + - name: read_only + value: false + - name: aws_iam_role + value: + role_arn: "{{ metastore_access_role_arn }}" + - name: skip_validation + value: false + exports: + - storage_credential_name + - storage_credential_external_id + + - name: databricks_workspace/unitycatalog/grants + type: command + props: + - name: privileges + value: + - "ALL_PRIVILEGES" + - "MANAGE" + sql: | + UPDATE databricks_workspace.unitycatalog.grants + SET data__changes = '[{"add": {{ privileges }},"principal": "{{ databricks_group_name }}"}]' + WHERE full_name = '{{ storage_credential_name }}' AND + securable_type = 'storage_credential' AND + deployment_name = '{{ databricks_deployment_name }}'; + + - name: aws/iam/update_metastore_access_role + type: command + props: + - name: role_name + value: "{{ stack_name }}-{{ stack_env }}-metastore-role" + - name: assume_role_policy_document + value: + Version: "2012-10-17" + Statement: + - Effect: "Allow" + Principal: + AWS: + - "arn:aws:iam::414351767826:role/unity-catalog-prod-UCMasterRole-14S5ZJVKOTYTL" + - "{{ metastore_access_role_arn }}" + Action: "sts:AssumeRole" + Condition: + StringEquals: + sts:ExternalId: "{{ storage_credential_external_id }}" + +# ==================================================================================== +# DBX UC Catalog, Schema, and Table +# ==================================================================================== + + - name: interoperability_catalog + props: + - name: name + value: string + - name: comment + value: string + - name: properties + value: + property1: string + property2: string + - name: storage_root + value: string + - name: provider_name + value: string + - name: share_name + value: string + - name: connection_name + value: string + - name: options + value: + property1: string + property2: string + + - name: interoperability_schema + props: + - name: name + value: string + - name: catalog_name + value: string + - name: comment + value: string + - name: properties + value: + property1: string + property2: string + - name: storage_root + value: string + diff --git a/examples/snowflake/entitlements/README.md b/examples/snowflake/entitlements/README.md new file mode 100644 index 0000000..78215d4 --- /dev/null +++ b/examples/snowflake/entitlements/README.md @@ -0,0 +1,63 @@ +# `stackql-deploy` starter project for `snowflake` + +> for starter projects using other providers, try `stackql-deploy examples/snowflake/entitlements --provider=aws` or `stackql-deploy examples/snowflake/entitlements --provider=google` + +see the following links for more information on `stackql`, `stackql-deploy` and the `snowflake` provider: + +- [`snowflake` provider docs](https://stackql.io/registry/snowflake) +- [`stackql`](https://github.com/stackql/stackql) +- [`stackql-deploy` PyPI home page](https://pypi.org/project/stackql-deploy/) +- [`stackql-deploy` GitHub repo](https://github.com/stackql/stackql-deploy) + +## Overview + +__`stackql-deploy`__ is a stateless, declarative, SQL driven Infrastructure-as-Code (IaC) framework. There is no state file required as the current state is assessed for each resource at runtime. __`stackql-deploy`__ is capable of provisioning, deprovisioning and testing a stack which can include resources across different providers, like a stack spanning `azure` and `aws` for example. + +## Prerequisites + +This example requires `stackql-deploy` to be installed using __`pip install stackql-deploy`__. The host used to run `stackql-deploy` needs the necessary environment variables set to authenticate to your specific provider, in the case of the `snowflake` provider, `SNOWFLAKE_PAT` must be set, for more information on authentication to `snowflake` see the [`snowflake` provider documentation](https://snowflake.stackql.io/providers/snowflake). + +## Usage + +Adjust the values in the [__`stackql_manifest.yml`__](stackql_manifest.yml) file if desired. The [__`stackql_manifest.yml`__](stackql_manifest.yml) file contains resource configuration variables to support multiple deployment environments, these will be used for `stackql` queries in the `resources` folder. + +The syntax for the `stackql-deploy` command is as follows: + +```bash +stackql-deploy { build | test | teardown } { stack-directory } { deployment environment} [ optional flags ] +``` + +### Deploying a stack + +For example, to deploy the stack named examples/snowflake/entitlements to an environment labeled `sit`, run the following: + +```bash +stackql-deploy build examples/snowflake/entitlements sit \ +-e SNOWFLAKE_ORG=OKXVNMC -e SNOWFLAKE_ACCOUNT=VH34026 +``` + +Use the `--dry-run` flag to view the queries to be run without actually running them, for example: + +```bash +stackql-deploy build examples/snowflake/entitlements sit \ +-e SNOWFLAKE_ORG=OKXVNMC -e SNOWFLAKE_ACCOUNT=VH34026 \ +--dry-run +``` + +### Testing a stack + +To test a stack to ensure that all resources are present and in the desired state, run the following (in our `sit` deployment example): + +```bash +stackql-deploy test examples/snowflake/entitlements sit \ +-e SNOWFLAKE_ORG=OKXVNMC -e SNOWFLAKE_ACCOUNT=VH34026 +``` + +### Tearing down a stack + +To destroy or deprovision all resources in a stack for our `sit` deployment example, run the following: + +```bash +stackql-deploy teardown examples/snowflake/entitlements sit \ +-e SNOWFLAKE_ORG=OKXVNMC -e SNOWFLAKE_ACCOUNT=VH34026 +``` \ No newline at end of file diff --git a/examples/snowflake/entitlements/resources/databases.iql b/examples/snowflake/entitlements/resources/databases.iql new file mode 100644 index 0000000..3f39f52 --- /dev/null +++ b/examples/snowflake/entitlements/resources/databases.iql @@ -0,0 +1,83 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM snowflake.database.databases +WHERE name = '{{ database_name }}' +AND endpoint = '{{ endpoint }}'; + +/*+ statecheck, retries=1, retry_delay=2 */ +SELECT COUNT(*) as count +FROM snowflake.database.databases +WHERE name = '{{ database_name }}' +AND endpoint = '{{ endpoint }}' +AND kind = '{{ kind }}' +AND comment = '{{ comment }}' +AND data_retention_time_in_days = {{ data_retention_time_in_days }} +AND log_level = '{{ log_level }}' +AND max_data_extension_time_in_days = {{ max_data_extension_time_in_days }} +AND suspend_task_after_num_failures = {{ suspend_task_after_num_failures }} +AND trace_level = '{{ trace_level }}' +AND user_task_managed_initial_warehouse_size = '{{ user_task_managed_initial_warehouse_size }}' +AND serverless_task_min_statement_size = '{{ serverless_task_min_statement_size }}' +AND serverless_task_max_statement_size = '{{ serverless_task_max_statement_size }}' +AND user_task_timeout_ms = {{ user_task_timeout_ms }} +; + +/*+ create */ +INSERT INTO snowflake.database.databases ( +data__name, +data__kind, +data__comment, +data__data_retention_time_in_days, +data__log_level, +data__max_data_extension_time_in_days, +data__suspend_task_after_num_failures, +data__trace_level, +data__user_task_managed_initial_warehouse_size, +data__serverless_task_min_statement_size, +data__serverless_task_max_statement_size, +data__user_task_timeout_ms, +endpoint +) +SELECT +'{{ database_name }}', +'{{ kind }}', +'{{ comment }}', + {{ data_retention_time_in_days }}, +'{{ log_level }}', + {{ max_data_extension_time_in_days }}, + {{ suspend_task_after_num_failures }}, +'{{ trace_level }}', +'{{ user_task_managed_initial_warehouse_size }}', +'{{ serverless_task_min_statement_size }}', +'{{ serverless_task_max_statement_size }}', + {{ user_task_timeout_ms }}, +'{{ endpoint }}' +; + +/*+ update */ +REPLACE snowflake.database.databases +SET +kind = '{{ kind }}', +comment = '{{ comment }}', +data_retention_time_in_days = '{{ data_retention_time_in_days }}', +default_ddl_collation = '{{ default_ddl_collation }}', +log_level = '{{ log_level }}', +max_data_extension_time_in_days = '{{ max_data_extension_time_in_days }}', +suspend_task_after_num_failures = '{{ suspend_task_after_num_failures }}', +trace_level = '{{ trace_level }}', +user_task_managed_initial_warehouse_size = '{{ user_task_managed_initial_warehouse_size }}', +serverless_task_min_statement_size = '{{ serverless_task_min_statement_size }}', +serverless_task_max_statement_size = '{{ serverless_task_max_statement_size }}', +user_task_timeout_ms = '{{ user_task_timeout_ms }}' +WHERE +name = '{{ database_name }}' +AND data__name = '{{ database_name }}' +AND endpoint = '{{ endpoint }}'; + +/*+ exports */ +SELECT '{{ database_name }}' as database_name; + +/*+ delete */ +DELETE FROM snowflake.database.databases +WHERE name = '{{ database_name }}' +AND endpoint = '{{ endpoint }}'; \ No newline at end of file diff --git a/examples/snowflake/entitlements/resources/grants.iql b/examples/snowflake/entitlements/resources/grants.iql new file mode 100644 index 0000000..93c65b7 --- /dev/null +++ b/examples/snowflake/entitlements/resources/grants.iql @@ -0,0 +1,23 @@ +/*+ createorupdate */ +INSERT INTO snowflake.role.grants ( +data__securable, +data__securable_type, +data__grant_option, +data__privileges, +name, +endpoint +) +SELECT +'{{ securable }}', +'{{ securable_type }}', +{{ grant_option }}, +'{{ privileges }}', +'{{ role_name }}', +'{{ endpoint }}' +; + +/*+ delete */ +DELETE FROM snowflake.role.grants +WHERE name = '{{ role_name }}' +AND data__securable_type = '{{ securable_type }}' +AND endpoint = '{{ endpoint }}'; \ No newline at end of file diff --git a/examples/snowflake/entitlements/resources/masking_policies.iql b/examples/snowflake/entitlements/resources/masking_policies.iql new file mode 100644 index 0000000..108d59b --- /dev/null +++ b/examples/snowflake/entitlements/resources/masking_policies.iql @@ -0,0 +1,20 @@ +/*+ createorupdate */ +INSERT INTO snowflake.sqlapi.statements ( +data__statement, +data__timeout, +data__database, +data__schema, +"User-Agent", +endpoint +) +SELECT +'{{ statement }}', +{{ timeout }}, +'{{ database }}', +'{{ schema }}', +'{{ "User-Agent" }}', +'{{ endpoint }}' +; + +/*+ exports */ +SELECT '{{ masking_policy_name }}' as masking_policy_name; \ No newline at end of file diff --git a/examples/snowflake/entitlements/resources/roles.iql b/examples/snowflake/entitlements/resources/roles.iql new file mode 100644 index 0000000..cc8e2b0 --- /dev/null +++ b/examples/snowflake/entitlements/resources/roles.iql @@ -0,0 +1,21 @@ +/*+ createorupdate */ +INSERT INTO snowflake.role.roles ( +data__name, +data__comment, +endpoint, +createMode +) +SELECT +'{{ role_name }}', +'{{ comment }}', +'{{ endpoint }}', +'orReplace' +; + +/*+ exports */ +SELECT '{{ role_name }}' as role_name; + +/*+ delete */ +DELETE FROM snowflake.role.roles +WHERE name = '{{ role_name }}' +AND endpoint = '{{ endpoint }}'; \ No newline at end of file diff --git a/examples/snowflake/entitlements/resources/schemas.iql b/examples/snowflake/entitlements/resources/schemas.iql new file mode 100644 index 0000000..55a72e6 --- /dev/null +++ b/examples/snowflake/entitlements/resources/schemas.iql @@ -0,0 +1,87 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM snowflake.schema.schemas +WHERE database_name = '{{ database_name }}' +AND name = '{{ schema_name }}' +AND endpoint = '{{ endpoint }}'; + +/*+ statecheck, retries=1, retry_delay=2 */ +SELECT COUNT(*) as count +FROM snowflake.schema.schemas +WHERE database_name = '{{ database_name }}' +AND name = '{{ schema_name }}' +AND endpoint = '{{ endpoint }}' +AND kind = '{{ kind }}' +AND managed_access = {{ managed_access }} +AND data_retention_time_in_days = {{ data_retention_time_in_days }} +AND log_level = '{{ log_level }}' +AND max_data_extension_time_in_days = {{ max_data_extension_time_in_days }} +AND suspend_task_after_num_failures = {{ suspend_task_after_num_failures }} +AND trace_level = '{{ trace_level }}' +AND user_task_managed_initial_warehouse_size = '{{ user_task_managed_initial_warehouse_size }}' +AND serverless_task_min_statement_size = '{{ serverless_task_min_statement_size }}' +AND serverless_task_max_statement_size = '{{ serverless_task_max_statement_size }}' +AND user_task_timeout_ms = {{ user_task_timeout_ms }}; + +/*+ create */ +INSERT INTO snowflake.schema.schemas ( +data__name, +data__kind, +data__managed_access, +data__data_retention_time_in_days, +data__log_level, +data__max_data_extension_time_in_days, +data__suspend_task_after_num_failures, +data__trace_level, +data__user_task_managed_initial_warehouse_size, +data__serverless_task_min_statement_size, +data__serverless_task_max_statement_size, +data__user_task_timeout_ms, +database_name, +endpoint +) +SELECT +'{{ schema_name }}', +'{{ kind }}', +{{ managed_access }}, +{{ data_retention_time_in_days }}, +'{{ log_level }}', +{{ max_data_extension_time_in_days }}, +{{ suspend_task_after_num_failures }}, +'{{ trace_level }}', +'{{ user_task_managed_initial_warehouse_size }}', +'{{ serverless_task_min_statement_size }}', +'{{ serverless_task_max_statement_size }}', +{{ user_task_timeout_ms }}, +'{{ database_name }}', +'{{ endpoint }}' +; + +/*+ update */ +REPLACE snowflake.schema.schemas +SET +kind = '{{ kind }}', +managed_access = {{ managed_access }}, +data_retention_time_in_days = {{ data_retention_time_in_days }}, +log_level = '{{ log_level }}', +max_data_extension_time_in_days = {{ max_data_extension_time_in_days }}, +suspend_task_after_num_failures = {{ suspend_task_after_num_failures }}, +trace_level = '{{ trace_level }}', +user_task_managed_initial_warehouse_size = '{{ user_task_managed_initial_warehouse_size }}', +serverless_task_min_statement_size = '{{ serverless_task_min_statement_size }}', +serverless_task_max_statement_size = '{{ serverless_task_max_statement_size }}', +user_task_timeout_ms = {{ user_task_timeout_ms }} +WHERE +database_name = '{{ database_name }}' +AND name = '{{ schema_name }}' +AND data__name = '{{ schema_name }}' +AND endpoint = '{{ endpoint }}'; + +/*+ exports */ +SELECT '{{ schema_name }}' as schema_name; + +/*+ delete */ +DELETE FROM snowflake.schema.schemas +WHERE database_name = '{{ database_name }}' +AND name = '{{ schema_name }}' +AND endpoint = '{{ endpoint }}'; \ No newline at end of file diff --git a/examples/snowflake/entitlements/resources/statements.iql b/examples/snowflake/entitlements/resources/statements.iql new file mode 100644 index 0000000..18782c0 --- /dev/null +++ b/examples/snowflake/entitlements/resources/statements.iql @@ -0,0 +1,17 @@ +/*+ createorupdate */ +INSERT INTO snowflake.sqlapi.statements ( +data__statement, +data__timeout, +data__database, +data__schema, +"User-Agent", +endpoint +) +SELECT +'{{ statement }}', +{{ timeout }}, +'{{ database }}', +'{{ schema }}', +'{{ "User-Agent" }}', +'{{ endpoint }}' +; diff --git a/examples/snowflake/entitlements/resources/tables.iql b/examples/snowflake/entitlements/resources/tables.iql new file mode 100644 index 0000000..5411d68 --- /dev/null +++ b/examples/snowflake/entitlements/resources/tables.iql @@ -0,0 +1,49 @@ +/*+ exists */ +SELECT COUNT(*) as count +FROM snowflake.table.tables +WHERE database_name = '{{ database_name }}' +AND schema_name = '{{ schema_name }}' +AND name = '{{ name }}' +AND endpoint = '{{ endpoint }}'; + +/*+ statecheck, retries=1, retry_delay=2 */ +SELECT COUNT(*) as count +FROM snowflake.table.tables +WHERE database_name = '{{ database_name }}' +AND schema_name = '{{ schema_name }}' +AND name = '{{ name }}' +AND endpoint = '{{ endpoint }}' +AND kind = '{{ kind }}' +AND comment = '{{ comment }}'; + +/*+ create */ +INSERT INTO snowflake.table.tables ( +data__name, +data__kind, +data__columns, +data__constraints, +data__comment, +database_name, +schema_name, +endpoint +) +SELECT +'{{ name }}', +'{{ kind }}', +'{{ columns }}', +'{{ constraints }}', +'{{ comment }}', +'{{ database_name }}', +'{{ schema_name }}', +'{{ endpoint }}' +; + +/*+ exports */ +SELECT '{{ name }}' as table_name; + +/*+ delete */ +DELETE FROM snowflake.table.tables +WHERE database_name = '{{ database_name }}' +AND schema_name = '{{ schema_name }}' +AND name = '{{ name }}' +AND endpoint = '{{ endpoint }}'; \ No newline at end of file diff --git a/examples/snowflake/entitlements/resources/warehouses.iql b/examples/snowflake/entitlements/resources/warehouses.iql new file mode 100644 index 0000000..70858ec --- /dev/null +++ b/examples/snowflake/entitlements/resources/warehouses.iql @@ -0,0 +1,33 @@ +/*+ createorupdate */ +INSERT INTO snowflake.warehouse.warehouses ( +data__name, +data__warehouse_type, +data__warehouse_size, +data__scaling_policy, +data__auto_suspend, +data__auto_resume, +data__initially_suspended, +data__comment, +createMode, +endpoint +) +SELECT +'{{ name }}', +'{{ warehouse_type }}', +'{{ warehouse_size }}', +'{{ scaling_policy }}', +{{ auto_suspend }}, +'{{ auto_resume }}', +'{{ initially_suspended }}', +'{{ comment }}', +'orReplace', +'{{ endpoint }}' +; + +/*+ exports */ +SELECT '{{ name }}' as warehouse_name; + +/*+ delete */ +DELETE FROM snowflake.warehouse.warehouses +WHERE name = '{{ name }}' +AND endpoint = '{{ endpoint }}'; \ No newline at end of file diff --git a/examples/snowflake/entitlements/stackql_manifest.yml b/examples/snowflake/entitlements/stackql_manifest.yml new file mode 100644 index 0000000..8854b97 --- /dev/null +++ b/examples/snowflake/entitlements/stackql_manifest.yml @@ -0,0 +1,337 @@ +version: 1 +name: snowflake_entitlements +description: entitlements framework for snowflake +providers: + - snowflake +globals: + - name: endpoint + description: snowflake endpoint (org-account) + value: "{{ SNOWFLAKE_ORG }}-{{ SNOWFLAKE_ACCOUNT }}" + - name: global_tags + value: + provisioner: stackql + stack_name: "{{ stack_name }}" + stack_env: "{{ stack_env }}" +resources: + - name: main_database + file: databases.iql + props: + - name: database_name + value: "{{ stack_name|upper }}_{{ stack_env|upper }}" + - name: kind + value: PERMANENT + - name: comment + value: "Main database for {{ stack_name }} {{ stack_env }}" + - name: data_retention_time_in_days + value: 1 + - name: log_level + value: 'OFF' + - name: max_data_extension_time_in_days + value: 14 + - name: suspend_task_after_num_failures + value: 10 + - name: trace_level + value: 'OFF' + - name: user_task_managed_initial_warehouse_size + value: MEDIUM + - name: serverless_task_min_statement_size + value: XSMALL + - name: serverless_task_max_statement_size + value: X2LARGE + - name: user_task_timeout_ms + value: 3600000 + exports: + - database_name: main_database_name + + # shared warehouse + - name: shared_warehouse + file: warehouses.iql + props: + - name: name + value: ANALYST_WH + - name: warehouse_type + value: STANDARD + - name: warehouse_size + value: XSMALL + - name: scaling_policy + value: ECONOMY + - name: auto_suspend + value: 300 + - name: auto_resume + value: 'true' + - name: initially_suspended + value: 'true' + - name: comment + value: "Analyst warehouse for {{ stack_name }} {{ stack_env }}" + exports: + - warehouse_name: shared_warehouse_name + + # schemas + - name: bronze_schema_src1 + file: schemas.iql + props: + - name: database_name + value: "{{ main_database_name}}" + - name: schema_name + value: "BRONZE_SRC1" + - name: kind + value: PERMANENT + - name: managed_access + value: true + - name: data_retention_time_in_days + value: 1 + - name: log_level + value: "OFF" + - name: max_data_extension_time_in_days + value: 14 + - name: suspend_task_after_num_failures + value: 10 + - name: trace_level + value: "OFF" + - name: user_task_managed_initial_warehouse_size + value: "MEDIUM" + - name: serverless_task_min_statement_size + value: "XSMALL" + - name: serverless_task_max_statement_size + value: "X2LARGE" + - name: user_task_timeout_ms + value: 3600000 + exports: + - schema_name: bronze_schema_src1_name + + # roles + - name: basic_access_role + file: roles.iql + props: + - name: role_name + value: "{{ stack_name|upper }}_{{ stack_env|upper }}_BASIC_ACCESS_ROLE" + - name: comment + value: "Basic access role" + exports: + - role_name: basic_access_role_name + + - name: pci_access_role + file: roles.iql + props: + - name: role_name + value: "{{ stack_name|upper }}_{{ stack_env|upper }}_PCI_ACCESS_ROLE" + - name: comment + value: "PCI access role" + exports: + - role_name: pci_access_role_name + + # grants + - name: basic_access_role_db_usage + file: grants.iql + props: + - name: role_name + value: '{{ basic_access_role_name }}' + - name: securable + value: + name: '{{ main_database_name }}' + - name: securable_type + value: DATABASE + - name: grant_option + value: false + - name: privileges + value: ["USAGE"] + + - name: basic_access_role_schema_usage + file: grants.iql + props: + - name: role_name + value: '{{ basic_access_role_name }}' + - name: securable + value: + database: '{{ main_database_name }}' + name: '{{ bronze_schema_src1_name }}' + - name: securable_type + value: SCHEMA + - name: grant_option + value: false + - name: privileges + value: ["USAGE"] + + - name: basic_access_role_warehouse_usage + file: grants.iql + props: + - name: role_name + value: '{{ basic_access_role_name }}' + - name: securable + value: + name: '{{ shared_warehouse_name }}' + - name: securable_type + value: WAREHOUSE + - name: grant_option + value: false + - name: privileges + value: ["USAGE"] + + - name: pci_access_role_db_usage + file: grants.iql + props: + - name: role_name + value: '{{ pci_access_role_name }}' + - name: securable + value: + name: '{{ main_database_name }}' + - name: securable_type + value: DATABASE + - name: grant_option + value: false + description: >- + If true, allows the recipient role to grant the privileges to other + roles. + - name: privileges + value: ["USAGE"] + + - name: pci_access_role_schema_usage + file: grants.iql + props: + - name: role_name + value: '{{ pci_access_role_name }}' + - name: securable + value: + database: '{{ main_database_name }}' + name: '{{ bronze_schema_src1_name }}' + - name: securable_type + value: SCHEMA + - name: grant_option + value: false + - name: privileges + value: ["USAGE"] + + - name: pci_access_role_warehouse_usage + file: grants.iql + props: + - name: role_name + value: '{{ pci_access_role_name }}' + - name: securable + value: + name: '{{ shared_warehouse_name }}' + - name: securable_type + value: WAREHOUSE + - name: grant_option + value: false + - name: privileges + value: ["USAGE"] + + # masking policies + - name: create_pci_masking_policy + file: masking_policies.iql + props: + - name: masking_policy_name + value: '{{ stack_name|upper }}_{{ stack_env|upper }}_PCI_MASKING_POLICY' + - name: '"User-Agent"' + value: stackql + - name: statement + value: | + CREATE MASKING POLICY IF NOT EXISTS {{ stack_name|upper }}_{{ stack_env|upper }}_PCI_MASKING_POLICY + AS (val STRING) RETURNS STRING -> + CASE + WHEN CURRENT_ROLE() IN (''{{ pci_access_role_name }}'') THEN val + ELSE ''***MASKED***'' + END + - name: timeout + value: 10 + - name: database + value: '{{ main_database_name }}' + - name: schema + value: '{{ bronze_schema_src1_name }}' + exports: + - masking_policy_name: pci_masking_policy_name + + # customer data table + - name: customer_data_table + file: tables.iql + props: + - name: database_name + value: '{{ main_database_name }}' + - name: schema_name + value: '{{ bronze_schema_src1_name }}' + - name: name + value: 'CUSTOMER_DATA' + - name: kind + value: 'PERMANENT' + - name: comment + value: 'Table with PCI masked data' + - name: columns + value: + - name: customer_id + datatype: 'INTEGER' + nullable: false + - name: customer_name + datatype: 'VARCHAR(100)' + nullable: false + - name: email + datatype: 'VARCHAR(100)' + nullable: false + - name: credit_card_number + datatype: 'VARCHAR(19)' + nullable: true + comment: 'PCI sensitive data - masked for non-PCI roles' + - name: purchase_amount + datatype: 'NUMBER(10,2)' + nullable: false + - name: purchase_date + datatype: 'DATE' + nullable: false + - name: constraints + value: + - name: pk_customer_id + column_names: ["customer_id"] + constraint_type: "PRIMARY KEY" + exports: + - table_name: customer_data_table_name + + - name: apply_pci_masking_policy + file: statements.iql + props: + - name: '"User-Agent"' + value: stackql + - name: statement + value: | + ALTER TABLE {{ main_database_name }}.{{ bronze_schema_src1_name }}.{{ customer_data_table_name}} + MODIFY COLUMN credit_card_number + SET MASKING POLICY {{ pci_masking_policy_name }} + - name: timeout + value: 10 + - name: database + value: '{{ main_database_name }}' + - name: schema + value: '{{ bronze_schema_src1_name }}' + + - name: basic_access_customer_data_table_usage + file: grants.iql + props: + - name: role_name + value: '{{ basic_access_role_name }}' + - name: securable + value: + database: '{{ main_database_name }}' + schema: '{{ bronze_schema_src1_name }}' + name: '{{ customer_data_table_name }}' + - name: securable_type + value: TABLE + - name: grant_option + value: false + - name: privileges + value: ["SELECT"] + + - name: pci_access_customer_data_table_usage + file: grants.iql + props: + - name: role_name + value: '{{ pci_access_role_name }}' + - name: securable + value: + database: '{{ main_database_name }}' + schema: '{{ bronze_schema_src1_name }}' + name: '{{ customer_data_table_name }}' + - name: securable_type + value: TABLE + - name: grant_option + value: false + - name: privileges + value: ["SELECT"] + diff --git a/get-contributors.iql b/get-contributors.iql new file mode 100644 index 0000000..e673431 --- /dev/null +++ b/get-contributors.iql @@ -0,0 +1,10 @@ +SELECT login FROM ( +SELECT login, SUM(contributions) total_contributions FROM +(SELECT login, contributions +FROM github.repos.contributors +WHERE owner = 'stackql' +AND repo IN ('stackql', 'stackql-deploy', 'pystackql', 'google-discovery-to-openapi') +) t +GROUP BY login +ORDER BY total_contributions DESC +) t1 \ No newline at end of file diff --git a/get-contributors.sh b/get-contributors.sh new file mode 100644 index 0000000..c7bd7c7 --- /dev/null +++ b/get-contributors.sh @@ -0,0 +1 @@ +./stackql exec --infile get-contributors.iql --output csv -f stackql_deploy/inc/contributors.csv -H \ No newline at end of file diff --git a/setup.py b/setup.py index 7ce9d62..2860f2d 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ setup( name='stackql-deploy', - version='1.8.3', + version='1.8.5', description='Model driven resource provisioning and deployment framework using StackQL.', long_description=readme, long_description_content_type='text/x-rst', @@ -22,8 +22,10 @@ package_data={ 'stackql_deploy': [ 'templates/**/*.template', # Include template files recursively + 'contributors.csv' ], }, + include_package_data=True, install_requires=[ 'click', diff --git a/stackql_deploy/__init__.py b/stackql_deploy/__init__.py index 5369601..31e8d61 100644 --- a/stackql_deploy/__init__.py +++ b/stackql_deploy/__init__.py @@ -1 +1 @@ -__version__ = '1.8.3' +__version__ = '1.8.5' diff --git a/stackql_deploy/cli.py b/stackql_deploy/cli.py index be2b275..3a7fc2b 100644 --- a/stackql_deploy/cli.py +++ b/stackql_deploy/cli.py @@ -1,3 +1,4 @@ +# cli.py import click import os import sys @@ -289,6 +290,36 @@ def info(ctx): for provider in providers: click.echo(f" {provider['name']}: {provider['version']}") + # Read and display contributors + contributors = read_contributors(logger) + if contributors: + click.echo("\n" + click.style("✨ Special Thanks to our Contributors ✨", fg="green", bold=True)) + + # Display 4 contributors per line + for i in range(0, len(contributors), 4): + # Get up to 4 contributors for this line + line_contributors = contributors[i:i+4] + # Join with commas + line = ", ".join(line_contributors) + # Display the line + click.echo(f" {line}") + +def read_contributors(logger): + """Read contributors from CSV file and return as list of dicts.""" + try: + # Look for contributors.csv in package directory + package_dir = os.path.dirname(os.path.abspath(__file__)) + contributors_path = os.path.join(package_dir, 'inc', 'contributors.csv') + + with open(contributors_path, 'r', encoding='utf-8') as f: + contributors = [line.strip() for line in f if line.strip()] + + return contributors + + except Exception as e: + logger.debug(f"Failed to read contributors: {str(e)}") + return [] + # # shell command # diff --git a/stackql_deploy/cmd/base.py b/stackql_deploy/cmd/base.py index 6b38893..876a16f 100644 --- a/stackql_deploy/cmd/base.py +++ b/stackql_deploy/cmd/base.py @@ -1,3 +1,4 @@ +# cmd/base.py from ..lib.utils import ( perform_retries, run_stackql_command, @@ -7,7 +8,8 @@ show_query, check_all_dicts, ) -from ..lib.config import setup_environment, load_manifest, get_global_context_and_providers +from ..lib.config import load_manifest, get_global_context_and_providers +from ..lib.filters import setup_environment class StackQLBase: def __init__(self, stackql, vars, logger, stack_dir, stack_env): diff --git a/stackql_deploy/cmd/build.py b/stackql_deploy/cmd/build.py index 8e3a4e6..606d049 100644 --- a/stackql_deploy/cmd/build.py +++ b/stackql_deploy/cmd/build.py @@ -1,3 +1,4 @@ +# cmd/build.py import datetime from ..lib.utils import ( catch_error_and_exit, @@ -6,7 +7,7 @@ get_type ) from ..lib.config import get_full_context, render_value -from ..lib.templating import get_queries +from ..lib.templating import get_queries, render_inline_template from .base import StackQLBase class StackQLProvisioner(StackQLBase): @@ -73,7 +74,16 @@ def run(self, dry_run, show_queries, on_failure): # # get resource queries # - resource_queries = get_queries(self.env, self.stack_dir, 'resources', resource, full_context, self.logger) + if type == 'command' and 'sql' in resource: + # command type resource with inline SQL + resource_queries = {} + else: + resource_queries = get_queries(self.env, + self.stack_dir, + 'resources', + resource, + full_context, + self.logger) # provisioning queries if type in ('resource', 'multi'): @@ -238,9 +248,27 @@ def run(self, dry_run, show_queries, on_failure): if type == 'command': # command queries - command_query = resource_queries.get('command', {}).get('rendered') - command_retries = resource_queries.get('command', {}).get('options', {}).get('retries', 1) - command_retry_delay = resource_queries.get('command', {}).get('options', {}).get('retry_delay', 0) + if 'sql' in resource: + command_query = render_inline_template(self.env, + resource["name"], + resource["sql"], + full_context, + self.logger) + command_retries = 1 + command_retry_delay = 0 + else: + # SQL from file + command_query = resource_queries.get('command', {}).get('rendered') + command_retries = resource_queries.get('command', {}).get('options', {}).get('retries', 1) + command_retry_delay = resource_queries.get('command', {}).get('options', {}).get('retry_delay', 0) + if not command_query: + error_msg = ( + "'sql' should be defined in the resource or the 'command' anchor " + "needs to be supplied in the corresponding iql file for command " + "type resources." + ) + catch_error_and_exit(error_msg, self.logger) + self.run_command(command_query, command_retries, command_retry_delay, dry_run, show_queries) # # exports diff --git a/stackql_deploy/cmd/teardown.py b/stackql_deploy/cmd/teardown.py index 17fd496..db3d022 100644 --- a/stackql_deploy/cmd/teardown.py +++ b/stackql_deploy/cmd/teardown.py @@ -1,3 +1,4 @@ +# cmd/teardown.py import datetime from ..lib.utils import ( catch_error_and_exit, diff --git a/stackql_deploy/cmd/test.py b/stackql_deploy/cmd/test.py index 35d4b12..dbd19b0 100644 --- a/stackql_deploy/cmd/test.py +++ b/stackql_deploy/cmd/test.py @@ -1,3 +1,4 @@ +# cmd/test.py import datetime from ..lib.utils import ( catch_error_and_exit, diff --git a/stackql_deploy/inc/contributors.csv b/stackql_deploy/inc/contributors.csv new file mode 100644 index 0000000..11a0e5f --- /dev/null +++ b/stackql_deploy/inc/contributors.csv @@ -0,0 +1,23 @@ +jeffreyaven +general-kroll-4-life +derek10cloud +yunchengyang515 +mxrch +jthegedus +Iqbalabdi +tomekz +soysaucewaso +sanketmp +ryukinoz +ryuichi-maeda +rameshgkwd05 +pinalbaldha +kieranrimmer +gsusI +filipnavara +drawdrop +datwiz +cuishuang +claude[bot] +Racso-3141 +BulkBeing diff --git a/stackql_deploy/lib/bootstrap.py b/stackql_deploy/lib/bootstrap.py index d1b79b9..3ace615 100644 --- a/stackql_deploy/lib/bootstrap.py +++ b/stackql_deploy/lib/bootstrap.py @@ -1,3 +1,4 @@ +# lib/bootstrap.py import logging # Set up logging at the root level diff --git a/stackql_deploy/lib/config.py b/stackql_deploy/lib/config.py index 22f0fab..57cefcf 100644 --- a/stackql_deploy/lib/config.py +++ b/stackql_deploy/lib/config.py @@ -1,98 +1,12 @@ +# lib/config.py import os import yaml import json -import base64 import pprint -import uuid import sys from .utils import pull_providers, catch_error_and_exit -from jinja2 import Environment, FileSystemLoader, TemplateError - -# jinja filters - -def from_json(value): - return json.loads(value) - -def base64_encode(value): - return base64.b64encode(value.encode()).decode() - -def merge_lists(list1, list2): - # Helper function to ensure we have Python lists, not JSON strings - def ensure_list(input_data): - if isinstance(input_data, str): - try: - # Attempt to decode a JSON string - decoded = json.loads(input_data) - if isinstance(decoded, list): - return decoded - except json.JSONDecodeError: - pass # If it's not a JSON string, keep it as a string - elif isinstance(input_data, list): - return input_data - raise ValueError("(config.merge_lists) input must be a list or a JSON-encoded list string") - - # Ensure both inputs are lists - list1 = ensure_list(list1) - list2 = ensure_list(list2) - - # Convert lists to sets of JSON strings to handle unhashable types - set1 = set(json.dumps(item, sort_keys=True) for item in list1) - set2 = set(json.dumps(item, sort_keys=True) for item in list2) - - # Merge sets - merged_set = set1 | set2 - - # Convert back to list of dictionaries or original items - merged_list = [json.loads(item) for item in merged_set] - return merged_list - -def merge_objects(obj1, obj2): - # Helper function to ensure we have Python dicts, not JSON strings - def ensure_dict(input_data): - if isinstance(input_data, str): - try: - # Attempt to decode a JSON string - decoded = json.loads(input_data) - if isinstance(decoded, dict): - return decoded - except json.JSONDecodeError: - pass # If it's not a JSON string, keep it as a string - elif isinstance(input_data, dict): - return input_data - raise ValueError("(config.merge_objects) input must be a dict or a JSON-encoded dict string") - - # Ensure both inputs are dicts - obj1 = ensure_dict(obj1) - obj2 = ensure_dict(obj2) - - # Merge the two dictionaries - merged_obj = {**obj1, **obj2} - - return merged_obj - -def generate_patch_document(properties): - """ - Generates a patch document for the given resource. This is designed for the AWS Cloud Control API, which requires - a patch document to update resources. - """ - patch_doc = [] - for key, value in properties.items(): - # Check if the value is already a string (indicating it's likely already JSON) and leave it as is - if isinstance(value, str): - try: - # Try to parse the string to confirm it's a JSON object/array - parsed_value = json.loads(value) - patch_doc.append({"op": "add", "path": f"/{key}", "value": parsed_value}) - except json.JSONDecodeError: - # If it's not a JSON string, treat it as a simple string value - patch_doc.append({"op": "add", "path": f"/{key}", "value": value}) - else: - # If it's not a string, add it as a JSON-compatible object - patch_doc.append({"op": "add", "path": f"/{key}", "value": value}) - - return json.dumps(patch_doc) - -# END jinja filters +from jinja2 import TemplateError +from .filters import merge_lists, merge_objects def to_sql_compatible_json(value): """ @@ -176,26 +90,36 @@ def render_globals(env, vars, global_vars, stack_env, stack_name, logger): def render_properties(env, resource_props, global_context, logger): prop_context = {} + # Create a resource_context that starts with a copy of global_context + # This will be used for rendering and updated as we go, but not returned + resource_context = global_context.copy() logger.debug("rendering properties...") for prop in resource_props: try: if 'value' in prop: - rendered_value = render_value(env, prop['value'], global_context, logger) + # Use resource_context for rendering, which includes both global vars and + # properties that have already been processed + rendered_value = render_value(env, prop['value'], resource_context, logger) logger.debug( f"(config.render_properties) setting property [{prop['name']}] to " f"{to_sql_compatible_json(rendered_value)}" ) prop_context[prop['name']] = to_sql_compatible_json(rendered_value) + # Update resource_context with the new property + resource_context[prop['name']] = to_sql_compatible_json(rendered_value) elif 'values' in prop: env_value = prop['values'].get(global_context['stack_env'], {}).get('value') if env_value is not None: - rendered_value = render_value(env, env_value, global_context, logger) + # Use resource_context for rendering + rendered_value = render_value(env, env_value, resource_context, logger) logger.debug( f"(config.render_properties) setting property [{prop['name']}] using value for " f"{env_value} to {to_sql_compatible_json(rendered_value)}" ) prop_context[prop['name']] = to_sql_compatible_json(rendered_value) + # Update resource_context with the new property + resource_context[prop['name']] = to_sql_compatible_json(rendered_value) else: catch_error_and_exit( f"(config.render_properties) no value specified for property '{prop['name']}' " @@ -206,15 +130,16 @@ def render_properties(env, resource_props, global_context, logger): if 'merge' in prop: logger.debug(f"(config.render_properties) processing merge for [{prop['name']}]") base_value_rendered = prop_context.get(prop['name'], None) - base_value = json.loads(base_value_rendered) + base_value = json.loads(base_value_rendered) if base_value_rendered else None base_value_type = type(base_value) logger.debug( f"(config.render_properties) base value for [{prop['name']}]: " f"{base_value_rendered} (type: {base_value_type})" ) for merge_item in prop['merge']: - if merge_item in global_context: - merge_value_rendered = global_context[merge_item] + # Use resource_context for lookups during merge + if merge_item in resource_context: + merge_value_rendered = resource_context[merge_item] merge_value = json.loads(merge_value_rendered) merge_value_type = type(merge_value) logger.debug( @@ -246,11 +171,14 @@ def render_properties(env, resource_props, global_context, logger): ) else: catch_error_and_exit( - f"(config.render_properties) merge item '{merge_item}' not found in global context.", + f"(config.render_properties) merge item '{merge_item}' not found in context.", logger ) - prop_context[prop['name']] = to_sql_compatible_json(base_value) + processed_value = to_sql_compatible_json(base_value) + prop_context[prop['name']] = processed_value + # Update resource_context with the merged property + resource_context[prop['name']] = processed_value except Exception as e: catch_error_and_exit(f"(config.render_properties) failed to render property '{prop['name']}']: {e}", logger) @@ -270,22 +198,6 @@ def load_manifest(stack_dir, logger): except Exception as e: catch_error_and_exit("(config.load_manifest) failed to load manifest: " + str(e), logger) -def setup_environment(stack_dir, logger): - logger.debug("(config.setup_environment) setting up environment...") - if not os.path.exists(stack_dir): - catch_error_and_exit("(config.setup_environment) stack directory does not exist.", logger) - env = Environment( - loader=FileSystemLoader(os.getcwd()), - autoescape=False - ) - env.filters['merge_lists'] = merge_lists - env.filters['base64_encode'] = base64_encode - env.filters['generate_patch_document'] = generate_patch_document - env.filters['from_json'] = from_json - env.globals['uuid'] = lambda: str(uuid.uuid4()) - logger.debug("custom Jinja filters registered: %s", env.filters.keys()) - return env - def get_global_context_and_providers(env, manifest, vars, stack_env, stack_name, stackql, logger): # Extract the global variables from the manifest and include stack_env logger.debug("(config.get_global_context_and_providers) getting global context and pulling providers...") diff --git a/stackql_deploy/lib/filters.py b/stackql_deploy/lib/filters.py new file mode 100644 index 0000000..dad5a8c --- /dev/null +++ b/stackql_deploy/lib/filters.py @@ -0,0 +1,131 @@ +# lib/filters.py +import os +import json +import base64 +import uuid +from jinja2 import Environment, FileSystemLoader +from .utils import catch_error_and_exit + +def from_json(value): + return json.loads(value) + +def base64_encode(value): + return base64.b64encode(value.encode()).decode() + +def merge_lists(list1, list2): + # Helper function to ensure we have Python lists, not JSON strings + def ensure_list(input_data): + if isinstance(input_data, str): + try: + # Attempt to decode a JSON string + decoded = json.loads(input_data) + if isinstance(decoded, list): + return decoded + except json.JSONDecodeError: + pass # If it's not a JSON string, keep it as a string + elif isinstance(input_data, list): + return input_data + raise ValueError("(config.merge_lists) input must be a list or a JSON-encoded list string") + + # Ensure both inputs are lists + list1 = ensure_list(list1) + list2 = ensure_list(list2) + + # Convert lists to sets of JSON strings to handle unhashable types + set1 = set(json.dumps(item, sort_keys=True) for item in list1) + set2 = set(json.dumps(item, sort_keys=True) for item in list2) + + # Merge sets + merged_set = set1 | set2 + + # Convert back to list of dictionaries or original items + merged_list = [json.loads(item) for item in merged_set] + return merged_list + +def merge_objects(obj1, obj2): + # Helper function to ensure we have Python dicts, not JSON strings + def ensure_dict(input_data): + if isinstance(input_data, str): + try: + # Attempt to decode a JSON string + decoded = json.loads(input_data) + if isinstance(decoded, dict): + return decoded + except json.JSONDecodeError: + pass # If it's not a JSON string, keep it as a string + elif isinstance(input_data, dict): + return input_data + raise ValueError("(config.merge_objects) input must be a dict or a JSON-encoded dict string") + + # Ensure both inputs are dicts + obj1 = ensure_dict(obj1) + obj2 = ensure_dict(obj2) + + # Merge the two dictionaries + merged_obj = {**obj1, **obj2} + + return merged_obj + +def generate_patch_document(properties): + """ + Generates a patch document for the given resource. This is designed for the AWS Cloud Control API, which requires + a patch document to update resources. + """ + patch_doc = [] + for key, value in properties.items(): + # Check if the value is already a string (indicating it's likely already JSON) and leave it as is + if isinstance(value, str): + try: + # Try to parse the string to confirm it's a JSON object/array + parsed_value = json.loads(value) + patch_doc.append({"op": "add", "path": f"/{key}", "value": parsed_value}) + except json.JSONDecodeError: + # If it's not a JSON string, treat it as a simple string value + patch_doc.append({"op": "add", "path": f"/{key}", "value": value}) + else: + # If it's not a string, add it as a JSON-compatible object + patch_doc.append({"op": "add", "path": f"/{key}", "value": value}) + + return json.dumps(patch_doc) + +def sql_list(input_data): + # If the input is already a string representation of a list, parse it + if isinstance(input_data, str): + try: + import json + # Parse the string as JSON array + python_list = json.loads(input_data) + except json.JSONDecodeError: + # If it's not valid JSON, treat it as a single item + python_list = [input_data] + else: + python_list = input_data + + # Handle empty list case + if not python_list: + return '(NULL)' + + # Convert each item to string, wrap in quotes, join with commas + quoted_items = [f"'{str(item)}'" for item in python_list] + return f"({','.join(quoted_items)})" + +# +# exported functions +# + +def setup_environment(stack_dir, logger): + logger.debug("(config.setup_environment) setting up environment...") + if not os.path.exists(stack_dir): + catch_error_and_exit("(config.setup_environment) stack directory does not exist.", logger) + env = Environment( + loader=FileSystemLoader(os.getcwd()), + autoescape=False + ) + env.filters['merge_lists'] = merge_lists + env.filters['base64_encode'] = base64_encode + env.filters['generate_patch_document'] = generate_patch_document + env.filters['from_json'] = from_json + env.filters['sql_list'] = sql_list + env.globals['uuid'] = lambda: str(uuid.uuid4()) + logger.debug("custom Jinja filters registered: %s", env.filters.keys()) + return env diff --git a/stackql_deploy/lib/templating.py b/stackql_deploy/lib/templating.py index cc73ca8..a08ea81 100644 --- a/stackql_deploy/lib/templating.py +++ b/stackql_deploy/lib/templating.py @@ -1,3 +1,4 @@ +# lib/templating.py import json import os from .utils import catch_error_and_exit @@ -126,3 +127,45 @@ def get_queries(env, stack_dir, doc_key, resource, full_context, logger): f"(templating.get_queries) failed to load or render queries for [{resource['name']}]: {str(e)}", logger ) + +def render_inline_template(env, resource_name, template_string, full_context, logger): + """ + Renders a single template string using the provided context. + Similar to get_queries but for inline templates rather than files. + """ + logger.debug(f"(templating.render_inline_template) [{resource_name}] template:\n\n{template_string}\n") + + try: + # Process the context the same way as in render_queries + temp_context = full_context.copy() + + for ctx_key, ctx_value in temp_context.items(): + if isinstance(ctx_value, str) and is_json(ctx_value, logger): + properties = json.loads(ctx_value) + # Serialize JSON ensuring booleans are lower case and using correct JSON syntax + json_str = json.dumps( + properties, ensure_ascii=False, separators=(',', ':') + ).replace('True', 'true').replace('False', 'false') + # Correctly format JSON to use double quotes and pass directly since template handles quoting + json_str = json_str.replace("'", "\\'") # escape single quotes if any within strings + temp_context[ctx_key] = json_str + + # Render the template + template = env.from_string(template_string) + rendered_template = template.render(temp_context) + + logger.debug( + f"(templating.render_inline_template) [{resource_name}] rendered template:" + f"\n\n{rendered_template}\n" + ) + return rendered_template + + except TemplateError as e: + raise RuntimeError(f"(templating.render_inline_template) error rendering template for [{resource_name}]: {e}") + except json.JSONDecodeError as e: + # Handle JSON errors more gracefully + logger.warning(f"(templating.render_inline_template) JSON decode error in context for [{resource_name}]: {e}") + # Try rendering anyway, might work with non-JSON parts of the context + template = env.from_string(template_string) + rendered_template = template.render(temp_context) + return rendered_template diff --git a/stackql_deploy/lib/utils.py b/stackql_deploy/lib/utils.py index 59d041a..a1a1b06 100644 --- a/stackql_deploy/lib/utils.py +++ b/stackql_deploy/lib/utils.py @@ -1,3 +1,4 @@ +# lib/utils.py import time import json import sys diff --git a/start-stackql-server.sh b/start-stackql-server.sh new file mode 100644 index 0000000..1ac8bf5 --- /dev/null +++ b/start-stackql-server.sh @@ -0,0 +1,9 @@ +# start server if not running +echo "checking if server is running" +if [ -z "$(ps | grep stackql)" ]; then + echo "starting server" + nohup ./stackql -v --pgsrv.port=5444 srv & + sleep 5 +else + echo "server is already running" +fi \ No newline at end of file diff --git a/stop-stackql-server.sh b/stop-stackql-server.sh new file mode 100644 index 0000000..762f6e8 --- /dev/null +++ b/stop-stackql-server.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +# Find the process ID of the StackQL server +PID=$(pgrep -f "stackql") + +if [ -z "$PID" ]; then + echo "stackql server is not running." +else + echo "stopping stackql server (PID: $PID)..." + kill $PID + echo "stackql server stopped." +fi \ No newline at end of file diff --git a/website/docs/getting-started.md b/website/docs/getting-started.md index 342cbae..6299e1a 100644 --- a/website/docs/getting-started.md +++ b/website/docs/getting-started.md @@ -86,7 +86,7 @@ resources: -The `stackql_manifest.yml` file is detailed [__here__](/docs/manifest-file). +The `stackql_manifest.yml` file is detailed [__here__](/manifest-file). ### Resource Query Files @@ -138,7 +138,7 @@ WHERE resourceGroupName = '{{ resource_group_name }}' AND subscriptionId = '{{ s -Resource queries are detailed [__here__](/docs/resource-query-files). +Resource queries are detailed [__here__](/resource-query-files). ### `stackql-deploy` commands @@ -165,7 +165,7 @@ stackql-deploy teardown my-azure-stack dev \ -e AZURE_SUBSCRIPTION_ID=00000000-0000-0000-0000-000000000000 ``` -For more detailed information see [`cli-reference/build`](/docs/cli-reference/build), [`cli-reference/test`](/docs/cli-reference/test), [`cli-reference/teardown`](/docs/cli-reference/teardown), or other commands available. +For more detailed information see [`cli-reference/build`](/cli-reference/build), [`cli-reference/test`](/cli-reference/test), [`cli-reference/teardown`](/cli-reference/teardown), or other commands available. ### `stackql-deploy` deployment flow @@ -178,8 +178,8 @@ For more detailed information see [`cli-reference/build`](/docs/cli-reference/bu To get up and running quickly, `stackql-deploy` provides a set of quick start templates for common cloud providers. These templates include predefined configurations and resource queries tailored to AWS, Azure, and Google Cloud, among others. -- [**AWS Quick Start Template**](/docs/template-library/aws/vpc-and-ec2-instance): A basic setup for deploying a VPC, including subnets and routing configurations. -- [**Azure Quick Start Template**](/docs/template-library/azure/simple-vnet-and-vm): A setup for creating a Resource Group with associated resources. -- [**Google Cloud Quick Start Template**](/docs/template-library/google/k8s-the-hard-way): A configuration for deploying a VPC with network and firewall rules. +- [**AWS Quick Start Template**](/template-library/aws/vpc-and-ec2-instance): A basic setup for deploying a VPC, including subnets and routing configurations. +- [**Azure Quick Start Template**](/template-library/azure/simple-vnet-and-vm): A setup for creating a Resource Group with associated resources. +- [**Google Cloud Quick Start Template**](/template-library/google/k8s-the-hard-way): A configuration for deploying a VPC with network and firewall rules. These templates are designed to help you kickstart your infrastructure deployment with minimal effort, providing a solid foundation that you can customize to meet your specific needs. \ No newline at end of file diff --git a/website/docs/index.md b/website/docs/index.md index 9368e50..27c40c7 100644 --- a/website/docs/index.md +++ b/website/docs/index.md @@ -13,9 +13,11 @@ draft: false unlisted: false --- -![StackQL Deploy](/img/stackql-deploy-logo.png) +![StackQL Deploy](/img/stackql-deploy-featured-image.png) -### Model Driven, Declarative, State File-less, Multi-Cloud IaC +## Model Driven, Declarative, State File-less, Multi-Cloud IaC + + __`stackql-deploy`__ is a multi-cloud resource provisioning framework using __`stackql`__. It is inspired by dbt (data build tool), which manages data transformation workflows in analytics engineering by treating SQL scripts as models that can be built, tested, and materialized incrementally. With StackQL, you can create a similar framework for cloud and SaaS provisioning. The goal is to treat cloud stacks as models that can be deployed, tested, updated, and de-provisioned, enabling developers to deploy complex, dependent infrastructure components in a reliable and repeatable manner. @@ -27,4 +29,3 @@ __`stackql-deploy`__ is a multi-cloud resource provisioning framework using __`s - Single code base for multiple target environments - SQL-based definitions for resources and tests - diff --git a/website/docs/manifest-file.md b/website/docs/manifest-file.md index e787f6d..52d2946 100644 --- a/website/docs/manifest-file.md +++ b/website/docs/manifest-file.md @@ -167,7 +167,7 @@ the fields within the __`stackql_manifest.yml`__ file are described in further d ## Example manifest file -Here is a complete example of a `stackql_manifest.yml` file for a Google stack, for other examples see the [Template Library](/docs/template-library). +Here is a complete example of a `stackql_manifest.yml` file for a Google stack, for other examples see the [Template Library](/template-library). diff --git a/website/docs/manifest_fields/index.js b/website/docs/manifest_fields/index.js index 43cc158..9609727 100644 --- a/website/docs/manifest_fields/index.js +++ b/website/docs/manifest_fields/index.js @@ -15,6 +15,7 @@ export { default as ResourceProps } from "./resources/props.mdx"; export { default as ResourceProtected } from "./resources/protected.mdx"; export { default as ResourceAuth } from "./resources/auth.mdx"; export { default as ResourceIf } from "./resources/if.mdx"; +export { default as ResourceSql } from "./resources/sql.mdx"; export { default as ResourcePropName } from "./resources/props/name.mdx"; export { default as ResourcePropDescription } from "./resources/props/description.mdx"; export { default as ResourcePropValue } from "./resources/props/value.mdx"; diff --git a/website/docs/manifest_fields/name.mdx b/website/docs/manifest_fields/name.mdx index 65e9c9c..bb2733b 100644 --- a/website/docs/manifest_fields/name.mdx +++ b/website/docs/manifest_fields/name.mdx @@ -3,7 +3,7 @@ import LeftAlignedTable from '@site/src/components/LeftAlignedTable'; -The name of the stack, by default this is derived by the [__`init`__](/docs/cli-reference/init) command from the stack directory name (replacing `_` with `-` for resource and property name compliance). This name can be overridden, the value for `name` is exposed as a global variable called `stack_name` which is often used with resource or property values so ensure that this string conforms to any naming restrictions. +The name of the stack, by default this is derived by the [__`init`__](/cli-reference/init) command from the stack directory name (replacing `_` with `-` for resource and property name compliance). This name can be overridden, the value for `name` is exposed as a global variable called `stack_name` which is often used with resource or property values so ensure that this string conforms to any naming restrictions. diff --git a/website/docs/manifest_fields/resources.mdx b/website/docs/manifest_fields/resources.mdx index 9248bb0..9b498d5 100644 --- a/website/docs/manifest_fields/resources.mdx +++ b/website/docs/manifest_fields/resources.mdx @@ -13,6 +13,7 @@ import LeftAlignedTable from '@site/src/components/LeftAlignedTable'; { name: 'resource.protected', anchor: 'resourceprotected' }, { name: 'resource.description', anchor: 'resourcedescription' }, { name: 'resource.if', anchor: 'resourceif' }, + { name: 'resource.sql', anchor: 'resourcesql' }, ]} /> diff --git a/website/docs/manifest_fields/resources/sql.mdx b/website/docs/manifest_fields/resources/sql.mdx new file mode 100644 index 0000000..3c2ee32 --- /dev/null +++ b/website/docs/manifest_fields/resources/sql.mdx @@ -0,0 +1,86 @@ +import File from '@site/src/components/File'; +import LeftAlignedTable from '@site/src/components/LeftAlignedTable'; + + + +For `command` type resources, you can include SQL statements directly in your resource manifest using the `sql` key. This allows you to write custom SQL commands without needing a separate IQL file. + + +```yaml {5-11} +resources: + - name: databricks_workspace/unitycatalog/grants + type: command + props: [...] + sql: | + /*+ update */ + UPDATE databricks_workspace.unitycatalog.grants + SET principal = '{{ principal }}', + privileges = {{ privileges }} + WHERE full_name = '{{ full_name }}' AND + securable_type = '{{ securable_type }}' AND + deployment_name = '{{ deployment_name }}'; +``` + + +:::info +- The `sql` key is only supported to `command` type resources +- For command resources, either `sql` or a corresponding IQL file with a `command` anchor must be provided, if `sql` is supplied in the manifest this will be used +- The `sql` key accepts a string containing the SQL statement to execute +- You can use multi-line strings with the YAML pipe (`|`) character for better readability +- Template variables can be referenced using Jinja2 template syntax (`{{ variable }}`) +::: + +## When to Use + +The `sql` key is particularly useful for: + +- Simple commands that don't warrant a separate IQL file +- One-off operations specific to a particular deployment +- Custom operations like granting permissions in Unity Catalog + +## Examples + +### Grant Permissions in Unity Catalog + +```yaml +- name: databricks_workspace/unitycatalog/grants + type: command + props: + - name: full_name + value: "my-storage-credential" + - name: securable_type + value: "storage_credential" + - name: deployment_name + value: "{{ databricks_deployment_name }}" + - name: principal + value: "account users" + - name: privileges + value: + - "CREATE_EXTERNAL_LOCATION" + - "USE" + sql: | + /*+ update */ + UPDATE databricks_workspace.unitycatalog.grants + SET principal = '{{ principal }}', + privileges = {{ privileges }} + WHERE full_name = '{{ full_name }}' AND + securable_type = '{{ securable_type }}' AND + deployment_name = '{{ deployment_name }}'; +``` + +### Run a Custom Query with Conditional Logic + +You can combine the `sql` key with conditional processing: + +```yaml +- name: custom_command + type: command + if: "environment == 'production'" + props: + - name: table_name + value: "{{ stack_name }}_audit_log" + sql: | + /*+ update */ + INSERT INTO {{ table_name }} + VALUES ('{{ stack_name }}', '{{ stack_env }}', '{{ deployment_timestamp }}'); +``` \ No newline at end of file diff --git a/website/docs/manifest_fields/resources/type.mdx b/website/docs/manifest_fields/resources/type.mdx index d31b10c..009b5fc 100644 --- a/website/docs/manifest_fields/resources/type.mdx +++ b/website/docs/manifest_fields/resources/type.mdx @@ -3,7 +3,7 @@ import LeftAlignedTable from '@site/src/components/LeftAlignedTable'; -Resource type, values include : `resource` (default), `query`, `script`, `multi` +Resource type, values include : `resource` (default), `query`, `script`, `multi`, `command` @@ -22,5 +22,6 @@ resources: - `query` is designed to return data using an `exports` method - `script` is used to incorporate an external script in your stack definition (non StackQL query) - `multi` is used when resources are created in a loop (such as creating 3 vms) +- `command` is used to run a command (like an `UPDATE`, `INSERT`) during a `build` operation (which does not export any variables) ::: \ No newline at end of file diff --git a/website/docs/resource-query-files.md b/website/docs/resource-query-files.md index 7e8e9f4..ba119d1 100644 --- a/website/docs/resource-query-files.md +++ b/website/docs/resource-query-files.md @@ -157,7 +157,7 @@ AND JSON_EXTRACT(routingConfig, '$.routingMode') = 'REGIONAL' :::tip -Useful functions for testing the desired state of a resource include [`JSON_EQUAL`](https://stackql.io/docs/language-spec/functions/json/json_equal), [`JSON_EXTRACT`](https://stackql.io/docs/language-spec/functions/json/json_extract) and [`JSON_EACH`](https://stackql.io/docs/language-spec/functions/json/json_equal). +Useful functions for testing the desired state of a resource include [`JSON_EQUAL`](https://stackql.io/docs/language-spec/functions/json/json_equal), [`AWS_POLICY_EQUAL`](https://stackql.io/docs/language-spec/functions/json/aws_policy_equal), [`JSON_EXTRACT`](https://stackql.io/docs/language-spec/functions/json/json_extract) and [`JSON_EACH`](https://stackql.io/docs/language-spec/functions/json/json_equal). ::: diff --git a/website/docs/template-library/aws/vpc-and-ec2-instance.md b/website/docs/template-library/aws/vpc-and-ec2-instance.md index b11b2ac..55221b8 100644 --- a/website/docs/template-library/aws/vpc-and-ec2-instance.md +++ b/website/docs/template-library/aws/vpc-and-ec2-instance.md @@ -21,7 +21,7 @@ The EC2 instance is bootstrapped with a web server that serves a simple page usi ## Deploying the Stack -> install `stackql-deploy` using `pip install stackql-deploy` (see [__Installing stackql-deploy__](/docs/getting-started#installing-stackql-deploy)), set the `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` environment variables, that's it! +> install `stackql-deploy` using `pip install stackql-deploy` (see [__Installing stackql-deploy__](/getting-started#installing-stackql-deploy)), set the `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` environment variables, that's it! Once you have setup your project directory (your "stack"), you can use the `stackql-deploy` cli application to deploy, test or teardown the stack in any given environment. To deploy the stack to an environment labeled `sit`, run the following: diff --git a/website/docs/template-library/azure/simple-vnet-and-vm.md b/website/docs/template-library/azure/simple-vnet-and-vm.md index fdae17e..be13342 100644 --- a/website/docs/template-library/azure/simple-vnet-and-vm.md +++ b/website/docs/template-library/azure/simple-vnet-and-vm.md @@ -22,7 +22,7 @@ The Virtual Machine is bootstrapped with a web server that serves a simple page ## Deploying the Stack -> Install `stackql-deploy` using `pip install stackql` (see [__Installing stackql-deploy__](/docs/getting-started#installing-stackql-deploy)), set the `AZURE_SUBSCRIPTION_ID`, `AZURE_CLIENT_ID`, `AZURE_CLIENT_SECRET`, and `AZURE_TENANT_ID` environment variables, and you're ready to go! +> Install `stackql-deploy` using `pip install stackql` (see [__Installing stackql-deploy__](/getting-started#installing-stackql-deploy)), set the `AZURE_SUBSCRIPTION_ID`, `AZURE_CLIENT_ID`, `AZURE_CLIENT_SECRET`, and `AZURE_TENANT_ID` environment variables, and you're ready to go! Once you have set up your project directory (your "stack"), you can use the `stackql-deploy` CLI application to deploy, test, or teardown the stack in any given environment. To deploy the stack to an environment labeled `sit`, run the following: diff --git a/website/docs/template-library/google/k8s-the-hard-way.md b/website/docs/template-library/google/k8s-the-hard-way.md index 40a07b6..a8332bf 100644 --- a/website/docs/template-library/google/k8s-the-hard-way.md +++ b/website/docs/template-library/google/k8s-the-hard-way.md @@ -30,7 +30,7 @@ To install `stackql-deploy`, use the following command: ```bash pip install stackql-deploy ``` -for more information on installing `stackql-deploy` see [__Installing stackql-deploy__](/docs/getting-started#installing-stackql-deploy). +for more information on installing `stackql-deploy` see [__Installing stackql-deploy__](/getting-started#installing-stackql-deploy). ## Deploying Using `stackql-deploy` diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 33693df..ddb6177 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -35,6 +35,7 @@ const config = { sidebarPath: './sidebars.js', // Remove this to remove the "edit this page" links. editUrl: 'https://github.com/stackql/stackql-deploy/tree/main/website/', + routeBasePath: '/', // Set the docs to be the root of the site }, // blog: { // showReadingTime: true, @@ -64,18 +65,18 @@ const config = { image: 'img/stackql-cover.png', navbar: { logo: { - alt: 'StackQL', + alt: 'StackQL Deploy', href: '/', - src: 'img/logo-original.svg', - srcDark: 'img/logo-white.svg', + src: 'img/stackql-deploy-logo.svg', + srcDark: 'img/stackql-deploy-logo-white.svg', }, items: [ - { - type: 'docSidebar', - sidebarId: 'docsSidebar', - position: 'left', - label: 'Deploy Docs', - }, + // { + // type: 'docSidebar', + // sidebarId: 'docsSidebar', + // position: 'left', + // label: 'Deploy Docs', + // }, { to: '/stackqldocs', position: 'left', @@ -124,7 +125,12 @@ const config = { to: '/registry', }, ] - }, + }, + { + to: '/downloads', + position: 'left', + label: 'Downloads', + }, // {to: '/blog', label: 'Blog', position: 'left'}, { href: 'https://github.com/stackql/stackql', @@ -139,8 +145,8 @@ const config = { logo: { alt: 'StackQL', href: 'https://stackql.io/', - src: 'img/logo-original.svg', - srcDark: 'img/logo-white.svg', + src: 'img/stackql-deploy-logo.svg', + srcDark: 'img/stackql-deploy-logo-white.svg', }, links: [ { diff --git a/website/package.json b/website/package.json index 3eb35f0..fc7494b 100644 --- a/website/package.json +++ b/website/package.json @@ -14,9 +14,9 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "^3.5.2", - "@docusaurus/preset-classic": "^3.5.2", - "@docusaurus/theme-mermaid": "^3.5.2", + "@docusaurus/core": "^3.8.1", + "@docusaurus/preset-classic": "^3.8.1", + "@docusaurus/theme-mermaid": "^3.8.1", "@emotion/react": "^11.13.0", "@emotion/styled": "^11.13.0", "@iconify/react": "^5.0.2", @@ -29,8 +29,8 @@ "react-dom": "^18.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.5.2", - "@docusaurus/types": "^3.5.2" + "@docusaurus/module-type-aliases": "^3.8.1", + "@docusaurus/types": "^3.8.1" }, "browserslist": { "production": [ @@ -45,6 +45,6 @@ ] }, "engines": { - "node": ">=18.0" + "node": ">=20.0" } } diff --git a/website/src/css/custom.css b/website/src/css/custom.css index 6794a8f..21111ee 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -73,12 +73,15 @@ /* * github */ -.header-github-link:before { + .header-github-link:before { content: ''; width: 140px; height: 28px; -display: flex; - background: url("https://img.shields.io/github/stars/stackql/stackql?logo=github&style=social") no-repeat center/contain; + display: flex; + background-image: url("https://img.shields.io/github/stars/stackql/stackql?logo=github&style=social"); + background-repeat: no-repeat; + background-position: center; + background-size: contain; } .header-github-link:hover { @@ -179,16 +182,6 @@ html[data-theme='dark'] .footer .container { padding: 0; } -/* -* vhs image -*/ -.vhsImage { - display: block; - margin-left: 0; - margin-right: auto; - width: 70%; -} - /* * custom styles */ @@ -225,4 +218,28 @@ table { html[data-theme='dark'] .docFieldHeading { color: #FFFFFF; +} + +/* +* vhs image +*/ + +.vhsImage { + max-width: 60%; /* Reduce width to 80% of container */ + display: block; /* Ensure it's a block element for margin auto to work */ + margin: 40px auto; /* Add 40px space above/below and center horizontally */ + transform: scale(0.9); /* Make it 90% of original size */ + transform-origin: center; /* Scale from center */ +} + +/* Add more space before and after the image container */ +img[class="vhsImage"] { + margin-top: 40px; + margin-bottom: 40px; +} + +/* If the image is inside a container, you might need this */ +.vhsImage-container, +div:has(> .vhsImage) { + margin: 40px 0; } \ No newline at end of file diff --git a/website/src/pages/cookbooks.js b/website/src/pages/cookbooks.js deleted file mode 100644 index 7982b54..0000000 --- a/website/src/pages/cookbooks.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import Head from '@docusaurus/Head'; - -export default function Cookbooks() { - return ( - - - - ); -}; \ No newline at end of file diff --git a/website/src/pages/index.js b/website/src/pages/index.js deleted file mode 100644 index 67388bf..0000000 --- a/website/src/pages/index.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import Head from '@docusaurus/Head'; - -export default function Home() { - return ( - - - - ); -} diff --git a/website/src/theme/DocCard/index.tsx b/website/src/theme/DocCard/index.tsx index 58f4a5a..eca9592 100644 --- a/website/src/theme/DocCard/index.tsx +++ b/website/src/theme/DocCard/index.tsx @@ -19,8 +19,8 @@ import type { import styles from './styles.module.css'; const descriptionMap = { - '/docs/template-library/aws/simple-vpc': 'Simple VPC configuration in AWS', - '/docs/template-library/azure/simple-vnet': 'Basic Virtual Network setup in Azure', + '/template-library/aws/simple-vpc': 'Simple VPC configuration in AWS', + '/template-library/azure/simple-vnet': 'Basic Virtual Network setup in Azure', }; diff --git a/website/static/img/logo-original.svg b/website/static/img/logo-original.svg deleted file mode 100644 index 1de09ec..0000000 --- a/website/static/img/logo-original.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/website/static/img/logo-white.svg b/website/static/img/logo-white.svg deleted file mode 100644 index 88c628e..0000000 --- a/website/static/img/logo-white.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/website/static/img/stackql-deploy-featured-image.png b/website/static/img/stackql-deploy-featured-image.png new file mode 100644 index 0000000..086322f Binary files /dev/null and b/website/static/img/stackql-deploy-featured-image.png differ diff --git a/website/static/img/stackql-deploy-logo-white.svg b/website/static/img/stackql-deploy-logo-white.svg new file mode 100644 index 0000000..a09fefc --- /dev/null +++ b/website/static/img/stackql-deploy-logo-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/static/img/stackql-deploy-logo.png b/website/static/img/stackql-deploy-logo.png deleted file mode 100644 index a834750..0000000 Binary files a/website/static/img/stackql-deploy-logo.png and /dev/null differ diff --git a/website/static/img/stackql-deploy-logo.svg b/website/static/img/stackql-deploy-logo.svg new file mode 100644 index 0000000..1709a64 --- /dev/null +++ b/website/static/img/stackql-deploy-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/yarn.lock b/website/yarn.lock index 421538e..2090806 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -2,158 +2,153 @@ # yarn lockfile v1 -"@algolia/autocomplete-core@1.9.3": - version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" - integrity sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw== - dependencies: - "@algolia/autocomplete-plugin-algolia-insights" "1.9.3" - "@algolia/autocomplete-shared" "1.9.3" - -"@algolia/autocomplete-plugin-algolia-insights@1.9.3": - version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz#9b7f8641052c8ead6d66c1623d444cbe19dde587" - integrity sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg== - dependencies: - "@algolia/autocomplete-shared" "1.9.3" - -"@algolia/autocomplete-preset-algolia@1.9.3": - version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz#64cca4a4304cfcad2cf730e83067e0c1b2f485da" - integrity sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA== - dependencies: - "@algolia/autocomplete-shared" "1.9.3" +"@algolia/autocomplete-core@1.17.9": + version "1.17.9" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz#83374c47dc72482aa45d6b953e89377047f0dcdc" + integrity sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ== + dependencies: + "@algolia/autocomplete-plugin-algolia-insights" "1.17.9" + "@algolia/autocomplete-shared" "1.17.9" + +"@algolia/autocomplete-plugin-algolia-insights@1.17.9": + version "1.17.9" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz#74c86024d09d09e8bfa3dd90b844b77d9f9947b6" + integrity sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ== + dependencies: + "@algolia/autocomplete-shared" "1.17.9" + +"@algolia/autocomplete-preset-algolia@1.17.9": + version "1.17.9" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz#911f3250544eb8ea4096fcfb268f156b085321b5" + integrity sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ== + dependencies: + "@algolia/autocomplete-shared" "1.17.9" + +"@algolia/autocomplete-shared@1.17.9": + version "1.17.9" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz#5f38868f7cb1d54b014b17a10fc4f7e79d427fa8" + integrity sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ== + +"@algolia/client-abtesting@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.34.0.tgz#1b7162c76cb77179a114d34efd76b0078ba2cab3" + integrity sha512-d6ardhDtQsnMpyr/rPrS3YuIE9NYpY4rftkC7Ap9tyuhZ/+V3E/LH+9uEewPguKzVqduApdwJzYq2k+vAXVEbQ== + dependencies: + "@algolia/client-common" "5.34.0" + "@algolia/requester-browser-xhr" "5.34.0" + "@algolia/requester-fetch" "5.34.0" + "@algolia/requester-node-http" "5.34.0" + +"@algolia/client-analytics@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.34.0.tgz#1eb5c5cfdf4be62f5a71600c9e04e71d7a742dc5" + integrity sha512-WXIByjHNA106JO1Dj6b4viSX/yMN3oIB4qXr2MmyEmNq0MgfuPfPw8ayLRIZPa9Dp27hvM3G8MWJ4RG978HYFw== + dependencies: + "@algolia/client-common" "5.34.0" + "@algolia/requester-browser-xhr" "5.34.0" + "@algolia/requester-fetch" "5.34.0" + "@algolia/requester-node-http" "5.34.0" + +"@algolia/client-common@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.34.0.tgz#c617f62d73325f2c61bf5ee1c122f385f66fc117" + integrity sha512-JeN1XJLZIkkv6yK0KT93CIXXk+cDPUGNg5xeH4fN9ZykYFDWYRyqgaDo+qvg4RXC3WWkdQ+hogQuuCk4Y3Eotw== + +"@algolia/client-insights@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.34.0.tgz#5623db7c926e1e600dd5b8e6f76ab703b8920eb7" + integrity sha512-gdFlcQa+TWXJUsihHDlreFWniKPFIQ15i5oynCY4m9K3DCex5g5cVj9VG4Hsquxf2t6Y0yv8w6MvVTGDO8oRLw== + dependencies: + "@algolia/client-common" "5.34.0" + "@algolia/requester-browser-xhr" "5.34.0" + "@algolia/requester-fetch" "5.34.0" + "@algolia/requester-node-http" "5.34.0" + +"@algolia/client-personalization@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.34.0.tgz#e9e8d8af7ff74ab1c72fed259da0c916ada88719" + integrity sha512-g91NHhIZDkh1IUeNtsUd8V/ZxuBc2ByOfDqhCkoQY3Z/mZszhpn3Czn6AR5pE81fx793vMaiOZvQVB5QttArkQ== + dependencies: + "@algolia/client-common" "5.34.0" + "@algolia/requester-browser-xhr" "5.34.0" + "@algolia/requester-fetch" "5.34.0" + "@algolia/requester-node-http" "5.34.0" + +"@algolia/client-query-suggestions@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.34.0.tgz#50fdd06c47d949c315590806dba33b549e300365" + integrity sha512-cvRApDfFrlJ3Vcn37U4Nd/7S6T8cx7FW3mVLJPqkkzixv8DQ/yV+x4VLirxOtGDdq3KohcIbIGWbg1QuyOZRvQ== + dependencies: + "@algolia/client-common" "5.34.0" + "@algolia/requester-browser-xhr" "5.34.0" + "@algolia/requester-fetch" "5.34.0" + "@algolia/requester-node-http" "5.34.0" + +"@algolia/client-search@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.34.0.tgz#44867a0b0be7103d4d72601b7dd534bad6fe6d6d" + integrity sha512-m9tK4IqJmn+flEPRtuxuHgiHmrKV0su5fuVwVpq8/es4DMjWMgX1a7Lg1PktvO8AbKaTp9kTtBAPnwXpuCwmEg== + dependencies: + "@algolia/client-common" "5.34.0" + "@algolia/requester-browser-xhr" "5.34.0" + "@algolia/requester-fetch" "5.34.0" + "@algolia/requester-node-http" "5.34.0" -"@algolia/autocomplete-shared@1.9.3": - version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz#2e22e830d36f0a9cf2c0ccd3c7f6d59435b77dfa" - integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ== - -"@algolia/cache-browser-local-storage@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz#97bc6d067a9fd932b9c922faa6b7fd6e546e1348" - integrity sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww== - dependencies: - "@algolia/cache-common" "4.24.0" - -"@algolia/cache-common@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.24.0.tgz#81a8d3a82ceb75302abb9b150a52eba9960c9744" - integrity sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g== +"@algolia/events@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" + integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== -"@algolia/cache-in-memory@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz#ffcf8872f3a10cb85c4f4641bdffd307933a6e44" - integrity sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w== +"@algolia/ingestion@1.34.0": + version "1.34.0" + resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.34.0.tgz#393e20c4948f304349230de7cdfd4be5ce6efe93" + integrity sha512-2rxy4XoeRtIpzxEh5u5UgDC5HY4XbNdjzNgFx1eDrfFkSHpEVjirtLhISMy2N5uSFqYu1uUby5/NC1Soq8J7iw== dependencies: - "@algolia/cache-common" "4.24.0" + "@algolia/client-common" "5.34.0" + "@algolia/requester-browser-xhr" "5.34.0" + "@algolia/requester-fetch" "5.34.0" + "@algolia/requester-node-http" "5.34.0" -"@algolia/client-account@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.24.0.tgz#eba7a921d828e7c8c40a32d4add21206c7fe12f1" - integrity sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA== +"@algolia/monitoring@1.34.0": + version "1.34.0" + resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.34.0.tgz#f163560f660195e028b02a81e4bc3475cf001225" + integrity sha512-OJiDhlJX8ZdWAndc50Z6aUEW/YmnhFK2ul3rahMw5/c9Damh7+oY9SufoK2LimJejy+65Qka06YPG29v2G/vww== dependencies: - "@algolia/client-common" "4.24.0" - "@algolia/client-search" "4.24.0" - "@algolia/transporter" "4.24.0" + "@algolia/client-common" "5.34.0" + "@algolia/requester-browser-xhr" "5.34.0" + "@algolia/requester-fetch" "5.34.0" + "@algolia/requester-node-http" "5.34.0" -"@algolia/client-analytics@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.24.0.tgz#9d2576c46a9093a14e668833c505ea697a1a3e30" - integrity sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg== +"@algolia/recommend@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.34.0.tgz#5adec4b49c32612309204e9f17f9180c6e4e1da9" + integrity sha512-fzNQZAdVxu/Gnbavy8KW5gurApwdYcPW6+pjO7Pw8V5drCR3eSqnOxSvp79rhscDX8ezwqMqqK4F3Hsq+KpRzg== dependencies: - "@algolia/client-common" "4.24.0" - "@algolia/client-search" "4.24.0" - "@algolia/requester-common" "4.24.0" - "@algolia/transporter" "4.24.0" + "@algolia/client-common" "5.34.0" + "@algolia/requester-browser-xhr" "5.34.0" + "@algolia/requester-fetch" "5.34.0" + "@algolia/requester-node-http" "5.34.0" -"@algolia/client-common@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.24.0.tgz#77c46eee42b9444a1d1c1583a83f7df4398a649d" - integrity sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA== +"@algolia/requester-browser-xhr@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.34.0.tgz#3882e55907d6a3cf7160aef5b6743be398b88c57" + integrity sha512-gEI0xjzA/xvMpEdYmgQnf6AQKllhgKRtnEWmwDrnct+YPIruEHlx1dd7nRJTy/33MiYcCxkB4khXpNrHuqgp3Q== dependencies: - "@algolia/requester-common" "4.24.0" - "@algolia/transporter" "4.24.0" + "@algolia/client-common" "5.34.0" -"@algolia/client-personalization@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.24.0.tgz#8b47789fb1cb0f8efbea0f79295b7c5a3850f6ae" - integrity sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w== +"@algolia/requester-fetch@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.34.0.tgz#bda378f9e5d70d7516d15478a5a7123eaf62afb0" + integrity sha512-5SwGOttpbACT4jXzfSJ3mnTcF46SVNSnZ1JjxC3qBa3qKi4U0CJGzuVVy3L798u8dG5H0SZ2MAB5v7180Gnqew== dependencies: - "@algolia/client-common" "4.24.0" - "@algolia/requester-common" "4.24.0" - "@algolia/transporter" "4.24.0" + "@algolia/client-common" "5.34.0" -"@algolia/client-search@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.24.0.tgz#75e6c02d33ef3e0f34afd9962c085b856fc4a55f" - integrity sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA== +"@algolia/requester-node-http@5.34.0": + version "5.34.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.34.0.tgz#047bf7f7027c2d94752da55d60d2a3f6d38d12c3" + integrity sha512-409XlyIyEXrxyGjWxd0q5RASizHSRVUU0AXPCEdqnbcGEzbCgL1n7oYI8YxzE/RqZLha+PNwWCcTVn7EE5tyyQ== dependencies: - "@algolia/client-common" "4.24.0" - "@algolia/requester-common" "4.24.0" - "@algolia/transporter" "4.24.0" - -"@algolia/events@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" - integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== - -"@algolia/logger-common@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.24.0.tgz#28d439976019ec0a46ba7a1a739ef493d4ef8123" - integrity sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA== - -"@algolia/logger-console@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.24.0.tgz#c6ff486036cd90b81d07a95aaba04461da7e1c65" - integrity sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg== - dependencies: - "@algolia/logger-common" "4.24.0" - -"@algolia/recommend@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-4.24.0.tgz#8a3f78aea471ee0a4836b78fd2aad4e9abcaaf34" - integrity sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw== - dependencies: - "@algolia/cache-browser-local-storage" "4.24.0" - "@algolia/cache-common" "4.24.0" - "@algolia/cache-in-memory" "4.24.0" - "@algolia/client-common" "4.24.0" - "@algolia/client-search" "4.24.0" - "@algolia/logger-common" "4.24.0" - "@algolia/logger-console" "4.24.0" - "@algolia/requester-browser-xhr" "4.24.0" - "@algolia/requester-common" "4.24.0" - "@algolia/requester-node-http" "4.24.0" - "@algolia/transporter" "4.24.0" - -"@algolia/requester-browser-xhr@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz#313c5edab4ed73a052e75803855833b62dd19c16" - integrity sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA== - dependencies: - "@algolia/requester-common" "4.24.0" - -"@algolia/requester-common@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.24.0.tgz#1c60c198031f48fcdb9e34c4057a3ea987b9a436" - integrity sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA== - -"@algolia/requester-node-http@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz#4461593714031d02aa7da221c49df675212f482f" - integrity sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw== - dependencies: - "@algolia/requester-common" "4.24.0" - -"@algolia/transporter@4.24.0": - version "4.24.0" - resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.24.0.tgz#226bb1f8af62430374c1972b2e5c8580ab275102" - integrity sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA== - dependencies: - "@algolia/cache-common" "4.24.0" - "@algolia/logger-common" "4.24.0" - "@algolia/requester-common" "4.24.0" + "@algolia/client-common" "5.34.0" "@ampproject/remapping@^2.2.0": version "2.3.0" @@ -163,7 +158,20 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.8.3": +"@antfu/install-pkg@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@antfu/install-pkg/-/install-pkg-1.1.0.tgz#78fa036be1a6081b5a77a5cf59f50c7752b6ba26" + integrity sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ== + dependencies: + package-manager-detector "^1.3.0" + tinyexec "^1.0.1" + +"@antfu/utils@^8.1.0": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@antfu/utils/-/utils-8.1.1.tgz#95b1947d292a9a2efffba2081796dcaa05ecedfb" + integrity sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ== + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== @@ -171,12 +179,26 @@ "@babel/highlight" "^7.24.7" picocolors "^1.0.0" +"@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== + dependencies: + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" + "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.2": version "7.25.2" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.2.tgz#e41928bd33475305c586f6acbbb7e3ade7a6f7f5" integrity sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ== -"@babel/core@^7.21.3", "@babel/core@^7.23.3": +"@babel/compat-data@^7.27.2", "@babel/compat-data@^7.27.7", "@babel/compat-data@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.0.tgz#9fc6fd58c2a6a15243cd13983224968392070790" + integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== + +"@babel/core@^7.21.3": version "7.25.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== @@ -197,7 +219,28 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.23.3", "@babel/generator@^7.25.0": +"@babel/core@^7.25.9": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.0.tgz#55dad808d5bf3445a108eefc88ea3fdf034749a4" + integrity sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.0" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-module-transforms" "^7.27.3" + "@babel/helpers" "^7.27.6" + "@babel/parser" "^7.28.0" + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.28.0" + "@babel/types" "^7.28.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.0.tgz#f858ddfa984350bc3d3b7f125073c9af6988f18e" integrity sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw== @@ -207,6 +250,17 @@ "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" +"@babel/generator@^7.25.9", "@babel/generator@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.0.tgz#9cc2f7bd6eb054d77dc66c2664148a0c5118acd2" + integrity sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg== + dependencies: + "@babel/parser" "^7.28.0" + "@babel/types" "^7.28.0" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + "@babel/helper-annotate-as-pure@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" @@ -214,6 +268,13 @@ dependencies: "@babel/types" "^7.24.7" +"@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5" + integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== + dependencies: + "@babel/types" "^7.27.3" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" @@ -233,6 +294,17 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.27.2": + version "7.27.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" + integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== + dependencies: + "@babel/compat-data" "^7.27.2" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.24.7", "@babel/helper-create-class-features-plugin@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz#a109bf9c3d58dfed83aaf42e85633c89f43a6253" @@ -246,6 +318,19 @@ "@babel/traverse" "^7.25.0" semver "^6.3.1" +"@babel/helper-create-class-features-plugin@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz#5bee4262a6ea5ddc852d0806199eb17ca3de9281" + integrity sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-member-expression-to-functions" "^7.27.1" + "@babel/helper-optimise-call-expression" "^7.27.1" + "@babel/helper-replace-supers" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/traverse" "^7.27.1" + semver "^6.3.1" + "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7", "@babel/helper-create-regexp-features-plugin@^7.25.0": version "7.25.2" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz#24c75974ed74183797ffd5f134169316cd1808d9" @@ -255,6 +340,15 @@ regexpu-core "^5.3.1" semver "^6.3.1" +"@babel/helper-create-regexp-features-plugin@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz#05b0882d97ba1d4d03519e4bce615d70afa18c53" + integrity sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + regexpu-core "^6.2.0" + semver "^6.3.1" + "@babel/helper-define-polyfill-provider@^0.6.2": version "0.6.2" resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d" @@ -266,6 +360,22 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" +"@babel/helper-define-polyfill-provider@^0.6.5": + version "0.6.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz#742ccf1cb003c07b48859fc9fa2c1bbe40e5f753" + integrity sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg== + dependencies: + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-plugin-utils" "^7.27.1" + debug "^4.4.1" + lodash.debounce "^4.0.8" + resolve "^1.22.10" + +"@babel/helper-globals@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== + "@babel/helper-member-expression-to-functions@^7.24.8": version "7.24.8" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz#6155e079c913357d24a4c20480db7c712a5c3fb6" @@ -274,6 +384,14 @@ "@babel/traverse" "^7.24.8" "@babel/types" "^7.24.8" +"@babel/helper-member-expression-to-functions@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz#ea1211276be93e798ce19037da6f06fbb994fa44" + integrity sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" @@ -282,6 +400,14 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" +"@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + "@babel/helper-module-transforms@^7.24.7", "@babel/helper-module-transforms@^7.24.8", "@babel/helper-module-transforms@^7.25.0", "@babel/helper-module-transforms@^7.25.2": version "7.25.2" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" @@ -292,6 +418,15 @@ "@babel/helper-validator-identifier" "^7.24.7" "@babel/traverse" "^7.25.2" +"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.27.3": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz#db0bbcfba5802f9ef7870705a7ef8788508ede02" + integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.3" + "@babel/helper-optimise-call-expression@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" @@ -299,11 +434,23 @@ dependencies: "@babel/types" "^7.24.7" +"@babel/helper-optimise-call-expression@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz#c65221b61a643f3e62705e5dd2b5f115e35f9200" + integrity sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw== + dependencies: + "@babel/types" "^7.27.1" + "@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.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.24.8" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== +"@babel/helper-plugin-utils@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== + "@babel/helper-remap-async-to-generator@^7.24.7", "@babel/helper-remap-async-to-generator@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz#d2f0fbba059a42d68e5e378feaf181ef6055365e" @@ -313,6 +460,15 @@ "@babel/helper-wrap-function" "^7.25.0" "@babel/traverse" "^7.25.0" +"@babel/helper-remap-async-to-generator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz#4601d5c7ce2eb2aea58328d43725523fcd362ce6" + integrity sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-wrap-function" "^7.27.1" + "@babel/traverse" "^7.27.1" + "@babel/helper-replace-supers@^7.24.7", "@babel/helper-replace-supers@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz#ff44deac1c9f619523fe2ca1fd650773792000a9" @@ -322,6 +478,15 @@ "@babel/helper-optimise-call-expression" "^7.24.7" "@babel/traverse" "^7.25.0" +"@babel/helper-replace-supers@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz#b1ed2d634ce3bdb730e4b52de30f8cccfd692bc0" + integrity sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.27.1" + "@babel/helper-optimise-call-expression" "^7.27.1" + "@babel/traverse" "^7.27.1" + "@babel/helper-simple-access@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" @@ -338,21 +503,44 @@ "@babel/traverse" "^7.24.7" "@babel/types" "^7.24.7" +"@babel/helper-skip-transparent-expression-wrappers@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz#62bb91b3abba8c7f1fec0252d9dbea11b3ee7a56" + integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + "@babel/helper-string-parser@^7.24.8": version "7.24.8" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + "@babel/helper-validator-identifier@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + "@babel/helper-validator-option@^7.24.7", "@babel/helper-validator-option@^7.24.8": version "7.24.8" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + "@babel/helper-wrap-function@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz#dab12f0f593d6ca48c0062c28bcfb14ebe812f81" @@ -362,6 +550,15 @@ "@babel/traverse" "^7.25.0" "@babel/types" "^7.25.0" +"@babel/helper-wrap-function@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz#b88285009c31427af318d4fe37651cd62a142409" + integrity sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ== + dependencies: + "@babel/template" "^7.27.1" + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + "@babel/helpers@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.0.tgz#e69beb7841cb93a6505531ede34f34e6a073650a" @@ -370,6 +567,14 @@ "@babel/template" "^7.25.0" "@babel/types" "^7.25.0" +"@babel/helpers@^7.27.6": + version "7.27.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.6.tgz#6456fed15b2cb669d2d1fabe84b66b34991d812c" + integrity sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug== + dependencies: + "@babel/template" "^7.27.2" + "@babel/types" "^7.27.6" + "@babel/highlight@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" @@ -387,6 +592,13 @@ dependencies: "@babel/types" "^7.25.2" +"@babel/parser@^7.27.2", "@babel/parser@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.0.tgz#979829fbab51a29e13901e5a80713dbcb840825e" + integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g== + dependencies: + "@babel/types" "^7.28.0" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3": version "7.25.3" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz#dca427b45a6c0f5c095a1c639dfe2476a3daba7f" @@ -395,6 +607,14 @@ "@babel/helper-plugin-utils" "^7.24.8" "@babel/traverse" "^7.25.3" +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz#61dd8a8e61f7eb568268d1b5f129da3eee364bf9" + integrity sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.27.1" + "@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz#cd0c583e01369ef51676bdb3d7b603e17d2b3f73" @@ -402,6 +622,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.8" +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz#43f70a6d7efd52370eefbdf55ae03d91b293856d" + integrity sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz#749bde80356b295390954643de7635e0dffabe73" @@ -409,6 +636,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.8" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz#beb623bd573b8b6f3047bd04c32506adc3e58a72" + integrity sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89" @@ -418,6 +652,15 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" "@babel/plugin-transform-optional-chaining" "^7.24.7" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz#e134a5479eb2ba9c02714e8c1ebf1ec9076124fd" + integrity sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/plugin-transform-optional-chaining" "^7.27.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz#3a82a70e7cb7294ad2559465ebcb871dfbf078fb" @@ -426,6 +669,14 @@ "@babel/helper-plugin-utils" "^7.24.8" "@babel/traverse" "^7.25.0" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz#bb1c25af34d75115ce229a1de7fa44bf8f955670" + integrity sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.27.1" + "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" @@ -473,6 +724,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-syntax-import-assertions@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz#88894aefd2b03b5ee6ad1562a7c8e1587496aecd" + integrity sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-syntax-import-attributes@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca" @@ -480,6 +738,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-syntax-import-attributes@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz#34c017d54496f9b11b61474e7ea3dfd5563ffe07" + integrity sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" @@ -501,6 +766,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-syntax-jsx@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c" + integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -564,6 +836,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-syntax-typescript@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz#5147d29066a793450f220c63fa3a9431b7e6dd18" + integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" @@ -579,6 +858,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-arrow-functions@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz#6e2061067ba3ab0266d834a9f94811196f2aba9a" + integrity sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-async-generator-functions@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz#b785cf35d73437f6276b1e30439a57a50747bddf" @@ -589,6 +875,15 @@ "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/traverse" "^7.25.0" +"@babel/plugin-transform-async-generator-functions@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz#1276e6c7285ab2cd1eccb0bc7356b7a69ff842c2" + integrity sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-remap-async-to-generator" "^7.27.1" + "@babel/traverse" "^7.28.0" + "@babel/plugin-transform-async-to-generator@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" @@ -598,6 +893,15 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/helper-remap-async-to-generator" "^7.24.7" +"@babel/plugin-transform-async-to-generator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz#9a93893b9379b39466c74474f55af03de78c66e7" + integrity sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-remap-async-to-generator" "^7.27.1" + "@babel/plugin-transform-block-scoped-functions@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" @@ -605,6 +909,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-block-scoped-functions@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz#558a9d6e24cf72802dd3b62a4b51e0d62c0f57f9" + integrity sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-block-scoping@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz#23a6ed92e6b006d26b1869b1c91d1b917c2ea2ac" @@ -612,6 +923,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.8" +"@babel/plugin-transform-block-scoping@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz#e7c50cbacc18034f210b93defa89638666099451" + integrity sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-class-properties@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz#256879467b57b0b68c7ddfc5b76584f398cd6834" @@ -620,6 +938,14 @@ "@babel/helper-create-class-features-plugin" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-class-properties@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz#dd40a6a370dfd49d32362ae206ddaf2bb082a925" + integrity sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-class-static-block@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d" @@ -629,6 +955,14 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-class-static-block" "^7.14.5" +"@babel/plugin-transform-class-static-block@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz#7e920d5625b25bbccd3061aefbcc05805ed56ce4" + integrity sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-classes@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz#63122366527d88e0ef61b612554fe3f8c793991e" @@ -641,6 +975,18 @@ "@babel/traverse" "^7.25.0" globals "^11.1.0" +"@babel/plugin-transform-classes@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.0.tgz#12fa46cffc32a6e084011b650539e880add8a0f8" + integrity sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.3" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-globals" "^7.28.0" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-replace-supers" "^7.27.1" + "@babel/traverse" "^7.28.0" + "@babel/plugin-transform-computed-properties@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" @@ -649,6 +995,14 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/template" "^7.24.7" +"@babel/plugin-transform-computed-properties@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz#81662e78bf5e734a97982c2b7f0a793288ef3caa" + integrity sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/template" "^7.27.1" + "@babel/plugin-transform-destructuring@^7.24.8": version "7.24.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz#c828e814dbe42a2718a838c2a2e16a408e055550" @@ -656,6 +1010,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.8" +"@babel/plugin-transform-destructuring@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz#0f156588f69c596089b7d5b06f5af83d9aa7f97a" + integrity sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.28.0" + "@babel/plugin-transform-dotall-regex@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" @@ -664,6 +1026,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-dotall-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz#aa6821de864c528b1fecf286f0a174e38e826f4d" + integrity sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-duplicate-keys@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" @@ -671,6 +1041,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-duplicate-keys@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz#f1fbf628ece18e12e7b32b175940e68358f546d1" + integrity sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz#809af7e3339466b49c034c683964ee8afb3e2604" @@ -679,6 +1056,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.25.0" "@babel/helper-plugin-utils" "^7.24.8" +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz#5043854ca620a94149372e69030ff8cb6a9eb0ec" + integrity sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-dynamic-import@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" @@ -687,6 +1072,21 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" +"@babel/plugin-transform-dynamic-import@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz#4c78f35552ac0e06aa1f6e3c573d67695e8af5a4" + integrity sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-explicit-resource-management@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz#45be6211b778dbf4b9d54c4e8a2b42fa72e09a1a" + integrity sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-destructuring" "^7.28.0" + "@babel/plugin-transform-exponentiation-operator@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" @@ -695,6 +1095,13 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-exponentiation-operator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz#fc497b12d8277e559747f5a3ed868dd8064f83e1" + integrity sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-export-namespace-from@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197" @@ -703,6 +1110,13 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" +"@babel/plugin-transform-export-namespace-from@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz#71ca69d3471edd6daa711cf4dfc3400415df9c23" + integrity sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-for-of@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" @@ -711,6 +1125,14 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" +"@babel/plugin-transform-for-of@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz#bc24f7080e9ff721b63a70ac7b2564ca15b6c40a" + integrity sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/plugin-transform-function-name@^7.25.1": version "7.25.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz#b85e773097526c1a4fc4ba27322748643f26fc37" @@ -720,6 +1142,15 @@ "@babel/helper-plugin-utils" "^7.24.8" "@babel/traverse" "^7.25.1" +"@babel/plugin-transform-function-name@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz#4d0bf307720e4dce6d7c30fcb1fd6ca77bdeb3a7" + integrity sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ== + dependencies: + "@babel/helper-compilation-targets" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/traverse" "^7.27.1" + "@babel/plugin-transform-json-strings@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a" @@ -728,6 +1159,13 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-json-strings" "^7.8.3" +"@babel/plugin-transform-json-strings@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz#a2e0ce6ef256376bd527f290da023983527a4f4c" + integrity sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-literals@^7.25.2": version "7.25.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz#deb1ad14fc5490b9a65ed830e025bca849d8b5f3" @@ -735,6 +1173,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.8" +"@babel/plugin-transform-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz#baaefa4d10a1d4206f9dcdda50d7d5827bb70b24" + integrity sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-logical-assignment-operators@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" @@ -743,6 +1188,13 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" +"@babel/plugin-transform-logical-assignment-operators@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz#890cb20e0270e0e5bebe3f025b434841c32d5baa" + integrity sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-member-expression-literals@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df" @@ -750,6 +1202,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-member-expression-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz#37b88ba594d852418e99536f5612f795f23aeaf9" + integrity sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-modules-amd@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" @@ -758,6 +1217,14 @@ "@babel/helper-module-transforms" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-modules-amd@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz#a4145f9d87c2291fe2d05f994b65dba4e3e7196f" + integrity sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA== + dependencies: + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-modules-commonjs@^7.24.7", "@babel/plugin-transform-modules-commonjs@^7.24.8": version "7.24.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz#ab6421e564b717cb475d6fff70ae7f103536ea3c" @@ -767,6 +1234,14 @@ "@babel/helper-plugin-utils" "^7.24.8" "@babel/helper-simple-access" "^7.24.7" +"@babel/plugin-transform-modules-commonjs@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz#8e44ed37c2787ecc23bdc367f49977476614e832" + integrity sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw== + dependencies: + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-modules-systemjs@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz#8f46cdc5f9e5af74f3bd019485a6cbe59685ea33" @@ -777,6 +1252,16 @@ "@babel/helper-validator-identifier" "^7.24.7" "@babel/traverse" "^7.25.0" +"@babel/plugin-transform-modules-systemjs@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz#00e05b61863070d0f3292a00126c16c0e024c4ed" + integrity sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA== + dependencies: + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.1" + "@babel/plugin-transform-modules-umd@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" @@ -785,6 +1270,14 @@ "@babel/helper-module-transforms" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-modules-umd@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz#63f2cf4f6dc15debc12f694e44714863d34cd334" + integrity sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w== + dependencies: + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-named-capturing-groups-regex@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" @@ -793,6 +1286,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-named-capturing-groups-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz#f32b8f7818d8fc0cc46ee20a8ef75f071af976e1" + integrity sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-new-target@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" @@ -800,6 +1301,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-new-target@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz#259c43939728cad1706ac17351b7e6a7bea1abeb" + integrity sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-nullish-coalescing-operator@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" @@ -808,6 +1316,13 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" +"@babel/plugin-transform-nullish-coalescing-operator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz#4f9d3153bf6782d73dd42785a9d22d03197bc91d" + integrity sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-numeric-separator@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" @@ -816,6 +1331,13 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" +"@babel/plugin-transform-numeric-separator@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz#614e0b15cc800e5997dadd9bd6ea524ed6c819c6" + integrity sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-object-rest-spread@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" @@ -826,6 +1348,17 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.24.7" +"@babel/plugin-transform-object-rest-spread@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz#d23021857ffd7cd809f54d624299b8086402ed8d" + integrity sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA== + dependencies: + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-destructuring" "^7.28.0" + "@babel/plugin-transform-parameters" "^7.27.7" + "@babel/traverse" "^7.28.0" + "@babel/plugin-transform-object-super@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" @@ -834,6 +1367,14 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/helper-replace-supers" "^7.24.7" +"@babel/plugin-transform-object-super@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz#1c932cd27bf3874c43a5cac4f43ebf970c9871b5" + integrity sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-replace-supers" "^7.27.1" + "@babel/plugin-transform-optional-catch-binding@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" @@ -842,6 +1383,13 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" +"@babel/plugin-transform-optional-catch-binding@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz#84c7341ebde35ccd36b137e9e45866825072a30c" + integrity sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-optional-chaining@^7.24.7", "@babel/plugin-transform-optional-chaining@^7.24.8": version "7.24.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz#bb02a67b60ff0406085c13d104c99a835cdf365d" @@ -851,6 +1399,14 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" "@babel/plugin-syntax-optional-chaining" "^7.8.3" +"@babel/plugin-transform-optional-chaining@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz#874ce3c4f06b7780592e946026eb76a32830454f" + integrity sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/plugin-transform-parameters@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" @@ -858,6 +1414,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-parameters@^7.27.7": + version "7.27.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz#1fd2febb7c74e7d21cf3b05f7aebc907940af53a" + integrity sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-private-methods@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz#e6318746b2ae70a59d023d5cc1344a2ba7a75f5e" @@ -866,6 +1429,14 @@ "@babel/helper-create-class-features-plugin" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-private-methods@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz#fdacbab1c5ed81ec70dfdbb8b213d65da148b6af" + integrity sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-private-property-in-object@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" @@ -876,6 +1447,15 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" +"@babel/plugin-transform-private-property-in-object@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz#4dbbef283b5b2f01a21e81e299f76e35f900fb11" + integrity sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-property-literals@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc" @@ -883,6 +1463,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-property-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz#07eafd618800591e88073a0af1b940d9a42c6424" + integrity sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-react-constant-elements@^7.21.3": version "7.25.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.1.tgz#71a665ed16ce618067d05f4a98130207349d82ae" @@ -897,6 +1484,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-react-display-name@^7.27.1": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz#6f20a7295fea7df42eb42fed8f896813f5b934de" + integrity sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-react-jsx-development@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz#eaee12f15a93f6496d852509a850085e6361470b" @@ -904,6 +1498,13 @@ dependencies: "@babel/plugin-transform-react-jsx" "^7.24.7" +"@babel/plugin-transform-react-jsx-development@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz#47ff95940e20a3a70e68ad3d4fcb657b647f6c98" + integrity sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.27.1" + "@babel/plugin-transform-react-jsx@^7.24.7": version "7.25.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz#e37e8ebfa77e9f0b16ba07fadcb6adb47412227a" @@ -915,6 +1516,17 @@ "@babel/plugin-syntax-jsx" "^7.24.7" "@babel/types" "^7.25.2" +"@babel/plugin-transform-react-jsx@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz#1023bc94b78b0a2d68c82b5e96aed573bcfb9db0" + integrity sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-syntax-jsx" "^7.27.1" + "@babel/types" "^7.27.1" + "@babel/plugin-transform-react-pure-annotations@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz#bdd9d140d1c318b4f28b29a00fb94f97ecab1595" @@ -923,6 +1535,14 @@ "@babel/helper-annotate-as-pure" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-react-pure-annotations@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz#339f1ce355eae242e0649f232b1c68907c02e879" + integrity sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-regenerator@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" @@ -931,6 +1551,21 @@ "@babel/helper-plugin-utils" "^7.24.7" regenerator-transform "^0.15.2" +"@babel/plugin-transform-regenerator@^7.28.0": + version "7.28.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.1.tgz#bde80603442ff4bb4e910bc8b35485295d556ab1" + integrity sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-regexp-modifiers@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz#df9ba5577c974e3f1449888b70b76169998a6d09" + integrity sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-reserved-words@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4" @@ -938,16 +1573,23 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-runtime@^7.22.9": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz#00a5bfaf8c43cf5c8703a8a6e82b59d9c58f38ca" - integrity sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw== +"@babel/plugin-transform-reserved-words@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz#40fba4878ccbd1c56605a4479a3a891ac0274bb4" + integrity sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw== dependencies: - "@babel/helper-module-imports" "^7.24.7" - "@babel/helper-plugin-utils" "^7.24.7" - babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.10.1" - babel-plugin-polyfill-regenerator "^0.6.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/plugin-transform-runtime@^7.25.9": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.0.tgz#462e79008cc7bdac03e4c5e1765b9de2bcd31c21" + integrity sha512-dGopk9nZrtCs2+nfIem25UuHyt5moSJamArzIoh9/vezUQPmYDOzjaHDCkAzuGJibCIkPup8rMT2+wYB6S73cA== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + babel-plugin-polyfill-corejs2 "^0.4.14" + babel-plugin-polyfill-corejs3 "^0.13.0" + babel-plugin-polyfill-regenerator "^0.6.5" semver "^6.3.1" "@babel/plugin-transform-shorthand-properties@^7.24.7": @@ -957,6 +1599,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-shorthand-properties@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz#532abdacdec87bfee1e0ef8e2fcdee543fe32b90" + integrity sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-spread@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" @@ -965,6 +1614,14 @@ "@babel/helper-plugin-utils" "^7.24.7" "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" +"@babel/plugin-transform-spread@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz#1a264d5fc12750918f50e3fe3e24e437178abb08" + integrity sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/plugin-transform-sticky-regex@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" @@ -972,6 +1629,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-sticky-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz#18984935d9d2296843a491d78a014939f7dcd280" + integrity sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-template-literals@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" @@ -979,6 +1643,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-template-literals@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz#1a0eb35d8bb3e6efc06c9fd40eb0bcef548328b8" + integrity sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-typeof-symbol@^7.24.8": version "7.24.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz#383dab37fb073f5bfe6e60c654caac309f92ba1c" @@ -986,6 +1657,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.8" +"@babel/plugin-transform-typeof-symbol@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz#70e966bb492e03509cf37eafa6dcc3051f844369" + integrity sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-typescript@^7.24.7": version "7.25.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz#237c5d10de6d493be31637c6b9fa30b6c5461add" @@ -997,6 +1675,17 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" "@babel/plugin-syntax-typescript" "^7.24.7" +"@babel/plugin-transform-typescript@^7.27.1": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz#796cbd249ab56c18168b49e3e1d341b72af04a6b" + integrity sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.27.3" + "@babel/helper-create-class-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/plugin-syntax-typescript" "^7.27.1" + "@babel/plugin-transform-unicode-escapes@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" @@ -1004,6 +1693,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-unicode-escapes@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz#3e3143f8438aef842de28816ece58780190cf806" + integrity sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-unicode-property-regex@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd" @@ -1012,6 +1708,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-unicode-property-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz#bdfe2d3170c78c5691a3c3be934c8c0087525956" + integrity sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-unicode-regex@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" @@ -1020,6 +1724,14 @@ "@babel/helper-create-regexp-features-plugin" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" +"@babel/plugin-transform-unicode-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz#25948f5c395db15f609028e370667ed8bae9af97" + integrity sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-transform-unicode-sets-regex@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz#d40705d67523803a576e29c63cef6e516b858ed9" @@ -1028,7 +1740,15 @@ "@babel/helper-create-regexp-features-plugin" "^7.24.7" "@babel/helper-plugin-utils" "^7.24.7" -"@babel/preset-env@^7.20.2", "@babel/preset-env@^7.22.9": +"@babel/plugin-transform-unicode-sets-regex@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz#6ab706d10f801b5c72da8bb2548561fa04193cd1" + integrity sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/preset-env@^7.20.2": version "7.25.3" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.3.tgz#0bf4769d84ac51d1073ab4a86f00f30a3a83c67c" integrity sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g== @@ -1117,6 +1837,82 @@ core-js-compat "^3.37.1" semver "^6.3.1" +"@babel/preset-env@^7.25.9": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.28.0.tgz#d23a6bc17b43227d11db77081a0779c706b5569c" + integrity sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg== + dependencies: + "@babel/compat-data" "^7.28.0" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.27.1" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.27.1" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions" "^7.27.1" + "@babel/plugin-syntax-import-attributes" "^7.27.1" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.27.1" + "@babel/plugin-transform-async-generator-functions" "^7.28.0" + "@babel/plugin-transform-async-to-generator" "^7.27.1" + "@babel/plugin-transform-block-scoped-functions" "^7.27.1" + "@babel/plugin-transform-block-scoping" "^7.28.0" + "@babel/plugin-transform-class-properties" "^7.27.1" + "@babel/plugin-transform-class-static-block" "^7.27.1" + "@babel/plugin-transform-classes" "^7.28.0" + "@babel/plugin-transform-computed-properties" "^7.27.1" + "@babel/plugin-transform-destructuring" "^7.28.0" + "@babel/plugin-transform-dotall-regex" "^7.27.1" + "@babel/plugin-transform-duplicate-keys" "^7.27.1" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.27.1" + "@babel/plugin-transform-dynamic-import" "^7.27.1" + "@babel/plugin-transform-explicit-resource-management" "^7.28.0" + "@babel/plugin-transform-exponentiation-operator" "^7.27.1" + "@babel/plugin-transform-export-namespace-from" "^7.27.1" + "@babel/plugin-transform-for-of" "^7.27.1" + "@babel/plugin-transform-function-name" "^7.27.1" + "@babel/plugin-transform-json-strings" "^7.27.1" + "@babel/plugin-transform-literals" "^7.27.1" + "@babel/plugin-transform-logical-assignment-operators" "^7.27.1" + "@babel/plugin-transform-member-expression-literals" "^7.27.1" + "@babel/plugin-transform-modules-amd" "^7.27.1" + "@babel/plugin-transform-modules-commonjs" "^7.27.1" + "@babel/plugin-transform-modules-systemjs" "^7.27.1" + "@babel/plugin-transform-modules-umd" "^7.27.1" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.27.1" + "@babel/plugin-transform-new-target" "^7.27.1" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.27.1" + "@babel/plugin-transform-numeric-separator" "^7.27.1" + "@babel/plugin-transform-object-rest-spread" "^7.28.0" + "@babel/plugin-transform-object-super" "^7.27.1" + "@babel/plugin-transform-optional-catch-binding" "^7.27.1" + "@babel/plugin-transform-optional-chaining" "^7.27.1" + "@babel/plugin-transform-parameters" "^7.27.7" + "@babel/plugin-transform-private-methods" "^7.27.1" + "@babel/plugin-transform-private-property-in-object" "^7.27.1" + "@babel/plugin-transform-property-literals" "^7.27.1" + "@babel/plugin-transform-regenerator" "^7.28.0" + "@babel/plugin-transform-regexp-modifiers" "^7.27.1" + "@babel/plugin-transform-reserved-words" "^7.27.1" + "@babel/plugin-transform-shorthand-properties" "^7.27.1" + "@babel/plugin-transform-spread" "^7.27.1" + "@babel/plugin-transform-sticky-regex" "^7.27.1" + "@babel/plugin-transform-template-literals" "^7.27.1" + "@babel/plugin-transform-typeof-symbol" "^7.27.1" + "@babel/plugin-transform-unicode-escapes" "^7.27.1" + "@babel/plugin-transform-unicode-property-regex" "^7.27.1" + "@babel/plugin-transform-unicode-regex" "^7.27.1" + "@babel/plugin-transform-unicode-sets-regex" "^7.27.1" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.14" + babel-plugin-polyfill-corejs3 "^0.13.0" + babel-plugin-polyfill-regenerator "^0.6.5" + core-js-compat "^3.43.0" + semver "^6.3.1" + "@babel/preset-modules@0.1.6-no-external-plugins": version "0.1.6-no-external-plugins" resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" @@ -1126,7 +1922,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.18.6", "@babel/preset-react@^7.22.5": +"@babel/preset-react@^7.18.6": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.7.tgz#480aeb389b2a798880bf1f889199e3641cbb22dc" integrity sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag== @@ -1138,7 +1934,19 @@ "@babel/plugin-transform-react-jsx-development" "^7.24.7" "@babel/plugin-transform-react-pure-annotations" "^7.24.7" -"@babel/preset-typescript@^7.21.0", "@babel/preset-typescript@^7.22.5": +"@babel/preset-react@^7.25.9": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.27.1.tgz#86ea0a5ca3984663f744be2fd26cb6747c3fd0ec" + integrity sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-transform-react-display-name" "^7.27.1" + "@babel/plugin-transform-react-jsx" "^7.27.1" + "@babel/plugin-transform-react-jsx-development" "^7.27.1" + "@babel/plugin-transform-react-pure-annotations" "^7.27.1" + +"@babel/preset-typescript@^7.21.0": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz#66cd86ea8f8c014855671d5ea9a737139cbbfef1" integrity sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ== @@ -1149,26 +1957,41 @@ "@babel/plugin-transform-modules-commonjs" "^7.24.7" "@babel/plugin-transform-typescript" "^7.24.7" +"@babel/preset-typescript@^7.25.9": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz#190742a6428d282306648a55b0529b561484f912" + integrity sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-syntax-jsx" "^7.27.1" + "@babel/plugin-transform-modules-commonjs" "^7.27.1" + "@babel/plugin-transform-typescript" "^7.27.1" + "@babel/regjsgen@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime-corejs3@^7.22.6": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.25.0.tgz#0a318b66dfc765ad10562d829fea372ed7e1eb7d" - integrity sha512-BOehWE7MgQ8W8Qn0CQnMtg2tHPHPulcS/5AVpFvs2KCK1ET+0WqZqPvnpRpFN81gYoFopdIEJX9Sgjw3ZBccPg== +"@babel/runtime-corejs3@^7.25.9": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.28.0.tgz#4d9938897f5a9aaa9e5f99408a4bf86daba40ec1" + integrity sha512-nlIXnSqLcBij8K8TtkxbBJgfzfvi75V1pAKSM7dUXejGw12vJAqez74jZrHTsJ3Z+Aczc5Q/6JgNjKRMsVU44g== dependencies: - core-js-pure "^3.30.2" - regenerator-runtime "^0.14.0" + core-js-pure "^3.43.0" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.22.6", "@babel/runtime@^7.23.9", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.23.9", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== dependencies: regenerator-runtime "^0.14.0" +"@babel/runtime@^7.25.9": + version "7.27.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.6.tgz#ec4070a04d76bae8ddbb10770ba55714a417b7c6" + integrity sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q== + "@babel/template@^7.24.7", "@babel/template@^7.25.0": version "7.25.0" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" @@ -1178,7 +2001,16 @@ "@babel/parser" "^7.25.0" "@babel/types" "^7.25.0" -"@babel/traverse@^7.22.8", "@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3": +"@babel/template@^7.27.1", "@babel/template@^7.27.2": + version "7.27.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3": version "7.25.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.3.tgz#f1b901951c83eda2f3e29450ce92743783373490" integrity sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ== @@ -1191,6 +2023,19 @@ debug "^4.3.1" globals "^11.1.0" +"@babel/traverse@^7.25.9", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.0.tgz#518aa113359b062042379e333db18380b537e34b" + integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.0" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.28.0" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.0" + debug "^4.3.1" + "@babel/types@^7.21.3", "@babel/types@^7.24.7", "@babel/types@^7.24.8", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.4.4": version "7.25.2" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.2.tgz#55fb231f7dc958cd69ea141a4c2997e819646125" @@ -1200,143 +2045,541 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" -"@braintree/sanitize-url@^6.0.1": - version "6.0.4" - resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz#923ca57e173c6b232bbbb07347b1be982f03e783" - integrity sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A== +"@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.27.6", "@babel/types@^7.28.0": + version "7.28.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.1.tgz#2aaf3c10b31ba03a77ac84f52b3912a0edef4cf9" + integrity sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + +"@braintree/sanitize-url@^7.0.4": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz#15e19737d946559289b915e5dad3b4c28407735e" + integrity sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw== + +"@chevrotain/cst-dts-gen@11.0.3": + version "11.0.3" + resolved "https://registry.yarnpkg.com/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz#5e0863cc57dc45e204ccfee6303225d15d9d4783" + integrity sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ== + dependencies: + "@chevrotain/gast" "11.0.3" + "@chevrotain/types" "11.0.3" + lodash-es "4.17.21" + +"@chevrotain/gast@11.0.3": + version "11.0.3" + resolved "https://registry.yarnpkg.com/@chevrotain/gast/-/gast-11.0.3.tgz#e84d8880323fe8cbe792ef69ce3ffd43a936e818" + integrity sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q== + dependencies: + "@chevrotain/types" "11.0.3" + lodash-es "4.17.21" + +"@chevrotain/regexp-to-ast@11.0.3": + version "11.0.3" + resolved "https://registry.yarnpkg.com/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz#11429a81c74a8e6a829271ce02fc66166d56dcdb" + integrity sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA== + +"@chevrotain/types@11.0.3": + version "11.0.3" + resolved "https://registry.yarnpkg.com/@chevrotain/types/-/types-11.0.3.tgz#f8a03914f7b937f594f56eb89312b3b8f1c91848" + integrity sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ== + +"@chevrotain/utils@11.0.3": + version "11.0.3" + resolved "https://registry.yarnpkg.com/@chevrotain/utils/-/utils-11.0.3.tgz#e39999307b102cff3645ec4f5b3665f5297a2224" + integrity sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ== "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@csstools/cascade-layer-name-parser@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz#43f962bebead0052a9fed1a2deeb11f85efcbc72" + integrity sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A== + +"@csstools/color-helpers@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@csstools/color-helpers/-/color-helpers-5.0.2.tgz#82592c9a7c2b83c293d9161894e2a6471feb97b8" + integrity sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA== + +"@csstools/css-calc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-2.1.4.tgz#8473f63e2fcd6e459838dd412401d5948f224c65" + integrity sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ== + +"@csstools/css-color-parser@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz#79fc68864dd43c3b6782d2b3828bc0fa9d085c10" + integrity sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg== + dependencies: + "@csstools/color-helpers" "^5.0.2" + "@csstools/css-calc" "^2.1.4" + +"@csstools/css-parser-algorithms@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz#5755370a9a29abaec5515b43c8b3f2cf9c2e3076" + integrity sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ== + +"@csstools/css-tokenizer@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz#333fedabc3fd1a8e5d0100013731cf19e6a8c5d3" + integrity sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw== + +"@csstools/media-query-list-parser@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz#7aec77bcb89c2da80ef207e73f474ef9e1b3cdf1" + integrity sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ== + +"@csstools/postcss-cascade-layers@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz#dd2c70db3867b88975f2922da3bfbae7d7a2cae7" + integrity sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg== + dependencies: + "@csstools/selector-specificity" "^5.0.0" + postcss-selector-parser "^7.0.0" + +"@csstools/postcss-color-function@^4.0.10": + version "4.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-4.0.10.tgz#11ad43a66ef2cc794ab826a07df8b5fa9fb47a3a" + integrity sha512-4dY0NBu7NVIpzxZRgh/Q/0GPSz/jLSw0i/u3LTUor0BkQcz/fNhN10mSWBDsL0p9nDb0Ky1PD6/dcGbhACuFTQ== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-color-mix-function@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.10.tgz#8c9d0ccfae5c45a9870dd84807ea2995c7a3a514" + integrity sha512-P0lIbQW9I4ShE7uBgZRib/lMTf9XMjJkFl/d6w4EMNHu2qvQ6zljJGEcBkw/NsBtq/6q3WrmgxSS8kHtPMkK4Q== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-color-mix-variadic-function-arguments@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.0.tgz#0b29cb9b4630d7ed68549db265662d41554a17ed" + integrity sha512-Z5WhouTyD74dPFPrVE7KydgNS9VvnjB8qcdes9ARpCOItb4jTnm7cHp4FhxCRUoyhabD0WVv43wbkJ4p8hLAlQ== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-content-alt-text@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.6.tgz#548862226eac54bab0ee5f1bf3a9981393ab204b" + integrity sha512-eRjLbOjblXq+byyaedQRSrAejKGNAFued+LcbzT+LCL78fabxHkxYjBbxkroONxHHYu2qxhFK2dBStTLPG3jpQ== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-exponential-functions@^2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.9.tgz#fc03d1272888cb77e64cc1a7d8a33016e4f05c69" + integrity sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-font-format-keywords@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz#6730836eb0153ff4f3840416cc2322f129c086e6" + integrity sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw== + dependencies: + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-gamut-mapping@^2.0.10": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.10.tgz#f518d941231d721dbecf5b41e3c441885ff2f28b" + integrity sha512-QDGqhJlvFnDlaPAfCYPsnwVA6ze+8hhrwevYWlnUeSjkkZfBpcCO42SaUD8jiLlq7niouyLgvup5lh+f1qessg== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-gradients-interpolation-method@^5.0.10": + version "5.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.10.tgz#3146da352c31142a721fdba062ac3a6d11dbbec3" + integrity sha512-HHPauB2k7Oits02tKFUeVFEU2ox/H3OQVrP3fSOKDxvloOikSal+3dzlyTZmYsb9FlY9p5EUpBtz0//XBmy+aw== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-hwb-function@^4.0.10": + version "4.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.10.tgz#f93f3c457e6440ac37ef9b908feb5d901b417d50" + integrity sha512-nOKKfp14SWcdEQ++S9/4TgRKchooLZL0TUFdun3nI4KPwCjETmhjta1QT4ICQcGVWQTvrsgMM/aLB5We+kMHhQ== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-ic-unit@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.2.tgz#7561e09db65fac8304ceeab9dd3e5c6e43414587" + integrity sha512-lrK2jjyZwh7DbxaNnIUjkeDmU8Y6KyzRBk91ZkI5h8nb1ykEfZrtIVArdIjX4DHMIBGpdHrgP0n4qXDr7OHaKA== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-initial@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-initial/-/postcss-initial-2.0.1.tgz#c385bd9d8ad31ad159edd7992069e97ceea4d09a" + integrity sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg== + +"@csstools/postcss-is-pseudo-class@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.3.tgz#d34e850bcad4013c2ed7abe948bfa0448aa8eb74" + integrity sha512-jS/TY4SpG4gszAtIg7Qnf3AS2pjcUM5SzxpApOrlndMeGhIbaTzWBzzP/IApXoNWEW7OhcjkRT48jnAUIFXhAQ== + dependencies: + "@csstools/selector-specificity" "^5.0.0" + postcss-selector-parser "^7.0.0" + +"@csstools/postcss-light-dark-function@^2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.9.tgz#9fb080188907539734a9d5311d2a1cb82531ef38" + integrity sha512-1tCZH5bla0EAkFAI2r0H33CDnIBeLUaJh1p+hvvsylJ4svsv2wOmJjJn+OXwUZLXef37GYbRIVKX+X+g6m+3CQ== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-logical-float-and-clear@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz#62617564182cf86ab5d4e7485433ad91e4c58571" + integrity sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ== + +"@csstools/postcss-logical-overflow@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz#c6de7c5f04e3d4233731a847f6c62819bcbcfa1d" + integrity sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA== + +"@csstools/postcss-logical-overscroll-behavior@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz#43c03eaecdf34055ef53bfab691db6dc97a53d37" + integrity sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w== + +"@csstools/postcss-logical-resize@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz#4df0eeb1a61d7bd85395e56a5cce350b5dbfdca6" + integrity sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-logical-viewport-units@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.4.tgz#016d98a8b7b5f969e58eb8413447eb801add16fc" + integrity sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ== + dependencies: + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-media-minmax@^2.0.9": + version "2.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.9.tgz#184252d5b93155ae526689328af6bdf3fc113987" + integrity sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/media-query-list-parser" "^4.0.3" + +"@csstools/postcss-media-queries-aspect-ratio-number-values@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.5.tgz#f485c31ec13d6b0fb5c528a3474334a40eff5f11" + integrity sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/media-query-list-parser" "^4.0.3" + +"@csstools/postcss-nested-calc@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz#754e10edc6958d664c11cde917f44ba144141c62" + integrity sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A== + dependencies: + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-normalize-display-values@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz#ecdde2daf4e192e5da0c6fd933b6d8aff32f2a36" + integrity sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-oklab-function@^4.0.10": + version "4.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.10.tgz#d4c23c51dd0be45e6dedde22432d7d0003710780" + integrity sha512-ZzZUTDd0fgNdhv8UUjGCtObPD8LYxMH+MJsW9xlZaWTV8Ppr4PtxlHYNMmF4vVWGl0T6f8tyWAKjoI6vePSgAg== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-progressive-custom-properties@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.1.0.tgz#70c8d41b577f4023633b7e3791604e0b7f3775bc" + integrity sha512-YrkI9dx8U4R8Sz2EJaoeD9fI7s7kmeEBfmO+UURNeL6lQI7VxF6sBE+rSqdCBn4onwqmxFdBU3lTwyYb/lCmxA== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-random-function@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz#3191f32fe72936e361dadf7dbfb55a0209e2691e" + integrity sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-relative-color-syntax@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.10.tgz#daa840583969461e1e06b12e9c591e52a790ec86" + integrity sha512-8+0kQbQGg9yYG8hv0dtEpOMLwB9M+P7PhacgIzVzJpixxV4Eq9AUQtQw8adMmAJU1RBBmIlpmtmm3XTRd/T00g== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-scope-pseudo-class@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz#9fe60e9d6d91d58fb5fc6c768a40f6e47e89a235" + integrity sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q== + dependencies: + postcss-selector-parser "^7.0.0" + +"@csstools/postcss-sign-functions@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.4.tgz#a9ac56954014ae4c513475b3f1b3e3424a1e0c12" + integrity sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-stepped-value-functions@^4.0.9": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.9.tgz#36036f1a0e5e5ee2308e72f3c9cb433567c387b9" + integrity sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-text-decoration-shorthand@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.2.tgz#a3bcf80492e6dda36477538ab8e8943908c9f80a" + integrity sha512-8XvCRrFNseBSAGxeaVTaNijAu+FzUvjwFXtcrynmazGb/9WUdsPCpBX+mHEHShVRq47Gy4peYAoxYs8ltUnmzA== + dependencies: + "@csstools/color-helpers" "^5.0.2" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-trigonometric-functions@^4.0.9": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.9.tgz#3f94ed2e319b57f2c59720b64e4d0a8a6fb8c3b2" + integrity sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A== + dependencies: + "@csstools/css-calc" "^2.1.4" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-unset-value@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz#7caa981a34196d06a737754864baf77d64de4bba" + integrity sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA== + +"@csstools/selector-resolve-nested@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz#848c6f44cb65e3733e478319b9342b7aa436fac7" + integrity sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g== + +"@csstools/selector-specificity@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz#037817b574262134cabd68fc4ec1a454f168407b" + integrity sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw== + +"@csstools/utilities@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@csstools/utilities/-/utilities-2.0.0.tgz#f7ff0fee38c9ffb5646d47b6906e0bc8868bde60" + integrity sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ== + "@discoveryjs/json-ext@0.5.7": version "0.5.7" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@docsearch/css@3.6.1": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.6.1.tgz#f0a728ecb486c81f2d282650fc1820c914913408" - integrity sha512-VtVb5DS+0hRIprU2CO6ZQjK2Zg4QU5HrDM1+ix6rT0umsYvFvatMAnf97NHZlVWDaaLlx7GRfR/7FikANiM2Fg== +"@docsearch/css@3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.9.0.tgz#3bc29c96bf024350d73b0cfb7c2a7b71bf251cd5" + integrity sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA== -"@docsearch/react@^3.5.2": - version "3.6.1" - resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.6.1.tgz#0f826df08693293806d64277d6d9c38636211b97" - integrity sha512-qXZkEPvybVhSXj0K7U3bXc233tk5e8PfhoZ6MhPOiik/qUQxYC+Dn9DnoS7CxHQQhHfCvTiN0eY9M12oRghEXw== +"@docsearch/react@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.9.0.tgz#d0842b700c3ee26696786f3c8ae9f10c1a3f0db3" + integrity sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ== dependencies: - "@algolia/autocomplete-core" "1.9.3" - "@algolia/autocomplete-preset-algolia" "1.9.3" - "@docsearch/css" "3.6.1" - algoliasearch "^4.19.1" + "@algolia/autocomplete-core" "1.17.9" + "@algolia/autocomplete-preset-algolia" "1.17.9" + "@docsearch/css" "3.9.0" + algoliasearch "^5.14.2" -"@docusaurus/core@3.5.2", "@docusaurus/core@^3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.5.2.tgz#3adedb90e7b6104592f1231043bd6bf91680c39c" - integrity sha512-4Z1WkhCSkX4KO0Fw5m/Vuc7Q3NxBG53NE5u59Rs96fWkMPZVSrzEPP16/Nk6cWb/shK7xXPndTmalJtw7twL/w== +"@docusaurus/babel@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/babel/-/babel-3.8.1.tgz#db329ac047184214e08e2dbc809832c696c18506" + integrity sha512-3brkJrml8vUbn9aeoZUlJfsI/GqyFcDgQJwQkmBtclJgWDEQBKKeagZfOgx0WfUQhagL1sQLNW0iBdxnI863Uw== dependencies: - "@babel/core" "^7.23.3" - "@babel/generator" "^7.23.3" + "@babel/core" "^7.25.9" + "@babel/generator" "^7.25.9" "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-runtime" "^7.22.9" - "@babel/preset-env" "^7.22.9" - "@babel/preset-react" "^7.22.5" - "@babel/preset-typescript" "^7.22.5" - "@babel/runtime" "^7.22.6" - "@babel/runtime-corejs3" "^7.22.6" - "@babel/traverse" "^7.22.8" - "@docusaurus/cssnano-preset" "3.5.2" - "@docusaurus/logger" "3.5.2" - "@docusaurus/mdx-loader" "3.5.2" - "@docusaurus/utils" "3.5.2" - "@docusaurus/utils-common" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" - autoprefixer "^10.4.14" - babel-loader "^9.1.3" + "@babel/plugin-transform-runtime" "^7.25.9" + "@babel/preset-env" "^7.25.9" + "@babel/preset-react" "^7.25.9" + "@babel/preset-typescript" "^7.25.9" + "@babel/runtime" "^7.25.9" + "@babel/runtime-corejs3" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@docusaurus/logger" "3.8.1" + "@docusaurus/utils" "3.8.1" babel-plugin-dynamic-import-node "^2.3.3" + fs-extra "^11.1.1" + tslib "^2.6.0" + +"@docusaurus/bundler@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/bundler/-/bundler-3.8.1.tgz#e2b11d615f09a6e470774bb36441b8d06736b94c" + integrity sha512-/z4V0FRoQ0GuSLToNjOSGsk6m2lQUG4FRn8goOVoZSRsTrU8YR2aJacX5K3RG18EaX9b+52pN4m1sL3MQZVsQA== + dependencies: + "@babel/core" "^7.25.9" + "@docusaurus/babel" "3.8.1" + "@docusaurus/cssnano-preset" "3.8.1" + "@docusaurus/logger" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils" "3.8.1" + babel-loader "^9.2.1" + clean-css "^5.3.3" + copy-webpack-plugin "^11.0.0" + css-loader "^6.11.0" + css-minimizer-webpack-plugin "^5.0.1" + cssnano "^6.1.2" + file-loader "^6.2.0" + html-minifier-terser "^7.2.0" + mini-css-extract-plugin "^2.9.2" + null-loader "^4.0.1" + postcss "^8.5.4" + postcss-loader "^7.3.4" + postcss-preset-env "^10.2.1" + terser-webpack-plugin "^5.3.9" + tslib "^2.6.0" + url-loader "^4.1.1" + webpack "^5.95.0" + webpackbar "^6.0.1" + +"@docusaurus/core@3.8.1", "@docusaurus/core@^3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.8.1.tgz#c22e47c16a22cb7d245306c64bc54083838ff3db" + integrity sha512-ENB01IyQSqI2FLtOzqSI3qxG2B/jP4gQPahl2C3XReiLebcVh5B5cB9KYFvdoOqOWPyr5gXK4sjgTKv7peXCrA== + dependencies: + "@docusaurus/babel" "3.8.1" + "@docusaurus/bundler" "3.8.1" + "@docusaurus/logger" "3.8.1" + "@docusaurus/mdx-loader" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-common" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" boxen "^6.2.1" chalk "^4.1.2" chokidar "^3.5.3" - clean-css "^5.3.2" cli-table3 "^0.6.3" combine-promises "^1.1.0" commander "^5.1.0" - copy-webpack-plugin "^11.0.0" core-js "^3.31.1" - css-loader "^6.8.1" - css-minimizer-webpack-plugin "^5.0.1" - cssnano "^6.1.2" - del "^6.1.1" detect-port "^1.5.1" escape-html "^1.0.3" eta "^2.2.0" eval "^0.1.8" - file-loader "^6.2.0" + execa "5.1.1" fs-extra "^11.1.1" - html-minifier-terser "^7.2.0" html-tags "^3.3.1" - html-webpack-plugin "^5.5.3" + html-webpack-plugin "^5.6.0" leven "^3.1.0" lodash "^4.17.21" - mini-css-extract-plugin "^2.7.6" + open "^8.4.0" p-map "^4.0.0" - postcss "^8.4.26" - postcss-loader "^7.3.3" prompts "^2.4.2" - react-dev-utils "^12.0.1" - react-helmet-async "^1.3.0" + react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" react-loadable "npm:@docusaurus/react-loadable@6.0.0" react-loadable-ssr-addon-v5-slorber "^1.0.1" react-router "^5.3.4" react-router-config "^5.1.1" react-router-dom "^5.3.4" - rtl-detect "^1.0.4" semver "^7.5.4" - serve-handler "^6.1.5" - shelljs "^0.8.5" - terser-webpack-plugin "^5.3.9" + serve-handler "^6.1.6" + tinypool "^1.0.2" tslib "^2.6.0" update-notifier "^6.0.2" - url-loader "^4.1.1" - webpack "^5.88.1" - webpack-bundle-analyzer "^4.9.0" - webpack-dev-server "^4.15.1" - webpack-merge "^5.9.0" - webpackbar "^5.0.2" + webpack "^5.95.0" + webpack-bundle-analyzer "^4.10.2" + webpack-dev-server "^4.15.2" + webpack-merge "^6.0.1" -"@docusaurus/cssnano-preset@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.5.2.tgz#6c1f2b2f9656f978c4694c84ab24592b04dcfab3" - integrity sha512-D3KiQXOMA8+O0tqORBrTOEQyQxNIfPm9jEaJoALjjSjc2M/ZAWcUfPQEnwr2JB2TadHw2gqWgpZckQmrVWkytA== +"@docusaurus/cssnano-preset@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.8.1.tgz#bd55026251a6ab8e2194839a2042458ef9880c44" + integrity sha512-G7WyR2N6SpyUotqhGznERBK+x84uyhfMQM2MmDLs88bw4Flom6TY46HzkRkSEzaP9j80MbTN8naiL1fR17WQug== dependencies: cssnano-preset-advanced "^6.1.2" - postcss "^8.4.38" + postcss "^8.5.4" postcss-sort-media-queries "^5.2.0" tslib "^2.6.0" -"@docusaurus/logger@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.5.2.tgz#1150339ad56844b30734115c19c580f3b25cf5ed" - integrity sha512-LHC540SGkeLfyT3RHK3gAMK6aS5TRqOD4R72BEU/DE2M/TY8WwEUAMY576UUc/oNJXv8pGhBmQB6N9p3pt8LQw== +"@docusaurus/logger@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.8.1.tgz#45321b2e2e14695d0dbd8b4104ea7b0fbaa98700" + integrity sha512-2wjeGDhKcExEmjX8k1N/MRDiPKXGF2Pg+df/bDDPnnJWHXnVEZxXj80d6jcxp1Gpnksl0hF8t/ZQw9elqj2+ww== dependencies: chalk "^4.1.2" tslib "^2.6.0" -"@docusaurus/mdx-loader@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.5.2.tgz#99781641372c5037bcbe09bb8ade93a0e0ada57d" - integrity sha512-ku3xO9vZdwpiMIVd8BzWV0DCqGEbCP5zs1iHfKX50vw6jX8vQo0ylYo1YJMZyz6e+JFJ17HYHT5FzVidz2IflA== +"@docusaurus/mdx-loader@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz#74309b3614bbcef1d55fb13e6cc339b7fb000b5f" + integrity sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w== dependencies: - "@docusaurus/logger" "3.5.2" - "@docusaurus/utils" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" + "@docusaurus/logger" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" "@mdx-js/mdx" "^3.0.0" "@slorber/remark-comment" "^1.0.0" escape-html "^1.0.3" estree-util-value-to-estree "^3.0.1" file-loader "^6.2.0" fs-extra "^11.1.1" - image-size "^1.0.2" + image-size "^2.0.2" mdast-util-mdx "^3.0.0" mdast-util-to-string "^4.0.0" rehype-raw "^7.0.0" @@ -1352,181 +2595,210 @@ vfile "^6.0.1" webpack "^5.88.1" -"@docusaurus/module-type-aliases@3.5.2", "@docusaurus/module-type-aliases@^3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.5.2.tgz#4e8f9c0703e23b2e07ebfce96598ec83e4dd2a9e" - integrity sha512-Z+Xu3+2rvKef/YKTMxZHsEXp1y92ac0ngjDiExRdqGTmEKtCUpkbNYH8v5eXo5Ls+dnW88n6WTa+Q54kLOkwPg== +"@docusaurus/module-type-aliases@3.8.1", "@docusaurus/module-type-aliases@^3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.8.1.tgz#454de577bd7f50b5eae16db0f76b49ca5e4e281a" + integrity sha512-6xhvAJiXzsaq3JdosS7wbRt/PwEPWHr9eM4YNYqVlbgG1hSK3uQDXTVvQktasp3VO6BmfYWPozueLWuj4gB+vg== dependencies: - "@docusaurus/types" "3.5.2" + "@docusaurus/types" "3.8.1" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" "@types/react-router-dom" "*" - react-helmet-async "*" + react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" react-loadable "npm:@docusaurus/react-loadable@6.0.0" -"@docusaurus/plugin-content-blog@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.5.2.tgz#649c07c34da7603645f152bcebdf75285baed16b" - integrity sha512-R7ghWnMvjSf+aeNDH0K4fjyQnt5L0KzUEnUhmf1e3jZrv3wogeytZNN6n7X8yHcMsuZHPOrctQhXWnmxu+IRRg== - dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/logger" "3.5.2" - "@docusaurus/mdx-loader" "3.5.2" - "@docusaurus/theme-common" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils" "3.5.2" - "@docusaurus/utils-common" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" +"@docusaurus/plugin-content-blog@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.8.1.tgz#88d842b562b04cf59df900d9f6984b086f821525" + integrity sha512-vNTpMmlvNP9n3hGEcgPaXyvTljanAKIUkuG9URQ1DeuDup0OR7Ltvoc8yrmH+iMZJbcQGhUJF+WjHLwuk8HSdw== + dependencies: + "@docusaurus/core" "3.8.1" + "@docusaurus/logger" "3.8.1" + "@docusaurus/mdx-loader" "3.8.1" + "@docusaurus/theme-common" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-common" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" cheerio "1.0.0-rc.12" feed "^4.2.2" fs-extra "^11.1.1" lodash "^4.17.21" - reading-time "^1.5.0" + schema-dts "^1.1.2" srcset "^4.0.0" tslib "^2.6.0" unist-util-visit "^5.0.0" utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-docs@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.5.2.tgz#adcf6c0bd9a9818eb192ab831e0069ee62d31505" - integrity sha512-Bt+OXn/CPtVqM3Di44vHjE7rPCEsRCB/DMo2qoOuozB9f7+lsdrHvD0QCHdBs0uhz6deYJDppAr2VgqybKPlVQ== - dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/logger" "3.5.2" - "@docusaurus/mdx-loader" "3.5.2" - "@docusaurus/module-type-aliases" "3.5.2" - "@docusaurus/theme-common" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils" "3.5.2" - "@docusaurus/utils-common" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" +"@docusaurus/plugin-content-docs@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.8.1.tgz#40686a206abb6373bee5638de100a2c312f112a4" + integrity sha512-oByRkSZzeGNQByCMaX+kif5Nl2vmtj2IHQI2fWjCfCootsdKZDPFLonhIp5s3IGJO7PLUfe0POyw0Xh/RrGXJA== + dependencies: + "@docusaurus/core" "3.8.1" + "@docusaurus/logger" "3.8.1" + "@docusaurus/mdx-loader" "3.8.1" + "@docusaurus/module-type-aliases" "3.8.1" + "@docusaurus/theme-common" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-common" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" "@types/react-router-config" "^5.0.7" combine-promises "^1.1.0" fs-extra "^11.1.1" js-yaml "^4.1.0" lodash "^4.17.21" + schema-dts "^1.1.2" tslib "^2.6.0" utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-pages@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.5.2.tgz#2b59e43f5bc5b5176ff01835de706f1c65c2e68b" - integrity sha512-WzhHjNpoQAUz/ueO10cnundRz+VUtkjFhhaQ9jApyv1a46FPURO4cef89pyNIOMny1fjDz/NUN2z6Yi+5WUrCw== - dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/mdx-loader" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" +"@docusaurus/plugin-content-pages@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.8.1.tgz#41b684dbd15390b7bb6a627f78bf81b6324511ac" + integrity sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w== + dependencies: + "@docusaurus/core" "3.8.1" + "@docusaurus/mdx-loader" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" fs-extra "^11.1.1" tslib "^2.6.0" webpack "^5.88.1" -"@docusaurus/plugin-debug@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.5.2.tgz#c25ca6a59e62a17c797b367173fe80c06fdf2f65" - integrity sha512-kBK6GlN0itCkrmHuCS6aX1wmoWc5wpd5KJlqQ1FyrF0cLDnvsYSnh7+ftdwzt7G6lGBho8lrVwkkL9/iQvaSOA== +"@docusaurus/plugin-css-cascade-layers@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.8.1.tgz#cb414b4a82aa60fc64ef2a435ad0105e142a6c71" + integrity sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw== dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils" "3.5.2" + "@docusaurus/core" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" + tslib "^2.6.0" + +"@docusaurus/plugin-debug@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.8.1.tgz#45b107e46b627caaae66995f53197ace78af3491" + integrity sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw== + dependencies: + "@docusaurus/core" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils" "3.8.1" fs-extra "^11.1.1" - react-json-view-lite "^1.2.0" + react-json-view-lite "^2.3.0" tslib "^2.6.0" -"@docusaurus/plugin-google-analytics@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.5.2.tgz#1143e78d1461d3c74a2746f036d25b18d4a2608d" - integrity sha512-rjEkJH/tJ8OXRE9bwhV2mb/WP93V441rD6XnM6MIluu7rk8qg38iSxS43ga2V2Q/2ib53PcqbDEJDG/yWQRJhQ== +"@docusaurus/plugin-google-analytics@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.8.1.tgz#64a302e62fe5cb6e007367c964feeef7b056764a" + integrity sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q== dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" + "@docusaurus/core" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" tslib "^2.6.0" -"@docusaurus/plugin-google-gtag@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.5.2.tgz#60b5a9e1888c4fa16933f7c5cb5f2f2c31caad3a" - integrity sha512-lm8XL3xLkTPHFKKjLjEEAHUrW0SZBSHBE1I+i/tmYMBsjCcUB5UJ52geS5PSiOCFVR74tbPGcPHEV/gaaxFeSA== +"@docusaurus/plugin-google-gtag@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.8.1.tgz#8c76f8a1d96448f2f0f7b10e6bde451c40672b95" + integrity sha512-tKE8j1cEZCh8KZa4aa80zpSTxsC2/ZYqjx6AAfd8uA8VHZVw79+7OTEP2PoWi0uL5/1Is0LF5Vwxd+1fz5HlKg== dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" + "@docusaurus/core" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" "@types/gtag.js" "^0.0.12" tslib "^2.6.0" -"@docusaurus/plugin-google-tag-manager@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.5.2.tgz#7a37334d2e7f00914d61ad05bc09391c4db3bfda" - integrity sha512-QkpX68PMOMu10Mvgvr5CfZAzZQFx8WLlOiUQ/Qmmcl6mjGK6H21WLT5x7xDmcpCoKA/3CegsqIqBR+nA137lQg== +"@docusaurus/plugin-google-tag-manager@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.8.1.tgz#88241ffd06369f4a4d5fb982ff3ac2777561ae37" + integrity sha512-iqe3XKITBquZq+6UAXdb1vI0fPY5iIOitVjPQ581R1ZKpHr0qe+V6gVOrrcOHixPDD/BUKdYwkxFjpNiEN+vBw== dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" + "@docusaurus/core" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" tslib "^2.6.0" -"@docusaurus/plugin-sitemap@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.5.2.tgz#9c940b27f3461c54d65295cf4c52cb20538bd360" - integrity sha512-DnlqYyRAdQ4NHY28TfHuVk414ft2uruP4QWCH//jzpHjqvKyXjj2fmDtI8RPUBh9K8iZKFMHRnLtzJKySPWvFA== - dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/logger" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils" "3.5.2" - "@docusaurus/utils-common" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" +"@docusaurus/plugin-sitemap@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.8.1.tgz#3aebd39186dc30e53023f1aab44625bc0bdac892" + integrity sha512-+9YV/7VLbGTq8qNkjiugIelmfUEVkTyLe6X8bWq7K5qPvGXAjno27QAfFq63mYfFFbJc7z+pudL63acprbqGzw== + dependencies: + "@docusaurus/core" "3.8.1" + "@docusaurus/logger" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-common" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" fs-extra "^11.1.1" sitemap "^7.1.1" tslib "^2.6.0" -"@docusaurus/preset-classic@^3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.5.2.tgz#977f78510bbc556aa0539149eef960bb7ab52bd9" - integrity sha512-3ihfXQ95aOHiLB5uCu+9PRy2gZCeSZoDcqpnDvf3B+sTrMvMTr8qRUzBvWkoIqc82yG5prCboRjk1SVILKx6sg== - dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/plugin-content-blog" "3.5.2" - "@docusaurus/plugin-content-docs" "3.5.2" - "@docusaurus/plugin-content-pages" "3.5.2" - "@docusaurus/plugin-debug" "3.5.2" - "@docusaurus/plugin-google-analytics" "3.5.2" - "@docusaurus/plugin-google-gtag" "3.5.2" - "@docusaurus/plugin-google-tag-manager" "3.5.2" - "@docusaurus/plugin-sitemap" "3.5.2" - "@docusaurus/theme-classic" "3.5.2" - "@docusaurus/theme-common" "3.5.2" - "@docusaurus/theme-search-algolia" "3.5.2" - "@docusaurus/types" "3.5.2" - -"@docusaurus/theme-classic@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.5.2.tgz#602ddb63d987ab1f939e3760c67bc1880f01c000" - integrity sha512-XRpinSix3NBv95Rk7xeMF9k4safMkwnpSgThn0UNQNumKvmcIYjfkwfh2BhwYh/BxMXQHJ/PdmNh22TQFpIaYg== - dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/mdx-loader" "3.5.2" - "@docusaurus/module-type-aliases" "3.5.2" - "@docusaurus/plugin-content-blog" "3.5.2" - "@docusaurus/plugin-content-docs" "3.5.2" - "@docusaurus/plugin-content-pages" "3.5.2" - "@docusaurus/theme-common" "3.5.2" - "@docusaurus/theme-translations" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils" "3.5.2" - "@docusaurus/utils-common" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" +"@docusaurus/plugin-svgr@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-svgr/-/plugin-svgr-3.8.1.tgz#6f340be8eae418a2cce540d8ece096ffd9c9b6ab" + integrity sha512-rW0LWMDsdlsgowVwqiMb/7tANDodpy1wWPwCcamvhY7OECReN3feoFwLjd/U4tKjNY3encj0AJSTxJA+Fpe+Gw== + dependencies: + "@docusaurus/core" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" + "@svgr/core" "8.1.0" + "@svgr/webpack" "^8.1.0" + tslib "^2.6.0" + webpack "^5.88.1" + +"@docusaurus/preset-classic@^3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.8.1.tgz#bb79fd12f3211363720c569a526c7e24d3aa966b" + integrity sha512-yJSjYNHXD8POMGc2mKQuj3ApPrN+eG0rO1UPgSx7jySpYU+n4WjBikbrA2ue5ad9A7aouEtMWUoiSRXTH/g7KQ== + dependencies: + "@docusaurus/core" "3.8.1" + "@docusaurus/plugin-content-blog" "3.8.1" + "@docusaurus/plugin-content-docs" "3.8.1" + "@docusaurus/plugin-content-pages" "3.8.1" + "@docusaurus/plugin-css-cascade-layers" "3.8.1" + "@docusaurus/plugin-debug" "3.8.1" + "@docusaurus/plugin-google-analytics" "3.8.1" + "@docusaurus/plugin-google-gtag" "3.8.1" + "@docusaurus/plugin-google-tag-manager" "3.8.1" + "@docusaurus/plugin-sitemap" "3.8.1" + "@docusaurus/plugin-svgr" "3.8.1" + "@docusaurus/theme-classic" "3.8.1" + "@docusaurus/theme-common" "3.8.1" + "@docusaurus/theme-search-algolia" "3.8.1" + "@docusaurus/types" "3.8.1" + +"@docusaurus/theme-classic@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.8.1.tgz#1e45c66d89ded359225fcd29bf3258d9205765c1" + integrity sha512-bqDUCNqXeYypMCsE1VcTXSI1QuO4KXfx8Cvl6rYfY0bhhqN6d2WZlRkyLg/p6pm+DzvanqHOyYlqdPyP0iz+iw== + dependencies: + "@docusaurus/core" "3.8.1" + "@docusaurus/logger" "3.8.1" + "@docusaurus/mdx-loader" "3.8.1" + "@docusaurus/module-type-aliases" "3.8.1" + "@docusaurus/plugin-content-blog" "3.8.1" + "@docusaurus/plugin-content-docs" "3.8.1" + "@docusaurus/plugin-content-pages" "3.8.1" + "@docusaurus/theme-common" "3.8.1" + "@docusaurus/theme-translations" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-common" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" "@mdx-js/react" "^3.0.0" clsx "^2.0.0" copy-text-to-clipboard "^3.2.0" - infima "0.2.0-alpha.44" + infima "0.2.0-alpha.45" lodash "^4.17.21" nprogress "^0.2.0" - postcss "^8.4.26" + postcss "^8.5.4" prism-react-renderer "^2.3.0" prismjs "^1.29.0" react-router-dom "^5.3.4" @@ -1534,15 +2806,15 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-common@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.5.2.tgz#b507ab869a1fba0be9c3c9d74f2f3d74c3ac78b2" - integrity sha512-QXqlm9S6x9Ibwjs7I2yEDgsCocp708DrCrgHgKwg2n2AY0YQ6IjU0gAK35lHRLOvAoJUfCKpQAwUykB0R7+Eew== +"@docusaurus/theme-common@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.8.1.tgz#17c23316fbe3ee3f7e707c7298cb59a0fff38b4b" + integrity sha512-UswMOyTnPEVRvN5Qzbo+l8k4xrd5fTFu2VPPfD6FcW/6qUtVLmJTQCktbAL3KJ0BVXGm5aJXz/ZrzqFuZERGPw== dependencies: - "@docusaurus/mdx-loader" "3.5.2" - "@docusaurus/module-type-aliases" "3.5.2" - "@docusaurus/utils" "3.5.2" - "@docusaurus/utils-common" "3.5.2" + "@docusaurus/mdx-loader" "3.8.1" + "@docusaurus/module-type-aliases" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-common" "3.8.1" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -1552,34 +2824,34 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-mermaid@^3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-mermaid/-/theme-mermaid-3.5.2.tgz#7d64289e6f2493b9fc0d5f2e8f66da4c9d884db8" - integrity sha512-7vWCnIe/KoyTN1Dc55FIyqO5hJ3YaV08Mr63Zej0L0mX1iGzt+qKSmeVUAJ9/aOalUhF0typV0RmNUSy5FAmCg== - dependencies: - "@docusaurus/core" "3.5.2" - "@docusaurus/module-type-aliases" "3.5.2" - "@docusaurus/theme-common" "3.5.2" - "@docusaurus/types" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" - mermaid "^10.4.0" +"@docusaurus/theme-mermaid@^3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-mermaid/-/theme-mermaid-3.8.1.tgz#2b73b5e90057bd9fb46f267aeb2d3470b168a7c8" + integrity sha512-IWYqjyTPjkNnHsFFu9+4YkeXS7PD1xI3Bn2shOhBq+f95mgDfWInkpfBN4aYvx4fTT67Am6cPtohRdwh4Tidtg== + dependencies: + "@docusaurus/core" "3.8.1" + "@docusaurus/module-type-aliases" "3.8.1" + "@docusaurus/theme-common" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" + mermaid ">=11.6.0" tslib "^2.6.0" -"@docusaurus/theme-search-algolia@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.5.2.tgz#466c83ca7e8017d95ae6889ccddc5ef8bf6b61c6" - integrity sha512-qW53kp3VzMnEqZGjakaV90sst3iN1o32PH+nawv1uepROO8aEGxptcq2R5rsv7aBShSRbZwIobdvSYKsZ5pqvA== - dependencies: - "@docsearch/react" "^3.5.2" - "@docusaurus/core" "3.5.2" - "@docusaurus/logger" "3.5.2" - "@docusaurus/plugin-content-docs" "3.5.2" - "@docusaurus/theme-common" "3.5.2" - "@docusaurus/theme-translations" "3.5.2" - "@docusaurus/utils" "3.5.2" - "@docusaurus/utils-validation" "3.5.2" - algoliasearch "^4.18.0" - algoliasearch-helper "^3.13.3" +"@docusaurus/theme-search-algolia@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.8.1.tgz#3aa3d99c35cc2d4b709fcddd4df875a9b536e29b" + integrity sha512-NBFH5rZVQRAQM087aYSRKQ9yGEK9eHd+xOxQjqNpxMiV85OhJDD4ZGz6YJIod26Fbooy54UWVdzNU0TFeUUUzQ== + dependencies: + "@docsearch/react" "^3.9.0" + "@docusaurus/core" "3.8.1" + "@docusaurus/logger" "3.8.1" + "@docusaurus/plugin-content-docs" "3.8.1" + "@docusaurus/theme-common" "3.8.1" + "@docusaurus/theme-translations" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-validation" "3.8.1" + algoliasearch "^5.17.1" + algoliasearch-helper "^3.22.6" clsx "^2.0.0" eta "^2.2.0" fs-extra "^11.1.1" @@ -1587,59 +2859,61 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-translations@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.5.2.tgz#38f9ebf2a5d860397022206a05fef66c08863c89" - integrity sha512-GPZLcu4aT1EmqSTmbdpVrDENGR2yObFEX8ssEFYTCiAIVc0EihNSdOIBTazUvgNqwvnoU1A8vIs1xyzc3LITTw== +"@docusaurus/theme-translations@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.8.1.tgz#4b1d76973eb53861e167c7723485e059ba4ffd0a" + integrity sha512-OTp6eebuMcf2rJt4bqnvuwmm3NVXfzfYejL+u/Y1qwKhZPrjPoKWfk1CbOP5xH5ZOPkiAsx4dHdQBRJszK3z2g== dependencies: fs-extra "^11.1.1" tslib "^2.6.0" -"@docusaurus/types@3.5.2", "@docusaurus/types@^3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.5.2.tgz#058019dbeffbee2d412c3f72569e412a727f9608" - integrity sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw== +"@docusaurus/types@3.8.1", "@docusaurus/types@^3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.8.1.tgz#83ab66c345464e003b576a49f78897482061fc26" + integrity sha512-ZPdW5AB+pBjiVrcLuw3dOS6BFlrG0XkS2lDGsj8TizcnREQg3J8cjsgfDviszOk4CweNfwo1AEELJkYaMUuOPg== dependencies: "@mdx-js/mdx" "^3.0.0" "@types/history" "^4.7.11" "@types/react" "*" commander "^5.1.0" joi "^17.9.2" - react-helmet-async "^1.3.0" + react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" utility-types "^3.10.0" - webpack "^5.88.1" + webpack "^5.95.0" webpack-merge "^5.9.0" -"@docusaurus/utils-common@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.5.2.tgz#4d7f5e962fbca3e2239d80457aa0e4bd3d8f7e0a" - integrity sha512-i0AZjHiRgJU6d7faQngIhuHKNrszpL/SHQPgF1zH4H+Ij6E9NBYGy6pkcGWToIv7IVPbs+pQLh1P3whn0gWXVg== +"@docusaurus/utils-common@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.8.1.tgz#c369b8c3041afb7dcd595d4172beb1cc1015c85f" + integrity sha512-zTZiDlvpvoJIrQEEd71c154DkcriBecm4z94OzEE9kz7ikS3J+iSlABhFXM45mZ0eN5pVqqr7cs60+ZlYLewtg== dependencies: + "@docusaurus/types" "3.8.1" tslib "^2.6.0" -"@docusaurus/utils-validation@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.5.2.tgz#1b2b2f02082781cc8ce713d4c85e88d6d2fc4eb3" - integrity sha512-m+Foq7augzXqB6HufdS139PFxDC5d5q2QKZy8q0qYYvGdI6nnlNsGH4cIGsgBnV7smz+mopl3g4asbSDvMV0jA== +"@docusaurus/utils-validation@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.8.1.tgz#0499c0d151a4098a0963237057993282cfbd538e" + integrity sha512-gs5bXIccxzEbyVecvxg6upTwaUbfa0KMmTj7HhHzc016AGyxH2o73k1/aOD0IFrdCsfJNt37MqNI47s2MgRZMA== dependencies: - "@docusaurus/logger" "3.5.2" - "@docusaurus/utils" "3.5.2" - "@docusaurus/utils-common" "3.5.2" + "@docusaurus/logger" "3.8.1" + "@docusaurus/utils" "3.8.1" + "@docusaurus/utils-common" "3.8.1" fs-extra "^11.2.0" joi "^17.9.2" js-yaml "^4.1.0" lodash "^4.17.21" tslib "^2.6.0" -"@docusaurus/utils@3.5.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.5.2.tgz#17763130215f18d7269025903588ef7fb373e2cb" - integrity sha512-33QvcNFh+Gv+C2dP9Y9xWEzMgf3JzrpL2nW9PopidiohS1nDcyknKRx2DWaFvyVTTYIkkABVSr073VTj/NITNA== +"@docusaurus/utils@3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.8.1.tgz#2ac1e734106e2f73dbd0f6a8824d525f9064e9f0" + integrity sha512-P1ml0nvOmEFdmu0smSXOqTS1sxU5tqvnc0dA4MTKV39kye+bhQnjkIKEE18fNOvxjyB86k8esoCIFM3x4RykOQ== dependencies: - "@docusaurus/logger" "3.5.2" - "@docusaurus/utils-common" "3.5.2" - "@svgr/webpack" "^8.1.0" + "@docusaurus/logger" "3.8.1" + "@docusaurus/types" "3.8.1" + "@docusaurus/utils-common" "3.8.1" escape-string-regexp "^4.0.0" + execa "5.1.1" file-loader "^6.2.0" fs-extra "^11.1.1" github-slugger "^1.5.0" @@ -1649,9 +2923,9 @@ js-yaml "^4.1.0" lodash "^4.17.21" micromatch "^4.0.5" + p-queue "^6.6.2" prompts "^2.4.2" resolve-pathname "^3.0.0" - shelljs "^0.8.5" tslib "^2.6.0" url-loader "^4.1.1" utility-types "^3.10.0" @@ -1788,6 +3062,20 @@ resolved "https://registry.yarnpkg.com/@iconify/types/-/types-2.0.0.tgz#ab0e9ea681d6c8a1214f30cd741fe3a20cc57f57" integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== +"@iconify/utils@^2.1.33": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-2.3.0.tgz#1bbbf8c477ebe9a7cacaea78b1b7e8937f9cbfba" + integrity sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA== + dependencies: + "@antfu/install-pkg" "^1.0.0" + "@antfu/utils" "^8.1.0" + "@iconify/types" "^2.0.0" + debug "^4.4.0" + globals "^15.14.0" + kolorist "^1.8.0" + local-pkg "^1.0.0" + mlly "^1.7.4" + "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" @@ -1807,6 +3095,14 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" +"@jridgewell/gen-mapping@^0.3.12": + version "0.3.12" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz#2234ce26c62889f03db3d7fea43c1932ab3e927b" + integrity sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" @@ -1839,6 +3135,11 @@ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== +"@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.4" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz#7358043433b2e5da569aa02cbc4c121da3af27d7" + integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw== + "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" @@ -1847,6 +3148,14 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@^0.3.28": + version "0.3.29" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz#a58d31eaadaf92c6695680b2e1d464a9b8fbf7fc" + integrity sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@leichtgewicht/ip-codec@^2.0.1": version "2.0.5" resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" @@ -1888,6 +3197,13 @@ dependencies: "@types/mdx" "^2.0.0" +"@mermaid-js/parser@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@mermaid-js/parser/-/parser-0.6.2.tgz#6d505a33acb52ddeb592c596b14f9d92a30396a9" + integrity sha512-+PO02uGF6L6Cs0Bw8RpGhikVvMWEysfAyl27qTlroUB8jSWr1lL0Sf6zi78ZxlSnmgSY2AMMKVgghnN9jTtwkQ== + dependencies: + langium "3.3.1" + "@mui/core-downloads-tracker@^5.16.7": version "5.16.7" resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz#182a325a520f7ebd75de051fceabfc0314cfd004" @@ -2232,23 +3548,216 @@ dependencies: "@types/node" "*" -"@types/d3-scale-chromatic@^3.0.0": +"@types/d3-array@*": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.1.tgz#1f6658e3d2006c4fceac53fde464166859f8b8c5" + integrity sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg== + +"@types/d3-axis@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-3.0.6.tgz#e760e5765b8188b1defa32bc8bb6062f81e4c795" + integrity sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-brush@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-3.0.6.tgz#c2f4362b045d472e1b186cdbec329ba52bdaee6c" + integrity sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-chord@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-3.0.6.tgz#1706ca40cf7ea59a0add8f4456efff8f8775793d" + integrity sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg== + +"@types/d3-color@*": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2" + integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== + +"@types/d3-contour@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-3.0.6.tgz#9ada3fa9c4d00e3a5093fed0356c7ab929604231" + integrity sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg== + dependencies: + "@types/d3-array" "*" + "@types/geojson" "*" + +"@types/d3-delaunay@*": + version "6.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz#185c1a80cc807fdda2a3fe960f7c11c4a27952e1" + integrity sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw== + +"@types/d3-dispatch@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz#096efdf55eb97480e3f5621ff9a8da552f0961e7" + integrity sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ== + +"@types/d3-drag@*": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-3.0.7.tgz#b13aba8b2442b4068c9a9e6d1d82f8bcea77fc02" + integrity sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-dsv@*": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-3.0.7.tgz#0a351f996dc99b37f4fa58b492c2d1c04e3dac17" + integrity sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g== + +"@types/d3-ease@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.2.tgz#e28db1bfbfa617076f7770dd1d9a48eaa3b6c51b" + integrity sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA== + +"@types/d3-fetch@*": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-3.0.7.tgz#c04a2b4f23181aa376f30af0283dbc7b3b569980" + integrity sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA== + dependencies: + "@types/d3-dsv" "*" + +"@types/d3-force@*": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-3.0.10.tgz#6dc8fc6e1f35704f3b057090beeeb7ac674bff1a" + integrity sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw== + +"@types/d3-format@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-3.0.4.tgz#b1e4465644ddb3fdf3a263febb240a6cd616de90" + integrity sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g== + +"@types/d3-geo@*": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-3.1.0.tgz#b9e56a079449174f0a2c8684a9a4df3f60522440" + integrity sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ== + dependencies: + "@types/geojson" "*" + +"@types/d3-hierarchy@*": + version "3.1.7" + resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz#6023fb3b2d463229f2d680f9ac4b47466f71f17b" + integrity sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg== + +"@types/d3-interpolate@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz#412b90e84870285f2ff8a846c6eb60344f12a41c" + integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA== + dependencies: + "@types/d3-color" "*" + +"@types/d3-path@*": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.1.tgz#f632b380c3aca1dba8e34aa049bcd6a4af23df8a" + integrity sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg== + +"@types/d3-polygon@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-3.0.2.tgz#dfae54a6d35d19e76ac9565bcb32a8e54693189c" + integrity sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA== + +"@types/d3-quadtree@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz#d4740b0fe35b1c58b66e1488f4e7ed02952f570f" + integrity sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg== + +"@types/d3-random@*": version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz#fc0db9c10e789c351f4c42d96f31f2e4df8f5644" - integrity sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw== + resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-3.0.3.tgz#ed995c71ecb15e0cd31e22d9d5d23942e3300cfb" + integrity sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ== -"@types/d3-scale@^4.0.3": - version "4.0.8" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.8.tgz#d409b5f9dcf63074464bf8ddfb8ee5a1f95945bb" - integrity sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ== +"@types/d3-scale-chromatic@*": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#dc6d4f9a98376f18ea50bad6c39537f1b5463c39" + integrity sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ== + +"@types/d3-scale@*": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.9.tgz#57a2f707242e6fe1de81ad7bfcccaaf606179afb" + integrity sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw== dependencies: "@types/d3-time" "*" +"@types/d3-selection@*": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-3.0.11.tgz#bd7a45fc0a8c3167a631675e61bc2ca2b058d4a3" + integrity sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w== + +"@types/d3-shape@*": + version "3.1.7" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.7.tgz#2b7b423dc2dfe69c8c93596e673e37443348c555" + integrity sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg== + dependencies: + "@types/d3-path" "*" + +"@types/d3-time-format@*": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-4.0.3.tgz#d6bc1e6b6a7db69cccfbbdd4c34b70632d9e9db2" + integrity sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg== + "@types/d3-time@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.3.tgz#3c186bbd9d12b9d84253b6be6487ca56b54f88be" integrity sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw== +"@types/d3-timer@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.2.tgz#70bbda77dc23aa727413e22e214afa3f0e852f70" + integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw== + +"@types/d3-transition@*": + version "3.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-3.0.9.tgz#1136bc57e9ddb3c390dccc9b5ff3b7d2b8d94706" + integrity sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-zoom@*": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-3.0.8.tgz#dccb32d1c56b1e1c6e0f1180d994896f038bc40b" + integrity sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw== + dependencies: + "@types/d3-interpolate" "*" + "@types/d3-selection" "*" + +"@types/d3@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@types/d3/-/d3-7.4.3.tgz#d4550a85d08f4978faf0a4c36b848c61eaac07e2" + integrity sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww== + dependencies: + "@types/d3-array" "*" + "@types/d3-axis" "*" + "@types/d3-brush" "*" + "@types/d3-chord" "*" + "@types/d3-color" "*" + "@types/d3-contour" "*" + "@types/d3-delaunay" "*" + "@types/d3-dispatch" "*" + "@types/d3-drag" "*" + "@types/d3-dsv" "*" + "@types/d3-ease" "*" + "@types/d3-fetch" "*" + "@types/d3-force" "*" + "@types/d3-format" "*" + "@types/d3-geo" "*" + "@types/d3-hierarchy" "*" + "@types/d3-interpolate" "*" + "@types/d3-path" "*" + "@types/d3-polygon" "*" + "@types/d3-quadtree" "*" + "@types/d3-random" "*" + "@types/d3-scale" "*" + "@types/d3-scale-chromatic" "*" + "@types/d3-selection" "*" + "@types/d3-shape" "*" + "@types/d3-time" "*" + "@types/d3-time-format" "*" + "@types/d3-timer" "*" + "@types/d3-transition" "*" + "@types/d3-zoom" "*" + "@types/debug@^4.0.0": version "4.1.12" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" @@ -2256,7 +3765,7 @@ dependencies: "@types/ms" "*" -"@types/eslint-scope@^3.7.3": +"@types/eslint-scope@^3.7.3", "@types/eslint-scope@^3.7.7": version "3.7.7" resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== @@ -2284,6 +3793,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== +"@types/estree@^1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": version "4.19.5" resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" @@ -2304,6 +3818,11 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/geojson@*": + version "7946.0.16" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.16.tgz#8ebe53d69efada7044454e3305c19017d97ced2a" + integrity sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg== + "@types/gtag.js@^0.0.12": version "0.0.12" resolved "https://registry.yarnpkg.com/@types/gtag.js/-/gtag.js-0.0.12.tgz#095122edca896689bdfcdd73b057e23064d23572" @@ -2362,18 +3881,11 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/mdast@^3.0.0": - version "3.0.15" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.15.tgz#49c524a263f30ffa28b71ae282f813ed000ab9f5" - integrity sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ== - dependencies: - "@types/unist" "^2" - "@types/mdast@^4.0.0", "@types/mdast@^4.0.2": version "4.0.4" resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" @@ -2524,12 +4036,17 @@ dependencies: "@types/node" "*" +"@types/trusted-types@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== + "@types/unist@*", "@types/unist@^3.0.0": version "3.0.2" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.2.tgz#6dd61e43ef60b34086287f83683a5c1b2dc53d20" integrity sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ== -"@types/unist@^2", "@types/unist@^2.0.0": +"@types/unist@^2.0.0": version "2.0.10" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== @@ -2566,21 +4083,44 @@ "@webassemblyjs/helper-numbers" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" + integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== + dependencies: + "@webassemblyjs/helper-numbers" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/floating-point-hex-parser@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== +"@webassemblyjs/floating-point-hex-parser@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" + integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== + "@webassemblyjs/helper-api-error@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== +"@webassemblyjs/helper-api-error@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" + integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== + "@webassemblyjs/helper-buffer@1.12.1": version "1.12.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== +"@webassemblyjs/helper-buffer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" + integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== + "@webassemblyjs/helper-numbers@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" @@ -2590,11 +4130,25 @@ "@webassemblyjs/helper-api-error" "1.11.6" "@xtuc/long" "4.2.2" +"@webassemblyjs/helper-numbers@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" + integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.13.2" + "@webassemblyjs/helper-api-error" "1.13.2" + "@xtuc/long" "4.2.2" + "@webassemblyjs/helper-wasm-bytecode@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== +"@webassemblyjs/helper-wasm-bytecode@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" + integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== + "@webassemblyjs/helper-wasm-section@1.12.1": version "1.12.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" @@ -2605,6 +4159,16 @@ "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/wasm-gen" "1.12.1" +"@webassemblyjs/helper-wasm-section@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" + integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/ieee754@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" @@ -2612,6 +4176,13 @@ dependencies: "@xtuc/ieee754" "^1.2.0" +"@webassemblyjs/ieee754@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" + integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== + dependencies: + "@xtuc/ieee754" "^1.2.0" + "@webassemblyjs/leb128@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" @@ -2619,11 +4190,23 @@ dependencies: "@xtuc/long" "4.2.2" +"@webassemblyjs/leb128@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" + integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== + dependencies: + "@xtuc/long" "4.2.2" + "@webassemblyjs/utf8@1.11.6": version "1.11.6" resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== +"@webassemblyjs/utf8@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" + integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== + "@webassemblyjs/wasm-edit@^1.12.1": version "1.12.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" @@ -2638,6 +4221,20 @@ "@webassemblyjs/wasm-parser" "1.12.1" "@webassemblyjs/wast-printer" "1.12.1" +"@webassemblyjs/wasm-edit@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" + integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/helper-wasm-section" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-opt" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + "@webassemblyjs/wast-printer" "1.14.1" + "@webassemblyjs/wasm-gen@1.12.1": version "1.12.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" @@ -2649,6 +4246,17 @@ "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" +"@webassemblyjs/wasm-gen@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" + integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + "@webassemblyjs/wasm-opt@1.12.1": version "1.12.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" @@ -2659,6 +4267,16 @@ "@webassemblyjs/wasm-gen" "1.12.1" "@webassemblyjs/wasm-parser" "1.12.1" +"@webassemblyjs/wasm-opt@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" + integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + "@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": version "1.12.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" @@ -2671,6 +4289,18 @@ "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" + integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-api-error" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + "@webassemblyjs/wast-printer@1.12.1": version "1.12.1" resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" @@ -2679,6 +4309,14 @@ "@webassemblyjs/ast" "1.12.1" "@xtuc/long" "4.2.2" +"@webassemblyjs/wast-printer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" + integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@xtuc/long" "4.2.2" + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -2702,6 +4340,11 @@ acorn-import-attributes@^1.9.5: resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== +acorn-import-phases@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz#16eb850ba99a056cb7cbfe872ffb8972e18c8bd7" + integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== + acorn-jsx@^5.0.0: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -2719,7 +4362,12 @@ acorn@^8.0.0, acorn@^8.0.4, acorn@^8.11.0, acorn@^8.7.1, acorn@^8.8.2: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== -address@^1.0.1, address@^1.1.2: +acorn@^8.14.0, acorn@^8.15.0: + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + +address@^1.0.1: version "1.2.2" resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== @@ -2739,7 +4387,7 @@ ajv-formats@^2.1.1: dependencies: ajv "^8.0.0" -ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: +ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== @@ -2751,7 +4399,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.12.2, ajv@^6.12.5: +ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2771,40 +4419,45 @@ ajv@^8.0.0, ajv@^8.9.0: json-schema-traverse "^1.0.0" require-from-string "^2.0.2" -algoliasearch-helper@^3.13.3: - version "3.22.3" - resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.22.3.tgz#7c67a1a87c3adb0b52ef726a3de3c0b0edcbb5d1" - integrity sha512-2eoEz8mG4KHE+DzfrBTrCmDPxVXv7aZZWPojAJFtARpxxMO6lkos1dJ+XDCXdPvq7q3tpYWRi6xXmVQikejtpA== +algoliasearch-helper@^3.22.6: + version "3.26.0" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.26.0.tgz#d6e283396a9fc5bf944f365dc3b712570314363f" + integrity sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw== dependencies: "@algolia/events" "^4.0.1" -algoliasearch@^4.18.0, algoliasearch@^4.19.1: - version "4.24.0" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.24.0.tgz#b953b3e2309ef8f25da9de311b95b994ac918275" - integrity sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g== - dependencies: - "@algolia/cache-browser-local-storage" "4.24.0" - "@algolia/cache-common" "4.24.0" - "@algolia/cache-in-memory" "4.24.0" - "@algolia/client-account" "4.24.0" - "@algolia/client-analytics" "4.24.0" - "@algolia/client-common" "4.24.0" - "@algolia/client-personalization" "4.24.0" - "@algolia/client-search" "4.24.0" - "@algolia/logger-common" "4.24.0" - "@algolia/logger-console" "4.24.0" - "@algolia/recommend" "4.24.0" - "@algolia/requester-browser-xhr" "4.24.0" - "@algolia/requester-common" "4.24.0" - "@algolia/requester-node-http" "4.24.0" - "@algolia/transporter" "4.24.0" +algoliasearch@^5.14.2, algoliasearch@^5.17.1: + version "5.34.0" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.34.0.tgz#eb71f52b254059bfe40342ff47a2d3641b93c68b" + integrity sha512-wioVnf/8uuG8Bmywhk5qKIQ3wzCCtmdvicPRb0fa3kKYGGoewfgDqLEaET1MV2NbTc3WGpPv+AgauLVBp1nB9A== + dependencies: + "@algolia/client-abtesting" "5.34.0" + "@algolia/client-analytics" "5.34.0" + "@algolia/client-common" "5.34.0" + "@algolia/client-insights" "5.34.0" + "@algolia/client-personalization" "5.34.0" + "@algolia/client-query-suggestions" "5.34.0" + "@algolia/client-search" "5.34.0" + "@algolia/ingestion" "1.34.0" + "@algolia/monitoring" "1.34.0" + "@algolia/recommend" "5.34.0" + "@algolia/requester-browser-xhr" "5.34.0" + "@algolia/requester-fetch" "5.34.0" + "@algolia/requester-node-http" "5.34.0" ansi-align@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== dependencies: - string-width "^4.1.0" + string-width "^4.1.0" + +ansi-escapes@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" ansi-html-community@^0.0.8: version "0.0.8" @@ -2828,7 +4481,7 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -2880,12 +4533,7 @@ astring@^1.8.0: resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.6.tgz#2c9c157cf1739d67561c56ba896e6948f6b93731" integrity sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg== -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -autoprefixer@^10.4.14, autoprefixer@^10.4.19: +autoprefixer@^10.4.19: version "10.4.20" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b" integrity sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g== @@ -2897,10 +4545,22 @@ autoprefixer@^10.4.14, autoprefixer@^10.4.19: picocolors "^1.0.1" postcss-value-parser "^4.2.0" -babel-loader@^9.1.3: - version "9.1.3" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a" - integrity sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw== +autoprefixer@^10.4.21: + version "10.4.21" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.21.tgz#77189468e7a8ad1d9a37fbc08efc9f480cf0a95d" + integrity sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ== + dependencies: + browserslist "^4.24.4" + caniuse-lite "^1.0.30001702" + fraction.js "^4.3.7" + normalize-range "^0.1.2" + picocolors "^1.1.1" + postcss-value-parser "^4.2.0" + +babel-loader@^9.2.1: + version "9.2.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.2.1.tgz#04c7835db16c246dd19ba0914418f3937797587b" + integrity sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA== dependencies: find-cache-dir "^4.0.0" schema-utils "^4.0.0" @@ -2930,7 +4590,16 @@ babel-plugin-polyfill-corejs2@^0.4.10: "@babel/helper-define-polyfill-provider" "^0.6.2" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: +babel-plugin-polyfill-corejs2@^0.4.14: + version "0.4.14" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz#8101b82b769c568835611542488d463395c2ef8f" + integrity sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg== + dependencies: + "@babel/compat-data" "^7.27.7" + "@babel/helper-define-polyfill-provider" "^0.6.5" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.10.4: version "0.10.6" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7" integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA== @@ -2938,6 +4607,14 @@ babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: "@babel/helper-define-polyfill-provider" "^0.6.2" core-js-compat "^3.38.0" +babel-plugin-polyfill-corejs3@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz#bb7f6aeef7addff17f7602a08a6d19a128c30164" + integrity sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.5" + core-js-compat "^3.43.0" + babel-plugin-polyfill-regenerator@^0.6.1: version "0.6.2" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz#addc47e240edd1da1058ebda03021f382bba785e" @@ -2945,6 +4622,13 @@ babel-plugin-polyfill-regenerator@^0.6.1: dependencies: "@babel/helper-define-polyfill-provider" "^0.6.2" +babel-plugin-polyfill-regenerator@^0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz#32752e38ab6f6767b92650347bf26a31b16ae8c5" + integrity sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.5" + bail@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" @@ -3044,7 +4728,7 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^4.23.0, browserslist@^4.23.1, browserslist@^4.23.3: +browserslist@^4.0.0, browserslist@^4.21.10, browserslist@^4.23.0, browserslist@^4.23.1, browserslist@^4.23.3: version "4.23.3" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== @@ -3054,6 +4738,16 @@ browserslist@^4.0.0, browserslist@^4.18.1, browserslist@^4.21.10, browserslist@^ node-releases "^2.0.18" update-browserslist-db "^1.1.0" +browserslist@^4.24.0, browserslist@^4.24.4, browserslist@^4.25.0, browserslist@^4.25.1: + version "4.25.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.1.tgz#ba9e8e6f298a1d86f829c9b975e07948967bb111" + integrity sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw== + dependencies: + caniuse-lite "^1.0.30001726" + electron-to-chromium "^1.5.173" + node-releases "^2.0.19" + update-browserslist-db "^1.1.3" + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -3136,6 +4830,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001646: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz#52de59529e8b02b1aedcaaf5c05d9e23c0c28138" integrity sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg== +caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001726: + version "1.0.30001727" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz#22e9706422ad37aa50556af8c10e40e2d93a8b85" + integrity sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q== + ccount@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" @@ -3150,7 +4849,7 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: +chalk@^4.0.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -3213,7 +4912,26 @@ cheerio@1.0.0-rc.12: parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" -chokidar@^3.4.2, chokidar@^3.5.3: +chevrotain-allstar@~0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz#b7412755f5d83cc139ab65810cdb00d8db40e6ca" + integrity sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw== + dependencies: + lodash-es "^4.17.21" + +chevrotain@~11.0.3: + version "11.0.3" + resolved "https://registry.yarnpkg.com/chevrotain/-/chevrotain-11.0.3.tgz#88ffc1fb4b5739c715807eaeedbbf200e202fc1b" + integrity sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw== + dependencies: + "@chevrotain/cst-dts-gen" "11.0.3" + "@chevrotain/gast" "11.0.3" + "@chevrotain/regexp-to-ast" "11.0.3" + "@chevrotain/types" "11.0.3" + "@chevrotain/utils" "11.0.3" + lodash-es "4.17.21" + +chokidar@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -3238,7 +4956,7 @@ ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== -clean-css@^5.2.2, clean-css@^5.3.2, clean-css@~5.3.2: +clean-css@^5.2.2, clean-css@^5.3.3, clean-css@~5.3.2: version "5.3.3" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd" integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== @@ -3382,6 +5100,16 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +confbox@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06" + integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== + +confbox@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.2.2.tgz#8652f53961c74d9e081784beed78555974a9c110" + integrity sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ== + config-chain@^1.1.11: version "1.1.13" resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4" @@ -3406,10 +5134,10 @@ connect-history-api-fallback@^2.0.0: resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== -consola@^2.15.3: - version "2.15.3" - resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" - integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== +consola@^3.2.3: + version "3.4.2" + resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.2.tgz#5af110145397bb67afdab77013fdc34cae590ea7" + integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA== content-disposition@0.5.2: version "0.5.2" @@ -3472,10 +5200,17 @@ core-js-compat@^3.37.1, core-js-compat@^3.38.0: dependencies: browserslist "^4.23.3" -core-js-pure@^3.30.2: - version "3.38.0" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.38.0.tgz#bc802cd152e33d5b0ec733b656c71cb847cac701" - integrity sha512-8balb/HAXo06aHP58mZMtXgD8vcnXz9tUDePgqBgJgKdmTlMt+jw3ujqniuBDQXMvTzxnMpxHFeuSM3g1jWQuQ== +core-js-compat@^3.43.0: + version "3.44.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.44.0.tgz#62b9165b97e4cbdb8bca16b14818e67428b4a0f8" + integrity sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA== + dependencies: + browserslist "^4.25.1" + +core-js-pure@^3.43.0: + version "3.44.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.44.0.tgz#6e9d6c128c8b967c5eac4f181c2b654d85c28090" + integrity sha512-gvMQAGB4dfVUxpYD0k3Fq8J+n5bB6Ytl15lqlZrOIXFzxOhtPaObfkQGHtMRdyjIf7z2IeNULwi1jEwyS+ltKQ== core-js@^3.31.1: version "3.38.0" @@ -3494,16 +5229,12 @@ cose-base@^1.0.0: dependencies: layout-base "^1.0.0" -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== +cose-base@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-2.2.0.tgz#1c395c35b6e10bb83f9769ca8b817d614add5c01" + integrity sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g== dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" + layout-base "^2.0.0" cosmiconfig@^7.0.0: version "7.1.0" @@ -3542,12 +5273,28 @@ crypto-random-string@^4.0.0: dependencies: type-fest "^1.0.1" +css-blank-pseudo@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz#32020bff20a209a53ad71b8675852b49e8d57e46" + integrity sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag== + dependencies: + postcss-selector-parser "^7.0.0" + css-declaration-sorter@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz#6dec1c9523bc4a643e088aab8f09e67a54961024" integrity sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow== -css-loader@^6.8.1: +css-has-pseudo@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-7.0.2.tgz#fb42e8de7371f2896961e1f6308f13c2c7019b72" + integrity sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ== + dependencies: + "@csstools/selector-specificity" "^5.0.0" + postcss-selector-parser "^7.0.0" + postcss-value-parser "^4.2.0" + +css-loader@^6.11.0: version "6.11.0" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.11.0.tgz#33bae3bf6363d0a7c2cf9031c96c744ff54d85ba" integrity sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g== @@ -3573,6 +5320,11 @@ css-minimizer-webpack-plugin@^5.0.1: schema-utils "^4.0.1" serialize-javascript "^6.0.1" +css-prefers-color-scheme@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz#ba001b99b8105b8896ca26fc38309ddb2278bd3c" + integrity sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ== + css-select@^4.1.3: version "4.3.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" @@ -3624,6 +5376,11 @@ css-what@^6.0.1, css-what@^6.1.0: resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== +cssdb@^8.3.0: + version "8.3.1" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-8.3.1.tgz#0ac96395b7092ffee14563e948cf43c2019b051e" + integrity sha512-XnDRQMXucLueX92yDe0LPKupXetWoFOgawr4O4X41l5TltgK2NVbJJVDnnOywDYfW1sTJ28AcXGKOqdRKwCcmQ== + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" @@ -3710,10 +5467,17 @@ cytoscape-cose-bilkent@^4.1.0: dependencies: cose-base "^1.0.0" -cytoscape@^3.28.1: - version "3.30.2" - resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.30.2.tgz#94149707fb6547a55e3b44f03ffe232706212161" - integrity sha512-oICxQsjW8uSaRmn4UK/jkczKOqTrVqt5/1WL0POiJUT2EKNc9STM4hYFHv917yu55aTBMFNRzymlJhVAiWPCxw== +cytoscape-fcose@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz#e4d6f6490df4fab58ae9cea9e5c3ab8d7472f471" + integrity sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ== + dependencies: + cose-base "^2.2.0" + +cytoscape@^3.29.3: + version "3.32.1" + resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.32.1.tgz#8475a892a43c79a26825b4f16946fa1491020798" + integrity sha512-dbeqFTLYEwlFg7UGtcZhCCG/2WayX72zK3Sq323CEX29CY81tYfVhw1MIdduCtpstB0cTOhJswWlM/OEB3Xp+Q== "d3-array@1 - 2": version "2.12.1" @@ -3950,7 +5714,7 @@ d3-zoom@3: d3-selection "2 - 3" d3-transition "2 - 3" -d3@^7.4.0, d3@^7.8.2: +d3@^7.9.0: version "7.9.0" resolved "https://registry.yarnpkg.com/d3/-/d3-7.9.0.tgz#579e7acb3d749caf8860bd1741ae8d371070cd5d" integrity sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA== @@ -3986,25 +5750,25 @@ d3@^7.4.0, d3@^7.8.2: d3-transition "3" d3-zoom "3" -dagre-d3-es@7.0.10: - version "7.0.10" - resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz#19800d4be674379a3cd8c86a8216a2ac6827cadc" - integrity sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A== +dagre-d3-es@7.0.11: + version "7.0.11" + resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz#2237e726c0577bfe67d1a7cfd2265b9ab2c15c40" + integrity sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw== dependencies: - d3 "^7.8.2" + d3 "^7.9.0" lodash-es "^4.17.21" -dayjs@^1.11.7: - version "1.11.12" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.12.tgz#5245226cc7f40a15bf52e0b99fd2a04669ccac1d" - integrity sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg== +dayjs@^1.11.13: + version "1.11.13" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c" + integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg== debounce@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@2.6.9, debug@^2.6.0: +debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -4018,6 +5782,13 @@ debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: dependencies: ms "2.1.2" +debug@^4.4.0, debug@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== + dependencies: + ms "^2.1.3" + decode-named-character-reference@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" @@ -4037,7 +5808,7 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deepmerge@^4.2.2, deepmerge@^4.3.1: +deepmerge@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== @@ -4077,20 +5848,6 @@ define-properties@^1.2.1: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -del@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" - integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - delaunator@5: version "5.0.1" resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.1.tgz#39032b08053923e924d6094fe2cde1a99cc51278" @@ -4123,14 +5880,6 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -detect-port-alt@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" - integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== - dependencies: - address "^1.0.1" - debug "^2.6.0" - detect-port@^1.5.1: version "1.6.1" resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.6.1.tgz#45e4073997c5f292b957cb678fb0bb8ed4250a67" @@ -4146,11 +5895,6 @@ devlop@^1.0.0, devlop@^1.1.0: dependencies: dequal "^2.0.0" -diff@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" - integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -4217,10 +5961,12 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" -dompurify@^3.0.5: - version "3.1.6" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.1.6.tgz#43c714a94c6a7b8801850f82e756685300a027e2" - integrity sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ== +dompurify@^3.2.5: + version "3.2.6" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.6.tgz#ca040a6ad2b88e2a92dc45f38c79f84a714a1cad" + integrity sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ== + optionalDependencies: + "@types/trusted-types" "^2.0.7" domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" @@ -4270,16 +6016,16 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== +electron-to-chromium@^1.5.173: + version "1.5.187" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.187.tgz#8c58854e065962351dc87e95614dd78d50425966" + integrity sha512-cl5Jc9I0KGUoOoSbxvTywTa40uspGJt/BDBoDLoxJRSBpWh4FFXBsjNRHfQrONsV/OoEjDfHUmZQa2d6Ze4YgA== + electron-to-chromium@^1.5.4: version "1.5.6" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.6.tgz#c81d9938b5a877314ad370feb73b4e5409b36abd" integrity sha512-jwXWsM5RPf6j9dPYzaorcBSUg6AiqocPEyMpkchkvntaH9HGfOOMZwxMJjDY/XEs3T5dM7uyH1VhRMkqUU9qVw== -elkjs@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/elkjs/-/elkjs-0.9.3.tgz#16711f8ceb09f1b12b99e971b138a8384a529161" - integrity sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -4318,6 +6064,14 @@ enhanced-resolve@^5.17.0: graceful-fs "^4.2.4" tapable "^2.2.0" +enhanced-resolve@^5.17.2: + version "5.18.2" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz#7903c5b32ffd4b2143eeb4b92472bd68effd5464" + integrity sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + entities@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" @@ -4357,6 +6111,11 @@ escalade@^3.1.1, escalade@^3.1.2: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + escape-goat@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-4.0.0.tgz#9424820331b510b0666b98f7873fe11ac4aa8081" @@ -4488,7 +6247,7 @@ eval@^0.1.8: "@types/node" "*" require-like ">= 0.1.1" -eventemitter3@^4.0.0: +eventemitter3@^4.0.0, eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== @@ -4498,7 +6257,7 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^5.0.0: +execa@5.1.1, execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -4550,6 +6309,11 @@ express@^4.17.3: utils-merge "1.0.1" vary "~1.1.2" +exsolve@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/exsolve/-/exsolve-1.0.7.tgz#3b74e4c7ca5c5f9a19c3626ca857309fa99f9e9e" + integrity sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw== + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -4588,13 +6352,6 @@ fast-uri@^3.0.1: resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== -fast-url-parser@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" - integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== - dependencies: - punycode "^1.3.2" - fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" @@ -4623,6 +6380,13 @@ feed@^4.2.2: dependencies: xml-js "^1.6.11" +figures@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + file-loader@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" @@ -4631,11 +6395,6 @@ file-loader@^6.2.0: loader-utils "^2.0.0" schema-utils "^3.0.0" -filesize@^8.0.6: - version "8.0.7" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" - integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== - fill-range@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" @@ -4669,21 +6428,6 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - find-up@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" @@ -4702,25 +6446,6 @@ follow-redirects@^1.0.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== -fork-ts-checker-webpack-plugin@^6.5.0: - version "6.5.3" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" - integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== - dependencies: - "@babel/code-frame" "^7.8.3" - "@types/json-schema" "^7.0.5" - chalk "^4.1.0" - chokidar "^3.4.2" - cosmiconfig "^6.0.0" - deepmerge "^4.2.2" - fs-extra "^9.0.0" - glob "^7.1.6" - memfs "^3.1.2" - minimatch "^3.0.4" - schema-utils "2.7.0" - semver "^7.3.2" - tapable "^1.0.0" - form-data-encoder@^2.1.2: version "2.1.4" resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" @@ -4755,16 +6480,6 @@ fs-extra@^11.1.1, fs-extra@^11.2.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - fs-monkey@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.6.tgz#8ead082953e88d992cf3ff844faa907b26756da2" @@ -4835,7 +6550,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: +glob@^7.1.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -4854,28 +6569,17 @@ global-dirs@^3.0.0: dependencies: ini "2.0.0" -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: +globals@^15.14.0: + version "15.15.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.15.0.tgz#7c4761299d41c32b075715a4ce1ede7897ff72a8" + integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== + +globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -4949,6 +6653,11 @@ gzip-size@^6.0.0: dependencies: duplexer "^0.1.2" +hachure-fill@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/hachure-fill/-/hachure-fill-0.5.2.tgz#d19bc4cc8750a5962b47fb1300557a85fcf934cc" + integrity sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg== + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -5187,10 +6896,10 @@ html-void-elements@^3.0.0: resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== -html-webpack-plugin@^5.5.3: - version "5.6.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz#50a8fa6709245608cb00e811eacecb8e0d7b7ea0" - integrity sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw== +html-webpack-plugin@^5.6.0: + version "5.6.3" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz#a31145f0fee4184d53a794f9513147df1e653685" + integrity sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg== dependencies: "@types/html-minifier-terser" "^6.0.0" html-minifier-terser "^6.0.2" @@ -5316,19 +7025,12 @@ ignore@^5.2.0, ignore@^5.2.4: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== -image-size@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.1.1.tgz#ddd67d4dc340e52ac29ce5f546a09f4e29e840ac" - integrity sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ== - dependencies: - queue "6.0.2" - -immer@^9.0.7: - version "9.0.21" - resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" - integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== +image-size@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-2.0.2.tgz#84a7b43704db5736f364bf0d1b029821299b4bdc" + integrity sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w== -import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: +import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -5351,10 +7053,10 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -infima@0.2.0-alpha.44: - version "0.2.0-alpha.44" - resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.44.tgz#9cd9446e473b44d49763f48efabe31f32440861d" - integrity sha512-tuRkUSO/lB3rEhLJk25atwAjgLuzq070+pOW8XcvpHky/YbENnRRdPd85IBkyeTgttmOy5ah+yHYsK1HhUd4lQ== +infima@0.2.0-alpha.45: + version "0.2.0-alpha.45" + resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.45.tgz#542aab5a249274d81679631b492973dd2c1e7466" + integrity sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw== inflight@^1.0.4: version "1.0.6" @@ -5379,7 +7081,7 @@ ini@2.0.0: resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== -ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: +ini@^1.3.4, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== @@ -5404,11 +7106,6 @@ internmap@^1.0.0: resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -5465,6 +7162,13 @@ is-core-module@^2.13.0: dependencies: hasown "^2.0.2" +is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + is-decimal@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" @@ -5535,11 +7239,6 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - is-path-inside@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" @@ -5574,11 +7273,6 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== -is-root@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" - integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== - is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -5693,11 +7387,21 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== +jsesc@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -5802,10 +7506,10 @@ jss@10.10.0, jss@^10.10.0: is-in-browser "^1.1.3" tiny-warning "^1.0.2" -katex@^0.16.9: - version "0.16.11" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.11.tgz#4bc84d5584f996abece5f01c6ad11304276a33f5" - integrity sha512-RQrI8rlHY92OLf3rho/Ts8i/XvjgguEjOkO1BEXcU3N8BqPpSzBNwV/G0Ukr+P/l3ivvJUE/Fa/CwbS6HesGNQ== +katex@^0.16.22: + version "0.16.22" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.22.tgz#d2b3d66464b1e6d69e6463b28a86ced5a02c5ccd" + integrity sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg== dependencies: commander "^8.3.0" @@ -5816,7 +7520,7 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" -khroma@^2.0.0: +khroma@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.1.0.tgz#45f2ce94ce231a437cf5b63c2e886e6eb42bbbb1" integrity sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw== @@ -5831,10 +7535,21 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -kleur@^4.0.3: - version "4.1.5" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" - integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== +kolorist@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" + integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== + +langium@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/langium/-/langium-3.3.1.tgz#da745a40d5ad8ee565090fed52eaee643be4e591" + integrity sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w== + dependencies: + chevrotain "~11.0.3" + chevrotain-allstar "~0.3.0" + vscode-languageserver "~9.0.1" + vscode-languageserver-textdocument "~1.0.11" + vscode-uri "~3.0.8" latest-version@^7.0.0: version "7.0.0" @@ -5856,6 +7571,11 @@ layout-base@^1.0.0: resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2" integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg== +layout-base@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285" + integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg== + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -5885,25 +7605,14 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" -loader-utils@^3.2.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.3.1.tgz#735b9a19fd63648ca7adbd31c2327dfe281304e5" - integrity sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg== - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== +local-pkg@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-1.1.1.tgz#f5fe74a97a3bd3c165788ee08ca9fbe998dc58dd" + integrity sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg== dependencies: - p-locate "^5.0.0" + mlly "^1.7.4" + pkg-types "^2.0.1" + quansync "^0.2.8" locate-path@^7.1.0: version "7.2.0" @@ -5912,7 +7621,7 @@ locate-path@^7.1.0: dependencies: p-locate "^6.0.0" -lodash-es@^4.17.21: +lodash-es@4.17.21, lodash-es@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== @@ -5973,11 +7682,23 @@ markdown-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz#34bebc83e9938cae16e0e017e4a9814a8330d3c4" integrity sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q== +markdown-table@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" + integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== + dependencies: + repeat-string "^1.0.0" + markdown-table@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.3.tgz#e6331d30e493127e031dd385488b5bd326e4a6bd" integrity sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw== +marked@^16.0.0: + version "16.1.1" + resolved "https://registry.yarnpkg.com/marked/-/marked-16.1.1.tgz#a7839dcf19fa5e349cad12c561f231320690acd4" + integrity sha512-ij/2lXfCRT71L6u0M29tJPhP0bM5shLL3u5BePhFwPELj2blMJ6GDtD7PfJhRLhJ/c2UwrK17ySVcDzy2YHjHQ== + mdast-util-directive@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz#3fb1764e705bbdf0afb0d3f889e4404c3e82561f" @@ -6002,24 +7723,6 @@ mdast-util-find-and-replace@^3.0.0, mdast-util-find-and-replace@^3.0.1: unist-util-is "^6.0.0" unist-util-visit-parents "^6.0.0" -mdast-util-from-markdown@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" - integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - decode-named-character-reference "^1.0.0" - mdast-util-to-string "^3.1.0" - micromark "^3.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-decode-string "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - unist-util-stringify-position "^3.0.0" - uvu "^0.5.0" - mdast-util-from-markdown@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz#32a6e8f512b416e1f51eb817fc64bd867ebcd9cc" @@ -6206,13 +7909,6 @@ mdast-util-to-markdown@^2.0.0: unist-util-visit "^5.0.0" zwitch "^2.0.0" -mdast-util-to-string@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" - integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz#7a5121475556a04e7eddeb67b264aae79d312814" @@ -6235,7 +7931,7 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -memfs@^3.1.2, memfs@^3.4.3: +memfs@^3.4.3: version "3.6.0" resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== @@ -6257,59 +7953,37 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -mermaid@^10.4.0: - version "10.9.1" - resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-10.9.1.tgz#5f582c23f3186c46c6aa673e59eeb46d741b2ea6" - integrity sha512-Mx45Obds5W1UkW1nv/7dHRsbfMM1aOKA2+Pxs/IGHNonygDHwmng8xTHyS9z4KWVi0rbko8gjiBmuwwXQ7tiNA== +mermaid@>=11.6.0: + version "11.9.0" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-11.9.0.tgz#fdc055d0f2a7f2afc13a78cb3e3c9b1374614e2e" + integrity sha512-YdPXn9slEwO0omQfQIsW6vS84weVQftIyyTGAZCwM//MGhPzL1+l6vO6bkf0wnP4tHigH1alZ5Ooy3HXI2gOag== dependencies: - "@braintree/sanitize-url" "^6.0.1" - "@types/d3-scale" "^4.0.3" - "@types/d3-scale-chromatic" "^3.0.0" - cytoscape "^3.28.1" + "@braintree/sanitize-url" "^7.0.4" + "@iconify/utils" "^2.1.33" + "@mermaid-js/parser" "^0.6.2" + "@types/d3" "^7.4.3" + cytoscape "^3.29.3" cytoscape-cose-bilkent "^4.1.0" - d3 "^7.4.0" + cytoscape-fcose "^2.2.0" + d3 "^7.9.0" d3-sankey "^0.12.3" - dagre-d3-es "7.0.10" - dayjs "^1.11.7" - dompurify "^3.0.5" - elkjs "^0.9.0" - katex "^0.16.9" - khroma "^2.0.0" + dagre-d3-es "7.0.11" + dayjs "^1.11.13" + dompurify "^3.2.5" + katex "^0.16.22" + khroma "^2.1.0" lodash-es "^4.17.21" - mdast-util-from-markdown "^1.3.0" - non-layered-tidy-tree-layout "^2.0.2" - stylis "^4.1.3" + marked "^16.0.0" + roughjs "^4.6.6" + stylis "^4.3.6" ts-dedent "^2.2.0" - uuid "^9.0.0" - web-worker "^1.2.0" + uuid "^11.1.0" methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -micromark-core-commonmark@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" - integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-factory-destination "^1.0.0" - micromark-factory-label "^1.0.0" - micromark-factory-space "^1.0.0" - micromark-factory-title "^1.0.0" - micromark-factory-whitespace "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-classify-character "^1.0.0" - micromark-util-html-tag-name "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - micromark-core-commonmark@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz#9a45510557d068605c6e9a80f282b2bb8581e43d" @@ -6500,15 +8174,6 @@ micromark-extension-mdxjs@^3.0.0: micromark-util-combine-extensions "^2.0.0" micromark-util-types "^2.0.0" -micromark-factory-destination@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" - integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - micromark-factory-destination@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz#857c94debd2c873cba34e0445ab26b74f6a6ec07" @@ -6518,16 +8183,6 @@ micromark-factory-destination@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromark-factory-label@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" - integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - micromark-factory-label@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz#17c5c2e66ce39ad6f4fc4cbf40d972f9096f726a" @@ -6568,16 +8223,6 @@ micromark-factory-space@^2.0.0: micromark-util-character "^2.0.0" micromark-util-types "^2.0.0" -micromark-factory-title@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" - integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - micromark-factory-title@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz#726140fc77892af524705d689e1cf06c8a83ea95" @@ -6588,16 +8233,6 @@ micromark-factory-title@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromark-factory-whitespace@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" - integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== - dependencies: - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - micromark-factory-whitespace@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz#9e92eb0f5468083381f923d9653632b3cfb5f763" @@ -6624,13 +8259,6 @@ micromark-util-character@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromark-util-chunked@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" - integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== - dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-chunked@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz#e51f4db85fb203a79dbfef23fd41b2f03dc2ef89" @@ -6638,15 +8266,6 @@ micromark-util-chunked@^2.0.0: dependencies: micromark-util-symbol "^2.0.0" -micromark-util-classify-character@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" - integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - micromark-util-classify-character@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz#8c7537c20d0750b12df31f86e976d1d951165f34" @@ -6656,14 +8275,6 @@ micromark-util-classify-character@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromark-util-combine-extensions@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" - integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-types "^1.0.0" - micromark-util-combine-extensions@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz#75d6ab65c58b7403616db8d6b31315013bfb7ee5" @@ -6672,13 +8283,6 @@ micromark-util-combine-extensions@^2.0.0: micromark-util-chunked "^2.0.0" micromark-util-types "^2.0.0" -micromark-util-decode-numeric-character-reference@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz#b1e6e17009b1f20bc652a521309c5f22c85eb1c6" - integrity sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw== - dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-decode-numeric-character-reference@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz#2698bbb38f2a9ba6310e359f99fcb2b35a0d2bd5" @@ -6686,16 +8290,6 @@ micromark-util-decode-numeric-character-reference@^2.0.0: dependencies: micromark-util-symbol "^2.0.0" -micromark-util-decode-string@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz#dc12b078cba7a3ff690d0203f95b5d5537f2809c" - integrity sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ== - dependencies: - decode-named-character-reference "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-decode-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz#7dfa3a63c45aecaa17824e656bcdb01f9737154a" @@ -6706,11 +8300,6 @@ micromark-util-decode-string@^2.0.0: micromark-util-decode-numeric-character-reference "^2.0.0" micromark-util-symbol "^2.0.0" -micromark-util-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz#92e4f565fd4ccb19e0dcae1afab9a173bbeb19a5" - integrity sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw== - micromark-util-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz#0921ac7953dc3f1fd281e3d1932decfdb9382ab1" @@ -6730,23 +8319,11 @@ micromark-util-events-to-acorn@^2.0.0: micromark-util-types "^2.0.0" vfile-message "^4.0.0" -micromark-util-html-tag-name@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" - integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== - micromark-util-html-tag-name@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz#ae34b01cbe063363847670284c6255bb12138ec4" integrity sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw== -micromark-util-normalize-identifier@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" - integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== - dependencies: - micromark-util-symbol "^1.0.0" - micromark-util-normalize-identifier@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz#91f9a4e65fe66cc80c53b35b0254ad67aa431d8b" @@ -6754,13 +8331,6 @@ micromark-util-normalize-identifier@^2.0.0: dependencies: micromark-util-symbol "^2.0.0" -micromark-util-resolve-all@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" - integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== - dependencies: - micromark-util-types "^1.0.0" - micromark-util-resolve-all@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz#189656e7e1a53d0c86a38a652b284a252389f364" @@ -6768,15 +8338,6 @@ micromark-util-resolve-all@^2.0.0: dependencies: micromark-util-types "^2.0.0" -micromark-util-sanitize-uri@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" - integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== - dependencies: - micromark-util-character "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-sanitize-uri@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz#ec8fbf0258e9e6d8f13d9e4770f9be64342673de" @@ -6786,16 +8347,6 @@ micromark-util-sanitize-uri@^2.0.0: micromark-util-encode "^2.0.0" micromark-util-symbol "^2.0.0" -micromark-util-subtokenize@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" - integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== - dependencies: - micromark-util-chunked "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.0" - uvu "^0.5.0" - micromark-util-subtokenize@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz#76129c49ac65da6e479c09d0ec4b5f29ec6eace5" @@ -6816,7 +8367,7 @@ micromark-util-symbol@^2.0.0: resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz#12225c8f95edf8b17254e47080ce0862d5db8044" integrity sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw== -micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: +micromark-util-types@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== @@ -6826,29 +8377,6 @@ micromark-util-types@^2.0.0: resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.0.tgz#63b4b7ffeb35d3ecf50d1ca20e68fc7caa36d95e" integrity sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w== -micromark@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" - integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== - dependencies: - "@types/debug" "^4.0.0" - debug "^4.0.0" - decode-named-character-reference "^1.0.0" - micromark-core-commonmark "^1.0.1" - micromark-factory-space "^1.0.0" - micromark-util-character "^1.0.0" - micromark-util-chunked "^1.0.0" - micromark-util-combine-extensions "^1.0.0" - micromark-util-decode-numeric-character-reference "^1.0.0" - micromark-util-encode "^1.0.0" - micromark-util-normalize-identifier "^1.0.0" - micromark-util-resolve-all "^1.0.0" - micromark-util-sanitize-uri "^1.0.0" - micromark-util-subtokenize "^1.0.0" - micromark-util-symbol "^1.0.0" - micromark-util-types "^1.0.1" - uvu "^0.5.0" - micromark@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.0.tgz#84746a249ebd904d9658cfabc1e8e5f32cbc6249" @@ -6929,10 +8457,10 @@ mimic-response@^4.0.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-4.0.0.tgz#35468b19e7c75d10f5165ea25e75a5ceea7cf70f" integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== -mini-css-extract-plugin@^2.7.6: - version "2.9.0" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.0.tgz#c73a1327ccf466f69026ac22a8e8fd707b78a235" - integrity sha512-Zs1YsZVfemekSZG+44vBsYTLQORkPMwnlv+aehcxK/NLKC+EGhDB39/YePYYqx/sTk6NnYpuqikhSn7+JIevTA== +mini-css-extract-plugin@^2.9.2: + version "2.9.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz#966031b468917a5446f4c24a80854b2947503c5b" + integrity sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w== dependencies: schema-utils "^4.0.0" tapable "^2.2.1" @@ -6942,7 +8470,7 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: +minimatch@3.1.2, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -6954,10 +8482,15 @@ minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -mri@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" - integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== +mlly@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.4.tgz#3d7295ea2358ec7a271eaa5d000a0f84febe100f" + integrity sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw== + dependencies: + acorn "^8.14.0" + pathe "^2.0.1" + pkg-types "^1.3.0" + ufo "^1.5.4" mrmime@^2.0.0: version "2.0.0" @@ -6974,7 +8507,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3: +ms@2.1.3, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -6987,6 +8520,11 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" +nanoid@^3.3.11: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" @@ -7030,10 +8568,10 @@ node-releases@^2.0.18: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== -non-layered-tidy-tree-layout@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz#57d35d13c356643fc296a55fb11ac15e74da7804" - integrity sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw== +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -7069,6 +8607,14 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" +null-loader@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/null-loader/-/null-loader-4.0.1.tgz#8e63bd3a2dd3c64236a4679428632edd0a6dbc6a" + integrity sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -7144,19 +8690,10 @@ p-cancelable@^3.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== -p-limit@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-limit@^4.0.0: version "4.0.0" @@ -7165,20 +8702,6 @@ p-limit@^4.0.0: dependencies: yocto-queue "^1.0.0" -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - p-locate@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" @@ -7193,6 +8716,14 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +p-queue@^6.6.2: + version "6.6.2" + resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" + integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== + dependencies: + eventemitter3 "^4.0.4" + p-timeout "^3.2.0" + p-retry@^4.5.0: version "4.6.2" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" @@ -7201,10 +8732,12 @@ p-retry@^4.5.0: "@types/retry" "0.12.0" retry "^0.13.1" -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" package-json@^8.1.0: version "8.1.1" @@ -7216,6 +8749,11 @@ package-json@^8.1.0: registry-url "^6.0.0" semver "^7.3.7" +package-manager-detector@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/package-manager-detector/-/package-manager-detector-1.3.0.tgz#b42d641c448826e03c2b354272456a771ce453c0" + integrity sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ== + param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -7288,15 +8826,10 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-data-parser@0.1.0, path-data-parser@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/path-data-parser/-/path-data-parser-0.1.0.tgz#8f5ba5cc70fc7becb3dcefaea08e2659aba60b8c" + integrity sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w== path-exists@^5.0.0: version "5.0.0" @@ -7328,10 +8861,10 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== -path-to-regexp@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" - integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== +path-to-regexp@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-3.3.0.tgz#f7f31d32e8518c2660862b644414b6d5c63a611b" + integrity sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw== path-to-regexp@^1.7.0: version "1.8.0" @@ -7345,6 +8878,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathe@^2.0.1, pathe@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716" + integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== + periscopic@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" @@ -7359,6 +8897,11 @@ picocolors@^1.0.0, picocolors@^1.0.1: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -7371,12 +8914,43 @@ pkg-dir@^7.0.0: dependencies: find-up "^6.3.0" -pkg-up@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== +pkg-types@^1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df" + integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== + dependencies: + confbox "^0.1.8" + mlly "^1.7.4" + pathe "^2.0.1" + +pkg-types@^2.0.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-2.2.0.tgz#049bf404f82a66c465200149457acf0c5fb0fb2d" + integrity sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ== + dependencies: + confbox "^0.2.2" + exsolve "^1.0.7" + pathe "^2.0.3" + +points-on-curve@0.2.0, points-on-curve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/points-on-curve/-/points-on-curve-0.2.0.tgz#7dbb98c43791859434284761330fa893cb81b4d1" + integrity sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A== + +points-on-path@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/points-on-path/-/points-on-path-0.2.1.tgz#553202b5424c53bed37135b318858eacff85dd52" + integrity sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g== + dependencies: + path-data-parser "0.1.0" + points-on-curve "0.2.0" + +postcss-attribute-case-insensitive@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz#0c4500e3bcb2141848e89382c05b5a31c23033a3" + integrity sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw== dependencies: - find-up "^3.0.0" + postcss-selector-parser "^7.0.0" postcss-calc@^9.0.1: version "9.0.1" @@ -7386,6 +8960,40 @@ postcss-calc@^9.0.1: postcss-selector-parser "^6.0.11" postcss-value-parser "^4.2.0" +postcss-clamp@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-clamp/-/postcss-clamp-4.1.0.tgz#7263e95abadd8c2ba1bd911b0b5a5c9c93e02363" + integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-functional-notation@^7.0.10: + version "7.0.10" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.10.tgz#f1e9c3e4371889dcdfeabfa8515464fd8338cedc" + integrity sha512-k9qX+aXHBiLTRrWoCJuUFI6F1iF6QJQUXNVWJVSbqZgj57jDhBlOvD8gNUGl35tgqDivbGLhZeW3Ongz4feuKA== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +postcss-color-hex-alpha@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz#5dd3eba1f8facb4ea306cba6e3f7712e876b0c76" + integrity sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w== + dependencies: + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +postcss-color-rebeccapurple@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz#5ada28406ac47e0796dff4056b0a9d5a6ecead98" + integrity sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ== + dependencies: + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + postcss-colormin@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-6.1.0.tgz#076e8d3fb291fbff7b10e6b063be9da42ff6488d" @@ -7404,6 +9012,44 @@ postcss-convert-values@^6.1.0: browserslist "^4.23.0" postcss-value-parser "^4.2.0" +postcss-custom-media@^11.0.6: + version "11.0.6" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-11.0.6.tgz#6b450e5bfa209efb736830066682e6567bd04967" + integrity sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw== + dependencies: + "@csstools/cascade-layer-name-parser" "^2.0.5" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/media-query-list-parser" "^4.0.3" + +postcss-custom-properties@^14.0.6: + version "14.0.6" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-14.0.6.tgz#1af73a650bf115ba052cf915287c9982825fc90e" + integrity sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ== + dependencies: + "@csstools/cascade-layer-name-parser" "^2.0.5" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +postcss-custom-selectors@^8.0.5: + version "8.0.5" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-8.0.5.tgz#9448ed37a12271d7ab6cb364b6f76a46a4a323e8" + integrity sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg== + dependencies: + "@csstools/cascade-layer-name-parser" "^2.0.5" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + postcss-selector-parser "^7.0.0" + +postcss-dir-pseudo-class@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz#80d9e842c9ae9d29f6bf5fd3cf9972891d6cc0ca" + integrity sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA== + dependencies: + postcss-selector-parser "^7.0.0" + postcss-discard-comments@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz#e768dcfdc33e0216380623652b0a4f69f4678b6c" @@ -7431,7 +9077,59 @@ postcss-discard-unused@^6.0.5: dependencies: postcss-selector-parser "^6.0.16" -postcss-loader@^7.3.3: +postcss-double-position-gradients@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.2.tgz#185f8eab2db9cf4e34be69b5706c905895bb52ae" + integrity sha512-7qTqnL7nfLRyJK/AHSVrrXOuvDDzettC+wGoienURV8v2svNbu6zJC52ruZtHaO6mfcagFmuTGFdzRsJKB3k5Q== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +postcss-focus-visible@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz#1f7904904368a2d1180b220595d77b6f8a957868" + integrity sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-focus-within@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz#ac01ce80d3f2e8b2b3eac4ff84f8e15cd0057bc7" + integrity sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-font-variant@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== + +postcss-gap-properties@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz#d5ff0bdf923c06686499ed2b12e125fe64054fed" + integrity sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw== + +postcss-image-set-function@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz#538e94e16716be47f9df0573b56bbaca86e1da53" + integrity sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA== + dependencies: + "@csstools/utilities" "^2.0.0" + postcss-value-parser "^4.2.0" + +postcss-lab-function@^7.0.10: + version "7.0.10" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-7.0.10.tgz#0537bd7245b935fc133298c8896bcbd160540cae" + integrity sha512-tqs6TCEv9tC1Riq6fOzHuHcZyhg4k3gIAMB8GGY/zA1ssGdm6puHMVE7t75aOSoFg7UD2wyrFFhbldiCMyyFTQ== + dependencies: + "@csstools/css-color-parser" "^3.0.10" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/utilities" "^2.0.0" + +postcss-loader@^7.3.4: version "7.3.4" resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-7.3.4.tgz#aed9b79ce4ed7e9e89e56199d25ad1ec8f606209" integrity sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A== @@ -7440,6 +9138,13 @@ postcss-loader@^7.3.3: jiti "^1.20.0" semver "^7.5.4" +postcss-logical@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-8.1.0.tgz#4092b16b49e3ecda70c4d8945257da403d167228" + integrity sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA== + dependencies: + postcss-value-parser "^4.2.0" + postcss-merge-idents@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz#7b9c31c7bc823c94bec50f297f04e3c2b838ea65" @@ -7526,6 +9231,15 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" +postcss-nesting@^13.0.2: + version "13.0.2" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-13.0.2.tgz#fde0d4df772b76d03b52eccc84372e8d1ca1402e" + integrity sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ== + dependencies: + "@csstools/selector-resolve-nested" "^3.1.0" + "@csstools/selector-specificity" "^5.0.0" + postcss-selector-parser "^7.0.0" + postcss-normalize-charset@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz#1ec25c435057a8001dac942942a95ffe66f721e1" @@ -7588,6 +9302,11 @@ postcss-normalize-whitespace@^6.0.2: dependencies: postcss-value-parser "^4.2.0" +postcss-opacity-percentage@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz#0b0db5ed5db5670e067044b8030b89c216e1eb0a" + integrity sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ== + postcss-ordered-values@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz#366bb663919707093451ab70c3f99c05672aaae5" @@ -7596,6 +9315,102 @@ postcss-ordered-values@^6.0.2: cssnano-utils "^4.0.2" postcss-value-parser "^4.2.0" +postcss-overflow-shorthand@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz#f5252b4a2ee16c68cd8a9029edb5370c4a9808af" + integrity sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== + +postcss-place@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-10.0.0.tgz#ba36ee4786ca401377ced17a39d9050ed772e5a9" + integrity sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-preset-env@^10.2.1: + version "10.2.4" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-10.2.4.tgz#17d386b5a86b136dfbca89b52ef03a95ad9e32fa" + integrity sha512-q+lXgqmTMdB0Ty+EQ31SuodhdfZetUlwCA/F0zRcd/XdxjzI+Rl2JhZNz5US2n/7t9ePsvuhCnEN4Bmu86zXlA== + dependencies: + "@csstools/postcss-cascade-layers" "^5.0.2" + "@csstools/postcss-color-function" "^4.0.10" + "@csstools/postcss-color-mix-function" "^3.0.10" + "@csstools/postcss-color-mix-variadic-function-arguments" "^1.0.0" + "@csstools/postcss-content-alt-text" "^2.0.6" + "@csstools/postcss-exponential-functions" "^2.0.9" + "@csstools/postcss-font-format-keywords" "^4.0.0" + "@csstools/postcss-gamut-mapping" "^2.0.10" + "@csstools/postcss-gradients-interpolation-method" "^5.0.10" + "@csstools/postcss-hwb-function" "^4.0.10" + "@csstools/postcss-ic-unit" "^4.0.2" + "@csstools/postcss-initial" "^2.0.1" + "@csstools/postcss-is-pseudo-class" "^5.0.3" + "@csstools/postcss-light-dark-function" "^2.0.9" + "@csstools/postcss-logical-float-and-clear" "^3.0.0" + "@csstools/postcss-logical-overflow" "^2.0.0" + "@csstools/postcss-logical-overscroll-behavior" "^2.0.0" + "@csstools/postcss-logical-resize" "^3.0.0" + "@csstools/postcss-logical-viewport-units" "^3.0.4" + "@csstools/postcss-media-minmax" "^2.0.9" + "@csstools/postcss-media-queries-aspect-ratio-number-values" "^3.0.5" + "@csstools/postcss-nested-calc" "^4.0.0" + "@csstools/postcss-normalize-display-values" "^4.0.0" + "@csstools/postcss-oklab-function" "^4.0.10" + "@csstools/postcss-progressive-custom-properties" "^4.1.0" + "@csstools/postcss-random-function" "^2.0.1" + "@csstools/postcss-relative-color-syntax" "^3.0.10" + "@csstools/postcss-scope-pseudo-class" "^4.0.1" + "@csstools/postcss-sign-functions" "^1.1.4" + "@csstools/postcss-stepped-value-functions" "^4.0.9" + "@csstools/postcss-text-decoration-shorthand" "^4.0.2" + "@csstools/postcss-trigonometric-functions" "^4.0.9" + "@csstools/postcss-unset-value" "^4.0.0" + autoprefixer "^10.4.21" + browserslist "^4.25.0" + css-blank-pseudo "^7.0.1" + css-has-pseudo "^7.0.2" + css-prefers-color-scheme "^10.0.0" + cssdb "^8.3.0" + postcss-attribute-case-insensitive "^7.0.1" + postcss-clamp "^4.1.0" + postcss-color-functional-notation "^7.0.10" + postcss-color-hex-alpha "^10.0.0" + postcss-color-rebeccapurple "^10.0.0" + postcss-custom-media "^11.0.6" + postcss-custom-properties "^14.0.6" + postcss-custom-selectors "^8.0.5" + postcss-dir-pseudo-class "^9.0.1" + postcss-double-position-gradients "^6.0.2" + postcss-focus-visible "^10.0.1" + postcss-focus-within "^9.0.1" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^6.0.0" + postcss-image-set-function "^7.0.0" + postcss-lab-function "^7.0.10" + postcss-logical "^8.1.0" + postcss-nesting "^13.0.2" + postcss-opacity-percentage "^3.0.0" + postcss-overflow-shorthand "^6.0.0" + postcss-page-break "^3.0.4" + postcss-place "^10.0.0" + postcss-pseudo-class-any-link "^10.0.1" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^8.0.1" + +postcss-pseudo-class-any-link@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz#06455431171bf44b84d79ebaeee9fd1c05946544" + integrity sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q== + dependencies: + postcss-selector-parser "^7.0.0" + postcss-reduce-idents@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz#b0d9c84316d2a547714ebab523ec7d13704cd486" @@ -7618,6 +9433,18 @@ postcss-reduce-transforms@^6.0.2: dependencies: postcss-value-parser "^4.2.0" +postcss-replace-overflow-wrap@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== + +postcss-selector-not@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz#f2df9c6ac9f95e9fe4416ca41a957eda16130172" + integrity sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA== + dependencies: + postcss-selector-parser "^7.0.0" + postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.16, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: version "6.1.1" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz#5be94b277b8955904476a2400260002ce6c56e38" @@ -7626,6 +9453,14 @@ postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.16, postcss-select cssesc "^3.0.0" util-deprecate "^1.0.2" +postcss-selector-parser@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" + integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + postcss-sort-media-queries@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz#4556b3f982ef27d3bac526b99b6c0d3359a6cf97" @@ -7658,7 +9493,7 @@ postcss-zindex@^6.0.2: resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-6.0.2.tgz#e498304b83a8b165755f53db40e2ea65a99b56e1" integrity sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg== -postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.26, postcss@^8.4.33, postcss@^8.4.38: +postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.33: version "8.4.41" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681" integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== @@ -7667,6 +9502,15 @@ postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.26, postcss@^8.4.33, postcss@^8.4 picocolors "^1.0.1" source-map-js "^1.2.0" +postcss@^8.5.4: + version "8.5.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" + integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== + dependencies: + nanoid "^3.3.11" + picocolors "^1.1.1" + source-map-js "^1.2.1" + pretty-error@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" @@ -7733,11 +9577,6 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -punycode@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -7757,18 +9596,16 @@ qs@6.11.0: dependencies: side-channel "^1.0.4" +quansync@^0.2.8: + version "0.2.10" + resolved "https://registry.yarnpkg.com/quansync/-/quansync-0.2.10.tgz#32053cf166fa36511aae95fc49796116f2dc20e1" + integrity sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -queue@6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" - integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== - dependencies: - inherits "~2.0.3" - quick-lru@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" @@ -7811,36 +9648,6 @@ rc@1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-dev-utils@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" - integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== - dependencies: - "@babel/code-frame" "^7.16.0" - address "^1.1.2" - browserslist "^4.18.1" - chalk "^4.1.2" - cross-spawn "^7.0.3" - detect-port-alt "^1.1.6" - escape-string-regexp "^4.0.0" - filesize "^8.0.6" - find-up "^5.0.0" - fork-ts-checker-webpack-plugin "^6.5.0" - global-modules "^2.0.0" - globby "^11.0.4" - gzip-size "^6.0.0" - immer "^9.0.7" - is-root "^2.1.0" - loader-utils "^3.2.0" - open "^8.4.0" - pkg-up "^3.1.0" - prompts "^2.4.2" - react-error-overlay "^6.0.11" - recursive-readdir "^2.2.2" - shell-quote "^1.7.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - react-dom@^18.0.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" @@ -7849,29 +9656,15 @@ react-dom@^18.0.0: loose-envify "^1.1.0" scheduler "^0.23.2" -react-error-overlay@^6.0.11: - version "6.0.11" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" - integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== - -react-fast-compare@^3.2.0, react-fast-compare@^3.2.2: +react-fast-compare@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== -react-helmet-async@*: - version "2.0.5" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-2.0.5.tgz#cfc70cd7bb32df7883a8ed55502a1513747223ec" - integrity sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg== - dependencies: - invariant "^2.2.4" - react-fast-compare "^3.2.2" - shallowequal "^1.1.0" - -react-helmet-async@^1.3.0: +"react-helmet-async@npm:@slorber/react-helmet-async@1.3.0": version "1.3.0" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" - integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== + resolved "https://registry.yarnpkg.com/@slorber/react-helmet-async/-/react-helmet-async-1.3.0.tgz#11fbc6094605cf60aa04a28c17e0aab894b4ecff" + integrity sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A== dependencies: "@babel/runtime" "^7.12.5" invariant "^2.2.4" @@ -7889,10 +9682,10 @@ react-is@^18.3.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== -react-json-view-lite@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/react-json-view-lite/-/react-json-view-lite-1.4.0.tgz#0ff493245f4550abe5e1f1836f170fa70bb95914" - integrity sha512-wh6F6uJyYAmQ4fK0e8dSQMEWuvTs2Wr3el3sLD9bambX1+pSWUVXIz1RFaoy3TI1mZ0FqdpKq9YgbgTTgyrmXA== +react-json-view-lite@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/react-json-view-lite/-/react-json-view-lite-2.4.1.tgz#0d06696a06aaf4a74e890302b76cf8cddcc45d60" + integrity sha512-fwFYknRIBxjbFm0kBDrzgBy1xa5tDg2LyXXBepC5f1b+MY3BUClMCsvanMPn089JbV1Eg3nZcrp0VCuH43aXnA== react-loadable-ssr-addon-v5-slorber@^1.0.1: version "1.0.1" @@ -7989,25 +9782,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -reading-time@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" - integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -recursive-readdir@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" - integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== - dependencies: - minimatch "^3.0.5" - regenerate-unicode-properties@^10.1.0: version "10.1.1" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" @@ -8015,6 +9789,13 @@ regenerate-unicode-properties@^10.1.0: dependencies: regenerate "^1.4.2" +regenerate-unicode-properties@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" + integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== + dependencies: + regenerate "^1.4.2" + regenerate@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" @@ -8044,6 +9825,18 @@ regexpu-core@^5.3.1: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" +regexpu-core@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.2.0.tgz#0e5190d79e542bf294955dccabae04d3c7d53826" + integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.2.0" + regjsgen "^0.8.0" + regjsparser "^0.12.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + registry-auth-token@^5.0.1: version "5.0.2" resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" @@ -8058,6 +9851,18 @@ registry-url@^6.0.0: dependencies: rc "1.2.8" +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc" + integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== + dependencies: + jsesc "~3.0.2" + regjsparser@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" @@ -8171,6 +9976,11 @@ renderkid@^3.0.0: lodash "^4.17.21" strip-ansi "^6.0.1" +repeat-string@^1.0.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== + require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" @@ -8201,7 +10011,7 @@ resolve-pathname@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== -resolve@^1.1.6, resolve@^1.14.2, resolve@^1.19.0: +resolve@^1.14.2, resolve@^1.19.0: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== @@ -8210,6 +10020,15 @@ resolve@^1.1.6, resolve@^1.14.2, resolve@^1.19.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve@^1.22.10: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + dependencies: + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + responselike@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/responselike/-/responselike-3.0.0.tgz#20decb6c298aff0dbee1c355ca95461d42823626" @@ -8239,10 +10058,15 @@ robust-predicates@^3.0.2: resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== -rtl-detect@^1.0.4: - version "1.1.2" - resolved "https://registry.yarnpkg.com/rtl-detect/-/rtl-detect-1.1.2.tgz#ca7f0330af5c6bb626c15675c642ba85ad6273c6" - integrity sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ== +roughjs@^4.6.6: + version "4.6.6" + resolved "https://registry.yarnpkg.com/roughjs/-/roughjs-4.6.6.tgz#1059f49a5e0c80dee541a005b20cc322b222158b" + integrity sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ== + dependencies: + hachure-fill "^0.5.2" + path-data-parser "^0.1.0" + points-on-curve "^0.2.0" + points-on-path "^0.2.1" rtlcss@^4.1.0: version "4.2.0" @@ -8266,13 +10090,6 @@ rw@1: resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== -sade@^1.7.3: - version "1.8.1" - resolved "https://registry.yarnpkg.com/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" - integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== - dependencies: - mri "^1.1.0" - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -8300,14 +10117,10 @@ scheduler@^0.23.2: dependencies: loose-envify "^1.1.0" -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" +schema-dts@^1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/schema-dts/-/schema-dts-1.1.5.tgz#9237725d305bac3469f02b292a035107595dc324" + integrity sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg== schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: version "3.3.0" @@ -8328,6 +10141,16 @@ schema-utils@^4.0.0, schema-utils@^4.0.1: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" +schema-utils@^4.3.0, schema-utils@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.2.tgz#0c10878bf4a73fd2b1dfd14b9462b26788c806ae" + integrity sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + section-matter@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" @@ -8361,7 +10184,7 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.4: +semver@^7.3.5, semver@^7.3.7, semver@^7.5.4: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -8385,25 +10208,24 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" -serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1, serialize-javascript@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" -serve-handler@^6.1.5: - version "6.1.5" - resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.5.tgz#a4a0964f5c55c7e37a02a633232b6f0d6f068375" - integrity sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg== +serve-handler@^6.1.6: + version "6.1.6" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.6.tgz#50803c1d3e947cd4a341d617f8209b22bd76cfa1" + integrity sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ== dependencies: bytes "3.0.0" content-disposition "0.5.2" - fast-url-parser "1.1.3" mime-types "2.1.18" minimatch "3.1.2" path-is-inside "1.0.2" - path-to-regexp "2.2.1" + path-to-regexp "3.3.0" range-parser "1.2.0" serve-index@^1.9.1: @@ -8475,20 +10297,11 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.7.3, shell-quote@^1.8.1: +shell-quote@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== -shelljs@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - side-channel@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" @@ -8572,6 +10385,11 @@ source-map-js@^1.0.1, source-map-js@^1.2.0: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -8643,10 +10461,10 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== -std-env@^3.0.1: - version "3.7.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" - integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== +std-env@^3.7.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.9.0.tgz#1a6f7243b339dca4c9fd55e1c7504c77ef23e8f1" + integrity sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw== string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" @@ -8697,7 +10515,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@^6.0.1: +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== @@ -8758,10 +10576,10 @@ stylis@4.2.0: resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== -stylis@^4.1.3: - version "4.3.2" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.2.tgz#8f76b70777dd53eb669c6f58c997bf0a9972e444" - integrity sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg== +stylis@^4.3.6: + version "4.3.6" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.6.tgz#7c7b97191cb4f195f03ecab7d52f7902ed378320" + integrity sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ== supports-color@^5.3.0: version "5.5.0" @@ -8807,11 +10625,6 @@ svgo@^3.0.2, svgo@^3.2.0: csso "^5.0.5" picocolors "^1.0.0" -tapable@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -8828,6 +10641,17 @@ terser-webpack-plugin@^5.3.10, terser-webpack-plugin@^5.3.9: serialize-javascript "^6.0.1" terser "^5.26.0" +terser-webpack-plugin@^5.3.11: + version "5.3.14" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" + integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.25" + jest-worker "^27.4.5" + schema-utils "^4.3.0" + serialize-javascript "^6.0.2" + terser "^5.31.1" + terser@^5.10.0, terser@^5.15.1, terser@^5.26.0: version "5.31.5" resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.5.tgz#e48b7c65f32d2808e7dad803e4586a0bc3829b87" @@ -8838,10 +10662,15 @@ terser@^5.10.0, terser@^5.15.1, terser@^5.26.0: commander "^2.20.0" source-map-support "~0.5.20" -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +terser@^5.31.1: + version "5.43.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.43.1.tgz#88387f4f9794ff1a29e7ad61fb2932e25b4fdb6d" + integrity sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.14.0" + commander "^2.20.0" + source-map-support "~0.5.20" thunky@^1.0.2: version "1.1.0" @@ -8858,6 +10687,16 @@ tiny-warning@^1.0.0, tiny-warning@^1.0.2: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tinyexec@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-1.0.1.tgz#70c31ab7abbb4aea0a24f55d120e5990bfa1e0b1" + integrity sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw== + +tinypool@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.1.1.tgz#059f2d042bd37567fbc017d3d426bdd2a2612591" + integrity sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg== + to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" @@ -8900,6 +10739,11 @@ tslib@^2.0.3, tslib@^2.6.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + type-fest@^1.0.1: version "1.4.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" @@ -8925,6 +10769,11 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" +ufo@^1.5.4: + version "1.6.1" + resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.6.1.tgz#ac2db1d54614d1b22c1d603e3aef44a85d8f146b" + integrity sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA== + undici-types@~6.13.0: version "6.13.0" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.13.0.tgz#e3e79220ab8c81ed1496b5812471afd7cf075ea5" @@ -9007,13 +10856,6 @@ unist-util-remove-position@^5.0.0: "@types/unist" "^3.0.0" unist-util-visit "^5.0.0" -unist-util-stringify-position@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz#03ad3348210c2d930772d64b489580c13a7db39d" - integrity sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" @@ -9056,6 +10898,14 @@ update-browserslist-db@^1.1.0: escalade "^3.1.2" picocolors "^1.0.1" +update-browserslist-db@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + update-notifier@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-6.0.2.tgz#a6990253dfe6d5a02bd04fbb6a61543f55026b60" @@ -9112,26 +10962,16 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +uuid@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.0.tgz#9549028be1753bb934fc96e2bca09bb4105ae912" + integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== + uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== - -uvu@^0.5.0: - version "0.5.6" - resolved "https://registry.yarnpkg.com/uvu/-/uvu-0.5.6.tgz#2754ca20bcb0bb59b64e9985e84d2e81058502df" - integrity sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA== - dependencies: - dequal "^2.0.0" - diff "^5.0.0" - kleur "^4.0.3" - sade "^1.7.3" - value-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" @@ -9167,6 +11007,41 @@ vfile@^6.0.0, vfile@^6.0.1: unist-util-stringify-position "^4.0.0" vfile-message "^4.0.0" +vscode-jsonrpc@8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz#f43dfa35fb51e763d17cd94dcca0c9458f35abf9" + integrity sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA== + +vscode-languageserver-protocol@3.17.5: + version "3.17.5" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz#864a8b8f390835572f4e13bd9f8313d0e3ac4bea" + integrity sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg== + dependencies: + vscode-jsonrpc "8.2.0" + vscode-languageserver-types "3.17.5" + +vscode-languageserver-textdocument@~1.0.11: + version "1.0.12" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz#457ee04271ab38998a093c68c2342f53f6e4a631" + integrity sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA== + +vscode-languageserver-types@3.17.5: + version "3.17.5" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz#3273676f0cf2eab40b3f44d085acbb7f08a39d8a" + integrity sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg== + +vscode-languageserver@~9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz#500aef82097eb94df90d008678b0b6b5f474015b" + integrity sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g== + dependencies: + vscode-languageserver-protocol "3.17.5" + +vscode-uri@~3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f" + integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw== + watchpack@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" @@ -9187,12 +11062,7 @@ web-namespaces@^2.0.0: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== -web-worker@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.3.0.tgz#e5f2df5c7fe356755a5fb8f8410d4312627e6776" - integrity sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA== - -webpack-bundle-analyzer@^4.9.0: +webpack-bundle-analyzer@^4.10.2: version "4.10.2" resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz#633af2862c213730be3dbdf40456db171b60d5bd" integrity sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw== @@ -9221,7 +11091,7 @@ webpack-dev-middleware@^5.3.4: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@^4.15.1: +webpack-dev-server@^4.15.2: version "4.15.2" resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz#9e0c70a42a012560860adb186986da1248333173" integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== @@ -9266,11 +11136,25 @@ webpack-merge@^5.9.0: flat "^5.0.2" wildcard "^2.0.0" +webpack-merge@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-6.0.1.tgz#50c776868e080574725abc5869bd6e4ef0a16c6a" + integrity sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== + dependencies: + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.1" + webpack-sources@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== +webpack-sources@^3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.3.tgz#d4bf7f9909675d7a070ff14d0ef2a4f3c982c723" + integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== + webpack@^5.88.1: version "5.93.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.93.0.tgz#2e89ec7035579bdfba9760d26c63ac5c3462a5e5" @@ -9301,15 +11185,50 @@ webpack@^5.88.1: watchpack "^2.4.1" webpack-sources "^3.2.3" -webpackbar@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-5.0.2.tgz#d3dd466211c73852741dfc842b7556dcbc2b0570" - integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== +webpack@^5.95.0: + version "5.100.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.100.2.tgz#e2341facf9f7de1d702147c91bcb65b693adf9e8" + integrity sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw== + dependencies: + "@types/eslint-scope" "^3.7.7" + "@types/estree" "^1.0.8" + "@types/json-schema" "^7.0.15" + "@webassemblyjs/ast" "^1.14.1" + "@webassemblyjs/wasm-edit" "^1.14.1" + "@webassemblyjs/wasm-parser" "^1.14.1" + acorn "^8.15.0" + acorn-import-phases "^1.0.3" + browserslist "^4.24.0" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.17.2" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.11" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^4.3.2" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.11" + watchpack "^2.4.1" + webpack-sources "^3.3.3" + +webpackbar@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-6.0.1.tgz#5ef57d3bf7ced8b19025477bc7496ea9d502076b" + integrity sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q== dependencies: - chalk "^4.1.0" - consola "^2.15.3" + ansi-escapes "^4.3.2" + chalk "^4.1.2" + consola "^3.2.3" + figures "^3.2.0" + markdown-table "^2.0.0" pretty-time "^1.1.0" - std-env "^3.0.1" + std-env "^3.7.0" + wrap-ansi "^7.0.0" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" @@ -9325,13 +11244,6 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== -which@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -9346,11 +11258,20 @@ widest-line@^4.0.1: dependencies: string-width "^5.0.1" -wildcard@^2.0.0: +wildcard@^2.0.0, wildcard@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -9402,16 +11323,11 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yaml@^1.10.0, yaml@^1.7.2: +yaml@^1.10.0: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - yocto-queue@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.1.1.tgz#fef65ce3ac9f8a32ceac5a634f74e17e5b232110"