diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 599bafc..0000000 --- a/.flake8 +++ /dev/null @@ -1,4 +0,0 @@ -[flake8] -count = True -statistics = True -max-line-length = 88 \ No newline at end of file diff --git a/.github/workflows/pr_qa.yml b/.github/workflows/pr_qa.yml index cac4a39..8943511 100644 --- a/.github/workflows/pr_qa.yml +++ b/.github/workflows/pr_qa.yml @@ -5,7 +5,9 @@ name: Pull Request Quality Checks # Controls when the workflow will run on: pull_request: - branches: [ main ] + branches: + - main + - feat/* workflow_dispatch: jobs: @@ -13,21 +15,27 @@ jobs: name: PR checks runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: 3.12.x + + - name: Setup Node + uses: actions/setup-node@v4 with: - python-version: '3.12' + node-version: 20 + - name: Install Dependencies run: | python -m venv ./.venv source ./.venv/bin/activate - make install-lock; + make build make install-dev; - cp ./.venv/lib/python3.12/site-packages/guardrails_api_client/openapi-spec.json ./open-api-spec.json - - name: Run Quality Checks run: | source ./.venv/bin/activate - make qa; \ No newline at end of file diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..b0daf62 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,45 @@ +name: Publish To PyPI +on: + workflow_dispatch: + +permissions: + contents: read + +jobs: + build: + name: Build Image + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: 3.12.x + + - name: Install Python dependencies + run: | + python -m pip install --upgrade pip; + pip install twine; + pip install build; + continue-on-error: false + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Build the module + env: + PYPI_PASSWORD: ${{ secrets.PYPI_PASSWORD }} + run: | + make build + python -m build + continue-on-error: false + + - name: Upload to PyPI + env: + PYPI_PASSWORD: ${{ secrets.PYPI_PASSWORD }} + run: | + twine upload dist/* -u __token__ -p $PYPI_PASSWORD \ No newline at end of file diff --git a/.github/workflows/publish_image.yml b/.github/workflows/publish_image.yml deleted file mode 100644 index 37d543e..0000000 --- a/.github/workflows/publish_image.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: Publish Image To ECR -on: - push: - branches: - - 'main' - workflow_dispatch: - -permissions: - contents: read - -jobs: - build: - name: Build Image - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@v1 - with: - aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} - aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - aws-region: us-east-1 - - # - name: Login to Amazon ECR - # id: login-ecr - # uses: aws-actions/amazon-ecr-login@v1 - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Build, tag, and push base image to Amazon ECR - env: - IMAGE_NAME: api - ECR_REPO_NAME: guardrails-validation-service-test - run: | - bash buildspecs/build.sh - - - name: Build, tag, and push heavy image to Amazon ECR - env: - IMAGE_NAME: graas-heavy - ECR_REPO_NAME: guardrails-as-a-service-heavy-test - DOCKERFILE: Dockerfile.heavy - run: | - bash buildspecs/build.sh \ No newline at end of file diff --git a/.gitignore b/.gitignore index 35218b2..8377660 100644 --- a/.gitignore +++ b/.gitignore @@ -19,10 +19,12 @@ guardrails-custom-validators guardrails-api-client guardrails *.env +!default.env opentelemetry-lambda-layer open-api-spec.json open-api-spec.yml .python-version requirements-lock-old.txt -models -opensearch \ No newline at end of file +opensearch +build +*.egg-info \ No newline at end of file diff --git a/ApiClientLibraries.md b/ApiClientLibraries.md deleted file mode 100644 index df38e81..0000000 --- a/ApiClientLibraries.md +++ /dev/null @@ -1,93 +0,0 @@ -# API Client Libraries -Comparing our options for auto-generating client libraries from our OpenAPI Spec. - -## Auto-rest -Homepage: https://github.com/Azure/autorest/blob/main/docs/readme.md - -See setup here: https://github.com/tinystacks/guardrails-poc/blob/autorest-sdk/build-sdk.sh -and usage here: https://github.com/tinystacks/guardrails-poc/blob/autorest-sdk/sdk-test.py -### Summary - - Open source (MIT License) - - Developed by Microsoft - - Uses mostly native libraries with a few Azure libraries - - Runs in Node - -### Pros - - Lightweight: can be run via npx in any Node environment >= 12.x - - Supports most OpenAPI Spec features - - Supported by Microsoft since 2016 - - Simple setup and config - - Can generate base setup.py file for packaging -### Cons - - Requires some Azure libraries - - Forces use of Azure credential classes for setting auth headers - - Requires custom property on parameters to prevent them from being considered global - - Does not generate pyproject.toml - - Responses are generic JSON, not strongly typed models - -## OpenAPITools openapi-generator -Homepage: https://openapi-generator.tech/ - -See setup here: https://github.com/tinystacks/guardrails-poc/blob/open-api-generator/build-sdk.sh -and usage here: https://github.com/tinystacks/guardrails-poc/blob/open-api-generator/sdk-test.py -### Summary - - Open source (Apache License) - - Fork of Swagger Codegen - - Runs in JVM - -### Pros - - Extensive support of OpenAPI Specification - - Highly configurable - - Likely the most mature OpenAPI code generator - - Generates usage docs in markdown for the client - -### Cons - - Requires JVM to run - - Specifically requires Java 11 for generating python clients - - Historically, migrating between major version is toilsome - - Documenation is extensive but difficult to navigate - - Does not generate pyproject.toml - - Responses are not easily serializeable - - Boilerplate for making a call is excessive - - Passing parameters is unintuitive and not well typed - - !!! Cannot install alongside the guardrails-ai package !!! See error below - -### Issues -The client generated with the latest version of openapi-generator has clashing dependencies with the guardrails-ai package. - -```bash -ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. -guardrails-api-client 1.0.0 requires typing_extensions~=4.3.0, but you have typing-extensions 4.7.1 which is incompatible. -``` - -This might be resolvable by downgrading to a previous version but that is not a desireable outcome. - - -## openapi-python-client -Homepage: https://github.com/openapi-generators/openapi-python-client#openapi-python-client - -See setup here: https://github.com/tinystacks/guardrails-poc/blob/openapi-python-client/build-sdk.sh -and usage here: https://github.com/tinystacks/guardrails-poc/blob/openapi-python-client/sdk-test.py -### Summary - - Open source (MIT License) - - Runs in Python - -### Pros - - Python native - - Can use Poetry or Setuptools to package - - Generates pyproject.toml - - Generates Models along with client - - Models have builtin `to_dict` methods - -### Cons - - Doesn't support "default" responses key (expects an HTTP Code/number and therefore generates build time warning) - - Strict about schema contract (i.e. not required !== nullable) - - -## Conclusion -Given the options above, I would currently suggest using `openapi-python-client` for the following reasons: - - Python native and doesn't require other runtimes to perform code generation - - Output is packageable by default - - Non-opinionated auth setup - - Models can be easily converted to dictionaries and therefore json serializeable - - Can be installed adjacent to the existing guardrails-ai package \ No newline at end of file diff --git a/Dockerfile.dev b/Dockerfile.dev deleted file mode 100644 index 3fc7a6c..0000000 --- a/Dockerfile.dev +++ /dev/null @@ -1,51 +0,0 @@ -FROM public.ecr.aws/docker/library/python:3.11.6-slim - -ARG GITHUB_TOKEN -ARG HF_TOKEN - -# COPY .guardrailsrc /root/.guardrailsrc - -# Create app directory -WORKDIR /app - -# check the version -RUN python3 --version -# start the virtual environment -RUN python3 -m venv /opt/venv - -# Enable venv -ENV PATH="/opt/venv/bin:$PATH" - -# Install gcc -RUN apt-get update -RUN apt-get install -y git gcc - -# COPY ./guardrails-sdk ./guardrails-sdk - -# COPY ./guard-rails-api-client ./guard-rails-api-client - -# COPY ./guardrails-custom-validators ./guardrails-custom-validators - -# Copy the requirements file -COPY requirements*.txt . - -# RUN pip install ./guardrails-sdk -# RUN pip install ./guard-rails-api-client - -# Install app dependencies -RUN pip install -r requirements-lock.txt - -# Download punkt data -RUN python -m nltk.downloader -d /opt/nltk_data punkt - -RUN guardrails hub install hub://guardrails/valid_length - -# Freeze dependencies -RUN pip freeze > requirements-lock.txt - -# Copy the whole folder inside the Image filesystem -COPY . . - -EXPOSE 8000 - -CMD gunicorn --bind 0.0.0.0:8000 --timeout=90 --threads=10 "app:create_app()" diff --git a/Dockerfile.heavy b/Dockerfile.heavy deleted file mode 100644 index 02273f4..0000000 --- a/Dockerfile.heavy +++ /dev/null @@ -1,48 +0,0 @@ -FROM public.ecr.aws/docker/library/python:3.11.6-slim - -ARG GITHUB_TOKEN -ARG HF_TOKEN - -# COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.7.1 /lambda-adapter /opt/extensions/lambda-adapter -# COPY ./opentelemetry-lambda-layer /opt - -# Create app directory -WORKDIR /app - -# check the version -RUN python3 --version -# start the virtual environment -RUN python3 -m venv /opt/venv - -# Enable venv -ENV PATH="/opt/venv/bin:$PATH" - -# Install git and curl -RUN apt-get update -RUN apt-get install -y git curl gcc jq - -# Copy the requirements file -COPY requirements*.txt . - -RUN curl https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem -o ./global-bundle.pem - -# Install app dependencies -RUN pip install -r requirements-lock.txt - -# Download punkt data -RUN python -m nltk.downloader -d /opt/nltk_data punkt - -COPY buildspecs/hub-install.sh ./buildspecs/hub-install.sh -RUN chmod +x ./buildspecs/hub-install.sh -RUN ./buildspecs/hub-install.sh - -# Freeze dependencies -RUN pip freeze > requirements-lock.txt - -# Copy the whole folder inside the Image filesystem -COPY . . - -EXPOSE 8000 - -CMD gunicorn --bind 0.0.0.0:8000 --timeout=90 --threads=10 "app:create_app()" -# CMD gunicorn --forwarded-allow-ips="*" --bind 0.0.0.0:8000 --timeout=60 --threads=10 "app:create_app()" diff --git a/Dockerfile.lite b/Dockerfile.lite deleted file mode 100644 index 59094d6..0000000 --- a/Dockerfile.lite +++ /dev/null @@ -1,55 +0,0 @@ -FROM public.ecr.aws/docker/library/python:3.11.6-slim - -ARG GITHUB_TOKEN -ARG HF_TOKEN - -COPY .guardrailsrc /root/.guardrailsrc - -# COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.7.1 /lambda-adapter /opt/extensions/lambda-adapter -# COPY ./opentelemetry-lambda-layer /opt - -# Create app directory -WORKDIR /app - -# check the version -RUN python3 --version -# start the virtual environment -RUN python3 -m venv /opt/venv - -# Enable venv -ENV PATH="/opt/venv/bin:$PATH" - -# Install git and curl -RUN apt-get update -RUN apt-get install -y git curl gcc jq - -# Copy the requirements file -COPY requirements*.txt . - -RUN curl https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem -o ./global-bundle.pem - -# Install app dependencies -RUN pip install -r requirements-lock.txt - -# Download punkt data -RUN python -m nltk.downloader -d /opt/nltk_data punkt - -# RUN guardrails hub install hub://guardrails/profanity_free -RUN guardrails hub install hub://guardrails/valid_length -RUN guardrails hub install hub://guardrails/lowercase -RUN guardrails hub install hub://guardrails/regex_match - -COPY ./custom-install ./custom-install - -RUN python ./custom-install/install.py - -# Freeze dependencies -RUN pip freeze > requirements-lock.txt - -# Copy the whole folder inside the Image filesystem -COPY . . - -EXPOSE 8000 - -CMD gunicorn --bind 0.0.0.0:8000 --timeout=90 --threads=10 --limit-request-line=0 --limit-request-fields=1000 --limit-request-field_size=0 "app:create_app()" -# CMD gunicorn --forwarded-allow-ips="*" --bind 0.0.0.0:8000 --timeout=60 --threads=10 "app:create_app()" diff --git a/Dockerfile.prod b/Dockerfile.prod deleted file mode 100644 index cbd4e41..0000000 --- a/Dockerfile.prod +++ /dev/null @@ -1,41 +0,0 @@ -FROM public.ecr.aws/docker/library/python:3.11.6-slim - -# COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.7.1 /lambda-adapter /opt/extensions/lambda-adapter -# COPY ./opentelemetry-lambda-layer /opt - -# Create app directory -WORKDIR /app - -# check the version -RUN python3 --version -# start the virtual environment -RUN python3 -m venv /opt/venv - -# Enable venv -ENV PATH="/opt/venv/bin:$PATH" - -# Install git and curl -RUN apt-get update -RUN apt-get install -y git curl gcc - -# Copy the requirements file -COPY requirements*.txt . - -RUN curl https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem -o ./global-bundle.pem - -# Install app dependencies -RUN pip install -r requirements-lock.txt - -# Download punkt data -RUN python -m nltk.downloader -d /opt/nltk_data punkt - -# Freeze dependencies -RUN pip freeze > requirements-lock.txt - -# Copy the whole folder inside the Image filesystem -COPY . . - -EXPOSE 8000 - -CMD gunicorn --bind 0.0.0.0:8000 --timeout=5 --threads=10 "app:create_app()" -# CMD gunicorn --forwarded-allow-ips="*" --bind 0.0.0.0:8000 --timeout=60 --threads=10 "app:create_app()" diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..e1ada05 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,2 @@ +include guardrails_api/* +exclude */__pycache__/* \ No newline at end of file diff --git a/Makefile b/Makefile index da6d9f1..c1629a8 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,10 @@ # Installs production dependencies install: - pip install -r requirements.txt; - # This is a workaround because of this issue: https://github.com/open-telemetry/opentelemetry-python-contrib/issues/2053 - pip uninstall aiohttp -y - pip install opentelemetry-distro - opentelemetry-bootstrap -a install - pip install aiohttp + pip install .; # Installs development dependencies install-dev: - make install - pip install -r requirements-dev.txt; + pip install .[dev]; lock: pip freeze --exclude guardrails-api-client > requirements-lock.txt @@ -18,8 +12,16 @@ lock: install-lock: pip install -r requirements-lock.txt +.PHONY: build +build: + make install + + cp "$$(python -c "import guardrails_api_client as _; print(_.__path__[0])")/openapi-spec.json" ./guardrails_api/open-api-spec.json + + start: - bash ./local.sh + make build + bash ./guardrails_api/start.sh infra: docker compose --profile infra up --build @@ -37,15 +39,16 @@ refresh: format: - ruff check app.py wsgi.py src/ tests/ --fix - ruff format app.py wsgi.py src/ tests/ + ruff check guardrails_api/ tests/ --fix + ruff format guardrails_api/ tests/ lint: - ruff check app.py wsgi.py src/ tests/ - ruff format app.py wsgi.py src/ tests/ + ruff check guardrails_api/ tests/ + ruff format guardrails_api/ tests/ qa: + make build make lint make test-cov @@ -57,10 +60,10 @@ test: pytest ./tests test-cov: - coverage run --source=./src -m pytest ./tests + coverage run --source=./guardrails_api -m pytest ./tests coverage report --fail-under=45 view-test-cov: - coverage run --source=./src -m pytest ./tests + coverage run --source=./guardrails_api -m pytest ./tests coverage html open htmlcov/index.html \ No newline at end of file diff --git a/README.md b/README.md index 5e4cbdc..0d3945b 100644 --- a/README.md +++ b/README.md @@ -47,4 +47,4 @@ or to run everything including the guardrails-api -The last option is useful when checking that everything will work as planned in a more productionized environment. When developing, it's generally faster to just run the minimum infrastructure you need via docker and run the api on a bare process with the `make start` command. \ No newline at end of file +The last option is useful when checking that everything will work as planned in a more productionized environment. When developing, it's generally faster to just run the minimum infrastructure you need via docker and run the api on a bare process with the `make start` command. diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..7d6ed05 --- /dev/null +++ b/TODO.md @@ -0,0 +1,5 @@ + - [x] Accept env file path as env var + - [x] Accept config file path as env var + - [x] Add pyproject toml and setup.py + - [x] Add cli command to start server with arguments + - [ ] Update merge github action to publish module \ No newline at end of file diff --git a/buildspecs/build.sh b/buildspecs/build.sh deleted file mode 100644 index 1c1df36..0000000 --- a/buildspecs/build.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash - -callerIdentity=$(aws sts get-caller-identity); -accountId=$(jq -r .Account <<< $callerIdentity); -imageName="${IMAGE_NAME:-validation-service}"; -repoName="${ECR_REPO_NAME:-guardrails-validation-service-test}"; -commitSha=$(git rev-parse HEAD); -region="${AWS_DEFAULT_REGION:-us-east-1}"; -dockerfile="${DOCKERFILE:-Dockerfile.prod}"; -defaultEcrEndpoint="${accountId}.dkr.ecr.${region}.amazonaws.com"; -ecrEndpoint="${ECR_ENDPOINT:-$defaultEcrEndpoint}" -ecrImageUrl="${ecrEndpoint}/${repoName}"; - -# Fetch latest API Specification -curl https://raw.githubusercontent.com/guardrails-ai/guardrails-api-client/main/service-specs/guardrails-service-spec.yml -o ./open-api-spec.yml -# Dereference API Spec to JSON -npx @redocly/cli bundle --dereferenced --output ./open-api-spec.json --ext json ./open-api-spec.yml - - -# Setup unpublished api client -# echo "Building api client..." -# bash build-sdk.sh - -# Building OTEL Collector extension -# if [ -d "opentelemetry-lambda-layer" ]; then -# rm -rf opentelemetry-lambda-layer -# fi - -# curl $(aws lambda get-layer-version-by-arn --arn arn:aws:lambda:us-east-1:184161586896:layer:opentelemetry-collector-arm64-0_2_0:1 --query 'Content.Location' --output text) --output otel-collector.zip -# unzip otel-collector.zip -d ./opentelemetry-lambda-layer -# rm otel-collector.zip - -echo "Performing docker build" -docker login -u AWS -p $(aws ecr get-login-password --region $region) $ecrEndpoint; - -docker buildx build \ - --platform linux/arm64 \ - --progress plain \ - --no-cache \ - --build-arg CACHEBUST="$(date)" \ - --build-arg GITHUB_TOKEN="$GITHUB_TOKEN" \ - --build-arg HF_TOKEN="$HF_TOKEN" \ - -f "$DOCKERFILE" \ - -t "$imageName:$commitSha" \ - -t "$imageName:latest" . \ - || exit 1; - # > ./out.log 2>&1 \ - -docker image tag "$imageName:$commitSha" "$ecrImageUrl:$commitSha"; -docker image tag "$imageName:latest" "$ecrImageUrl:latest"; - -# echo "Publishing to ECR" -docker push $ecrImageUrl --all-tags; \ No newline at end of file diff --git a/buildspecs/deploy.yml b/buildspecs/deploy.yml deleted file mode 100644 index a52b100..0000000 --- a/buildspecs/deploy.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: 0.2 - -phases: - build: - commands: - - echo "Deploying $ECR_ENDPOINT:$IMAGE_VERSION_TAG to ECS Service $CLUSTER_ARN:$SERVICE_NAME" - - aws ecs update-service --service $SERVICE_NAME --cluster $CLUSTER_ARN --desired-count $TASK_COUNT --force-new-deployment - - echo "ECS Deployment started..." \ No newline at end of file diff --git a/buildspecs/heavy-build.sh b/buildspecs/heavy-build.sh deleted file mode 100644 index 67242f6..0000000 --- a/buildspecs/heavy-build.sh +++ /dev/null @@ -1,5 +0,0 @@ -export IMAGE_NAME="graas-heavy" -export ECR_REPO_NAME="guardrails-as-a-service-heavy-test" -export DOCKERFILE="Dockerfile.heavy" - -bash buildspecs/build.sh \ No newline at end of file diff --git a/buildspecs/hub-install.sh b/buildspecs/hub-install.sh deleted file mode 100644 index 43353ea..0000000 --- a/buildspecs/hub-install.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -echo " !!!!!!!!!!!! START HUB INSTALL !!!!!!!!!!!!" - -index_json=$(curl -H "Authorization: token $GITHUB_TOKEN" https://raw.githubusercontent.com/guardrails-ai/guardrails-hub/main/index.json) - -jq -r '.[].id' <<< $index_json | while read -r validator_id; do - # Cannot use wiki_provenance bc chromadb doesn't install pysqlite3 correctly - if [ "$validator_id" != "guardrails/wiki_provenance" ]; then - guardrails hub install "hub://${validator_id}" || exit 1 - fi -done - -echo " !!!!!!!!!!!! END HUB INSTALL !!!!!!!!!!!!" \ No newline at end of file diff --git a/cdktf/.gitignore b/cdktf/.gitignore deleted file mode 100644 index 1dfae30..0000000 --- a/cdktf/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -*.d.ts -*.js -node_modules -cdktf.out -cdktf.log -*terraform.*.tfstate* -.gen -.terraform -tsconfig.tsbuildinfo -!jest.config.js -!setup.js \ No newline at end of file diff --git a/cdktf/__tests__/main-test.ts b/cdktf/__tests__/main-test.ts deleted file mode 100644 index 5498de8..0000000 --- a/cdktf/__tests__/main-test.ts +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) HashiCorp, Inc -// SPDX-License-Identifier: MPL-2.0 -import "cdktf/lib/testing/adapters/jest"; // Load types for expect matchers -// import { Testing } from "cdktf"; - -describe("My CDKTF Application", () => { - // The tests below are example tests, you can find more information at - // https://cdk.tf/testing - it.todo("should be tested"); - - // // All Unit tests test the synthesised terraform code, it does not create real-world resources - // describe("Unit testing using assertions", () => { - // it("should contain a resource", () => { - // // import { Image,Container } from "./.gen/providers/docker" - // expect( - // Testing.synthScope((scope) => { - // new MyApplicationsAbstraction(scope, "my-app", {}); - // }) - // ).toHaveResource(Container); - - // expect( - // Testing.synthScope((scope) => { - // new MyApplicationsAbstraction(scope, "my-app", {}); - // }) - // ).toHaveResourceWithProperties(Image, { name: "ubuntu:latest" }); - // }); - // }); - - // describe("Unit testing using snapshots", () => { - // it("Tests the snapshot", () => { - // const app = Testing.app(); - // const stack = new TerraformStack(app, "test"); - - // new TestProvider(stack, "provider", { - // accessKey: "1", - // }); - - // new TestResource(stack, "test", { - // name: "my-resource", - // }); - - // expect(Testing.synth(stack)).toMatchSnapshot(); - // }); - - // it("Tests a combination of resources", () => { - // expect( - // Testing.synthScope((stack) => { - // new TestDataSource(stack, "test-data-source", { - // name: "foo", - // }); - - // new TestResource(stack, "test-resource", { - // name: "bar", - // }); - // }) - // ).toMatchInlineSnapshot(); - // }); - // }); - - // describe("Checking validity", () => { - // it("check if the produced terraform configuration is valid", () => { - // const app = Testing.app(); - // const stack = new TerraformStack(app, "test"); - - // new TestDataSource(stack, "test-data-source", { - // name: "foo", - // }); - - // new TestResource(stack, "test-resource", { - // name: "bar", - // }); - // expect(Testing.fullSynth(app)).toBeValidTerraform(); - // }); - - // it("check if this can be planned", () => { - // const app = Testing.app(); - // const stack = new TerraformStack(app, "test"); - - // new TestDataSource(stack, "test-data-source", { - // name: "foo", - // }); - - // new TestResource(stack, "test-resource", { - // name: "bar", - // }); - // expect(Testing.fullSynth(app)).toPlanSuccessfully(); - // }); - // }); -}); diff --git a/cdktf/help b/cdktf/help deleted file mode 100644 index 716be8d..0000000 --- a/cdktf/help +++ /dev/null @@ -1,51 +0,0 @@ -======================================================================================================== - - Your CDKTF TypeScript project is ready! - - cat help Print this message - - Compile: - npm run get Import/update Terraform providers and modules (you should check-in this directory) - npm run compile Compile typescript code to javascript (or "npm run watch") - npm run watch Watch for changes and compile typescript in the background - npm run build Compile typescript - - Synthesize: - cdktf synth [stack] Synthesize Terraform resources from stacks to cdktf.out/ (ready for 'terraform apply') - - Diff: - cdktf diff [stack] Perform a diff (terraform plan) for the given stack - - Deploy: - cdktf deploy [stack] Deploy the given stack - - Destroy: - cdktf destroy [stack] Destroy the stack - - Test: - npm run test Runs unit tests (edit __tests__/main-test.ts to add your own tests) - npm run test:watch Watches the tests and reruns them on change - - Upgrades: - npm run upgrade Upgrade cdktf modules to latest version - npm run upgrade:next Upgrade cdktf modules to latest "@next" version (last commit) - - Use Providers: - - You can add prebuilt providers (if available) or locally generated ones using the add command: - - cdktf provider add "aws@~>3.0" null kreuzwerker/docker - - You can find all prebuilt providers on npm: https://www.npmjs.com/search?q=keywords:cdktf - You can also install these providers directly through npm: - - npm install @cdktf/provider-aws - npm install @cdktf/provider-google - npm install @cdktf/provider-azurerm - npm install @cdktf/provider-docker - npm install @cdktf/provider-github - npm install @cdktf/provider-null - - You can also build any module or provider locally. Learn more https://cdk.tf/modules-and-providers - -======================================================================================================== diff --git a/cdktf/index.ts b/cdktf/index.ts deleted file mode 100644 index 8879d7a..0000000 --- a/cdktf/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './src'; \ No newline at end of file diff --git a/cdktf/package-lock.json b/cdktf/package-lock.json deleted file mode 100644 index 00d7626..0000000 --- a/cdktf/package-lock.json +++ /dev/null @@ -1,4449 +0,0 @@ -{ - "name": "cdktf", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "cdktf", - "version": "1.0.0", - "license": "MPL-2.0", - "dependencies": { - "cdktf": "^0.19.1", - "constructs": "^10.3.0" - }, - "devDependencies": { - "@types/jest": "^29.5.8", - "@types/node": "^20.9.0", - "jest": "^29.7.0", - "ts-jest": "^29.1.1", - "ts-node": "^10.9.1", - "typescript": "^5.2.2" - }, - "engines": { - "node": ">=18.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.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" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz", - "integrity": "sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.7", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", - "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", - "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.8", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.8.tgz", - "integrity": "sha512-fXEFTxMV2Co8ZF5aYFJv+YeA08RTYJfhtN5c9JSv/mFEMe+xxjufCb+PHL+bJcMs/ebPUsBu+UNTEz+ydXrR6g==", - "dev": true, - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/node": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz", - "integrity": "sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "17.0.31", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.31.tgz", - "integrity": "sha512-bocYSx4DI8TmdlvxqGpVNXOgCNR1Jj0gNPhhAY+iz1rgKDAaYrAYdFYnhDV1IFuiuVc9HkOwyDcFxaTElF3/wg==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", - "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "dev": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001561", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", - "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/cdktf": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/cdktf/-/cdktf-0.19.1.tgz", - "integrity": "sha512-scZhp2+FEgNUd+l5vaDCHABdwFApB1Lcknn2+dUw8aYwNsMoYT0tWs4AzPg22Z4jQFOIQLIXmBxifhr+RahdRg==", - "bundleDependencies": [ - "archiver", - "json-stable-stringify", - "semver" - ], - "dependencies": { - "archiver": "5.3.2", - "json-stable-stringify": "^1.0.2", - "semver": "^7.5.4" - }, - "peerDependencies": { - "constructs": "^10.0.25" - } - }, - "node_modules/cdktf/node_modules/archiver": { - "version": "5.3.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.4", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cdktf/node_modules/archiver-utils": { - "version": "2.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/cdktf/node_modules/archiver-utils/node_modules/readable-stream": { - "version": "2.3.7", - "inBundle": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/cdktf/node_modules/archiver-utils/node_modules/string_decoder": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/cdktf/node_modules/async": { - "version": "3.2.4", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdktf/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdktf/node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdktf/node_modules/bl": { - "version": "4.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/cdktf/node_modules/brace-expansion": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cdktf/node_modules/buffer": { - "version": "5.7.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/cdktf/node_modules/buffer-crc32": { - "version": "0.2.13", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/cdktf/node_modules/compress-commons": { - "version": "4.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cdktf/node_modules/concat-map": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdktf/node_modules/core-util-is": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdktf/node_modules/crc-32": { - "version": "1.2.2", - "inBundle": true, - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/cdktf/node_modules/crc32-stream": { - "version": "4.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cdktf/node_modules/end-of-stream": { - "version": "1.4.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/cdktf/node_modules/fs-constants": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdktf/node_modules/fs.realpath": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/cdktf/node_modules/glob": { - "version": "7.2.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cdktf/node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/cdktf/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/cdktf/node_modules/graceful-fs": { - "version": "4.2.10", - "inBundle": true, - "license": "ISC" - }, - "node_modules/cdktf/node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/cdktf/node_modules/inflight": { - "version": "1.0.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/cdktf/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/cdktf/node_modules/isarray": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdktf/node_modules/json-stable-stringify": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonify": "^0.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/cdktf/node_modules/jsonify": { - "version": "0.0.1", - "inBundle": true, - "license": "Public Domain", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/cdktf/node_modules/lazystream": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/cdktf/node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.7", - "inBundle": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/cdktf/node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/cdktf/node_modules/lodash.defaults": { - "version": "4.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdktf/node_modules/lodash.difference": { - "version": "4.5.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdktf/node_modules/lodash.flatten": { - "version": "4.4.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdktf/node_modules/lodash.isplainobject": { - "version": "4.0.6", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdktf/node_modules/lodash.union": { - "version": "4.6.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdktf/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cdktf/node_modules/minimatch": { - "version": "5.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cdktf/node_modules/normalize-path": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cdktf/node_modules/once": { - "version": "1.4.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/cdktf/node_modules/path-is-absolute": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cdktf/node_modules/process-nextick-args": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdktf/node_modules/readable-stream": { - "version": "3.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/cdktf/node_modules/readdir-glob": { - "version": "1.1.3", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/cdktf/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdktf/node_modules/semver": { - "version": "7.5.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cdktf/node_modules/string_decoder": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/cdktf/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdktf/node_modules/tar-stream": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/cdktf/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/cdktf/node_modules/wrappy": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC" - }, - "node_modules/cdktf/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/cdktf/node_modules/zip-stream": { - "version": "4.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "archiver-utils": "^2.1.0", - "compress-commons": "^4.1.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/constructs": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/constructs/-/constructs-10.3.0.tgz", - "integrity": "sha512-vbK8i3rIb/xwZxSpTjz3SagHn1qq9BChLEfy5Hf6fB3/2eFbrwt2n9kHwQcS0CPTRBesreeAcsJfMq2229FnbQ==", - "engines": { - "node": ">= 16.14.0" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/create-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", - "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "prompts": "^2.0.1" - }, - "bin": { - "create-jest": "bin/create-jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", - "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.578", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.578.tgz", - "integrity": "sha512-V0ZhSu1BQZKfG0yNEL6Dadzik8E1vAzfpVOapdSiT9F6yapEJ3Bk+4tZ4SMPdWiUchCgnM/ByYtBzp5ntzDMIA==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz", - "integrity": "sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", - "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/types": "^29.6.3", - "import-local": "^3.0.2", - "jest-cli": "^29.7.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", - "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", - "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^1.0.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.7.0", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.7.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-cli": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", - "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", - "dev": true, - "dependencies": { - "@jest/core": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "create-jest": "^29.7.0", - "exit": "^0.1.2", - "import-local": "^3.0.2", - "jest-config": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", - "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-jest": "^29.7.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", - "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", - "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", - "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^29.6.3", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", - "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/environment": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.7.0", - "jest-environment-node": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-leak-detector": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-resolve": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-util": "^29.7.0", - "jest-watcher": "^29.7.0", - "jest-worker": "^29.7.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", - "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/globals": "^29.7.0", - "@jest/source-map": "^29.6.3", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", - "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.7.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", - "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.7.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pure-rand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", - "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-jest": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", - "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", - "dev": true, - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ts-jest/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", - "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/cdktf/package.json b/cdktf/package.json deleted file mode 100644 index a9a5a0c..0000000 --- a/cdktf/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "guardrails-validation-cdktf", - "version": "1.0.0", - "main": "index.ts", - "types": "index.ts", - "license": "MPL-2.0", - "private": true, - "scripts": { - "get": "cdktf get", - "build": "tsc", - "synth": "cdktf synth", - "compile": "tsc --pretty", - "watch": "tsc -w", - "test": "jest", - "test:watch": "jest --watch", - "upgrade": "npm i cdktf@latest cdktf-cli@latest", - "upgrade:next": "npm i cdktf@next cdktf-cli@next" - }, - "engines": { - "node": ">=18.0" - }, - "dependencies": { - "cdktf": "^0.19.1", - "constructs": "^10.3.0" - }, - "devDependencies": { - "@types/jest": "^29.5.8", - "@types/node": "^20.9.0", - "jest": "^29.7.0", - "ts-jest": "^29.1.1", - "ts-node": "^10.9.1", - "typescript": "^5.2.2" - } -} diff --git a/cdktf/src/configs/allow-all-egress.ts b/cdktf/src/configs/allow-all-egress.ts deleted file mode 100644 index d2450a8..0000000 --- a/cdktf/src/configs/allow-all-egress.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { - securityGroup as securityGroupLib -} from '@cdktf/provider-aws'; - -import SecurityGroupEgress = securityGroupLib.SecurityGroupEgress; - -export const ALLOW_ALL_EGRESS: SecurityGroupEgress = { - fromPort: 0, - toPort: 0, - protocol: '-1', - cidrBlocks: ['0.0.0.0/0'], - ipv6CidrBlocks: ['::/0'] -}; \ No newline at end of file diff --git a/cdktf/src/configs/base-construct-config.ts b/cdktf/src/configs/base-construct-config.ts deleted file mode 100644 index c8b5c0f..0000000 --- a/cdktf/src/configs/base-construct-config.ts +++ /dev/null @@ -1,11 +0,0 @@ -export type BaseConstructConfig = { - environment: string; - profile: string; - accountId?: string; - region?: string; -} - -export type DefaultedBaseConstructConfig = BaseConstructConfig & { - accountId: string; - region: string; -} \ No newline at end of file diff --git a/cdktf/src/configs/index.ts b/cdktf/src/configs/index.ts deleted file mode 100644 index a4b0057..0000000 --- a/cdktf/src/configs/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './allow-all-egress'; -export * from './base-construct-config'; -export * from './open-search-config'; \ No newline at end of file diff --git a/cdktf/src/configs/open-search-config.ts b/cdktf/src/configs/open-search-config.ts deleted file mode 100644 index 6b6faac..0000000 --- a/cdktf/src/configs/open-search-config.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { - opensearchDomain as opensearchDomainLib, - secretsmanagerSecret as secretsmanagerSecretLib -} from '@cdktf/provider-aws'; - -import OpensearchDomain = opensearchDomainLib.OpensearchDomain; -import SecretsmanagerSecret = secretsmanagerSecretLib.SecretsmanagerSecret; - -export type OpenSearchConfig = { - opensearchDomain: OpensearchDomain; - credentials: SecretsmanagerSecret; - traceIngestionPipeline: { - endpoint: string; - arn: string; - }; - logIngestionPipeline: { - endpoint: string; - arn: string; - }; - metricIngestionPipeline: { - endpoint: string; - arn: string; - }; -} \ No newline at end of file diff --git a/cdktf/src/constructs/compute-service.ts b/cdktf/src/constructs/compute-service.ts deleted file mode 100644 index d189189..0000000 --- a/cdktf/src/constructs/compute-service.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { Construct } from 'constructs'; -import { CloudwatchLogGroup } from '@cdktf/provider-aws/lib/cloudwatch-log-group'; -import { EcsService } from '@cdktf/provider-aws/lib/ecs-service'; -import { EcsCluster } from '@cdktf/provider-aws/lib/ecs-cluster'; -import { Vpc } from '@cdktf/provider-aws/lib/vpc'; -import { Subnet } from '@cdktf/provider-aws/lib/subnet'; -import { SecurityGroup } from '@cdktf/provider-aws/lib/security-group'; -import { Apigatewayv2VpcLink } from '@cdktf/provider-aws/lib/apigatewayv2-vpc-link'; -import { ServiceDiscoveryPrivateDnsNamespace } from '@cdktf/provider-aws/lib/service-discovery-private-dns-namespace'; -import { Gateway } from './gateway'; -import { Task, TaskConfig as TaskConfigRequired } from './task'; - -export type TaskConfig = Omit - -export type ComputeServiceConfig = TaskConfig & { - cluster: EcsCluster; - subnets: Subnet[]; - vpc: Vpc; - vpcLink: Apigatewayv2VpcLink; - serviceDiscoveryNamespace: ServiceDiscoveryPrivateDnsNamespace; - taskCount?: number; -}; - - -export class ComputeService extends Construct { - private _gateway: Gateway; - private _logGroup: CloudwatchLogGroup; - private _securityGroup: SecurityGroup; - private _service: EcsService; - private _task: Task; - - constructor (scope: Construct, id: string, config: ComputeServiceConfig) { - super(scope, id); - - const { - containers, - cluster, - environment, - serviceName, - subnets, - vpc, - vpcLink, - serviceDiscoveryNamespace, - taskCount = 0, - profile - } = config; - - this._logGroup = new CloudwatchLogGroup(this, `${id}-logs`, { - name: `/${serviceName}/${environment}`, - retentionInDays: 180 - }); - - this._securityGroup = new SecurityGroup(this, `${id}-security-group`, { - vpcId: vpc.id, - ingress: [ - // only allow incoming traffic from our VPC - { - protocol: 'TCP', - fromPort: containers.at(0)?.port, - toPort: containers.at(0)?.port, - securityGroups: [vpc.defaultSecurityGroupId] - } - ], - egress: [ - // allow all outgoing traffic - { - fromPort: 0, - toPort: 0, - protocol: '-1', - cidrBlocks: ['0.0.0.0/0'], - ipv6CidrBlocks: ['::/0'] - } - ] - } - ); - - this._gateway = new Gateway(this, `${id}-gateway`, { - profile, - environment, - serviceDiscoveryNamespace, - serviceName, - vpcLink - }); - - const taskConfig = { ...config }; - taskConfig.containers.forEach((container) => { - container.environmentVariables?.push({ - name: 'SELF_ENDPOINT', - value: this.gateway.api.apiEndpoint - }); - }); - - this._task = new Task(this, `${id}-task`, { - ...config, - logGroup: this._logGroup - }); - - this._service = new EcsService(this, `${id}-ecs-service`, { - name: serviceName, - taskDefinition: this._task.taskDefinition.arn, - launchType: 'FARGATE', - cluster: cluster.arn, - desiredCount: taskCount, - networkConfiguration: { - subnets: subnets.map(s => s.id), - securityGroups: [vpc.defaultSecurityGroupId, this.securityGroup.id], - assignPublicIp: false - }, - enableExecuteCommand: true, - serviceRegistries: { - registryArn: this._gateway.discoveryService.arn, - containerName: containers.at(0)?.name, - containerPort: containers.at(0)?.port - } - }); - } - - public get gateway (): Gateway { - return this._gateway; - } - public get logGroup (): CloudwatchLogGroup { - return this._logGroup; - } - public get securityGroup (): SecurityGroup { - return this._securityGroup; - } - public get service (): EcsService { - return this._service; - } - public get task (): Task { - return this._task; - } -} \ No newline at end of file diff --git a/cdktf/src/constructs/deployment-pipeline.ts b/cdktf/src/constructs/deployment-pipeline.ts deleted file mode 100644 index 00d49c7..0000000 --- a/cdktf/src/constructs/deployment-pipeline.ts +++ /dev/null @@ -1,351 +0,0 @@ -import path = require('path'); -import { readFileSync } from 'fs'; -import { - cloudwatchLogGroup as cloudwatchLogGroupLib, - cloudwatchEventRule, - cloudwatchEventTarget, - codebuildProject as codebuildProjectLib, - ecrRepository, - iamRole, - subnet, - vpc as vpcLib -} from '@cdktf/provider-aws'; -import { Construct } from 'constructs'; -import { DefaultedBaseConstructConfig } from '../configs'; -import { truncate } from '../utils'; - -import CloudwatchEventRule = cloudwatchEventRule.CloudwatchEventRule; -import CloudwatchEventTarget = cloudwatchEventTarget.CloudwatchEventTarget; -import CodebuildProject = codebuildProjectLib.CodebuildProject; -import CloudwatchLogGroup = cloudwatchLogGroupLib.CloudwatchLogGroup; -import EcrRepository = ecrRepository.EcrRepository; -import IamRole = iamRole.IamRole; -import Subnet = subnet.Subnet; -import Vpc = vpcLib.Vpc; - - -/** - * Config for the DeploymentPipeline construct - */ -export type DeploymentPipelineConfig = { - /** - * Whether to deploy the newly built image immediately after it is built. - * @default - false - */ - deployAfterBuild?: boolean; - /** - * The ECR repository holding the image to deploy. - */ - ecrRepo: EcrRepository; - /** - * Arn of the ECS Cluster that hosts the target service. - */ - clusterArn: string; - /** - * Name of the ECS Cluster to deploy changes to. - */ - clusterName: string; - /** - * Name of the ECS Service to deploy changes to. - */ - serviceName: string; - /** - * The private subnets with a NAT to launch the codebuild jobs in. - */ - subnets: Subnet[]; - /** - * The VPC to launch the codebuild jobs in. - */ - vpc: Vpc; - /** - * The number of tasks to set on the service on update. - */ - taskCount?: number; -}; - -export class DeploymentPipeline extends Construct { - private _deployRole: IamRole; - private _deployLogs: CloudwatchLogGroup; - private _deploy: CodebuildProject; - - constructor (scope: Construct, id: string, baseConfig: DefaultedBaseConstructConfig, deploymentPipelineConfig: DeploymentPipelineConfig) { - super(scope, id); - - const { - region, - accountId, - environment - } = baseConfig; - - const { - deployAfterBuild = false, - ecrRepo, - clusterArn, - clusterName, - serviceName, - subnets, - vpc, - taskCount = 0 - } = deploymentPipelineConfig; - - this._deployLogs = new CloudwatchLogGroup(this, `${id}-deploy-logs`, { - name: `/${serviceName}/${environment}/deploy`, - retentionInDays: 180 - }); - - const roleNamePostfix = `-${environment}-deploy-role`; - const namePrefix = truncate(`${serviceName}`, (64 - roleNamePostfix.length)); - const roleName = `${namePrefix}${roleNamePostfix}`; - this._deployRole = new IamRole(this, `${id}-deploy-role`, { - name: roleName, - assumeRolePolicy: JSON.stringify({ - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Principal: { - Service: 'codebuild.amazonaws.com' - }, - Action: 'sts:AssumeRole' - }] - }), - inlinePolicy: [ - { - name: 'ecs-deploy-access', - policy: JSON.stringify({ - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: [ - 'ecs:UpdateService' - ], - Resource: [ - `arn:aws:ecs:${region}:${accountId}:service/${clusterName}/${serviceName}` - ] - }] - }) - }, - { - name: 'cloudwatchlogs-access', - policy: JSON.stringify({ - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: [ - 'logs:CreateLogStream', - 'logs:PutLogEvents' - ], - Resource: [ - this.deployLogs.arn, - `${this.deployLogs.arn}/*`, - `${this.deployLogs.arn}:*` - ] - }] - }) - }, - { - name: 'ecr-read-write-access', - policy: JSON.stringify({ - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: [ - 'ecr:BatchCheckLayerAvailability', - 'ecr:CompleteLayerUpload', - 'ecr:GetAuthorizationToken', - 'ecr:InitiateLayerUpload', - 'ecr:PutImage', - 'ecr:UploadLayerPart' - ], - Resource: [ - ecrRepo.arn - ] - }] - }) - }, - { - name: 'vpc-access', - policy: JSON.stringify({ - 'Version': '2012-10-17', - 'Statement': [ - { - 'Effect': 'Allow', - 'Action': [ - 'ec2:CreateNetworkInterface', - 'ec2:DescribeDhcpOptions', - 'ec2:DescribeNetworkInterfaces', - 'ec2:DeleteNetworkInterface', - 'ec2:DescribeSubnets', - 'ec2:DescribeSecurityGroups', - 'ec2:DescribeVpcs' - ], - 'Resource': '*' - }, - { - 'Effect': 'Allow', - 'Action': [ - 'ec2:CreateNetworkInterfacePermission' - ], - 'Resource': `arn:aws:ec2:${region}:${accountId}:network-interface/*`, - 'Condition': { - 'StringEquals': { - 'ec2:AuthorizedService': 'codebuild.amazonaws.com' - }, - 'ArnEquals': { - 'ec2:Subnet': subnets.map(s => s.arn) - } - } - } - ] - }) - } - ], - description: `Role used by CodeBuild to deploy image updates to the ECS Service ${serviceName}` - }); - - /** - * NOTE: You escape `${` in HCL with `$${`. - * However in JS regex, you have to additionally escape `$$` with `$$$`. - * My guess is they're using groovy under the hood or something, - * not important; but that's why the escape replaces looks odd. - */ - const buildspec = readFileSync( - path.resolve( - 'guardrails-api/buildspecs/deploy.yml' - ) - ).toString().replace(/\$\{/g, '$$${'); - this._deploy = new CodebuildProject(this, `${id}-deploy`, { - name: `${serviceName}-${environment}-deploy`, - queuedTimeout: 5, - buildTimeout: 5, - source: { - buildspec, - type: 'NO_SOURCE' - }, - artifacts: { - type: 'NO_ARTIFACTS' - }, - environment: { - computeType: 'BUILD_GENERAL1_SMALL', - image: 'aws/codebuild/amazonlinux2-aarch64-standard:3.0', - type: 'ARM_CONTAINER', - // TODO: Update with Env Vars for deploy-spec - environmentVariable: [ - { - name: 'ECR_ENDPOINT', - value: ecrRepo.repositoryUrl - }, - { - name: 'IMAGE_VERSION_TAG', - value: 'latest' - }, - { - name: 'CLUSTER_ARN', - value: clusterArn - }, - { - name: 'CLUSTER_NAME', - value: clusterName - }, - { - name: 'SERVICE_NAME', - value: serviceName - }, - { - name: 'TASK_COUNT', - value: taskCount.toString() - } - ] - }, - serviceRole: this.deployRole.arn, - logsConfig: { - cloudwatchLogs: { - groupName: this.deployLogs.name, - status: 'ENABLED' - } - }, - vpcConfig: { - vpcId: vpc.id, - securityGroupIds: [vpc.defaultSecurityGroupId], - subnets: subnets.map(s => s.id) - } - }); - - const onPublishServiceRole = new IamRole(this, `${id}-deploy-pub-role`, { - name: truncate(`${serviceName}-${environment}-deploy-rule-role`, 64), - assumeRolePolicy: JSON.stringify({ - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Principal: { - Service: 'events.amazonaws.com' - }, - Action: 'sts:AssumeRole' - }] - }), - inlinePolicy: [ - { - name: 'deploy-job-access', - policy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: [ - 'codebuild:StartBuild' - ], - Resource: [ - this.deploy.arn - ] - } - ] - }) - } - ], - description: `Role used by EventBridge to trigger actions for ${serviceName}-${environment}-deploy-rule` - }); - const onPublishRule = new CloudwatchEventRule(this, `${id}-deploy-pub-rule`, { - name: truncate(`${serviceName}-${environment}-deploy-rule`, 64), - description: `Starts ${serviceName}-${environment}-deploy when an image is published to ${ecrRepo.name}`, - isEnabled: deployAfterBuild, - eventPattern: JSON.stringify({ - 'detail-type': [ - 'ECR Image Action' - ], - 'source': [ - 'aws.ecr' - ], - 'detail': { - 'action-type': [ - 'PUSH' - ], - 'image-tag': [ - 'latest' - ], - 'repository-name': [ - ecrRepo.name - ], - 'result': [ - 'SUCCESS' - ] - } - }), - roleArn: onPublishServiceRole.arn - }); - new CloudwatchEventTarget(this, `${id}-deploy-pub-target`, { - arn: this.deploy.arn, - rule: onPublishRule.name, - roleArn: onPublishServiceRole.arn - }); - } - - public get deployRole (): IamRole { - return this._deployRole; - } - public get deployLogs (): CloudwatchLogGroup { - return this._deployLogs; - } - public get deploy (): CodebuildProject { - return this._deploy; - } - -} \ No newline at end of file diff --git a/cdktf/src/constructs/gateway.ts b/cdktf/src/constructs/gateway.ts deleted file mode 100644 index d609968..0000000 --- a/cdktf/src/constructs/gateway.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { Construct } from 'constructs'; -import { Apigatewayv2VpcLink } from '@cdktf/provider-aws/lib/apigatewayv2-vpc-link'; -import { Apigatewayv2Api } from '@cdktf/provider-aws/lib/apigatewayv2-api'; -import { Apigatewayv2Integration } from '@cdktf/provider-aws/lib/apigatewayv2-integration'; -import { ServiceDiscoveryPrivateDnsNamespace } from '@cdktf/provider-aws/lib/service-discovery-private-dns-namespace'; -import { ServiceDiscoveryService } from '@cdktf/provider-aws/lib/service-discovery-service'; -import { Apigatewayv2Route } from '@cdktf/provider-aws/lib/apigatewayv2-route'; -import { TerraformOutput } from 'cdktf'; -import { Apigatewayv2Stage } from '@cdktf/provider-aws/lib/apigatewayv2-stage'; -import { BaseConstructConfig } from '../../../../src/configs'; -import { truncate } from '../utils'; - -export type GatewayConfig = BaseConstructConfig & { - serviceName: string; - vpcLink: Apigatewayv2VpcLink; - serviceDiscoveryNamespace: ServiceDiscoveryPrivateDnsNamespace; -}; - -export class Gateway extends Construct { - private _api: Apigatewayv2Api; - private _discoveryService: ServiceDiscoveryService; - private _integration: Apigatewayv2Integration; - private _route: Apigatewayv2Route; - private _stage: Apigatewayv2Stage; - - constructor (scope: Construct, id: string, config: GatewayConfig) { - super(scope, id); - - const { - serviceName, - vpcLink, - serviceDiscoveryNamespace - } = config; - - this._api = new Apigatewayv2Api(this, `${id}-http-api`, { - name: `${serviceName}-gateway`, - description: 'Integration between apigw and Fargate Service', - protocolType: 'HTTP' - }); - - this._discoveryService = new ServiceDiscoveryService(this, `${id}-service-discovery-service`, { - name: `${truncate(serviceName, (61 - '-discovery-service'.length))}-discovery-service`, - dnsConfig: { - namespaceId: serviceDiscoveryNamespace.id, - dnsRecords: [ - { - ttl: 10, - type: 'SRV' - } - ], - routingPolicy: 'MULTIVALUE' - } - }); - - this._integration = new Apigatewayv2Integration(this, `${id}-api-integration`, { - apiId: this._api.id, - connectionId: vpcLink.id, - connectionType: 'VPC_LINK', - description: 'API Integration with AWS Fargate Service', - integrationMethod: 'ANY', // for GET and POST, use ANY - integrationType: 'HTTP_PROXY', - integrationUri: this._discoveryService.arn, - payloadFormatVersion: '1.0' // supported values for Lambda proxy integrations are 1.0 and 2.0. For all other integrations, 1.0 is the only supported value - }); - - this._route = new Apigatewayv2Route(this, `${id}-route`, { - apiId: this._api.id, - routeKey: 'ANY /{proxy+}', - target: `integrations/${this._integration.id}` - }); - - this._stage = new Apigatewayv2Stage(this, `${id}-default-stage`, { - apiId: this._api.id, - name: '$default', - autoDeploy: true - }); - - new TerraformOutput(this, `${id}-apig-url`, { - value: this._api.apiEndpoint, - description: 'API Gateway URL to access the endpoint' - }); - } - - public get api (): Apigatewayv2Api { - return this._api; - } - public get discoveryService (): ServiceDiscoveryService { - return this._discoveryService; - } - public get integration (): Apigatewayv2Integration { - return this._integration; - } - public get route (): Apigatewayv2Route { - return this._route; - } - public get stage (): Apigatewayv2Stage { - return this._stage; - } -} \ No newline at end of file diff --git a/cdktf/src/constructs/index.ts b/cdktf/src/constructs/index.ts deleted file mode 100644 index 66d7ea4..0000000 --- a/cdktf/src/constructs/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './deployment-pipeline'; -export * from './rds-postgres'; \ No newline at end of file diff --git a/cdktf/src/constructs/rds-postgres.ts b/cdktf/src/constructs/rds-postgres.ts deleted file mode 100644 index 6d94709..0000000 --- a/cdktf/src/constructs/rds-postgres.ts +++ /dev/null @@ -1,199 +0,0 @@ -import { - dbInstance as dbInstanceLib, - dbSubnetGroup as dbSubnetGroupLib, - securityGroup as securityGroupLib, - subnet, - vpc as vpcLib -} from '@cdktf/provider-aws'; -import { Construct } from "constructs"; -import { ALLOW_ALL_EGRESS } from "../configs"; - -import DbInstance = dbInstanceLib.DbInstance; -import DbSubnetGroup = dbSubnetGroupLib.DbSubnetGroup; -import SecurityGroup = securityGroupLib.SecurityGroup; -import Subnet = subnet.Subnet; -import Vpc = vpcLib.Vpc; - -export type RdsPostgresConfig = { - /** - * @default 5 - */ - allocatedStorage?: number; - /** - * @default false - */ - allowMajorVersionUpgrade?: boolean; - /** - * @default true - */ - autoMinorVersionUpgrade?: boolean; - availabilityZone?: string; - /** - * Backup retention in days - * @default 7 - */ - backupRetentionPeriod?: number - /** - * Where backups are stored - * Options - 'region' | 'outposts' - * @default region - */ - backupTarget?: string; - /** - * Daily time range (in UTC) for backups - * Must not overlap with maintenanceWindow - * @default '09:00-09:30' UTC (1:00 AM Pacific) - */ - backupWindow?: string; - /** - * @default 'rds-ca-rsa4096-g1' - */ - caCertIdentifier?: string; - /** - * @default '15.4' - */ - engineVersion?: string; - /** - * @default 'db.t4g.micro' - */ - instanceClass?: string; - /** - * The window to perform maintenance in. - * Syntax: "ddd:hh24:mi-ddd:hh24:mi". - * Eg: "Mon:00:00-Mon:03:00". - * @default 'Sun:10:00-Sun:13:00' UTC (Sundays 2:00 - 5:00 AM Pacific) - */ - maintenanceWindow?: string; - /** - * @default true - */ - multiAz?: boolean; - /** - * Name for the Postgres database - */ - name: string; - /** - * @default 5432 - */ - port?: number; - /** - * @default 'gp2' - */ - storageType?: string; - /** - * The private subnets with NAT for the Postgres DB to be created in. - */ - subnets: Subnet[]; - /** - * The VPC to launch the Postgres DB in. - */ - vpc: Vpc; -}; - -export class RdsPostgres extends Construct { - private _instance: DbInstance; - private _secretArn: string; - private _securityGroup: SecurityGroup; - private _subnetGroup: DbSubnetGroup; - - constructor (scope: Construct, id: string, rdsPostgresConfig: RdsPostgresConfig) { - super(scope, id); - - const { - allocatedStorage = 5, - availabilityZone, - allowMajorVersionUpgrade = false, - autoMinorVersionUpgrade = true, - backupRetentionPeriod = 7, - backupTarget = 'region', - backupWindow = '09:00-09:30', - caCertIdentifier = 'rds-ca-rsa4096-g1', - engineVersion = '15.4', - name: identifier, - instanceClass = 'db.t4g.micro', - maintenanceWindow = 'Sun:10:00-Sun:13:00', - multiAz, - port = 5432, - storageType = 'gp2', - subnets, - vpc - } = rdsPostgresConfig; - - this._subnetGroup = new DbSubnetGroup(this, `${id}-db-subnet-group`, { - namePrefix: identifier, - description: `Subnet group for ${identifier}; contains private subnets from ${vpc.id}`, - subnetIds: subnets.map(s => s.id) - }); - - this._securityGroup = new SecurityGroup(this, `${id}-sg`, { - name: `${identifier}-sg`, - description: 'Allow traffic from within the vpc', - vpcId: vpc.id, - ingress: [ - { - description: 'TLS from VPC', - fromPort: 443, - toPort: 443, - protocol: 'tcp', - cidrBlocks: [vpc.cidrBlock] - }, - { - description: 'psql from VPC', - fromPort: 5432, - toPort: 5432, - protocol: 'tcp', - cidrBlocks: [vpc.cidrBlock] - } - ], - egress: [ALLOW_ALL_EGRESS] - }); - - this._instance = new DbInstance(this, `${id}-db-instance`, { - allocatedStorage, - allowMajorVersionUpgrade, - autoMinorVersionUpgrade, - availabilityZone, - backupRetentionPeriod, - backupTarget, - backupWindow, - blueGreenUpdate: { - enabled: false // note supported for Postgres - }, - caCertIdentifier, - copyTagsToSnapshot: true, - dbName: 'postgres', - dbSubnetGroupName: this.subnetGroup.name, - deleteAutomatedBackups: true, - deletionProtection: false, - engine: 'postgres', - engineVersion, - identifier, - instanceClass, - maintenanceWindow, - manageMasterUserPassword: true, - multiAz, - port, - publiclyAccessible: false, - username: 'postgres', - skipFinalSnapshot: true, - storageEncrypted: true, - storageType, - vpcSecurityGroupIds: [this.securityGroup.id] - }); - - this._secretArn = this.instance.masterUserSecret.get(0).secretArn; - } - - public get secretArn(): string { - return this._secretArn; - } - public get instance(): DbInstance { - return this._instance; - } - public get securityGroup(): SecurityGroup { - return this._securityGroup; - } - public get subnetGroup(): DbSubnetGroup { - return this._subnetGroup; - } -} \ No newline at end of file diff --git a/cdktf/src/constructs/task.ts b/cdktf/src/constructs/task.ts deleted file mode 100644 index c388393..0000000 --- a/cdktf/src/constructs/task.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { Construct } from 'constructs'; -import { CloudwatchLogGroup } from '@cdktf/provider-aws/lib/cloudwatch-log-group'; -import { IamRole, IamRoleInlinePolicy } from '@cdktf/provider-aws/lib/iam-role'; -import { EcrRepository } from '@cdktf/provider-aws/lib/ecr-repository'; -import { EcsTaskDefinition } from '@cdktf/provider-aws/lib/ecs-task-definition'; -import { BaseConstructConfig } from '../../../../src/configs'; -import { truncate } from '../utils'; - -export type NameValue = { - name: string; - value: string; -} - -export type SecretRef = { - name: string; - valueFrom: string; -} - -export type ContainerConfig = { - image: string; - name: string; - port: number; - environmentVariables?: NameValue[]; - secrets?: SecretRef[]; -} - -export type TaskConfig = BaseConstructConfig & { - containers: ContainerConfig[]; - ecrRepo: EcrRepository; - logGroup: CloudwatchLogGroup; - serviceName: string; - cpu?: number; - memory?: number; - taskPolicies?: IamRoleInlinePolicy[]; - executionPolicies?: IamRoleInlinePolicy[]; -}; - -export class Task extends Construct { - private _executionRole: IamRole; - private _taskRole: IamRole; - private _taskDefinition: EcsTaskDefinition; - - constructor (scope: Construct, id: string, config: TaskConfig) { - super(scope, id); - - const { - cpu = 256, - ecrRepo, - containers, - logGroup, - memory = 512, - region, - serviceName, - taskPolicies = [], - executionPolicies = [] - } = config; - - // Used by ECS to create tasks - this._executionRole = new IamRole(this, `${id}-execution-role`, { - name: `${truncate(`${serviceName}`, (64 - '-execution-role'.length))}-execution-role`, - inlinePolicy: [ - ...executionPolicies, - { - name: 'allow-ecr-pull', - policy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: [ - 'ecr:GetAuthorizationToken', - 'ecr:BatchCheckLayerAvailability', - 'ecr:GetDownloadUrlForLayer', - 'ecr:BatchGetImage', - 'logs:CreateLogStream', - 'logs:PutLogEvents' - ], - Resource: [ - ecrRepo.arn - ] - } - ] - }) - } - ], - assumeRolePolicy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Action: 'sts:AssumeRole', - Effect: 'Allow', - Principal: { - Service: 'ecs-tasks.amazonaws.com' - } - } - ] - }), - managedPolicyArns: [ - 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy' - ] - }); - - // Used by tasks to do stuff in the app - this._taskRole = new IamRole(this, 'task-role', { - name: `${truncate(`${serviceName}`, (64 - '-task-role'.length))}-task-role`, - inlinePolicy: [ - ...taskPolicies, - { - name: 'allow-logs', - policy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['logs:CreateLogStream', 'logs:PutLogEvents'], - Resource: [ - logGroup.arn, - `${logGroup.arn}/*`, - `${logGroup.arn}:*` - ] - } - ] - }) - } - ], - assumeRolePolicy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Action: 'sts:AssumeRole', - Effect: 'Allow', - Principal: { - Service: 'ecs-tasks.amazonaws.com' - } - } - ] - }) - }); - - const containerDefinitions = containers.map(c => ({ - name: c.name, - image: c.image, - portMappings: [ - { - containerPort: c.port - } - ], - logConfiguration: { - logDriver: 'awslogs', - options: { - 'awslogs-region': region, - 'awslogs-group': logGroup.name, - 'awslogs-stream-prefix': c.name - } - }, - environment: c.environmentVariables, - secrets: c.secrets - })); - - this._taskDefinition = new EcsTaskDefinition(this, `${id}-task-definition`, { - containerDefinitions: JSON.stringify(containerDefinitions), - family: serviceName, - cpu: cpu.toString(), - memory: memory.toString(), - requiresCompatibilities: ['FARGATE'], - executionRoleArn: this._executionRole.arn, - taskRoleArn: this._taskRole.arn, - networkMode: 'awsvpc', - runtimePlatform: { - cpuArchitecture: 'ARM64', - operatingSystemFamily: 'LINUX' - } - }); - } - - public get executionRole (): IamRole { - return this._executionRole; - } - public get taskRole (): IamRole { - return this._taskRole; - } - public get taskDefinition (): EcsTaskDefinition { - return this._taskDefinition; - } -} \ No newline at end of file diff --git a/cdktf/src/index.ts b/cdktf/src/index.ts deleted file mode 100644 index d56efdf..0000000 --- a/cdktf/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './stacks'; -export * from './substacks'; \ No newline at end of file diff --git a/cdktf/src/stacks/index.ts b/cdktf/src/stacks/index.ts deleted file mode 100644 index 3d80728..0000000 --- a/cdktf/src/stacks/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './main'; \ No newline at end of file diff --git a/cdktf/src/stacks/main.ts b/cdktf/src/stacks/main.ts deleted file mode 100644 index 827dd06..0000000 --- a/cdktf/src/stacks/main.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Construct } from 'constructs'; -import { TerraformStack } from 'cdktf'; -import { GuardrailsValidationServiceSubStack, GuardrailsValidationServiceSubStackConfig } from '..'; - -export type GuardrailsValidationServiceStackConfig = GuardrailsValidationServiceSubStackConfig; - -// This is for if we want to do a multi-stack deployment -export class GuardrailsValidationServiceStack extends TerraformStack { - constructor (scope: Construct, id: string, config: GuardrailsValidationServiceStackConfig) { - super(scope, id); - - new GuardrailsValidationServiceSubStack(this, `${id}-substack`, config); - } -} \ No newline at end of file diff --git a/cdktf/src/substacks/index.ts b/cdktf/src/substacks/index.ts deleted file mode 100644 index 3d80728..0000000 --- a/cdktf/src/substacks/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './main'; \ No newline at end of file diff --git a/cdktf/src/substacks/main.ts b/cdktf/src/substacks/main.ts deleted file mode 100644 index 5b684e5..0000000 --- a/cdktf/src/substacks/main.ts +++ /dev/null @@ -1,340 +0,0 @@ -import { Construct } from 'constructs'; -import { - dataAwsCallerIdentity, - dataAwsRegion, - subnet, - vpc as vpcLib -} from '@cdktf/provider-aws'; -import { DefaultedBaseConstructConfig } from '../configs'; -import { - DeploymentPipeline, - DeploymentPipelineConfig as DeploymentPipelineConfigRequired, - RdsPostgres, - RdsPostgresConfig as RdsPostgresConfigRequired -} from '../constructs'; -import { truncate } from '../utils'; - -import AwsCallerIdentity = dataAwsCallerIdentity.DataAwsCallerIdentity; -import AwsRegion = dataAwsRegion.DataAwsRegion -import Subnet = subnet.Subnet; -import Vpc = vpcLib.Vpc; -import { EcsCluster } from '@cdktf/provider-aws/lib/ecs-cluster'; -import { Apigatewayv2VpcLink } from '@cdktf/provider-aws/lib/apigatewayv2-vpc-link'; -import { ServiceDiscoveryPrivateDnsNamespace } from '@cdktf/provider-aws/lib/service-discovery-private-dns-namespace'; -import { EcrRepository } from '@cdktf/provider-aws/lib/ecr-repository'; -import { ComputeService, ComputeServiceConfig } from '../constructs/compute-service'; -import { IamRoleInlinePolicy } from '@cdktf/provider-aws/lib/iam-role'; -import { NameValue } from '../constructs/task'; - -export type RdsPostgresConfig = Omit -export type DeploymentPipelineConfig = Omit< - DeploymentPipelineConfigRequired, - 'ecrRepo' | - 'subnets' | - 'vpc' | - 'clusterArn' | - 'clusterName' | - 'serviceName' -> - -export type OtelConfig = { - /** - * Sets the environment variable `OTEL_PYTHON_TRACER_PROVIDER` - * Defaults to `sdk_tracer_provider` - */ - pythonTracerProvider?: string; - /** - * Sets the environment variable `OTEL_SERVICE_NAME` - * Defaults to `guardrails-api` - */ - serviceName?: string; - /** - * Sets the environment variable `OTEL_TRACES_EXPORTER` - * Defaults to `otlp` - */ - tracesExporter?: string; - /** - * Sets the environment variable `OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST` - * Defaults to `Accept-Encoding,User-Agent,Referer` - */ - instrumentationHttpCaptureHeadersServerRequest?: string; - /** - * Sets the environment variable `OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE` - * Defaults to `Last-Modified,Content-Type` - */ - instrumentationHttpCaptureHeadersServerResponse?: string; - /** - * Sets the environment variable `OTEL_METRICS_EXPORTER` - * Defaults to `none` - */ - metricsExporter?: string; - /** - * Sets the environment variable `OTEL_EXPORTER_OTLP_PROTOCOL` - * Defaults to `http/protobuf` - */ - otlpProtocol?: string; - /** - * Sets the environment variable `OTEL_EXPORTER_OTLP_ENDPOINT` - * Defaults to `http://localhost:4317` - */ - otlpEndpoint?: string; - /** - * Sets the environment variable `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` - * Defaults to `${otlpEndpoint}/v1/traces` - */ - traceSink?: string; - /** - * Sets the environment variable `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` - * Defaults to `${otlpEndpoint}/v1/metrics` - */ - metricsSink?: string; - /** - * Sets the environment variable `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` - * Defaults to `${otlpEndpoint}/v1/logs` - */ - logsSink?: string; -} - -export type ServerConfig = Omit - -export type GuardrailsValidationServiceSubStackConfig = ServerConfig & { - deploymentPipelineConfig: DeploymentPipelineConfig; - ecrRepo: EcrRepository; - rdsPostgresConfig?: RdsPostgresConfig; - subnets: Subnet[]; - vpc: Vpc; - cluster: EcsCluster; - vpcLink: Apigatewayv2VpcLink; - serviceDiscoveryNamespace: ServiceDiscoveryPrivateDnsNamespace; - otelConfig?: OtelConfig; - environmentVariables?: NameValue[]; -} - -export class GuardrailsValidationServiceSubStack extends Construct { - private _pgDatabase: RdsPostgres; - private _deploymentPipeline: DeploymentPipeline; - private _server: ComputeService; - - constructor (scope: Construct, id: string, config: GuardrailsValidationServiceSubStackConfig) { - super(scope, id); - - const currentIdentity = new AwsCallerIdentity(this, `${id}-aws-identity`); - const defaultAccount: string = currentIdentity.accountId; - const currentRegion = new AwsRegion(this, `${id}-aws-region`); - const defaultRegion: string = currentRegion.name; - - const { - accountId = defaultAccount, - cluster, - deploymentPipelineConfig, - environment, - ecrRepo, - rdsPostgresConfig = {}, - region = defaultRegion, - subnets, - vpc, - profile, - environmentVariables = [], - taskPolicies = [], - memory = 1024, - otelConfig = {} - } = config; - - - const { - pythonTracerProvider = 'sdk_tracer_provider', - serviceName: otelServiceName = 'guardrails-api', - tracesExporter = 'otlp', - instrumentationHttpCaptureHeadersServerRequest = 'Accept-Encoding,User-Agent,Referer', - instrumentationHttpCaptureHeadersServerResponse = 'Last-Modified,Content-Type', - metricsExporter = 'none', - otlpProtocol = 'http/protobuf', - otlpEndpoint = 'http://localhost:4317', - } = otelConfig; - const { - traceSink = `${otlpEndpoint}/v1/traces`, - metricsSink = `${otlpEndpoint}/v1/metrics`, - logsSink = `${otlpEndpoint}/v1/logs`, - } = otelConfig; - - const baseConfig: DefaultedBaseConstructConfig = { - accountId, - environment, - profile, - region - }; - - const baseName = `${id}-guardrails-validation-service`; - const serviceName = truncate(`${baseName}-api-${environment}`, 59); // Allow 5 characters for appending `-role` - const dbName = truncate(`${baseName}-postgres-db`, 59); // 63 -sg - - const deploymentPipelineConfigRequired: DeploymentPipelineConfigRequired = { - ...deploymentPipelineConfig, - ecrRepo, - clusterArn: cluster.arn, - clusterName: cluster.name, - serviceName, - vpc, - subnets - }; - const rdsPostgresConfigRequired: RdsPostgresConfigRequired = { - ...rdsPostgresConfig, - name: dbName, - vpc, - subnets - }; - - this._deploymentPipeline = new DeploymentPipeline(this, `${id}-ci-cd`, baseConfig, deploymentPipelineConfigRequired); - - this._pgDatabase = new RdsPostgres(this, `${id}-pg`, rdsPostgresConfigRequired) - - const pgSecretsManagerAccess: IamRoleInlinePolicy = { - name: 'pg-secrets-manager-access', - policy: JSON.stringify({ - Version: '2012-10-17', - Statement: [{ - Effect: 'Allow', - Action: [ - 'secretsmanager:GetSecretValue' - ], - Resource: [ - this.pgDatabase.secretArn - ] - }] - }) - }; - - taskPolicies.push( - pgSecretsManagerAccess - ); - const mandatoryEnvVars = [ - { - name: 'APP_ENVIRONMENT', - value: environment - }, - { - name: 'NODE_ENV', - value: 'production' - }, - { - name: 'NLTK_DATA', - value: '/opt/nltk_data' - }, - { - name: 'PGPORT', - value: this.pgDatabase.instance.port.toString() - }, - { - name: 'PGDATABASE', - value: this.pgDatabase.instance.dbName - }, - { - name: 'PGHOST', - value: this.pgDatabase.instance.endpoint - }, - { - name: 'PGUSER', - value: 'postgres' - }, - { - name: 'PGPASSWORD_SECRET_ARN', - value: this.pgDatabase.secretArn - }, - { - name: 'PORT', - value: '8000' - }, - { - name: 'AWS_EXECUTION_ENV', - value: 'AWS_ECS_Fargate' - } - ]; - const optionalEnvVars = [ - { - name: 'PYTHONUNBUFFERED', - value: '1' - }, - { - name: 'OTEL_PYTHON_TRACER_PROVIDER', - value: pythonTracerProvider - }, - { - name: 'OTEL_SERVICE_NAME', - value: otelServiceName - }, - { - name: 'OTEL_TRACES_EXPORTER', - value: tracesExporter - }, - { - name: 'OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST', - value: instrumentationHttpCaptureHeadersServerRequest - }, - { - name: 'OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE', - value: instrumentationHttpCaptureHeadersServerResponse - }, - { - name: 'OTEL_METRICS_EXPORTER', - value: metricsExporter - }, - { - name: 'OTEL_EXPORTER_OTLP_PROTOCOL', - value: otlpProtocol - }, - { - name: 'OTEL_EXPORTER_OTLP_ENDPOINT', - value: otlpEndpoint - }, - { - name: 'OTEL_EXPORTER_OTLP_TRACES_ENDPOINT', - value: traceSink - }, - { - name: 'OTEL_EXPORTER_OTLP_METRICS_ENDPOINT', - value: metricsSink - }, - { - name: 'OTEL_EXPORTER_OTLP_LOGS_ENDPOINT', - value: logsSink - }, - { - name: 'LOG_LEVEL', - value: 'DEBUG' - } - ]; - - const mandatoryEnvVarNames: string[] = mandatoryEnvVars.map(ev => ev.name); - const userEnvVarNames: string[] = environmentVariables.map(ev => ev.name); - mandatoryEnvVars.push( - ...environmentVariables.filter((envVar: NameValue) => !mandatoryEnvVarNames.includes(envVar.name)), - ...optionalEnvVars.filter((envVar: NameValue) => !userEnvVarNames.includes(envVar.name)) - ); - environmentVariables; - this._server = new ComputeService(this, `${id}-compute-service`, { - ...config, - containers: [{ - image: ecrRepo.repositoryUrl, - name: ecrRepo.name, - port: 8000, - environmentVariables: mandatoryEnvVars - }], - memory, - taskPolicies, - serviceName - }); - } - - public get pgDatabase(): RdsPostgres { - return this._pgDatabase; - } - public get deploymentPipeline (): DeploymentPipeline { - return this._deploymentPipeline; - } - public get server (): ComputeService { - return this._server; - } -} \ No newline at end of file diff --git a/cdktf/src/utils/index.ts b/cdktf/src/utils/index.ts deleted file mode 100644 index 32942a1..0000000 --- a/cdktf/src/utils/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './truncate'; \ No newline at end of file diff --git a/cdktf/src/utils/truncate.ts b/cdktf/src/utils/truncate.ts deleted file mode 100644 index b7ca935..0000000 --- a/cdktf/src/utils/truncate.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { createHash } from 'crypto'; - -/** - * Takes a name and a maximum length and returns a string of that length. - * If the name parameter's length is greater than the specified max length - * it will be truncated and the last 8 characters will be replaced with the - * last 8 characters of the md5 hash of the original value for name. - * @param name - string - * @param maxLength - number - * @returns string - */ -export function truncate (name: string, maxLength: number): string { - if (name.length > maxLength) { - const hash = createHash('md5').update(name).digest('hex'); - - // last 8 characters yields a 0.000005 chance of collision - const semiHash = hash.substring(hash.length - 8); - - const truncName = name.substring(0, maxLength - 8); - return `${truncName}${semiHash}`; - } else { - return name; - } -} \ No newline at end of file diff --git a/cdktf/tsconfig.json b/cdktf/tsconfig.json deleted file mode 100644 index 27659f5..0000000 --- a/cdktf/tsconfig.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "compilerOptions": { - "alwaysStrict": true, - "declaration": true, - "experimentalDecorators": true, - "inlineSourceMap": true, - "inlineSources": true, - "lib": [ - "es2018" - ], - "module": "CommonJS", - "noEmitOnError": true, - "noFallthroughCasesInSwitch": true, - "noImplicitAny": true, - "noImplicitReturns": true, - "noImplicitThis": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "resolveJsonModule": true, - "strict": true, - "strictNullChecks": true, - "strictPropertyInitialization": true, - "stripInternal": true, - "target": "ES2018", - "incremental": true, - "skipLibCheck": true - }, - "include": [ - "**/*.ts" - ], - "exclude": [ - "node_modules", - "cdktf.out" - ] -} \ No newline at end of file diff --git a/custom-install/install.py b/custom-install/install.py deleted file mode 100644 index 85ea608..0000000 --- a/custom-install/install.py +++ /dev/null @@ -1,113 +0,0 @@ -import os -import sys -import logging -import json -from typing import Any, Dict -from rich.console import Console -from guardrails.cli.hub.install import ( - get_site_packages_location, - install_hub_module, - run_post_install, - add_to_hub_inits -) -from guardrails.cli.server.module_manifest import ModuleManifest -from string import Template - -console = Console() - -os.environ[ - "COLOREDLOGS_LEVEL_STYLES" -] = "spam=white,faint;success=green,bold;debug=magenta;verbose=blue;notice=cyan,bold;warning=yellow;error=red;critical=background=red" # noqa -LEVELS = { - "SPAM": 5, - "VERBOSE": 15, - "NOTICE": 25, - "SUCCESS": 35, -} -for key in LEVELS: - logging.addLevelName(LEVELS.get(key), key) # type: ignore -logger = logging.getLogger("custom-install") - - -def load_manifest(fileName: str) -> Dict[str, Any]: - with open(f"custom-install/manifests/{fileName}") as manifest_file: - content = manifest_file.read() - return json.loads(content) - -custom_manifests = { - "guardrails/provenance_llm": load_manifest("provenance-llm.json"), - "guardrails/detect_pii": load_manifest("detect-pii.json"), - "guardrails/competitor_check": load_manifest("competitor-check.json"), - "guardrails/many_shot_jailbreak": load_manifest("jailbreak.json"), - "tryolabs/restricttotopic": load_manifest("restrict-to-topic.json"), -} - -def get_validator_manifest(module_name) -> ModuleManifest: - manifest = custom_manifests.get(module_name, {}) - return ModuleManifest.from_dict(manifest) - -def custom_install(package_uri: str): - """Install a validator from the Hub.""" - if not package_uri.startswith("hub://"): - logger.error("Invalid URI!") - sys.exit(1) - - console.print(f"\nInstalling {package_uri}...\n") - logger.log( - level=LEVELS.get("SPAM"), msg=f"Installing {package_uri}..." # type: ignore - ) - - # Validation - module_name = package_uri.replace("hub://", "") - - # Prep - with console.status("Fetching manifest", spinner="bouncingBar"): - module_manifest = get_validator_manifest(module_name) - site_packages = get_site_packages_location() - - # Install - with console.status("Downloading dependencies", spinner="bouncingBar"): - install_hub_module(module_manifest, site_packages) - - # Post-install - with console.status("Running post-install setup", spinner="bouncingBar"): - run_post_install(module_manifest, site_packages) - add_to_hub_inits(module_manifest, site_packages) - - success_message_cli = Template( - """✅Successfully installed ${module_name}! - -[bold]Import validator:[/bold] -from guardrails.hub import ${export} - -[bold]Get more info:[/bold] -https://hub.guardrailsai.com/validator/${id} -""" - ).safe_substitute( - module_name=package_uri, - id=module_manifest.id, - export=module_manifest.exports[0], - ) - success_message_logger = Template( - """✅Successfully installed ${module_name}! - -Import validator: -from guardrails.hub import ${export} - -Get more info: -https://hub.guardrailsai.com/validator/${id} -""" - ).safe_substitute( - module_name=package_uri, - id=module_manifest.id, - export=module_manifest.exports[0], - ) - console.print(success_message_cli) # type: ignore - logger.log(level=LEVELS.get("SPAM"), msg=success_message_logger) # type: ignore - - -# custom_install("hub://guardrails/provenance_llm") -custom_install("hub://tryolabs/restricttotopic") -# custom_install("hub://guardrails/detect_pii") -# custom_install("hub://guardrails/competitor_check") -# custom_install("hub://guardrails/many_shot_jailbreak") diff --git a/custom-install/manifests/competitor-check.json b/custom-install/manifests/competitor-check.json deleted file mode 100644 index b936fa2..0000000 --- a/custom-install/manifests/competitor-check.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "Competitor Check", - "author": { - "name": "Guardrails AI", - "email": "contact@guardrailsai.com" - }, - "maintainers": [{ - "name": "Karan Acharya", - "email": "karan@guardrailsai.com" - }], - "repository": { - "url": "https://github.com/guardrails-ai/competitor_check.git", - "branch": "frontend_demo" - }, - "index": "./__init__.py", - "exports": [ - "CompetitorCheck" - ], - "tags": { - "language": [ - "en" - ], - "certification": [ - "Guardrails Certified" - ], - "contentType": [ - "string" - ], - "infrastructureRequirements": [ - "ML" - ], - "riskCategory": [ - "Brand risk" - ], - "useCases": [ - "Chatbots", - "Customer Support" - ] - }, - "id": "guardrails/competitor_check", - "namespace": "guardrails", - "packageName": "competitor_check", - "moduleName": "validator", - "requiresAuth": false, - "postInstall": "post-install.py" -} \ No newline at end of file diff --git a/custom-install/manifests/detect-pii.json b/custom-install/manifests/detect-pii.json deleted file mode 100644 index c0c37ad..0000000 --- a/custom-install/manifests/detect-pii.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "Detect PII", - "author": { - "name": "Guardrails AI", - "email": "contact@guardrailsai.com" - }, - "maintainers": [{ - "name": "Caleb Courier", - "email": "caleb@guardrailsai.com" - }], - "repository": { - "url": "https://github.com/guardrails-ai/detect_pii.git", - "branch": "frontend_demo" - }, - "index": "./__init__.py", - "exports": [ - "DetectPII" - ], - "tags": { - "language": [ - "en" - ], - "certification": [ - "Guardrails Certified" - ], - "contentType": [ - "string" - ], - "infrastructureRequirements": [ - "ML" - ], - "riskCategory": [ - "Data Leakage" - ], - "useCases": [ - "Chatbots", - "RAG", - "CodeGen", - "Structured data", - "Customer Support" - ] - }, - "id": "guardrails/detect_pii", - "namespace": "guardrails", - "packageName": "detect_pii", - "moduleName": "validator", - "requiresAuth": false, - "postInstall": "post-install.py" -} \ No newline at end of file diff --git a/custom-install/manifests/jailbreak.json b/custom-install/manifests/jailbreak.json deleted file mode 100644 index f461dc0..0000000 --- a/custom-install/manifests/jailbreak.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "Detect Many Shot Jailbreak", - "author": { - "name": "Guardrails AI", - "email": "contact@guardrailsai.com" - }, - "maintainers": [{ - "name": "Wyatt Lansford", - "email": "wyatt@guardrailsai.com" - }], - "repository": { - "url": "https://github.com/guardrails-ai/jailbreak.git", - "branch": "main" - }, - "index": "./__init__.py", - "exports": [ - "DetectManyShotJailbreak" - ], - "tags": { - "language": [ - "en" - ], - "certification": [ - "Guardrails Certified" - ], - "contentType": [ - "string" - ], - "infrastructureRequirements": [ - "ML" - ], - "riskCategory": [ - "Data Leakage" - ], - "useCases": [ - "Chatbots", - "RAG", - "CodeGen", - "Structured data", - "Customer Support" - ] - }, - "id": "guardrails/many_shot_jailbreak", - "namespace": "guardrails", - "packageName": "many_shot_jailbreak", - "moduleName": "validator", - "requiresAuth": false, - "postInstall": "post-install.py" -} \ No newline at end of file diff --git a/custom-install/manifests/provenance-llm.json b/custom-install/manifests/provenance-llm.json deleted file mode 100644 index aa9f950..0000000 --- a/custom-install/manifests/provenance-llm.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "Provenance LLM", - "author": { - "name": "Guardrails AI", - "email": "contact@guardrailsai.com" - }, - "maintainers": [{ - "name": "Caleb Courier", - "email": "caleb@guardrailsai.com" - }], - "repository": { - "url": "https://github.com/guardrails-ai/provenance_llm.git", - "branch": "default-embed-func" - }, - "index": "./__init__.py", - "exports": [ - "ProvenanceLLM" - ], - "tags": { - "language": [ - "en" - ], - "certification": [ - "Guardrails Certified" - ], - "contentType": [ - "string" - ], - "infrastructureRequirements": [ - "ML", - "LLM" - ], - "riskCategory": [ - "Factuality", - "Brand risk" - ], - "useCases": [ - "Chatbots", - "RAG", - "Customer Support" - ] - }, - "id": "guardrails/provenance_llm", - "namespace": "guardrails", - "packageName": "provenance_llm", - "moduleName": "validator", - "requiresAuth": false, - "postInstall": "post-install.py" -} \ No newline at end of file diff --git a/custom-install/manifests/restrict-to-topic.json b/custom-install/manifests/restrict-to-topic.json deleted file mode 100644 index 3f55972..0000000 --- a/custom-install/manifests/restrict-to-topic.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "Restrict to Topic", - "author": { - "name": "Tryolabs", - "email": "hello@tryolabs.com" - }, - "maintainers": [{ - "name": "Paz", - "email": "paz@tyrolabs.com" - }], - "repository": { - "url": "https://github.com/guardrails-ai/restricttotopic.git", - "branch": "streaming_demo" - }, - "index": "./__init__.py", - "exports": [ - "RestrictToTopic" - ], - "tags": { - "language": [ - "en" - ], - "certification": [ - "Guardrails Certified" - ], - "contentType": [ - "string" - ], - "infrastructureRequirements": [ - "LLM", - "ML" - ], - "riskCategory": [ - "Etiquette", - "Jailbreaking", - "Brand risk" - ], - "useCases": [ - "Chatbots", - "Customer Support" - ] - }, - "id": "tryolabs/restricttotopic", - "namespace": "tryolabs", - "packageName": "restricttotopic", - "moduleName": "validator", - "requiresAuth": false, - "postInstall": "post-install.py" -} \ No newline at end of file diff --git a/dev-build.sh b/dev-build.sh deleted file mode 100644 index fd4483e..0000000 --- a/dev-build.sh +++ /dev/null @@ -1,12 +0,0 @@ -curl https://raw.githubusercontent.com/guardrails-ai/guardrails-api-client/main/service-specs/guardrails-service-spec.yml -o ./open-api-spec.yml - -npx @redocly/cli bundle --dereferenced --output ./open-api-spec.json --ext json ./open-api-spec.yml - -docker build \ - -f Dockerfile.dev \ - --progress=plain \ - --no-cache \ - --build-arg CACHEBUST="$(date)" \ - --build-arg GITHUB_TOKEN="$GITHUB_TOKEN" \ - --build-arg HF_TOKEN="$HF_TOKEN" \ - -t "guardrails-api:dev" .; diff --git a/dev-run.sh b/dev-run.sh deleted file mode 100644 index 2370bdf..0000000 --- a/dev-run.sh +++ /dev/null @@ -1,3 +0,0 @@ -docker stop guardrails-api-dev || true -docker rm guardrails-api-dev || true -docker run -p 8000:8000 --env-file local.env --name guardrails-api-dev -it guardrails-api:dev \ No newline at end of file diff --git a/dev.sh b/dev.sh deleted file mode 100644 index 711755e..0000000 --- a/dev.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -# pip uninstall -y guardrails-ai -# rm -rf ./guardrails-sdk -# cp -r ../guardrails ./guardrails-sdk -# pip install ../guardrails - -# cp -r ../guardrails-custom-validators ./guardrails-custom-validators - -mkdir -p ./pgadmin-data - -cp ./pgadmin-dev-server.json ./pgadmin-data/servers.json -PG_PASSWORD="${PGPASSWORD:-changeme}" -echo "$PG_PASSWORD" > ./pgadmin-data/passfile - -bash dev-build.sh -bash dev-run.sh \ No newline at end of file diff --git a/diagrams/GuardRails Infra - Option 1.drawio b/diagrams/GuardRails Infra - Option 1.drawio deleted file mode 100644 index b26aca8..0000000 --- a/diagrams/GuardRails Infra - Option 1.drawio +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/diagrams/GuardRails Infra - Option 1.png b/diagrams/GuardRails Infra - Option 1.png deleted file mode 100644 index 678c4dc..0000000 Binary files a/diagrams/GuardRails Infra - Option 1.png and /dev/null differ diff --git a/diagrams/GuardRails Infra - Option 2.drawio b/diagrams/GuardRails Infra - Option 2.drawio deleted file mode 100644 index bce3ccf..0000000 --- a/diagrams/GuardRails Infra - Option 2.drawio +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/diagrams/GuardRails Infra - Option 2.png b/diagrams/GuardRails Infra - Option 2.png deleted file mode 100644 index e4153a8..0000000 Binary files a/diagrams/GuardRails Infra - Option 2.png and /dev/null differ diff --git a/guard-rail-spec.xml b/guard-rail-spec.xml deleted file mode 100644 index 03c2154..0000000 --- a/guard-rail-spec.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - Generate a dataset of fake user orders. Each row of the dataset should be valid. - - ${gr.complete_json_suffix} - - \ No newline at end of file diff --git a/guard.json b/guard.json deleted file mode 100644 index 3c874f0..0000000 --- a/guard.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "guard-1", - "railspec": { - "outputSchema": { - "schema": { - "user_orders": { - "element": { - "type": "list", - "name": "user_orders", - "description": "Generate a list of user, and how many orders they have placed in the past.", - "onFail": "noop" - }, - "formatters": ["length: 1 10"], - "children": { - "item": { - "user_id": { - "element": { - "type": "string", - "name": "user_id", - "description": "The user's id." - }, - "formatters": [] - }, - "user_name": { - "element": { - "type": "string", - "name": "user_name", - "description": "The user's first name and last name" - }, - "formatters": ["two-words"] - }, - "num_orders": { - "element": { - "type": "integer", - "name": "num_orders", - "description": "The number of orders the user has placed" - }, - "formatters": ["valid-range: 0 50"] - }, - "city": { - "element": { - "type": "string", - "name": "city", - "description": "City where user lives" - }, - "formatters": ["valid-choices: {['Chicago', 'SF', 'NY']}"] - }, - "last_order_date": { - "element": { - "type": "date", - "name": "last_order_date", - "description": "Date of last order" - }, - "formatters": [] - } - } - } - } - } - }, - "prompt": "Generate a dataset of fake user orders. Each row of the dataset should be valid.\n\n${gr.complete_json_suffix}", - "version": "0.1" - }, - "numReasks": 1 -} \ No newline at end of file diff --git a/guardrails_api/__init__.py b/guardrails_api/__init__.py new file mode 100644 index 0000000..6c8e6b9 --- /dev/null +++ b/guardrails_api/__init__.py @@ -0,0 +1 @@ +__version__ = "0.0.0" diff --git a/app.py b/guardrails_api/app.py similarity index 55% rename from app.py rename to guardrails_api/app.py index 4303716..8732d44 100644 --- a/app.py +++ b/guardrails_api/app.py @@ -1,4 +1,5 @@ import os +from typing import Optional from flask import Flask from flask.json.provider import DefaultJSONProvider from flask_cors import CORS @@ -6,8 +7,8 @@ from urllib.parse import urlparse from guardrails import configure_logging from opentelemetry.instrumentation.flask import FlaskInstrumentor -from src.clients.postgres_client import postgres_is_enabled -from src.otel import otel_is_disabled, initialize +from guardrails_api.clients.postgres_client import postgres_is_enabled +from guardrails_api.otel import otel_is_disabled, initialize # TODO: Move this to a separate file @@ -15,7 +16,9 @@ class OverrideJsonProvider(DefaultJSONProvider): def default(self, o): if isinstance(o, set): return list(o) - return super().default(self, o) + if callable(o): + return str(o) + return super().default(o) class ReverseProxied(object): @@ -29,11 +32,30 @@ def __call__(self, environ, start_response): return self.app(environ, start_response) -def create_app(): +def register_config(config: Optional[str] = None): + default_config_file = os.path.join(os.path.dirname(__file__), "config.py") + + config_file = config or default_config_file + config_file_path = os.path.abspath(config_file) + if os.path.isfile(config_file_path): + from importlib.machinery import SourceFileLoader + + # This creates a module named "validators" with the contents of the init file + # This allow statements like `from validators import StartsWith` + # But more importantly, it registers all of the validators imported in the init + SourceFileLoader("config", config_file_path).load_module() + + +def create_app(env: Optional[str] = None, config: Optional[str] = None): if os.environ.get("APP_ENVIRONMENT") != "production": from dotenv import load_dotenv - load_dotenv() + default_env_file = os.path.join(os.path.dirname(__file__), "default.env") + env_file = env or default_env_file + env_file_path = os.path.abspath(env_file) + load_dotenv(env_file_path) + + register_config(config) app = Flask(__name__) app.json = OverrideJsonProvider(app) @@ -54,13 +76,13 @@ def create_app(): # if no pg_host is set, don't set up postgres if postgres_is_enabled(): - from src.clients.postgres_client import PostgresClient + from guardrails_api.clients.postgres_client import PostgresClient pg_client = PostgresClient() pg_client.initialize(app) - from src.blueprints.root import root_bp - from src.blueprints.guards import guards_bp + from guardrails_api.blueprints.root import root_bp + from guardrails_api.blueprints.guards import guards_bp app.register_blueprint(root_bp) app.register_blueprint(guards_bp) diff --git a/src/__init__.py b/guardrails_api/blueprints/__init__.py similarity index 100% rename from src/__init__.py rename to guardrails_api/blueprints/__init__.py diff --git a/src/blueprints/guards.py b/guardrails_api/blueprints/guards.py similarity index 96% rename from src/blueprints/guards.py rename to guardrails_api/blueprints/guards.py index 26ab642..777fff3 100644 --- a/src/blueprints/guards.py +++ b/guardrails_api/blueprints/guards.py @@ -8,13 +8,13 @@ from guardrails import Guard from guardrails.classes import ValidationOutcome from opentelemetry.trace import Span -from src.classes.http_error import HttpError -from src.clients.memory_guard_client import MemoryGuardClient -from src.clients.pg_guard_client import PGGuardClient -from src.clients.postgres_client import postgres_is_enabled -from src.utils.handle_error import handle_error -from src.utils.get_llm_callable import get_llm_callable from guardrails_api_client import Guard as GuardStruct +from guardrails_api.classes.http_error import HttpError +from guardrails_api.clients.memory_guard_client import MemoryGuardClient +from guardrails_api.clients.pg_guard_client import PGGuardClient +from guardrails_api.clients.postgres_client import postgres_is_enabled +from guardrails_api.utils.handle_error import handle_error +from guardrails_api.utils.get_llm_callable import get_llm_callable guards_bp = Blueprint("guards", __name__, url_prefix="/guards") @@ -25,8 +25,8 @@ guard_client = PGGuardClient() else: guard_client = MemoryGuardClient() - # read in guards from file - import config + # Will be defined at runtime + import config # noqa exports = config.__dir__() for export_name in exports: diff --git a/src/blueprints/root.py b/guardrails_api/blueprints/root.py similarity index 73% rename from src/blueprints/root.py rename to guardrails_api/blueprints/root.py index 18a6cd9..ed388be 100644 --- a/src/blueprints/root.py +++ b/guardrails_api/blueprints/root.py @@ -3,16 +3,15 @@ import flask from string import Template from flask import Blueprint +from guardrails_api.open_api_spec import get_open_api_spec from sqlalchemy import text -from src.classes.health_check import HealthCheck -from src.clients.postgres_client import PostgresClient, postgres_is_enabled -from src.utils.handle_error import handle_error -from src.utils.logger import logger +from guardrails_api.classes.health_check import HealthCheck +from guardrails_api.clients.postgres_client import PostgresClient, postgres_is_enabled +from guardrails_api.utils.handle_error import handle_error +from guardrails_api.utils.logger import logger -# from src.modules.otel_logger import logger root_bp = Blueprint("root", __name__, url_prefix="/") -cached_api_spec = None @root_bp.route("/") @@ -43,11 +42,8 @@ def health_check(): @root_bp.route("/api-docs") @handle_error def api_docs(): - global cached_api_spec - if not cached_api_spec: - with open("./open-api-spec.json") as api_spec_file: - cached_api_spec = json.loads(api_spec_file.read()) - return json.dumps(cached_api_spec) + api_spec = get_open_api_spec() + return json.dumps(api_spec) @root_bp.route("/docs") @@ -64,11 +60,11 @@ def docs(): content="SwaggerUI" /> SwaggerUI - +
- +