diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..77fe2c8 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,23 @@ +{ + "env": { + "browser": false, + "es2021": true + }, + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2022 + }, + "plugins": [ + "@typescript-eslint" + ], + "ignorePatterns": [ + "node_modules", + "dist", + "hack" + ], + "root": true +} diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..fb4fe16 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,27 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: possible-bug +assignees: '' +--- + +### Environment +Device and OS: +App version: +Kubernetes distro being used: +Other: + +### Steps to reproduce +1. + +### Expected result + +### Actual Result + +### Visual Proof (screenshots, videos, text, etc) + +### Severity/Priority + +### Additional Context +Add any other context or screenshots about the technical debt here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..7928b95 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,22 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: 'enhancement' +assignees: '' +--- + +### Is your feature request related to a problem? Please describe. +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +### Describe the solution you'd like + +- **Given** a state +- **When** an action is taken +- **Then** something happens + +### Describe alternatives you've considered +(optional) A clear and concise description of any alternative solutions or features you've considered. + +### Additional context +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/tech_debt.md b/.github/ISSUE_TEMPLATE/tech_debt.md new file mode 100644 index 0000000..b39ccf5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/tech_debt.md @@ -0,0 +1,16 @@ +--- +name: Tech debt +about: Record something that should be investigated or refactored in the future. +title: '' +labels: 'tech-debt' +assignees: '' +--- + +### Describe what should be investigated or refactored +A clear and concise description of what should be changed/researched. Ex. This piece of the code is not DRY enough [...] + +### Links to any relevant code +(optional) i.e. - https://github.com/defenseunicorns/zarf/blob/main/README.md?plain=1#L1 + +### Additional context +Add any other context or screenshots about the technical debt here. diff --git a/.github/ISSUE_TEMPLATE/ux_test.md b/.github/ISSUE_TEMPLATE/ux_test.md new file mode 100644 index 0000000..6aba7cc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/ux_test.md @@ -0,0 +1,23 @@ +--- +name: UX Test +about: Record something that should be investigated to test User Experience +title: '' +labels: 'ux' +assignees: '' +--- + +## Driving Questions +What are we hoping to validate? + +## Testing Plan +User Persona: +Sample Group: + +- [ ] Use Checklist for Tasks + +## Additional context +Add any other context or screenshots about the UX test here. + +Related to issue: # + +## Link to Test & Results diff --git a/.github/codeql.yaml b/.github/codeql.yaml new file mode 100644 index 0000000..71c4bdf --- /dev/null +++ b/.github/codeql.yaml @@ -0,0 +1,6 @@ +paths-ignore: + - build/** + +query-filters: + - exclude: + id: go/path-injection diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..2064021 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,20 @@ +## Description + +... + +## Related Issue + +Fixes # + +Relates to # + +## Type of change + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Other (security config, docs update, etc) + +## Checklist before merging + +- [ ] Test, docs, adr added or updated as needed +- [ ] [Contributor Guide Steps](https://github.com/defenseunicorns/zarf/blob/main/CONTRIBUTING.md#developer-workflow) followed diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..7c2a176 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,68 @@ +name: Publish Zarf Init Package for AWS on Tag + +permissions: + contents: read + +on: + push: + tags: + - "v*" + +jobs: + release: + runs-on: ubuntu-latest + permissions: + packages: write + contents: write + steps: + # Checkout the repo and setup the tooling for this job + - name: Checkout + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + with: + fetch-depth: 0 + + - name: Install latest version of Zarf + uses: defenseunicorns/setup-zarf@main + + - name: Install tools + uses: defenseunicorns/zarf/.github/actions/install-tools@main + + - name: "ECR Credential Helper: Login to GHCR" + uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0 + with: + registry: ghcr.io + username: dummy + password: ${{ github.token }} + + - name: "ECR Credential Helper: Build and Publish the Image" + run: docker buildx build --push --platform linux/amd64 --tag ghcr.io/lucasrod16/zarf-init-aws/ecr-credential-helper:$GITHUB_REF_NAME . + + # - name: "ECR Credential Helper: Sign the Image" + # run: cosign sign --key awskms:///${{ secrets.COSIGN_AWS_KMS_KEY }} -a release-engineer=https://github.com/${{ github.actor }} -a version=$GITHUB_REF_NAME ghcr.io/defenseunicorns/zarf-init-aws/ecr-credential-helper:$GITHUB_REF_NAME + # env: + # COSIGN_EXPERIMENTAL: 1 + # AWS_REGION: ${{ secrets.COSIGN_AWS_REGION }} + # AWS_ACCESS_KEY_ID: ${{ secrets.COSIGN_AWS_KEY_ID }} + # AWS_SECRET_ACCESS_KEY: ${{ secrets.COSIGN_AWS_ACCESS_KEY }} + + - name: Build AWS init package for release + run: make release-aws-init-package CREDENTIAL_HELPER_IMAGE_TAG=$GITHUB_REF_NAME + + - name: Publish AWS Init Package as OCI and Skeleton + run: make publish-aws-init-package ARCH=amd64 REPOSITORY_URL=ghcr.io/defenseunicorns/packages + + # Create a CVE report based on this build + - name: Create release time CVE report + run: make cve-report + + - name: Save CVE report + uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + with: + name: cve-report + path: build/zarf-known-cves.csv + + # Create GitHub release and upload the AWS init package as a release artifact + - name: Create GitHub release and upload AWS init package as release artifact + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN}} + run: gh release create "$GITHUB_REF_NAME" ./build/zarf-init-*.tar.zst --generate-notes --verify-tag diff --git a/.github/workflows/scan-codeql.yml b/.github/workflows/scan-codeql.yml new file mode 100644 index 0000000..4b8db9d --- /dev/null +++ b/.github/workflows/scan-codeql.yml @@ -0,0 +1,66 @@ +name: Analyze CodeQL + +permissions: + contents: read + +on: + push: + branches: ["main"] + pull_request: + paths-ignore: + - "**.md" + - "**.jpg" + - "**.png" + - "**.gif" + - "**.svg" + - "adr/**" + - "docs/**" + - "CODEOWNERS" + schedule: + - cron: "32 2 * * 5" + +jobs: + validate: + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: ["go", "javascript"] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + + - name: Setup Go + uses: defenseunicorns/zarf/.github/actions/golang@main + + - name: Setup NodeJS + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + with: + node-version: 18 + cache: "npm" + cache-dependency-path: "package-lock.json" + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@04daf014b50eaf774287bf3f0f1869d4b4c4b913 # v2.21.7 + env: + CODEQL_EXTRACTOR_GO_BUILD_TRACING: on + with: + languages: ${{ matrix.language }} + config-file: ./.github/codeql.yaml + + - name: Build + run: make build-credential-helper-linux-amd + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@04daf014b50eaf774287bf3f0f1869d4b4c4b913 # v2.21.7 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/scan-cves.yml b/.github/workflows/scan-cves.yml new file mode 100644 index 0000000..55b6a00 --- /dev/null +++ b/.github/workflows/scan-cves.yml @@ -0,0 +1,33 @@ +name: Analyze CVEs + +permissions: + contents: read + +on: + schedule: + - cron: "0 10 * * *" + pull_request: + paths: + - "package.json" + - "package-lock.json" + - "go.mod" + - "go.sum" + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + + - name: Setup Go + uses: defenseunicorns/zarf/.github/actions/golang@main + + - name: Install tools + uses: defenseunicorns/zarf/.github/actions/install-tools@main + + - name: Install latest version of Zarf + uses: defenseunicorns/setup-zarf@main + + - name: Check for CVEs in Dependencies + run: make test-cves diff --git a/.github/workflows/scan-labels.yml b/.github/workflows/scan-labels.yml new file mode 100644 index 0000000..b2ada16 --- /dev/null +++ b/.github/workflows/scan-labels.yml @@ -0,0 +1,15 @@ +name: Validate Labels +on: + pull_request: + types: [labeled, unlabeled, opened, edited, synchronize] + +permissions: + contents: read + +jobs: + enforce: + runs-on: ubuntu-latest + steps: + - uses: yogevbd/enforce-label-action@a3c219da6b8fa73f6ba62b68ff09c469b3a1c024 # 2.2.2 + with: + BANNED_LABELS: "needs-docs,needs-tests,needs-adr,needs-git-sign-off,needs-tutorial" diff --git a/.github/workflows/scan-lint.yml b/.github/workflows/scan-lint.yml new file mode 100644 index 0000000..635af94 --- /dev/null +++ b/.github/workflows/scan-lint.yml @@ -0,0 +1,19 @@ +name: Validate Lint +on: pull_request + +permissions: + contents: read + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + + - name: Run Revive Action by pulling pre-built image + uses: docker://morphy/revive-action:v2 + with: + config: revive.toml + # Path pattern (default: ./...) + # path: diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml new file mode 100644 index 0000000..fc24d9a --- /dev/null +++ b/.github/workflows/scorecard.yml @@ -0,0 +1,50 @@ +name: Scorecards supply-chain security +on: + # Only the default branch is supported. + branch_protection_rule: + schedule: + - cron: '30 1 * * 6' + push: + branches: [ "main" ] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecards analysis + runs-on: ubuntu-latest + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Used to receive a badge. + id-token: write + + steps: + - name: "Checkout code" + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@08b4669551908b1024bb425080c797723083c031 # v2.2.0 + with: + results_file: results.sarif + results_format: sarif + repo_token: ${{ secrets.SCORECARD_READ_TOKEN }} + publish_results: true + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard. + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@04daf014b50eaf774287bf3f0f1869d4b4c4b913 # v2.21.7 + with: + sarif_file: results.sarif diff --git a/.github/workflows/test-aws-init-package.yml b/.github/workflows/test-aws-init-package.yml new file mode 100644 index 0000000..5101976 --- /dev/null +++ b/.github/workflows/test-aws-init-package.yml @@ -0,0 +1,247 @@ +# name: Test AWS Init Package +# on: +# pull_request: +# paths-ignore: +# - "**.md" +# - "**.jpg" +# - "**.png" +# - "**.gif" +# - "**.svg" +# - "adr/**" +# - "docs/**" +# - "CODEOWNERS" + +# workflow_dispatch: +# inputs: +# cluster_name_private: +# type: string +# default: "zarf-init-aws-private-test" +# description: Name of the eks cluster for private ECR test +# cluster_name_public: +# type: string +# default: "zarf-init-aws-public-test" +# description: Name of the eks cluster for public ECR test +# instance_type: +# type: string +# default: t3.medium +# description: EC2 instance type to use for the EKS cluster nodes + +# permissions: +# id-token: write +# contents: read + +# # Abort prior jobs in the same workflow / PR +# concurrency: +# group: init-aws-${{ github.ref }} +# cancel-in-progress: true + +# jobs: +# # Build AWS init package and EKS package +# build: +# runs-on: ubuntu-latest +# steps: +# - name: Checkout +# uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + +# - name: Install latest version of Zarf +# uses: defenseunicorns/setup-zarf@main + +# - name: Setup NodeJS +# uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 +# with: +# node-version: 18 +# cache: "npm" +# cache-dependency-path: "package-lock.json" + +# - name: Install Node dependencies +# run: npm ci + +# - name: Setup Go +# uses: defenseunicorns/zarf/.github/actions/golang@main + +# - name: Build ECR Pepr module +# run: make build-module + +# - name: Build AWS init package +# run: make aws-init-package + +# - name: Build EKS package +# run: make eks-package + +# # Upload the contents of the build directory for later stages to use +# - name: Upload build artifacts +# uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3 +# with: +# name: build-artifacts +# path: build/ +# retention-days: 1 + +# # Deploy and test AWS init package with private ECR registry +# validate-private-ecr: +# runs-on: ubuntu-latest +# needs: build +# env: +# CLUSTER_NAME: ${{ inputs.cluster_name_private || 'zarf-init-aws-private-test' }} +# PULUMI_CONFIG_PASSPHRASE: "" +# steps: +# - name: Checkout +# uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + +# - name: Download build artifacts +# uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 +# with: +# name: build-artifacts +# path: build/ + +# - name: Configure AWS Credentials +# uses: aws-actions/configure-aws-credentials@8c3f20df09ac63af7b3ae3d7c91f105f857d8497 # v4.0.0 +# with: +# role-to-assume: ${{ secrets.AWS_NIGHTLY_ROLE }} +# aws-region: us-east-1 +# role-duration-seconds: 14400 + +# - name: Install latest version of Zarf +# uses: defenseunicorns/setup-zarf@main + +# - name: Install Pulumi +# run: curl -fsSL https://get.pulumi.com | sh + +# - name: Setup NodeJS +# uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 +# with: +# node-version: 18 +# cache: "npm" +# cache-dependency-path: "iam/package-lock.json" + +# - name: Install Node dependencies +# working-directory: iam +# run: npm ci + +# - name: Deploy EKS package +# run: make deploy-eks-package CLUSTER_NAME="$CLUSTER_NAME" INSTANCE_TYPE=${{ inputs.instance_type }} + +# - name: Create IAM roles +# run: make create-iam CLUSTER_NAME="$CLUSTER_NAME" + +# - name: Update Zarf config file with registry type and IAM role ARNs +# run: make update-zarf-config REGISTRY_TYPE="private" + +# # This allows Zarf to use the zarf-config.toml config file +# - name: Move Zarf init package to root of repository +# run: mv build/zarf-init-amd64-*.tar.zst . + +# - name: Zarf init with private ECR registry +# run: | +# zarf init \ +# --registry-url="$(aws sts get-caller-identity --query 'Account' --output text).dkr.ecr.us-east-1.amazonaws.com" \ +# --registry-push-username="AWS" \ +# --registry-push-password="$(aws ecr get-login-password --region us-east-1)" \ +# --components="zarf-ecr-credential-helper" \ +# --confirm + +# - name: Teardown the cluster +# if: always() +# run: make remove-eks-package + +# - name: Delete private ECR repositories +# if: always() +# run: | +# repos=("defenseunicorns/pepr/controller" "defenseunicorns/zarf/agent" "defenseunicorns/zarf-init-aws/ecr-credential-helper") + +# for repo in "${repos[@]}" +# do +# aws ecr delete-repository --repository-name "${repo}" --force || true +# done + +# - name: Delete IAM roles +# if: always() +# run: make delete-iam + +# - name: Save logs +# if: always() +# uses: defenseunicorns/zarf/.github/actions/save-logs@main + +# # Deploy and test AWS init package with public ECR registry +# validate-public-ecr: +# runs-on: ubuntu-latest +# needs: build +# env: +# CLUSTER_NAME: ${{ inputs.cluster_name_public || 'zarf-init-aws-public-test' }} +# PULUMI_CONFIG_PASSPHRASE: "" +# steps: +# - name: Checkout +# uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + +# - name: Download build artifacts +# uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 +# with: +# name: build-artifacts +# path: build/ + +# - name: Configure AWS Credentials +# uses: aws-actions/configure-aws-credentials@8c3f20df09ac63af7b3ae3d7c91f105f857d8497 # v4.0.0 +# with: +# role-to-assume: ${{ secrets.AWS_NIGHTLY_ROLE }} +# aws-region: us-east-1 +# role-duration-seconds: 14400 + +# - name: Install latest version of Zarf +# uses: defenseunicorns/setup-zarf@main + +# - name: Install Pulumi +# run: curl -fsSL https://get.pulumi.com | sh + +# - name: Setup NodeJS +# uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 +# with: +# node-version: 18 +# cache: "npm" +# cache-dependency-path: "iam/package-lock.json" + +# - name: Install Node dependencies +# working-directory: iam +# run: npm ci + +# - name: Deploy EKS package +# run: make deploy-eks-package CLUSTER_NAME="$CLUSTER_NAME" INSTANCE_TYPE=${{ inputs.instance_type }} + +# - name: Create IAM roles +# run: make create-iam CLUSTER_NAME="$CLUSTER_NAME" + +# - name: Update Zarf config file with registry type and IAM role ARNs +# run: make update-zarf-config REGISTRY_TYPE="public" + +# # This allows Zarf to use the zarf-config.toml config file +# - name: Move Zarf init package to root of repository +# run: mv build/zarf-init-amd64-*.tar.zst . + +# - name: Zarf init with public ECR registry +# run: | +# zarf init \ +# --registry-url="$(aws ecr-public describe-registries --query 'registries[0].registryUri' --output text --region us-east-1)" \ +# --registry-push-username="AWS" \ +# --registry-push-password="$(aws ecr-public get-login-password --region us-east-1)" \ +# --components="zarf-ecr-credential-helper" \ +# --confirm + +# - name: Teardown the cluster +# if: always() +# run: make remove-eks-package + +# - name: Delete public ECR repositories +# if: always() +# run: | +# repos=("defenseunicorns/pepr/controller" "defenseunicorns/zarf/agent" "defenseunicorns/zarf-init-aws/ecr-credential-helper") + +# for repo in "${repos[@]}" +# do +# aws ecr-public delete-repository --repository-name "${repo}" --force || true +# done + +# - name: Delete IAM roles +# if: always() +# run: make delete-iam + +# - name: Save logs +# if: always() +# uses: defenseunicorns/zarf/.github/actions/save-logs@main diff --git a/.github/workflows/test-pepr-module.yml b/.github/workflows/test-pepr-module.yml new file mode 100644 index 0000000..420a94d --- /dev/null +++ b/.github/workflows/test-pepr-module.yml @@ -0,0 +1,40 @@ +name: Test Pepr Module +on: + pull_request: + paths-ignore: + - "**.md" + - "**.jpg" + - "**.png" + - "**.gif" + - "**.svg" + - "adr/**" + - "docs/**" + - "CODEOWNERS" + +permissions: + contents: read + +# Abort prior jobs in the same workflow / PR +concurrency: + group: pepr-module-${{ github.ref }} + cancel-in-progress: true + +jobs: + validate: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@3df4ab11eba7bda6032a0b82a6bb43b11571feac # v4.0.0 + + - name: Setup NodeJS + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3.8.1 + with: + node-version: 18 + cache: "npm" + cache-dependency-path: "package-lock.json" + + - name: Install Node dependencies + run: npm ci + + - name: Run unit tests for Pepr module + run: make test-module diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..172c638 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +node_modules +dist +insecure* +coverage +build +Pulumi.**.yaml +binaries +eks.yaml +**.tar.zst diff --git a/.grype.yaml b/.grype.yaml new file mode 100644 index 0000000..33ac6bd --- /dev/null +++ b/.grype.yaml @@ -0,0 +1,5 @@ +# Ignore list for vulnerabilities with a CVSS severity rating higher than "low". +# These will either be false positives or cannot be immediately patched. + +# ignore: +# - vulnerability: GHSA-qppj-fm5r-hxr3 diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..7c4c513 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,13 @@ +{ + "arrowParens": "avoid", + "bracketSameLine": false, + "bracketSpacing": true, + "embeddedLanguageFormatting": "auto", + "insertPragma": false, + "printWidth": 80, + "quoteProps": "as-needed", + "requirePragma": false, + "semi": true, + "tabWidth": 2, + "useTabs": false +} diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..ed46dd8 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,5 @@ +* @Racer159 @Noxsios @jeff-mccoy @lucasrod16 + +# Additional privileged files +/CODEOWNERS @jeff-mccoy @mikevanhemert @austenbryan +/LICENSE @jeff-mccoy @austenbryan diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8e600fc --- /dev/null +++ b/Dockerfile @@ -0,0 +1,8 @@ +FROM cgr.dev/chainguard/static:latest + +# 65532 is the UID of the `nonroot` user in chainguard/static. See: https://edu.chainguard.dev/chainguard/chainguard-images/reference/static/overview/#users +USER 65532:65532 + +COPY --chown=65532:65532 build/zarf-ecr-credential-helper /zarf-ecr-credential-helper + +CMD [ "/zarf-ecr-credential-helper" ] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..869e6de --- /dev/null +++ b/Makefile @@ -0,0 +1,109 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: 2021-Present The Zarf Authors + +# Provide a default value for the operating system architecture used in tests, e.g. " APPLIANCE_MODE=true|false make test-e2e ARCH=arm64" +ARCH ?= amd64 +CLI_VERSION ?= $(if $(shell git describe --tags),$(shell git describe --tags),"UnknownVersion") +CREDENTIAL_HELPER_BIN := ./build/zarf-ecr-credential-helper +CLUSTER_NAME ?= "" +INSTANCE_TYPE ?= t3.small +EKS_PACKAGE := ./build/zarf-package-distro-eks-multi-0.0.4.tar.zst +REGISTRY_TYPE ?= "" +###################################################################################### + +.DEFAULT_GOAL := help + +.PHONY: help +help: ## Display this help information + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) \ + | sort | awk 'BEGIN {FS = ":.*?## "}; \ + {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +clean: ## Clean the build directory + rm -rf build + +destroy: ## Run `zarf destroy` on the current cluster + zarf destroy --confirm --remove-components + +delete-packages: ## Delete all Zarf package tarballs in the project recursively + find . -type f -name 'zarf-package-*' -delete + +build-module: ## Build the ECR Pepr module + npm run build + cp ./dist/pepr-module-b95dbd80-e078-5eb9-aaf3-bcb9567417d0.yaml ./manifests/ + +format-module: ## Format the ECR Pepr module + npx pepr format + +test-module: ## Test the ECR Pepr module + npm run unit-test + +# Note: the path to the main.go file is not used due to https://github.com/golang/go/issues/51831#issuecomment-1074188363 +build-credential-helper-linux-amd: ## Build the ECR credential helper binary for Linux on AMD64 + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./build/zarf-ecr-credential-helper + +build-local-credential-helper-image: ## Build the ECR credential helper image to be used in a locally built init package + @test -s $(CREDENTIAL_HELPER_BIN) || $(MAKE) build-credential-helper-linux-amd + docker buildx build --load --platform linux/$(ARCH) --tag ghcr.io/defenseunicorns/zarf-init-aws/ecr-credential-helper:local . + +aws-init-package: ## Build the AWS Zarf init package + zarf package create -o build -a $(ARCH) --confirm . + +# INTERNAL: used to build a release version of the AWS init package with a specific credential-helper image +release-aws-init-package: + zarf package create -o build -a $(ARCH) --set CREDENTIAL_HELPER_IMAGE_TAG=$(CREDENTIAL_HELPER_IMAGE_TAG) --confirm . + +# INTERNAL: used to publish the AWS init package +publish-aws-init-package: + zarf package publish build/zarf-init-$(ARCH)-$(CLI_VERSION).tar.zst oci://$(REPOSITORY_URL) + zarf package publish . oci://$(REPOSITORY_URL) + +eks-package: ## Build the EKS package + zarf package create packages/eks -a multi -o build --confirm + +deploy-eks-package: ## Deploy the EKS package to create an EKS cluster + @if [ -z "$(CLUSTER_NAME)" ]; then \ + echo "Error: CLUSTER_NAME is not provided. Please set CLUSTER_NAME with a valid cluster name."; \ + echo "Example: make deploy-eks-package CLUSTER_NAME=my-cluster-name"; \ + exit 1; \ + fi + + @test -s $(EKS_PACKAGE) || { $(MAKE) eks-package; } + + zarf package deploy $(EKS_PACKAGE) \ + --components="deploy-eks-cluster" \ + --set=EKS_CLUSTER_NAME="$(CLUSTER_NAME)" \ + --set=EKS_INSTANCE_TYPE="$(INSTANCE_TYPE)" \ + --confirm + +remove-eks-package: ## Remove the EKS package to teardown an EKS cluster + zarf package remove $(EKS_PACKAGE) --confirm + +create-iam: ## Create AWS IAM policies and roles used in CI + @if [ -z "$(CLUSTER_NAME)" ]; then \ + echo "Error: CLUSTER_NAME is not provided. Please set CLUSTER_NAME with an existing EKS cluster name."; \ + echo "Example: make create-iam CLUSTER_NAME=my-cluster-name"; \ + exit 1; \ + fi + + @cd iam || exit \ + && pulumi logout \ + && pulumi login --local \ + && test $$(pulumi stack --show-name --non-interactive) || PULUMI_CONFIG_PASSPHRASE="" pulumi stack init ci \ + && PULUMI_CONFIG_PASSPHRASE="" CLUSTER_NAME="$(CLUSTER_NAME)" pulumi up --yes + +delete-iam: ## Delete AWS IAM policies and roles used in CI + @cd iam || exit \ + && PULUMI_CONFIG_PASSPHRASE="" pulumi down --yes \ + && PULUMI_CONFIG_PASSPHRASE="" pulumi stack rm ci --yes + +update-zarf-config: ## Update Zarf config file with registry type and IAM role ARN values + @cd iam || exit \ + && node ../hack/update-zarf-config.mjs "$(REGISTRY_TYPE)" "$$(PULUMI_CONFIG_PASSPHRASE="" pulumi stack output webhookRoleArn)" "$$(PULUMI_CONFIG_PASSPHRASE="" pulumi stack output credentialHelperRoleArn)" + +# INTERNAL: used to test for new CVEs that may have been introduced +test-cves: + zarf tools sbom packages --exclude './iam' . -o json | grype --fail-on low + +cve-report: ## Create a CVE report for the current project (must `brew install grype` first) + zarf tools sbom packages --exclude './iam' --exclude './binaries' . -o json | grype -o template -t hack/.templates/grype.tmpl > build/zarf-known-cves.csv diff --git a/README.md b/README.md index 11f6ef6..b12c700 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,123 @@ -# zarf-init-aws -Zarf Init Package for AWS - DevSecOps for Air Gap & Limited-Connection Systems. https://zarf.dev/ +# Zarf Init Package for AWS - DevSecOps for Air Gap + +[![Latest Release](https://img.shields.io/github/v/release/defenseunicorns/zarf-init-aws)](https://github.com/defenseunicorns/zarf-init-aws/releases) +[![Build Status](https://img.shields.io/github/actions/workflow/status/defenseunicorns/zarf-init-aws/release.yml)](https://github.com/defenseunicorns/zarf-init-aws/actions/workflows/release.yml) +[![OpenSSF Scorecard](https://api.securityscorecards.dev/projects/github.com/defenseunicorns/zarf-init-aws/badge)](https://api.securityscorecards.dev/projects/github.com/defenseunicorns/zarf-init-aws) + +Zarf eliminates the [complexity of air gap software delivery](https://www.itopstimes.com/contain/air-gap-kubernetes-considerations-for-running-cloud-native-applications-without-the-cloud/) for Kubernetes clusters and cloud-native workloads using a declarative packaging strategy to support DevSecOps in offline and semi-connected environments. + +## 👀 Looking for Zarf? + +- [Zarf Website](https://zarf.dev) +- [Zarf Overview](https://docs.zarf.dev/docs/zarf-overview) +- [Zarf Repo](https://github.com/defenseunicorns/Zarf) + +## Zarf Init Package for AWS + +This repository contains the Zarf init package for AWS that uses the [Amazon Elastic Container Registry (ECR)](https://aws.amazon.com/ecr/) as an OCI registry and deploys onto the [Amazon Elastic Kubernetes Service (EKS)](https://aws.amazon.com/eks/) platform. + +## Usage + +### Prerequisites + +- Zarf CLI (version >= `v0.30.0`) + - + +- Connection to an existing EKS cluster configured with an IAM OIDC identity provider to allow [IRSA](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) authentication + - + +- AWS CLI configured with the necessary permissions to describe and create ECR repositories, and fetch ECR tokens + +- Create IAM role for the Pepr webhook to be able to list and create ECR repositories + - See an [example role for reference](iam/json/ecr-webhook-role.json). Be sure to replace the `{{AWS_ACCOUNT_ID}}` and `{{EKS_CLUSTER_ID}}` placeholders, as well as the AWS region with your values. + + - You will need to create an IAM policy with the appropriate permissions and attach it to the role. See an [example policy for reference](iam/json/ecr-webhook-policy.json). + + ***Note***: If you only need to work with a private ECR registry, the `ecr-public:` prefixed actions can be removed from the policy. Likewise, if you only need to work with a public ECR registry, the `ecr:` prefixed actions can be removed from the policy. + +- (Optional) Create IAM role for the `zarf-ecr-credential-helper` to be able to fetch new ECR auth tokens + - The credential helper is an optional component and is NOT required to use ECR as an external Zarf registry. It can be used if you are looking for an automated solution for keeping your image pull secrets updated with valid ECR auth tokens. Frequent rotation of ECR tokens in image pull secrets is required because they expire after 12 hours. + + - See an [example role for reference](iam/json/ecr-credential-helper-role.json). Be sure to replace the `{{AWS_ACCOUNT_ID}}` and `{{EKS_CLUSTER_ID}}` placeholders, as well as the AWS region with your values. + + - You will need to create an IAM policy with the appropriate permissions and attach it to the role. See an [example policy for reference](iam/json/ecr-credential-helper-policy.json). + + ***Note***: If you only need to work with a private ECR registry, the `ecr-public:` prefixed actions can be removed from the policy. Likewise, if you only need to work with a public ECR registry, the `ecr:` prefixed actions can be removed from the policy. + +### Get the Zarf init package + +```bash +zarf package pull oci://ghcr.io/defenseunicorns/packages/init-aws:v0.0.1-amd64 +``` + +### Initialize EKS cluster with Zarf configured to use ECR as external registry + +#### Use ***private*** ECR registry + +1. Create a Zarf config file `zarf-config.toml` + + ```toml + architecture = 'amd64' + + [package.deploy] + components = 'zarf-ecr-credential-helper' + + [package.deploy.set] + registry_type = 'private' + + # Change me to your AWS region if needed + aws_region = 'us-east-1' + + # Set IAM role ARNs + ecr_hook_role_arn = '' + ecr_credential_helper_role_arn = '' + ``` + +1. Zarf init + + Note: Be sure to run the `zarf init` command from the same working directory as your Zarf config file + + ```bash + AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text) + + # Note: Be sure the region you specify in the --registry-url matches the one specified in your Zarf config file + zarf init \ + --registry-url="${AWS_ACCOUNT_ID}.dkr.ecr..amazonaws.com" \ + --registry-push-username="AWS" \ + --registry-push-password="$(aws ecr get-login-password --region )" \ + --confirm + ``` + +#### Use ***public*** ECR registry + +1. Create a Zarf config file `zarf-config.toml` + + ```toml + architecture = 'amd64' + + [package.deploy] + components = 'zarf-ecr-credential-helper' + + [package.deploy.set] + registry_type = 'public' + + # Must use us-east-1 region for public ECR registries: + # https://docs.aws.amazon.com/AmazonECR/latest/public/public-registries.html#public-registry-auth + aws_region = 'us-east-1' + + # Set IAM role ARNs + ecr_hook_role_arn = '' + ecr_credential_helper_role_arn = '' + ``` + +1. Zarf init + + Note: Be sure to run the `zarf init` command from the same working directory as your Zarf config file + + ```bash + zarf init \ + --registry-url="$(aws ecr-public describe-registries --query 'registries[0].registryUri' --output text --region us-east-1)" \ + --registry-push-username="AWS" \ + --registry-push-password="$(aws ecr-public get-login-password --region us-east-1)" \ + --confirm + ``` diff --git a/adr/0001-use-pulumi-typescript-sdk-to-provision-iam-resources.md b/adr/0001-use-pulumi-typescript-sdk-to-provision-iam-resources.md new file mode 100644 index 0000000..a867fa1 --- /dev/null +++ b/adr/0001-use-pulumi-typescript-sdk-to-provision-iam-resources.md @@ -0,0 +1,108 @@ +# 1. Use Pulumi TypeScript SDK to provision AWS IAM resources + +Date: 2023-10-13 + +## Status + +Accepted + +## Context + +Currently, the Zarf Init Package for AWS has two components that require access to ECR in AWS to function correctly, the Pepr webhook and zarf-ecr-credential-helper. EKS is currently the only Kubernetes distribution that is supported and tested on. We are leveraging an authentication feature of EKS called 'IAM Roles for Service Accounts (IRSA)', which allows you to add an annotation to a Kubernetes Service Account with the Amazon Resource Name (ARN) of an IAM role that contains the necessary policies and permissions. Here is how we are currently using this Service Account annotation to give Pepr the necessary permissions to list and create ECR repositories: + +```yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + namespace: pepr-system + annotations: + eks.amazonaws.com/role-arn: "###ZARF_VAR_ECR_HOOK_ROLE_ARN###" +``` + +For more information on EKS IRSA authentication, see: + +The IAM role used for Pepr to use IRSA authentication looks like: + +```json +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Federated": "arn:aws:iam::{{AWS_ACCOUNT_ID}}:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/{{EKS_CLUSTER_ID}}" + }, + "Action": "sts:AssumeRoleWithWebIdentity", + "Condition": { + "StringEquals": { + "oidc.eks.us-east-1.amazonaws.com/id/{{EKS_CLUSTER_ID}}:sub": "system:serviceaccount:pepr-system:pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0" + } + } + } + ] +} +``` + +The `{{EKS_CLUSTER_ID}}` is a placeholder value for an EKS cluster's OIDC issuer ID that is unique for each EKS cluster. Because we are provisioning ephemeral EKS clusters in CI to test the Zarf Init Package for AWS, we must dynamically fetch this data from the EKS cluster after it has been created, and replace the placeholder values in the IAM role(s) with the actual value. + +Four approaches have been considered to handle the updating and provisioning of the IAM policies and roles needed for our tests: + +1. Shell script using AWS CLI +2. Pulumi Go SDK +3. Pulumi TypeScript SDK +4. Terraform + +### Shell script using AWS CLI + +Pros: + +- Simple and quick to write to get a working solution + +Cons: + +- Requires using tools like `sed` to perform string replacements, which hinders portability and readability. For example, `gsed` is needed to work on MacOS, but `sed` is needed to work on Linux. + +### Pulumi Go SDK + +Pros: + +- Strongly typed programming language +- Aligns with Defense Unicorns' tech stack +- More portable than a shell script + +Cons: + +- The Pulumi Go SDK results in very verbose programs. Requires roughly 3x the amount of code when compared to a shell script. This results in slower development, debugging, and ultimately, cycle times. + +### Pulumi TypeScript SDK + +Pros: + +- Strongly typed programming language +- Aligns with Defense Unicorns' tech stack +- More portable than a shell script +- Less verbose than the Pulumi Go SDK + +Cons: + +- N/A + +### Terraform + +Pros: + +- Has been the de-facto standard for Infrastructure as Code for years +- Many engineers at Defense Unicorns are familiar with it + +Cons: + +- It is not released under an Open Source license (BSL): + +## Decision + +The Zarf Init Package for AWS will use the Pulumi TypeScript SDK to handle the updating and provisioning of IAM resources for use in our tests. This allows us to leverage a robust programming language that is clean and concise to read and write, and also allows for easier local testing due to the improved portability. + +## Consequences + +There may be a more steep learning curve for contributors who are unfamiliar with Pulumi or TypeScript. diff --git a/adr/template.md b/adr/template.md new file mode 100644 index 0000000..596fb25 --- /dev/null +++ b/adr/template.md @@ -0,0 +1,19 @@ +# NUMBER. TITLE + +Date: DATE + +## Status + +STATUS + +## Context + +The issue motivating this decision, and any context that influences or constrains the decision. + +## Decision + +The change that we're proposing or have agreed to implement. + +## Consequences + +What becomes easier or more difficult to do and any risks introduced by the change that will need to be mitigated. diff --git a/capabilities/ecr-private.ts b/capabilities/ecr-private.ts new file mode 100644 index 0000000..6db53ef --- /dev/null +++ b/capabilities/ecr-private.ts @@ -0,0 +1,77 @@ +import { + ECR, + CreateRepositoryCommand, + CreateRepositoryCommandInput, + DescribeRepositoriesCommand, + DescribeRepositoriesCommandInput, +} from "@aws-sdk/client-ecr"; +import { Log } from "pepr"; +import { ECRProvider } from "./ecr-provider"; + +export const privateECRURLPattern = + /^(?[0-9]{12})\.dkr\.ecr\..*\.amazonaws\.com$/; + +export class ECRPrivate implements ECRProvider { + private ecr: ECR; + + constructor(region: string) { + this.ecr = new ECR({ region }); + } + + async listExistingRepositories(repoNames: string[]): Promise { + try { + const existingRepositories: string[] = []; + + for (const repoName of repoNames) { + const params: DescribeRepositoriesCommandInput = { + repositoryNames: [repoName], + }; + + try { + await this.ecr.send(new DescribeRepositoriesCommand(params)); + Log.info(`Repository '${repoName}' already exists`); + existingRepositories.push(repoName); + } catch (err) { + if (err.name === "RepositoryNotFoundException") { + // Ignore this error and proceed to the next iteration + continue; + } else { + throw err; + } + } + } + return existingRepositories; + } catch (err) { + Log.error(`Error checking for existing ECR repositories: ${err}`); + return []; + } + } + + async createRepositories( + repoNames: string[], + accountId?: string, + ): Promise { + try { + const existingRepos = await this.listExistingRepositories(repoNames); + + for (const repoName of repoNames) { + if (!existingRepos?.includes(repoName)) { + const createParams: CreateRepositoryCommandInput = { + repositoryName: repoName, + registryId: accountId, + imageTagMutability: "IMMUTABLE", + imageScanningConfiguration: { + scanOnPush: true, + }, + }; + + await this.ecr.send(new CreateRepositoryCommand(createParams)); + + Log.info(`ECR Repository '${repoName}' created successfully.`); + } + } + } catch (err) { + Log.error(`Error creating ECR repositories: ${err}`); + } + } +} diff --git a/capabilities/ecr-provider.ts b/capabilities/ecr-provider.ts new file mode 100644 index 0000000..c162638 --- /dev/null +++ b/capabilities/ecr-provider.ts @@ -0,0 +1,4 @@ +export interface ECRProvider { + listExistingRepositories(repoNames: string[]): Promise; + createRepositories(repoNames: string[], accountId?: string): Promise; +} diff --git a/capabilities/ecr-public.ts b/capabilities/ecr-public.ts new file mode 100644 index 0000000..b38346e --- /dev/null +++ b/capabilities/ecr-public.ts @@ -0,0 +1,69 @@ +import { + ECRPUBLICClient, + CreateRepositoryCommand, + CreateRepositoryCommandInput, + DescribeRepositoriesCommand, + DescribeRepositoriesCommandInput, +} from "@aws-sdk/client-ecr-public"; +import { Log } from "pepr"; +import { ECRProvider } from "./ecr-provider"; + +export const publicECRURLPattern = + /^public\.ecr\.aws\/[a-z][a-z0-9]+(?:[._-][a-z0-9]+)*$/; + +export class ECRPublic implements ECRProvider { + private ecrPublic: ECRPUBLICClient; + + constructor(region: string) { + this.ecrPublic = new ECRPUBLICClient({ region }); + } + + async listExistingRepositories(repoNames: string[]): Promise { + try { + const existingRepositories: string[] = []; + + for (const repoName of repoNames) { + const params: DescribeRepositoriesCommandInput = { + repositoryNames: [repoName], + }; + + try { + await this.ecrPublic.send(new DescribeRepositoriesCommand(params)); + Log.info(`Repository '${repoName}' already exists`); + existingRepositories.push(repoName); + } catch (err) { + if (err.name === "RepositoryNotFoundException") { + // Ignore this error and proceed to the next iteration + continue; + } else { + throw err; + } + } + } + return existingRepositories; + } catch (err) { + Log.error(`Error checking for existing ECR repositories: ${err}`); + return []; + } + } + + async createRepositories(repoNames: string[]): Promise { + try { + const existingRepos = await this.listExistingRepositories(repoNames); + + for (const repoName of repoNames) { + if (!existingRepos?.includes(repoName)) { + const createParams: CreateRepositoryCommandInput = { + repositoryName: repoName, + }; + + await this.ecrPublic.send(new CreateRepositoryCommand(createParams)); + + Log.info(`ECR Repository '${repoName}' created successfully.`); + } + } + } catch (err) { + Log.error(`Error creating ECR repositories: ${err}`); + } + } +} diff --git a/capabilities/lib/utils.test.ts b/capabilities/lib/utils.test.ts new file mode 100644 index 0000000..8d9e0d7 --- /dev/null +++ b/capabilities/lib/utils.test.ts @@ -0,0 +1,78 @@ +import { getAccountId, getRepositoryNames } from "./utils"; + +describe("getRepositoryNames", () => { + it("correctly extracts repository name from different input images", () => { + const testCases = [ + { + input: "defenseunicorns/pepr/controller:v0.13.0", + expected: "defenseunicorns/pepr/controller", + }, + { + input: "defenseunicorns/pepr/controller:latest", + expected: "defenseunicorns/pepr/controller", + }, + { + input: "defenseunicorns/pepr/controller", + expected: "defenseunicorns/pepr/controller", + }, + { + input: "ghcr.io/defenseunicorns/zarf/agent:local", + expected: "defenseunicorns/zarf/agent", + }, + { + input: "ghcr.io/defenseunicorns/zarf/agent", + expected: "defenseunicorns/zarf/agent", + }, + { + input: "registry1.dso.mil/defenseunicorns/zarf/agent:latest", + expected: "defenseunicorns/zarf/agent", + }, + { + input: + "defenseunicorns/zarf-game@sha256:f78e442f0f3eb3e9459b5ae6b1a8fda62f8dfe818112e7d130a4e8ae72b3cbff", + expected: "defenseunicorns/zarf-game", + }, + ]; + + testCases.forEach(({ input, expected }) => { + const result = getRepositoryNames([input]); + expect(result).toEqual([expected]); + }); + }); + + it("correctly handles empty input array", () => { + const result = getRepositoryNames([]); + expect(result).toEqual([]); + }); +}); + +describe("getAccountId", () => { + const testCases = [ + { + input: "123456789012.dkr.ecr.us-east-1.amazonaws.com", + expected: "123456789012", + }, + { + input: "210987654321.dkr.ecr.us-west-2.amazonaws.com", + expected: "210987654321", + }, + ]; + + testCases.forEach(({ input, expected }) => { + it(`correctly extracts AWS account ID from ${input}`, () => { + const result = getAccountId(input); + expect(result).toEqual(expected); + }); + }); + + it("throws an error when an invalid ECR URL is provided", () => { + // Only has 11 digit account ID. Valid account IDs have 12 digits + const invalidInput = "12345678901.dkr.ecr.us-east-1.amazonaws.com"; + + const testFunction = () => getAccountId(invalidInput); + + expect(testFunction).toThrow( + "Invalid private ECR URL format: 12345678901.dkr.ecr.us-east-1.amazonaws.com", + ); + }); +}); diff --git a/capabilities/lib/utils.ts b/capabilities/lib/utils.ts new file mode 100644 index 0000000..2730a12 --- /dev/null +++ b/capabilities/lib/utils.ts @@ -0,0 +1,79 @@ +import { K8s, kind, Log } from "pepr"; +import { ZarfState } from "../zarf-types"; +import { privateECRURLPattern } from "../ecr-private"; +import { publicECRURLPattern } from "../ecr-public"; + +interface ECRCheckResult { + isECR: boolean; + registryURL: string; +} + +export async function isECRregistry(): Promise { + let zarfState: ZarfState; + + // Fetch the Zarf state secret + try { + const secret = await K8s(kind.Secret).InNamespace("zarf").Get("zarf-state"); + const secretString = atob(secret.data.state); + zarfState = JSON.parse(secretString); + } catch (err) { + Log.error( + `Error: Failed to get package secret 'zarf-state' in namespace 'zarf': ${err}`, + ); + } + + if (zarfState.registryInfo.internalRegistry === true) { + Log.warn( + "Zarf is configured to use an internal registry. Skipping creating ECR repos.", + ); + } + + const registryURL = zarfState.registryInfo.address; + + if ( + publicECRURLPattern.test(registryURL) || + privateECRURLPattern.test(registryURL) + ) { + return { isECR: true, registryURL }; + } + + return { isECR: false, registryURL }; +} + +export function getRepositoryNames(images: string[]): string[] { + if (!images) { + return []; + } + + const repoNames = images.map((image: string) => { + if (image.includes(":") && !image.includes("@sha256")) { + image = image.split(":")[0]; + } else if (image.includes("@sha256")) { + image = image.split("@sha256")[0]; + } + + const firstSlashIndex = image.indexOf("/"); + if (firstSlashIndex !== -1) { + const substringBeforeSlash = image.substring(0, firstSlashIndex); + if (substringBeforeSlash.includes(".")) { + image = image.substring(firstSlashIndex + 1); + } + } + + return image; + }); + + return repoNames; +} + +export function getAccountId(url: string): string { + const matches = url.match(privateECRURLPattern); + + if (!matches || matches.length !== 2) { + throw new Error(`Invalid private ECR URL format: ${url}`); + } + + const [, accountId] = matches; + + return accountId; +} diff --git a/capabilities/webhook.ts b/capabilities/webhook.ts new file mode 100644 index 0000000..190c9fe --- /dev/null +++ b/capabilities/webhook.ts @@ -0,0 +1,259 @@ +import { Capability, Log, a, K8s, kind } from "pepr"; +import { isECRregistry, getAccountId, getRepositoryNames } from "./lib/utils"; +import { ECRPublic, publicECRURLPattern } from "./ecr-public"; +import { ECRPrivate, privateECRURLPattern } from "./ecr-private"; +import { + DeployedPackage, + DeployedComponent, + ZarfComponent, +} from "./zarf-types"; + +/** + * The ECR Capability creates ECR repositories for a Zarf managed ECR registry + */ +export const ECRhook = new Capability({ + name: "ecr", + description: "Create ECR repositories for a Zarf managed ECR registry", + namespaces: ["pepr-system"], +}); + +const webhookName = "ecr-webhook"; + +const { When } = ECRhook; + +When(a.Secret) + .IsCreatedOrUpdated() + .InNamespace("zarf") + .WithLabel("package-deploy-info") + .Mutate(async request => { + const result = await isECRregistry(); + + if (!result.isECR) { + Log.error( + "A valid ECR URL was not found in the Zarf state secret: '" + + result.registryURL + + "'\nPlease provide a valid ECR registry URL.\nExample: '123456789012.dkr.ecr.us-east-1.amazonaws.com'", + ); + } + + const secret = request.Raw; + let deployedPackage: DeployedPackage; + let secretString: string; + let manuallyDecoded = false; + + // Pepr does not decode/encode non-ASCII characters in secret data: https://github.com/defenseunicorns/pepr/issues/219 + try { + secretString = atob(secret.data.data); + manuallyDecoded = true; + } catch (err) { + secretString = secret.data.data; + } + + // Parse the secret object + try { + deployedPackage = JSON.parse(secretString); + } catch (err) { + Log.error(`Failed to parse the secret data: ${err.message}`); + } + + for (const deployedComponent of deployedPackage.deployedComponents) { + for (const component of deployedPackage.data.components) { + if ( + deployedComponent.name === component.name && + deployedComponent.status === "Deploying" && + component.images + ) { + Log.info( + "The component " + + deployedComponent.name + + " is currently deploying", + ); + + const componentWebhook = + deployedPackage.componentWebhooks?.[deployedComponent.name]?.[ + webhookName + ]; + + // Check if the component has a webhook running for the current package generation + if ( + componentWebhook?.observedGeneration === deployedPackage.generation + ) { + Log.debug( + "The component " + + deployedComponent.name + + " has already had a webhook executed for it. Not executing another.", + ); + } else { + // Seed the componentWebhooks map/object + if (!deployedPackage.componentWebhooks) { + deployedPackage.componentWebhooks = {}; + } + + // Update the secret noting that the webhook is running for this component + deployedPackage.componentWebhooks[deployedComponent.name] = { + "ecr-webhook": { + name: webhookName, + status: "Running", + observedGeneration: deployedPackage.generation, + }, + }; + + createReposAndUpdateStatus( + deployedComponent, + result.registryURL, + secret.metadata.name, + component, + ); + } + } + } + } + + if (manuallyDecoded === true) { + secret.data.data = btoa(JSON.stringify(deployedPackage)); + } else { + secret.data.data = JSON.stringify(deployedPackage); + } + }); + +// Create ECR repositories and update webhook status in Zarf package secret +async function createReposAndUpdateStatus( + deployedComponent: DeployedComponent, + registryURL: string, + secretName: string, + zarfComponent: ZarfComponent, +): Promise { + let webhookStatus = "Succeeded"; + + try { + await createRepos(deployedComponent, zarfComponent, registryURL); + } catch (err) { + if (err.message.includes("Error creating ECR repositories")) { + Log.error(`Failed to create ECR repositories: ${err.message}`); + webhookStatus = "Failed"; + } + } finally { + await updateWebhookStatus( + secretName, + deployedComponent.name, + webhookStatus, + ); + } +} + +async function createRepos( + deployedComponent: DeployedComponent, + zarfComponent: ZarfComponent, + registryURL: string, +) { + Log.info( + `Gathering a list of ECR repository names to create for component '${deployedComponent?.name}'`, + ); + + const repoNames = getRepositoryNames(zarfComponent?.images); + + if (!repoNames) { + Log.info( + `No repositories will be created for component '${deployedComponent?.name}`, + ); + return; + } + + const region = process.env.AWS_REGION; + + // Create repositories for private ECR registry + if (privateECRURLPattern.test(registryURL)) { + const accountId = getAccountId(registryURL); + const ecrPrivate = new ECRPrivate(region); + + Log.info("Attempting to create ECR repositories"); + await ecrPrivate.createRepositories(repoNames, accountId); + } + + // Create repositories for public ECR registry + if (publicECRURLPattern.test(registryURL)) { + const ecrPublic = new ECRPublic(region); + + Log.info("Attempting to create ECR repositories"); + await ecrPublic.createRepositories(repoNames); + } +} + +// updateWebhookStatus updates the webhook status in the Zarf package secret +async function updateWebhookStatus( + secretName: string, + componentName: string, + status: string, +): Promise { + const ns = "zarf"; + + let secret: a.Secret; + let secretString: string; + let deployedPackage: DeployedPackage; + let manuallyDecoded = false; + + // Fetch the package secret + try { + secret = await K8s(kind.Secret).InNamespace(ns).Get(secretName); + } catch (err) { + Log.error( + `Error: Failed to get package secret '${secretName}' in namespace '${ns}': ${JSON.stringify( + err, + )}`, + ); + } + + try { + secretString = atob(secret.data.data); + manuallyDecoded = true; + } catch (err) { + secretString = secret.data.data; + } + + // Parse the secret object + try { + deployedPackage = JSON.parse(secretString); + } catch (err) { + Log.error(`Failed to parse the secret data: ${err.message}`); + } + + const componentWebhook = + deployedPackage.componentWebhooks[componentName]?.[webhookName]; + + // Update the webhook status if the observedGeneration matches + if (componentWebhook?.observedGeneration === deployedPackage.generation) { + componentWebhook.status = status; + deployedPackage.componentWebhooks[componentName][webhookName] = + componentWebhook; + } + + if (manuallyDecoded === true) { + secret.data.data = btoa(JSON.stringify(deployedPackage)); + } else { + secret.data.data = JSON.stringify(deployedPackage); + } + + // Use Server-Side force apply to forcefully take ownership of the package secret data.data field + // Doing a Server-Side apply without the force option will result in a FieldManagerConflict error due to Zarf owning the object. + // See the following PR for more information: https://github.com/defenseunicorns/kubernetes-fluent-client/pull/20 + try { + await K8s(kind.Secret).Apply( + { + metadata: { + name: secretName, + namespace: ns, + }, + data: { + data: secret.data.data, + }, + }, + { force: true }, + ); + } catch (err) { + Log.error( + `Error: Failed to update package secret '${secretName}' in namespace '${ns}': ${JSON.stringify( + err, + )}`, + ); + } +} diff --git a/capabilities/zarf-types.ts b/capabilities/zarf-types.ts new file mode 100644 index 0000000..ad217db --- /dev/null +++ b/capabilities/zarf-types.ts @@ -0,0 +1,48 @@ +export interface DeployedPackage { + componentWebhooks?: { [key: string]: { [key: string]: Webhook } }; + deployedComponents: DeployedComponent[]; + generation: number; + name: string; + data: ZarfPackage; +} + +export interface ZarfPackage { + components: ZarfComponent[]; +} + +export interface ZarfComponent { + images?: string[]; + name: string; +} + +export interface DeployedComponent { + images: string[]; + name: string; + observedGeneration: number; + status: string; +} + +export interface Webhook { + name: string; + observedGeneration: number; + status: string; + waitDurationSeconds?: number; +} + +export interface ZarfState { + /** + * Information about the container registry Zarf is configured to use + */ + registryInfo: RegistryInfo; +} + +export interface RegistryInfo { + /** + * URL address of the registry + */ + address: string; + /** + * Indicates if we are using a registry that Zarf is directly managing + */ + internalRegistry: boolean; +} diff --git a/docs/development.md b/docs/development.md new file mode 100644 index 0000000..7eab0b9 --- /dev/null +++ b/docs/development.md @@ -0,0 +1,78 @@ +# Update the Zarf ECR init package + +## Update the Pepr module + +### Run unit tests + +When making changes to the Pepr *.ts files are made, you can run the unit tests locally to test your changes: + +```bash +make test-module +``` + +### Format the Pepr module + +```bash +make format-module +``` + +### Rebuild the Pepr module + +```bash +make build-module +``` + +## Create EKS cluster + +```bash +make deploy-eks-package CLUSTER_NAME=my-cluster-name +``` + +## Create IAM roles to authenticate to ECR + +Note: The EKS cluster that is provided via CLUSTER_NAME must be ready/available + +```bash +make create-iam CLUSTER_NAME=my-cluster-name +``` + +## Build the AWS init package + +```bash +make aws-init-package +``` + +## Update the Zarf config file with registry type and IAM role ARNs + +```bash +# Change REGISTRY_TYPE to public as needed +make update-zarf-config REGISTRY_TYPE="private" +``` + +## Zarf init + +Note: Ensure the init package is in the root of the repository so that the zarf-config.toml file can be used: + +```bash +cp ./build/zarf-init-*.tar.zst . +``` + +```bash +# Private ECR registry +zarf init \ + --registry-url="$(aws sts get-caller-identity --query 'Account' --output text).dkr.ecr.us-east-1.amazonaws.com" \ + --registry-push-username="AWS" \ + --registry-push-password="$(aws ecr get-login-password --region us-east-1)" \ + --components="zarf-ecr-credential-helper" \ + --confirm +``` + +```bash +# Public ECR registry +zarf init \ + --registry-url="$(aws ecr-public describe-registries --query 'registries[0].registryUri' --output text --region us-east-1)" \ + --registry-push-username="AWS" \ + --registry-push-password="$(aws ecr-public get-login-password --region us-east-1)" \ + --components="zarf-ecr-credential-helper" \ + --confirm +``` diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..3c9ec0f --- /dev/null +++ b/go.mod @@ -0,0 +1,54 @@ +module main + +go 1.21.1 + +require ( + github.com/aws/aws-sdk-go v1.45.25 + k8s.io/apimachinery v0.28.2 + k8s.io/client-go v0.28.2 + k8s.io/klog/v2 v2.100.1 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/go-logr/logr v1.2.4 // indirect + github.com/go-openapi/jsonpointer v0.20.0 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.4 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.5.9 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/pprof v0.0.0-20230509042627-b1315fad0c5a // indirect + github.com/google/uuid v1.3.1 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/onsi/ginkgo/v2 v2.13.0 // indirect + github.com/onsi/gomega v1.27.10 // indirect + github.com/rogpeppe/go-internal v1.11.0 // indirect + golang.org/x/net v0.17.0 // indirect + golang.org/x/oauth2 v0.11.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/term v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect + golang.org/x/time v0.3.0 // indirect + golang.org/x/tools v0.13.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/protobuf v1.31.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/api v0.28.2 // indirect + k8s.io/kube-openapi v0.0.0-20230816210353-14e408962443 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.3.0 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..92f25e4 --- /dev/null +++ b/go.sum @@ -0,0 +1,181 @@ +github.com/aws/aws-sdk-go v1.45.25 h1:c4fLlh5sLdK2DCRTY1z0hyuJZU4ygxX8m1FswL6/nF4= +github.com/aws/aws-sdk-go v1.45.25/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= +github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20230509042627-b1315fad0c5a h1:PEOGDI1kkyW37YqPWHLHc+D20D9+87Wt12TCcfTUo5Q= +github.com/google/pprof v0.0.0-20230509042627-b1315fad0c5a/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.28.2 h1:9mpl5mOb6vXZvqbQmankOfPIGiudghwCoLl1EYfUZbw= +k8s.io/api v0.28.2/go.mod h1:RVnJBsjU8tcMq7C3iaRSGMeaKt2TWEUXcpIt/90fjEg= +k8s.io/apimachinery v0.28.2 h1:KCOJLrc6gu+wV1BYgwik4AF4vXOlVJPdiqn0yAWWwXQ= +k8s.io/apimachinery v0.28.2/go.mod h1:RdzF87y/ngqk9H4z3EL2Rppv5jj95vGS/HaFXrLDApU= +k8s.io/client-go v0.28.2 h1:DNoYI1vGq0slMBN/SWKMZMw0Rq+0EQW6/AK4v9+3VeY= +k8s.io/client-go v0.28.2/go.mod h1:sMkApowspLuc7omj1FOSUxSoqjr+d5Q0Yc0LOFnYFJY= +k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= +k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20230816210353-14e408962443 h1:CAIciCnJnSOQxPd0xvpV6JU3D4AJvnYbImPpFpO9Hnw= +k8s.io/kube-openapi v0.0.0-20230816210353-14e408962443/go.mod h1:wZK2AVp1uHCp4VamDVgBP2COHZjqD1T68Rf0CM3YjSM= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.3.0 h1:UZbZAZfX0wV2zr7YZorDz6GXROfDFj6LvqCRm4VUVKk= +sigs.k8s.io/structured-merge-diff/v4 v4.3.0/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/hack/.templates/grype.tmpl b/hack/.templates/grype.tmpl new file mode 100644 index 0000000..74952ec --- /dev/null +++ b/hack/.templates/grype.tmpl @@ -0,0 +1,4 @@ +"Package","Version","Fixed In","Vulnerability ID","Severity","Path(s)" +{{- range .Matches}} +"{{.Artifact.Name}}","{{.Artifact.Version}}","{{range .Vulnerability.Fix.Versions}}{{.}}{{end}}","{{.Vulnerability.ID}}","{{.Vulnerability.Severity}}","{{range .Artifact.Locations}}{{.RealPath}}{{end}}" +{{- end}} diff --git a/hack/ecr.sh b/hack/ecr.sh new file mode 100755 index 0000000..54f645b --- /dev/null +++ b/hack/ecr.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +REPO_NAME="defenseunicorns/pepr/controller" +ECR_CMD="ecr" + +# Validate the input for registry type +if [ "$ZARF_VAR_REGISTRY_TYPE" != "public" ] && [ "$ZARF_VAR_REGISTRY_TYPE" != "private" ]; then + echo "Error: Invalid registry type. Please specify 'public' or 'private'." + exit 1 +fi + +# When authenticating to a public registry, always authenticate to the us-east-1 region when using the AWS CLI. +# https://docs.aws.amazon.com/AmazonECR/latest/public/public-registries.html#public-registry-auth +if [ "$ZARF_VAR_REGISTRY_TYPE" = "public" ]; then + + if [ "$ZARF_VAR_AWS_REGION" != "us-east-1" ]; then + echo "Error: Invalid region: ECR public registries are only available in the us-east-1 region." + exit 1 + fi + + ECR_CMD="ecr-public" +fi + +# Create an ECR repository for the Pepr controller image if it doesn't already exist +if ! aws "$ECR_CMD" describe-repositories \ + --repository-names "$REPO_NAME" \ + --region "$ZARF_VAR_AWS_REGION" >/dev/null 2>&1 +then + ARGS=("--repository-name" "$REPO_NAME" "--region" "$ZARF_VAR_AWS_REGION") + + if [ "$ZARF_VAR_REGISTRY_TYPE" = "private" ]; then + ARGS+=("--image-scanning-configuration" "scanOnPush=true" "--image-tag-mutability" "IMMUTABLE") + fi + + aws "$ECR_CMD" create-repository "${ARGS[@]}" +fi + diff --git a/hack/update-zarf-config.mjs b/hack/update-zarf-config.mjs new file mode 100644 index 0000000..af12556 --- /dev/null +++ b/hack/update-zarf-config.mjs @@ -0,0 +1,61 @@ +import { readFile, writeFile } from "fs"; + +const filePath = "../zarf-config.toml"; + +// Config file keys +const registryType = "registry_type"; +const ecrWebhookRoleArn = "ecr_hook_role_arn"; +const ecrCredentialHelperRoleArn = "ecr_credential_helper_role_arn"; + +const args = process.argv.slice(2); + +// Validate registry type input +if (args[0] !== "private" && args[0] !== "public") { + console.log("First argument must be either 'public' or 'private' to specify ECR registry type"); + process.exit(1); +} + +// Validate role ARN inputs +if (!args[1]) { + console.log("Second argument must be an IAM role ARN for the ECR webhook"); + process.exit(1); +} +if (!args[2]) { + console.log("Third argument must be an IAM role ARN for the ECR credential helper"); + process.exit(1); +} + +readFile(filePath, "utf8", (err, data) => { + if (err) { + console.error(err); + return; + } + + // Update Zarf config file values + const pattern = `\\s*=\\s*['"].*['"]` + + let updatedConfig = data; + + updatedConfig = updatedConfig.replace( + new RegExp(`${registryType}${pattern}`), + `${registryType} = '${args[0]}'` + ); + + updatedConfig = updatedConfig.replace( + new RegExp(`${ecrWebhookRoleArn}${pattern}`), + `${ecrWebhookRoleArn} = '${args[1]}'` + ); + + updatedConfig = updatedConfig.replace( + new RegExp(`${ecrCredentialHelperRoleArn}${pattern}`), + `${ecrCredentialHelperRoleArn} = '${args[2]}'` + ); + + writeFile(filePath, updatedConfig, "utf8", (err) => { + if (err) { + console.error(err); + return; + } + console.log("Zarf config file updated successfully."); + }); +}); diff --git a/iam/Pulumi.yaml b/iam/Pulumi.yaml new file mode 100644 index 0000000..284a39d --- /dev/null +++ b/iam/Pulumi.yaml @@ -0,0 +1,3 @@ +name: iam +runtime: nodejs +description: IaC to provision IAM resources for IRSA authentication in CI diff --git a/iam/index.ts b/iam/index.ts new file mode 100644 index 0000000..861b281 --- /dev/null +++ b/iam/index.ts @@ -0,0 +1,86 @@ +import { Output } from "@pulumi/pulumi"; +import { join } from "path"; +import { + createPolicy, + createRole, + attachPolicyToRole, + getAccountId, + getClusterId, +} from "./utils"; + +// Resource names +const webhookRoleName = "ecr-webhook-role"; +const webhookPolicyName = "ecr-webhook-policy"; +const credentialHelperRoleName = "ecr-credential-helper-role"; +const credentialHelperPolicyName = "ecr-credential-helper-policy"; + +// File names for IAM resources +const jsonFilesDir = join(__dirname, "json"); +const webhookPolicyPath = join(jsonFilesDir, "ecr-webhook-policy.json"); +const webhookRolePath = join(jsonFilesDir, "ecr-webhook-role.json"); +const credentialHelperPolicyPath = join( + jsonFilesDir, + "ecr-credential-helper-policy.json", +); +const credentialHelperRolePath = join( + jsonFilesDir, + "ecr-credential-helper-role.json", +); + +const main = async () => { + const clusterId = await getClusterId(); + const accountId = await getAccountId(); + + // Create webhook IAM policy + const webhookPolicy = createPolicy(webhookPolicyPath, webhookPolicyName); + + // Create webhook IAM role + const webhookRole = createRole( + webhookRolePath, + webhookRoleName, + accountId, + clusterId as string, + ); + + // Create credential helper IAM policy + const credentialHelperPolicy = createPolicy( + credentialHelperPolicyPath, + credentialHelperPolicyName, + ); + + // Create credential helper IAM role + const credentialHelperRole = createRole( + credentialHelperRolePath, + credentialHelperRoleName, + accountId, + clusterId as string, + ); + + // Attach webhook policy to role + attachPolicyToRole( + "ecr-webhook-policy-attachment", + webhookRole.name as unknown as string, + webhookPolicy.arn as unknown as string, + ); + + // Attach credential helper policy to role + attachPolicyToRole( + "ecr-credential-helper-policy-attachment", + credentialHelperRole.name as unknown as string, + credentialHelperPolicy.arn as unknown as string, + ); + + const webhookRoleArn = webhookRole.arn; + const credentialHelperRoleArn = credentialHelperRole.arn; + + return [webhookRoleArn, credentialHelperRoleArn]; +}; + +const outputs = main(); + +export const webhookRoleArn: Promise> = outputs.then( + result => result[0], +); +export const credentialHelperRoleArn: Promise> = outputs.then( + result => result[1], +); diff --git a/iam/json/ecr-credential-helper-policy.json b/iam/json/ecr-credential-helper-policy.json new file mode 100644 index 0000000..94b21d5 --- /dev/null +++ b/iam/json/ecr-credential-helper-policy.json @@ -0,0 +1,13 @@ +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "ecr:GetAuthorizationToken", + "ecr-public:GetAuthorizationToken" + ], + "Resource": "*" + } + ] +} diff --git a/iam/json/ecr-credential-helper-role.json b/iam/json/ecr-credential-helper-role.json new file mode 100644 index 0000000..3d42565 --- /dev/null +++ b/iam/json/ecr-credential-helper-role.json @@ -0,0 +1,17 @@ +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Federated": "arn:aws:iam::{{AWS_ACCOUNT_ID}}:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/{{EKS_CLUSTER_ID}}" + }, + "Action": "sts:AssumeRoleWithWebIdentity", + "Condition": { + "StringEquals": { + "oidc.eks.us-east-1.amazonaws.com/id/{{EKS_CLUSTER_ID}}:sub": "system:serviceaccount:zarf:zarf-ecr-credential-helper" + } + } + } + ] +} diff --git a/iam/json/ecr-webhook-policy.json b/iam/json/ecr-webhook-policy.json new file mode 100644 index 0000000..d79cb3c --- /dev/null +++ b/iam/json/ecr-webhook-policy.json @@ -0,0 +1,15 @@ +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "ecr:DescribeRepositories", + "ecr:CreateRepository", + "ecr-public:DescribeRepositories", + "ecr-public:CreateRepository" + ], + "Resource": "*" + } + ] +} diff --git a/iam/json/ecr-webhook-role.json b/iam/json/ecr-webhook-role.json new file mode 100644 index 0000000..c2756ec --- /dev/null +++ b/iam/json/ecr-webhook-role.json @@ -0,0 +1,17 @@ +{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": { + "Federated": "arn:aws:iam::{{AWS_ACCOUNT_ID}}:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/{{EKS_CLUSTER_ID}}" + }, + "Action": "sts:AssumeRoleWithWebIdentity", + "Condition": { + "StringEquals": { + "oidc.eks.us-east-1.amazonaws.com/id/{{EKS_CLUSTER_ID}}:sub": "system:serviceaccount:pepr-system:pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0" + } + } + } + ] +} diff --git a/iam/package-lock.json b/iam/package-lock.json new file mode 100644 index 0000000..0776a1a --- /dev/null +++ b/iam/package-lock.json @@ -0,0 +1,2163 @@ +{ + "name": "iam", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "iam", + "dependencies": { + "@pulumi/aws": "^6.4.1", + "@pulumi/pulumi": "^3.0.0" + }, + "devDependencies": { + "@types/node": "^16" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.5.tgz", + "integrity": "sha512-iouYNlPxRAwZ2XboDT+OfRKHuaKHiqjB5VFYZ0NFrHkbEF+AV3muIUY9olQsp8uxU4VvRCMiRk9ftzFDGb61aw==", + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.10.tgz", + "integrity": "sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@logdna/tail-file": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@logdna/tail-file/-/tail-file-2.2.0.tgz", + "integrity": "sha512-XGSsWDweP80Fks16lwkAUIr54ICyBs6PsI4mpfTLQaWgEJRtY9xEV+PeyDpJ+sJEGZxqINlpmAwe/6tS1pP8Ng==", + "engines": { + "node": ">=10.3.0" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.6.0.tgz", + "integrity": "sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-metrics": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.32.0.tgz", + "integrity": "sha512-g1WLhpG8B6iuDyZJFRGsR+JKyZ94m5LEmY2f+duEJ9Xb4XRlLHrZvh6G34OH6GJ8iDHxfHb/sWjJ1ZpkI9yGMQ==", + "deprecated": "Please use @opentelemetry/api >= 1.3.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.17.1.tgz", + "integrity": "sha512-up5I+RiQEkGrVEHtbAtmRgS+ZOnFh3shaDNHqZPBlGy+O92auL6yMmjzYpSKmJOGWowvs3fhVHePa8Exb5iHUg==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.7.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.17.1.tgz", + "integrity": "sha512-I6LrZvl1FF97FQXPR0iieWQmKnGxYtMbWA1GrAXnLUR+B1Hn2m8KqQNEIlZAucyv00GBgpWkpllmULmZfG8P3g==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.17.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.7.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.17.1.tgz", + "integrity": "sha512-FaLZlIhdpxlZiKu/G8OvA+so4xoCL1hCo/JgNdeSxzI4GnJrmFFbZT6DXgUzXJO7F9Qw3KDE1cBFUHawLVz58g==", + "dependencies": { + "@opentelemetry/core": "1.17.1", + "@opentelemetry/resources": "1.17.1", + "@opentelemetry/sdk-trace-base": "1.17.1", + "@opentelemetry/semantic-conventions": "1.17.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.32.0.tgz", + "integrity": "sha512-y6ADjHpkUz/v1nkyyYjsQa/zorhX+0qVGpFvXMcbjU4sHnBnC02c6wcc93sIgZfiQClIWo45TGku1KQxJ5UUbQ==", + "dependencies": { + "@opentelemetry/api-metrics": "0.32.0", + "require-in-the-middle": "^5.0.3", + "semver": "^7.3.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.32.0.tgz", + "integrity": "sha512-Az6wdkPx/Mi26lT9LKFV6GhCA9prwQFPz5eCNSExTnSP49YhQ7XCjzPd2POPeLKt84ICitrBMdE1mj0zbPdLAQ==", + "dependencies": { + "@opentelemetry/api-metrics": "0.32.0", + "@opentelemetry/instrumentation": "0.32.0", + "@opentelemetry/semantic-conventions": "1.6.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.6.0.tgz", + "integrity": "sha512-aPfcBeLErM/PPiAuAbNFLN5sNbZLc3KZlar27uohllN8Zs6jJbHyJU1y7cMA6W/zuq+thkaG8mujiS+3iD/FWQ==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.17.1.tgz", + "integrity": "sha512-XEbXYb81AM3ayJLlbJqITPIgKBQCuby45ZHiB9mchnmQOffh6ZJOmXONdtZAV7TWzmzwvAd28vGSUk57Aw/5ZA==", + "dependencies": { + "@opentelemetry/core": "1.17.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.7.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.17.1.tgz", + "integrity": "sha512-p+P4lf2pbqd3YMfZO15QCGsDwR2m1ke2q5+dq6YBLa/q0qiC2eq4cD/qhYBBed5/X4PtdamaVGHGsp+u3GXHDA==", + "dependencies": { + "@opentelemetry/core": "1.17.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.7.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.17.1.tgz", + "integrity": "sha512-M2e5emqg5I7qRKqlzKx0ROkcPyF8PbcSaWEdsm72od9txP7Z/Pl8PDYOyu80xWvbHAWk5mDxOF6v3vNdifzclA==", + "dependencies": { + "@opentelemetry/core": "1.17.1", + "@opentelemetry/semantic-conventions": "1.17.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.7.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.17.1.tgz", + "integrity": "sha512-pfSJJSjZj5jkCJUQZicSpzN8Iz9UKMryPWikZRGObPnJo6cUSoKkjZh6BM3j+D47G4olMBN+YZKYqkFM1L6zNA==", + "dependencies": { + "@opentelemetry/core": "1.17.1", + "@opentelemetry/resources": "1.17.1", + "@opentelemetry/semantic-conventions": "1.17.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.7.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.17.1.tgz", + "integrity": "sha512-J56DaG4cusjw5crpI7x9rv4bxDF27DtKYGxXJF56KIvopbNKpdck5ZWXBttEyqgAVPDwHMAXWDL1KchHzF0a3A==", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.17.1", + "@opentelemetry/core": "1.17.1", + "@opentelemetry/propagator-b3": "1.17.1", + "@opentelemetry/propagator-jaeger": "1.17.1", + "@opentelemetry/sdk-trace-base": "1.17.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.7.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.17.1.tgz", + "integrity": "sha512-xbR2U+2YjauIuo42qmE8XyJK6dYeRMLJuOlUP5SO4auET4VtOHOzgkRVOq+Ik18N+Xf3YPcqJs9dZMiDddz1eQ==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@pulumi/aws": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@pulumi/aws/-/aws-6.4.1.tgz", + "integrity": "sha512-LAbsVY+8p3r1Q2b6wtYbVYfyLbEeH8Rn+0ctO+VSSWT/aJIPITr0M+xks3z8vhtJ5SnlUNiNgVnhZhbK4esjyg==", + "dependencies": { + "@pulumi/pulumi": "^3.0.0", + "builtin-modules": "3.0.0", + "mime": "^2.0.0", + "read-package-tree": "^5.2.1", + "resolve": "^1.7.1" + } + }, + "node_modules/@pulumi/pulumi": { + "version": "3.88.0", + "resolved": "https://registry.npmjs.org/@pulumi/pulumi/-/pulumi-3.88.0.tgz", + "integrity": "sha512-2Jf3BgamQoQ7gC3w1FNU/nFHT2CzVIgAh++MEWoohTKgYGSUwQnxCbOdGf7mN4kOKrpobi8/o8o1hSCQxMaBqA==", + "dependencies": { + "@grpc/grpc-js": "^1.8.16", + "@logdna/tail-file": "^2.0.6", + "@opentelemetry/api": "^1.2.0", + "@opentelemetry/exporter-zipkin": "^1.6.0", + "@opentelemetry/instrumentation": "^0.32.0", + "@opentelemetry/instrumentation-grpc": "^0.32.0", + "@opentelemetry/resources": "^1.6.0", + "@opentelemetry/sdk-trace-base": "^1.6.0", + "@opentelemetry/sdk-trace-node": "^1.6.0", + "@opentelemetry/semantic-conventions": "^1.6.0", + "@pulumi/query": "^0.3.0", + "execa": "^5.1.0", + "google-protobuf": "^3.5.0", + "ini": "^2.0.0", + "js-yaml": "^3.14.0", + "minimist": "^1.2.6", + "normalize-package-data": "^3.0.0", + "pkg-dir": "^7.0.0", + "read-package-tree": "^5.3.1", + "require-from-string": "^2.0.1", + "semver": "^7.5.2", + "source-map-support": "^0.5.6", + "ts-node": "^7.0.1", + "typescript": "~3.8.3", + "upath": "^1.1.0" + }, + "engines": { + "node": ">=8.13.0 || >=10.10.0" + } + }, + "node_modules/@pulumi/query": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@pulumi/query/-/query-0.3.0.tgz", + "integrity": "sha512-xfo+yLRM2zVjVEA4p23IjQWzyWl1ZhWOGobsBqRpIarzLvwNH/RAGaoehdxlhx4X92302DrpdIFgTICMN4P38w==" + }, + "node_modules/@types/node": { + "version": "16.18.58", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.58.tgz", + "integrity": "sha512-YGncyA25/MaVtQkjWW9r0EFBukZ+JulsLcVZBlGUfIb96OBMjkoRWwQo5IEWJ8Fj06Go3GHw+bjYDitv6BaGsA==" + }, + "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==", + "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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", + "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==" + }, + "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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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==" + }, + "node_modules/builtin-modules": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.0.0.tgz", + "integrity": "sha512-hMIeU4K2ilbXV6Uv93ZZ0Avg/M91RaKXucQ+4me2Do1txxBDyDZWCBa5bJSLqoNTRpXTLwEzIk1KmloenDDjhg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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==", + "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==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "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==", + "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==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "engines": { + "node": "*" + } + }, + "node_modules/define-data-property": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", + "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "engines": { + "node": ">=0.3.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==" + }, + "node_modules/es-abstract": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", + "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "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==", + "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==", + "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/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "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==" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==" + }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "engines": { + "node": ">=10.17.0" + } + }, + "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==", + "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==" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "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==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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==" + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "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==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==" + }, + "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==" + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "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==", + "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==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, + "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==" + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "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==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", + "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", + "dependencies": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "safe-array-concat": "^1.0.0" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "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==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "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==", + "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==", + "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==" + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/read-package-json": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", + "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", + "dependencies": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "node_modules/read-package-json/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/read-package-json/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-package-json/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-package-tree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", + "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", + "deprecated": "The functionality that this package provided is now in @npmcli/arborist", + "dependencies": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } + }, + "node_modules/readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "deprecated": "This functionality has been moved to @npmcli/fs", + "dependencies": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.2.0.tgz", + "integrity": "sha512-efCx3b+0Z69/LGJmm9Yvi4cqEdxnoGnxYxGxBghkkTTFeXRtTCmmhO0AnAfHz59k957uTSuy8WaHqOs8wbYUWg==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "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/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "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==", + "engines": { + "node": ">=6" + } + }, + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "dependencies": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "bin": { + "ts-node": "dist/bin.js" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/util-promisify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", + "integrity": "sha512-K+5eQPYs14b3+E+hmE2J6gCZ4JmMl9DbYS6BeP2CHq6WMuNxErxf5B/n0fz85L8zUuoO6rIzNNmIQDu/j+1OcA==", + "dependencies": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/iam/package.json b/iam/package.json new file mode 100644 index 0000000..60ef080 --- /dev/null +++ b/iam/package.json @@ -0,0 +1,11 @@ +{ + "name": "iam", + "main": "index.ts", + "devDependencies": { + "@types/node": "^16" + }, + "dependencies": { + "@pulumi/aws": "^6.4.1", + "@pulumi/pulumi": "^3.0.0" + } +} diff --git a/iam/tsconfig.json b/iam/tsconfig.json new file mode 100644 index 0000000..2f316ea --- /dev/null +++ b/iam/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "strict": true, + "outDir": "bin", + "target": "es2020", + "module": "CommonJS", + "moduleResolution": "node", + "sourceMap": true, + "experimentalDecorators": true, + "pretty": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.ts" + ] +} diff --git a/iam/utils.ts b/iam/utils.ts new file mode 100644 index 0000000..ded21b1 --- /dev/null +++ b/iam/utils.ts @@ -0,0 +1,77 @@ +import { iam, getCallerIdentity } from "@pulumi/aws"; +import { getCluster } from "@pulumi/aws/eks"; +import { readFileSync } from "fs"; + +export function createPolicy(file: string, policyName: string) { + const policy = readFile(file); + return new iam.Policy(policyName, { + policy: policy, + }); +} + +export function createRole( + file: string, + roleName: string, + accountId: string, + clusterId: string, +) { + const placeholderRole = readFile(file); + + const partiallyUpdatedRole = placeholderRole.replace( + new RegExp("{{AWS_ACCOUNT_ID}}", "g"), + accountId, + ); + + const updatedRole = partiallyUpdatedRole.replace( + new RegExp("{{EKS_CLUSTER_ID}}", "g"), + clusterId, + ); + + return new iam.Role(roleName, { + assumeRolePolicy: updatedRole, + }); +} + +export function attachPolicyToRole( + name: string, + roleName: string, + policyArn: string, +) { + return new iam.RolePolicyAttachment(name, { + role: roleName, + policyArn: policyArn, + }); +} + +export async function getClusterId(): Promise { + const clusterName = process.env.CLUSTER_NAME; + + if (!clusterName) { + throw new Error( + "CLUSTER_NAME environment variable must be set with a valid EKS cluster name", + ); + } + + try { + const cluster = await getCluster({ + name: clusterName, + }); + const oidcIssuer = cluster.identities[0].oidcs[0].issuer; + const clusterId = oidcIssuer.split("/").pop(); + if (clusterId === undefined) { + throw new Error("EKS cluster OIDC provider ID is undefined"); + } + return clusterId; + } catch (err) { + throw new Error(`Failed to get EKS cluster info: ${err}`); + } +} + +export async function getAccountId(): Promise { + const callerId = await getCallerIdentity({}); + return callerId.accountId; +} + +export function readFile(filename: string): string { + return readFileSync(filename, "utf8"); +} diff --git a/jest.config.json b/jest.config.json new file mode 100644 index 0000000..2717f58 --- /dev/null +++ b/jest.config.json @@ -0,0 +1,4 @@ +{ + "preset": "ts-jest", + "testEnvironment": "node" +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..9661b06 --- /dev/null +++ b/main.go @@ -0,0 +1,151 @@ +// Package main updates Zarf image pull secrets with new ECR tokens +package main + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "os" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/ecr" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" + "k8s.io/klog/v2" +) + +const ( + zarfNamespace = "zarf" + zarfImagePullSecret = "private-registry" + zarfStateSecret = "zarf-state" + zarfAgentLabel = "zarf.dev/agent" + zarfManagedByLabel = "app.kubernetes.io/managed-by" +) + +func main() { + clientset, err := newK8sClient() + if err != nil { + klog.Errorf("failed to create Kubernetes clientset: %v", err) + os.Exit(1) + } + + ecrURL, err := getECRURL(clientset) + if err != nil { + klog.Errorf("failed to get ECR URL from zarf-state secret: %v", err) + os.Exit(1) + } + + authToken, err := fetchECRToken() + if err != nil { + klog.Errorf("failed to fetch ECR token: %v", err) + os.Exit(1) + } + + err = updateZarfManagedImageSecrets(clientset, ecrURL, authToken) + if err != nil { + klog.Errorf("failed to update ECR image pull credentials: %v", err) + os.Exit(1) + } +} + +func newK8sClient() (*kubernetes.Clientset, error) { + config, err := rest.InClusterConfig() + if err != nil { + return nil, fmt.Errorf("failed to create Kubernetes config: %w", err) + } + + clientset, err := kubernetes.NewForConfig(config) + if err != nil { + return nil, fmt.Errorf("failed to create Kubernetes client: %w", err) + } + + return clientset, nil +} + +func getECRURL(clientset *kubernetes.Clientset) (string, error) { + secret, err := clientset.CoreV1().Secrets(zarfNamespace).Get(context.TODO(), zarfStateSecret, metav1.GetOptions{}) + if err != nil { + return "", fmt.Errorf("failed to get secret '%s' in namespace '%s': %w", zarfStateSecret, zarfNamespace, err) + } + + var zarfState zarfState + if err = json.Unmarshal(secret.Data["state"], &zarfState); err != nil { + return "", fmt.Errorf("failed to unmarshal 'secret.data.state' from the '%s' secret", zarfStateSecret) + } + + return zarfState.RegistryInfo.Address, nil +} + +func fetchECRToken() (string, error) { + region := os.Getenv("AWS_REGION") + if region == "" { + return "", errors.New("AWS_REGION environment variable is not set") + } + + sess, err := session.NewSessionWithOptions(session.Options{ + Config: aws.Config{Region: aws.String(region)}, + }) + if err != nil { + return "", fmt.Errorf("failed to create AWS session: %w", err) + } + + ecrClient := ecr.New(sess) + + authOutput, err := ecrClient.GetAuthorizationToken(&ecr.GetAuthorizationTokenInput{}) + if err != nil { + return "", fmt.Errorf("error calling GetAuthorizationToken(): %w", err) + } + + if len(authOutput.AuthorizationData) == 0 { + return "", errors.New("No authorization data received") + } + + return *authOutput.AuthorizationData[0].AuthorizationToken, nil +} + +func updateZarfManagedImageSecrets(clientset *kubernetes.Clientset, ecrURL string, authToken string) error { + namespaces, err := clientset.CoreV1().Namespaces().List(context.TODO(), metav1.ListOptions{}) + if err != nil { + return fmt.Errorf("error listing namespaces: %w", err) + } + + for _, namespace := range namespaces.Items { + registrySecret, err := clientset.CoreV1().Secrets(namespace.Name).Get(context.TODO(), zarfImagePullSecret, metav1.GetOptions{}) + if err != nil { + continue + } + + // Check if this is a Zarf managed secret or is in a namespace the Zarf agent will take action in + if registrySecret.Labels[zarfManagedByLabel] == "zarf" || + (namespace.Labels[zarfAgentLabel] != "skip" && namespace.Labels[zarfAgentLabel] != "ignore") { + + // Update the secret with the new ECR auth token + dockerConfigJSON := dockerConfig{ + Auths: dockerConfigEntry{ + ecrURL: dockerConfigEntryWithAuth{ + Auth: authToken, + }, + }, + } + dockerConfigData, err := json.Marshal(dockerConfigJSON) + if err != nil { + klog.Warningf("Failed to marshal docker config data for secret '%s' in namespace '%s': %v\n", registrySecret.Name, namespace.Name, err) + continue + } + + registrySecret.Data[".dockerconfigjson"] = dockerConfigData + + updatedRegistrySecret, err := clientset.CoreV1().Secrets(namespace.Name).Update(context.TODO(), registrySecret, metav1.UpdateOptions{}) + if err != nil { + return fmt.Errorf("failed to update secret '%s' in namespace '%s': %w", updatedRegistrySecret.Name, namespace.Name, err) + } + } + + klog.Infof("Successfully updated secret '%s' in namespace '%s'\n", registrySecret.Name, namespace.Name) + } + + return nil +} diff --git a/manifests/kustomization.yaml b/manifests/kustomization.yaml new file mode 100644 index 0000000..91b97bf --- /dev/null +++ b/manifests/kustomization.yaml @@ -0,0 +1,7 @@ +resources: + - pepr-module-b95dbd80-e078-5eb9-aaf3-bcb9567417d0.yaml + +patches: + - path: patches/add-service-account-annotation.patch.yaml + - path: patches/add-env-var.patch.yaml + - path: patches/replace-image-ref.patch.yaml diff --git a/manifests/patches/add-env-var.patch.yaml b/manifests/patches/add-env-var.patch.yaml new file mode 100644 index 0000000..f5550a1 --- /dev/null +++ b/manifests/patches/add-env-var.patch.yaml @@ -0,0 +1,16 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + namespace: pepr-system +spec: + selector: + matchLabels: + app: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + template: + spec: + containers: + - name: server + env: + - name: AWS_REGION + value: "###ZARF_VAR_AWS_REGION###" diff --git a/manifests/patches/add-service-account-annotation.patch.yaml b/manifests/patches/add-service-account-annotation.patch.yaml new file mode 100644 index 0000000..1444076 --- /dev/null +++ b/manifests/patches/add-service-account-annotation.patch.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + namespace: pepr-system + annotations: + eks.amazonaws.com/role-arn: "###ZARF_VAR_ECR_HOOK_ROLE_ARN###" diff --git a/manifests/patches/replace-image-ref.patch.yaml b/manifests/patches/replace-image-ref.patch.yaml new file mode 100644 index 0000000..ee8fa9f --- /dev/null +++ b/manifests/patches/replace-image-ref.patch.yaml @@ -0,0 +1,14 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + namespace: pepr-system +spec: + selector: + matchLabels: + app: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + template: + spec: + containers: + - name: server + image: "###ZARF_REGISTRY###/###ZARF_CONST_PEPR_IMAGE###:###ZARF_CONST_PEPR_IMAGE_TAG###" diff --git a/manifests/pepr-module-b95dbd80-e078-5eb9-aaf3-bcb9567417d0.yaml b/manifests/pepr-module-b95dbd80-e078-5eb9-aaf3-bcb9567417d0.yaml new file mode 100644 index 0000000..87fb8bf --- /dev/null +++ b/manifests/pepr-module-b95dbd80-e078-5eb9-aaf3-bcb9567417d0.yaml @@ -0,0 +1,279 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: pepr-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 +rules: + - apiGroups: + - '*' + resources: + - '*' + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 +subjects: + - kind: ServiceAccount + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + namespace: pepr-system +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + namespace: pepr-system +--- +apiVersion: v1 +kind: Secret +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-api-token + namespace: pepr-system +type: Opaque +data: + value: >- + YWQ3ZjNkOGE3Y2M3MWViODc3ZjdjYjg1ZWE4NjUyOGVmZmYzNjk0ZTc0MTJiZmJlMjBjMmNiYzRjNmMxNjJkMA== +--- +apiVersion: v1 +kind: Secret +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-tls + namespace: pepr-system +type: kubernetes.io/tls +data: + tls.crt: >- + LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpNSUlDd3pDQ0FhdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURBQU1CNFhEVEl6TVRBeE56RTFORGt3DQpNVm9YRFRJME1UQXhOekUxTkRrd01Wb3dBRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DDQpnZ0VCQUxKeUR3UFdOcHNLYlZDczk3bnJmYkY1N2RhaUJCa3cxeHo2L2JYcjF5M1loZDZtWFEvc1Z2N21kOEgyDQp6cTI4VWZvRnV0UFZ0YXJpVmZKdGNBRVlqL2k5TjErWXRONE5iU1NKZVhVRktVSFdIVWhWTm5waGFQUkJ4WWgvDQpRUEJVN1R5LzVmZFBVUDJkZGZ0WWtrc0l0UEdabnhQekRHZW0zb2ZDK3NoZVBPSkkwbDBmWkw5M0R2eEVnSDNrDQpzTStPUHgvdlpCUmNFMWdPZ2ZBeGRHOHpTSE50aU5qcXJCOVM1VS9PZTl1ZEYyVHJjM1d0eVdXbnk5b2RHNXJMDQpIWlgwMXdRUElkZHVGUll2cGN0amRHRnNmV0E4NEpIeWE0S0dqY0RHWCtGZlRlS25NMVVyQ09YYVRzS2orbitpDQorT2ozZWh1ZUZUeTlWU2dmWDVVUTloUTYzNFVDQXdFQUFhTklNRVl3UkFZRFZSMFJCRDB3TzRJNWNHVndjaTFpDQpPVFZrWW1RNE1DMWxNRGM0TFRWbFlqa3RZV0ZtTXkxaVkySTVOVFkzTkRFM1pEQXVjR1Z3Y2kxemVYTjBaVzB1DQpjM1pqTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFBWC9UL3pxNGtXeXRvN0JyQkc3L0lwNEhoZnIzdWplYkNQDQpJTmNEMUV2RThzbTJkckRCSkphVTBtb2RkV0tRdnpBblF4Ulo2WnNlMitDd01GOGxMNUlIaDFQbS9iSkIwbkg1DQozdERCYU5wNndyZGtOcmxlQ0xsMmZtQmh4YXlNclNtaFlReGJ5QXVhSTVGc1dBUENYNHNZRmt5MnliZGU4bG5aDQpNemNGUzRtWEh5V0RrcTJYcVJxdGdQTDdHZGhHRDlsVEJ3a1c1djA3TktZNDZoSWxGbVJDU2Vvbkp5S0pNU3h2DQpjSkY4NjNmeGhISEcxWVp3TjVrMzdkU0FUbjFpazlpdFBBTWY3VXVTNlMySG8rakg1d2pGTml3eVZMNGZHNkhiDQpNSWJ2LzVGQjVFQjdaVFI4NnkydGswS0JTMUpMR3JqTjREckQ5eHJId2pNcFRDM1RQK3B2DQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tDQo= + tls.key: >- + LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQ0KTUlJRW9nSUJBQUtDQVFFQXNuSVBBOVkybXdwdFVLejN1ZXQ5c1hudDFxSUVHVERYSFByOXRldlhMZGlGM3FaZA0KRCt4Vy91WjN3ZmJPcmJ4UitnVzYwOVcxcXVKVjhtMXdBUmlQK0wwM1g1aTAzZzF0SklsNWRRVXBRZFlkU0ZVMg0KZW1GbzlFSEZpSDlBOEZUdFBML2w5MDlRL1oxMSsxaVNTd2kwOFptZkUvTU1aNmJlaDhMNnlGNDg0a2pTWFI5aw0KdjNjTy9FU0FmZVN3ejQ0L0grOWtGRndUV0E2QjhERjBiek5JYzIySTJPcXNIMUxsVDg1NzI1MFhaT3R6ZGEzSg0KWmFmTDJoMGJtc3NkbGZUWEJBOGgxMjRWRmkrbHkyTjBZV3g5WUR6Z2tmSnJnb2FOd01aZjRWOU40cWN6VlNzSQ0KNWRwT3dxUDZmNkw0NlBkNkc1NFZQTDFWS0I5ZmxSRDJGRHJmaFFJREFRQUJBb0lCQUJyU052eUtKWkgvS3JnZQ0KRDJ3VC84UDl3aWhwR0xtYWxES29iUnI3ZEUvUlJDblhrcFJTbnk3WUFEY1l2Qzd6NTlSdktRb3ZESXUvVWxESw0KYnpQUzk4ell6K3BmL3d1RE5CenlSdDIyWldHZVo2OVlFNFNvZ0loNkhGRXNZMXZjUC81S0Q2d3c4VWoxY21iUg0KaE1lZmF1Y0hncGdTaDVKS3pCYlcwUy90cmpRS29lbk1KM1lKcDhxdEhBMGlCYlFNcllaR0lhVHZNVjExVlNtNA0KaWljdW9ad1dqaVlRY3BmNTZ4ems1ME9xa0hzeDNIcU9qelBYQm1qTzdqZ0FnVnJtSHNCdGpOODZhUzVveEg3Sg0KL2l6QzZQVzhmWlc2SVNGbnlJYUgzUFRzRjNDN3N1MFl4dktjemVYSzY3ZndmZ1Jva2tnaXlvYUM0NzY2bGdxTA0KcDZPN2lMOENnWUVBdFdhZGFTaldPVTNmcHdMK3gxS3FnTWthMUFSL3BLUnBRajB4SFZlcEx0MFI0WFhOaU9xbg0KMHYxenE0azhWOXpRSEQwOGR1RXl4ZmFUR0tncWkwSUFURXdqT2xIbWxjbS9VNmlycG9qMkFkRkFCWTZ1U2Jzcg0KalhRT2ZtN2xBZWsyVkNaOVI2czRSbVVsMm5HVFFXZnNRQ1lvU1RDVjV3UmNYT1FHN1p4MDY3OENnWUVBKzlSUg0KYmZJb0pmMTZ4eWJnRWFObERDbS95WHRkNlpqNTQrdGFLT3Jsa20ya2lGUG9kR1ZZTGNpUUtnR2kwZmE3SnhRdw0KQzUrUit4R2xuRkloRnExUlE5aXl2QjBQb0tXRUNSNlBaSktKMmZId3VUalYvd3RPQWpwSVJmTk5OZExlekpSeA0KekZEbUNBbXZORXBtdWorYU9TeDlMSEd1TCtUakRCODV0NXVFRmJzQ2dZQTFyN3orbG50d1VqL1M2ZXdGaWMyMA0KZDlCYzEwZi9yamtJeFp0M2w2NFdsSTdxTHpjNVFsbVE5RG43bG80cFlzeWt6dXJLTkRRV3FyYzJJTzhXYjk0dQ0KdG9ubWhMNjlyZ3ZWOHFGNmxDWmF1MWM3VGRML04wbllmM1NhcnE5UU5YbEN4bkZsZUtNYkVteDFqZytLMS9ydg0Kc1Z0UzdmSXZnUGJrOXdlbDR4d25lUUtCZ0hoUGNTL0R0eWFmT1I4WUZZaVh0VmpnUVQ0eThDVC83ckxTNTlvUQ0KanVrcjlLVWs0VE5xajN3Z0M2L2w1REhIWEpaSThNTTgwdk5OOVA3L3hjc2R0bXRoaGRLVlY3ZjZHMkIzOXkybg0KVExDUkE5Nlpwck1ZWlladTdjUnRmbit1Wkw3OFZIbTJWSStXZ052TWg5T0hPMWtCUmpRTGc1cGlFWTdqQkNJUg0KN0VLdEFvR0FRaVdzaFVieEsyWVJReVhNMkhRYWltYnlEdWRSTm9McmxNUDUxRCtQK2U2VFdndjZXcXd4NlFVbw0KMk5oQ3FONEI4S1VHU2YwS0s3d0FNOExVTW1lbkF1NlBNdGtNZ3p4ZjB6bTdLR1ZXOFRXaHNQbXMvYlg4aFZqUQ0KSDhkVXZRUlhaTSt6ZVJMT0wwNkQ5bWNRUjgrMWJKUVJMVWFhbVhVVWY2Y3FzcWlaNXVvPQ0KLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0NCg== +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + namespace: pepr-system + labels: + app: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 +spec: + replicas: 2 + selector: + matchLabels: + app: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + template: + metadata: + labels: + app: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + spec: + priorityClassName: system-node-critical + serviceAccountName: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + containers: + - name: server + image: ghcr.io/defenseunicorns/pepr/controller:v0.14.1 + imagePullPolicy: IfNotPresent + command: + - node + - /app/node_modules/pepr/dist/controller.js + - d80c8a71074bd07ba34ed768465a26ede697e435b084de7dd84bdfa985888295 + readinessProbe: + httpGet: + path: /healthz + port: 3000 + scheme: HTTPS + livenessProbe: + httpGet: + path: /healthz + port: 3000 + scheme: HTTPS + ports: + - containerPort: 3000 + resources: + requests: + memory: 64Mi + cpu: 100m + limits: + memory: 256Mi + cpu: 500m + env: + - name: PEPR_PRETTY_LOG + value: 'false' + - name: LOG_LEVEL + value: debug + volumeMounts: + - name: tls-certs + mountPath: /etc/certs + readOnly: true + - name: api-token + mountPath: /app/api-token + readOnly: true + - name: module + mountPath: /app/load + readOnly: true + volumes: + - name: tls-certs + secret: + secretName: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-tls + - name: api-token + secret: + secretName: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-api-token + - name: module + secret: + secretName: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-module +--- +apiVersion: v1 +kind: Service +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + namespace: pepr-system +spec: + selector: + app: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + ports: + - port: 443 + targetPort: 3000 +--- +apiVersion: v1 +kind: Service +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-watcher + namespace: pepr-system +spec: + selector: + app: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-watcher + ports: + - port: 443 + targetPort: 3000 +--- +apiVersion: v1 +kind: Secret +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-module + namespace: pepr-system +type: Opaque +data: + module-d80c8a71074bd07ba34ed768465a26ede697e435b084de7dd84bdfa985888295.js.gz: >- + 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 +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: peprstores.pepr.dev +spec: + group: pepr.dev + versions: + - name: v1 + served: true + storage: true + schema: + openAPIV3Schema: + type: object + properties: + data: + type: object + additionalProperties: + type: string + scope: Namespaced + names: + plural: peprstores + singular: peprstore + kind: PeprStore +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-store + namespace: pepr-system +rules: + - apiGroups: + - pepr.dev/* + resources: + - peprstores + resourceNames: + - '' + verbs: + - create + - get + - patch + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-store + namespace: pepr-system +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-store +subjects: + - kind: ServiceAccount + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0-store + namespace: pepr-system +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: MutatingWebhookConfiguration +metadata: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 +webhooks: + - name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0.pepr.dev + admissionReviewVersions: + - v1 + - v1beta1 + clientConfig: + caBundle: >- + LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpNSUlDdERDQ0FaeWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURBY01Sb3dHQVlEVlFRREV4RlFaWEJ5DQpJRVZ3YUdWdFpYSmhiQ0JEUVRBZUZ3MHlNekV3TVRjeE5UUTVNREZhRncweU5ERXdNVGN4TlRRNU1ERmFNQUF3DQpnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFERXM3aEovb2NvaTBha204ZmtpS1hpDQpVYWZ3RElGV3VxNlZOVFhtNHJtNTB1UTVPYTJ6R0d0YXhTU0V5T3hFdEt4UFlXV0lPeUdIRzZ4YWxOZTV4NHJZDQoyQVFiYjAvVXdXVVdCUU5tcHNkelBmbWk3RnhOSllWTVZEaFhuaFlTT21CVWJoY0NObnNsbEhOQzdsaTFFMHB0DQpVVUVQSmQ3b2RPS01rN01BN2MvMHRKMkFkY2xYTitjcUJjWENRaVZGZi92L1N1WXQ5WjVOT1ZObGJIV01zU29EDQpHZHZ0VmpQQVNlcXBwYTVPZ0htazRHMjA4U0hhQ0tTQy9Qa3VnSHE2cDM2TmdvREd1Y1c1MzM4NU5SWTV2NGtTDQpqQU94d2d2aWlHVStzQU9xTmNrQjlRQnAzWUt4bG4xbmFwR0UzcHJtN1VsZEV1Q2JENHBHYlFpb29Sd2wrREV6DQpBZ01CQUFHakhUQWJNQXdHQTFVZEV3UUZNQU1CQWY4d0N3WURWUjBQQkFRREFnTDBNQTBHQ1NxR1NJYjNEUUVCDQpDd1VBQTRJQkFRQ3NwZTJMSTU3Y3dBK3h0clRIb2ZxdE5mZC9NaXRPK1dWd0dIVHVTWVlSekxhUW5MR0x1aXB0DQpIR1FPYXROV1ZYVDBLSml1K29JUHRocTRYNGFnY1poZWZ4b2RMdFJnSFlzYzY5N2JJTzlBNlpJVlJpeHdSYXB2DQpWWlRTVGhYNWhJT3Nrd3lSYmYrRDBqaE8xTXZCRUhaNkxCcWltWTAyclVhejdaUUdhRCtUTVF4R3g0OWFHNFpVDQpiQm8zSjRRbVRUTnhnMU44NGw3SHh0NkhOUGd4MFFWUWdsTjBOZHZuYk9jQWh1RFRXT3BORE00a2s1cG9SZXQxDQo2eXZPS1R1Rm5zaHNheDZnYlFwNWROUzBmUGZXQUpJRzliK2hiRHRvODFOQVEwZm1xL3BsNWovVUxNY1M4SHcvDQpob0JDakhPbEYwM1JOWEw0NFNYTXp2R0Z0aklJcnRxbw0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ0K + service: + name: pepr-b95dbd80-e078-5eb9-aaf3-bcb9567417d0 + namespace: pepr-system + path: >- + /mutate/ad7f3d8a7cc71eb877f7cb85ea86528efff3694e7412bfbe20c2cbc4c6c162d0 + failurePolicy: Ignore + matchPolicy: Equivalent + timeoutSeconds: 10 + namespaceSelector: + matchExpressions: + - key: pepr.dev + operator: NotIn + values: + - ignore + - key: kubernetes.io/metadata.name + operator: NotIn + values: + - kube-system + - pepr-system + objectSelector: + matchExpressions: + - key: pepr.dev + operator: NotIn + values: + - ignore + - key: kubernetes.io/metadata.name + operator: NotIn + values: + - kube-system + - pepr-system + rules: + - apiGroups: + - '' + apiVersions: + - v1 + operations: + - CREATE + - UPDATE + resources: + - secrets + sideEffects: None diff --git a/manifests/zarf-ecr-credential-helper.yaml b/manifests/zarf-ecr-credential-helper.yaml new file mode 100644 index 0000000..0f8fdfe --- /dev/null +++ b/manifests/zarf-ecr-credential-helper.yaml @@ -0,0 +1,57 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: zarf-ecr-credential-helper + namespace: zarf + annotations: + eks.amazonaws.com/role-arn: "###ZARF_VAR_ECR_CREDENTIAL_HELPER_ROLE_ARN###" +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + namespace: zarf + name: zarf-ecr-credential-helper +rules: +- apiGroups: [""] + resources: ["namespaces"] + verbs: ["list"] +- apiGroups: [""] + resources: ["secrets"] + verbs: ["get", "update"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: zarf-ecr-credential-helper + namespace: zarf +subjects: +- kind: ServiceAccount + name: zarf-ecr-credential-helper + namespace: zarf +roleRef: + kind: ClusterRole + name: zarf-ecr-credential-helper + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: batch/v1 +kind: CronJob +metadata: + name: zarf-ecr-credential-helper + namespace: zarf +spec: + schedule: "###ZARF_VAR_ECR_CREDENTIAL_HELPER_CRON_SCHEDULE###" + jobTemplate: + spec: + template: + spec: + serviceAccountName: zarf-ecr-credential-helper + imagePullSecrets: + - name: private-registry + containers: + - name: zarf-ecr-credential-helper + image: "###ZARF_REGISTRY###/###ZARF_CONST_CREDENTIAL_HELPER_IMAGE###:###ZARF_CONST_CREDENTIAL_HELPER_IMAGE_TAG###" + imagePullPolicy: IfNotPresent + env: + - name: AWS_REGION + value: "###ZARF_VAR_AWS_REGION###" + restartPolicy: OnFailure diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..85b37b9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7933 @@ +{ + "name": "ecr", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ecr", + "version": "0.0.1", + "dependencies": { + "@aws-sdk/client-ecr": "^3.408.0", + "@aws-sdk/client-ecr-public": "^3.413.0", + "pepr": "^0.14.1" + }, + "devDependencies": { + "@jest/globals": "^29.6.4", + "@types/jest": "^29.5.5", + "jest": "^29.6.4", + "ts-jest": "^29.1.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "peer": true, + "engines": { + "node": ">=0.10.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/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/client-ecr": { + "version": "3.423.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.423.0.tgz", + "integrity": "sha512-NUBXSCywC6QGFsiRZR3cLJyp+ENgig+sO1NWBAlN3IM+0VYxTb9Y5dx6YIjEEjyTlV7D7WhdFqpSl6KY/x0nSw==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.423.0", + "@aws-sdk/credential-provider-node": "3.423.0", + "@aws-sdk/middleware-host-header": "3.418.0", + "@aws-sdk/middleware-logger": "3.418.0", + "@aws-sdk/middleware-recursion-detection": "3.418.0", + "@aws-sdk/middleware-signing": "3.418.0", + "@aws-sdk/middleware-user-agent": "3.418.0", + "@aws-sdk/region-config-resolver": "3.418.0", + "@aws-sdk/types": "3.418.0", + "@aws-sdk/util-endpoints": "3.418.0", + "@aws-sdk/util-user-agent-browser": "3.418.0", + "@aws-sdk/util-user-agent-node": "3.418.0", + "@smithy/config-resolver": "^2.0.10", + "@smithy/fetch-http-handler": "^2.1.5", + "@smithy/hash-node": "^2.0.9", + "@smithy/invalid-dependency": "^2.0.9", + "@smithy/middleware-content-length": "^2.0.11", + "@smithy/middleware-endpoint": "^2.0.9", + "@smithy/middleware-retry": "^2.0.12", + "@smithy/middleware-serde": "^2.0.9", + "@smithy/middleware-stack": "^2.0.2", + "@smithy/node-config-provider": "^2.0.12", + "@smithy/node-http-handler": "^2.1.5", + "@smithy/protocol-http": "^3.0.5", + "@smithy/smithy-client": "^2.1.6", + "@smithy/types": "^2.3.3", + "@smithy/url-parser": "^2.0.9", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.10", + "@smithy/util-defaults-mode-node": "^2.0.12", + "@smithy/util-retry": "^2.0.2", + "@smithy/util-utf8": "^2.0.0", + "@smithy/util-waiter": "^2.0.9", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr-public": { + "version": "3.423.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr-public/-/client-ecr-public-3.423.0.tgz", + "integrity": "sha512-mmI+gDIT0hVhpf5sVfFL4qytYRZkwb+HtMHBn9lkKGTUoN1W6Ndj7dWIaEnmQpsgJa3QhGBBQAU7wABjgs8kJA==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.423.0", + "@aws-sdk/credential-provider-node": "3.423.0", + "@aws-sdk/middleware-host-header": "3.418.0", + "@aws-sdk/middleware-logger": "3.418.0", + "@aws-sdk/middleware-recursion-detection": "3.418.0", + "@aws-sdk/middleware-signing": "3.418.0", + "@aws-sdk/middleware-user-agent": "3.418.0", + "@aws-sdk/region-config-resolver": "3.418.0", + "@aws-sdk/types": "3.418.0", + "@aws-sdk/util-endpoints": "3.418.0", + "@aws-sdk/util-user-agent-browser": "3.418.0", + "@aws-sdk/util-user-agent-node": "3.418.0", + "@smithy/config-resolver": "^2.0.10", + "@smithy/fetch-http-handler": "^2.1.5", + "@smithy/hash-node": "^2.0.9", + "@smithy/invalid-dependency": "^2.0.9", + "@smithy/middleware-content-length": "^2.0.11", + "@smithy/middleware-endpoint": "^2.0.9", + "@smithy/middleware-retry": "^2.0.12", + "@smithy/middleware-serde": "^2.0.9", + "@smithy/middleware-stack": "^2.0.2", + "@smithy/node-config-provider": "^2.0.12", + "@smithy/node-http-handler": "^2.1.5", + "@smithy/protocol-http": "^3.0.5", + "@smithy/smithy-client": "^2.1.6", + "@smithy/types": "^2.3.3", + "@smithy/url-parser": "^2.0.9", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.10", + "@smithy/util-defaults-mode-node": "^2.0.12", + "@smithy/util-retry": "^2.0.2", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.423.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.423.0.tgz", + "integrity": "sha512-znIufHkwhCIePgaYciIs3x/+BpzR57CZzbCKHR9+oOvGyufEPPpUT5bFLvbwTgfiVkTjuk6sG/ES3U5Bc+xtrA==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.418.0", + "@aws-sdk/middleware-logger": "3.418.0", + "@aws-sdk/middleware-recursion-detection": "3.418.0", + "@aws-sdk/middleware-user-agent": "3.418.0", + "@aws-sdk/region-config-resolver": "3.418.0", + "@aws-sdk/types": "3.418.0", + "@aws-sdk/util-endpoints": "3.418.0", + "@aws-sdk/util-user-agent-browser": "3.418.0", + "@aws-sdk/util-user-agent-node": "3.418.0", + "@smithy/config-resolver": "^2.0.10", + "@smithy/fetch-http-handler": "^2.1.5", + "@smithy/hash-node": "^2.0.9", + "@smithy/invalid-dependency": "^2.0.9", + "@smithy/middleware-content-length": "^2.0.11", + "@smithy/middleware-endpoint": "^2.0.9", + "@smithy/middleware-retry": "^2.0.12", + "@smithy/middleware-serde": "^2.0.9", + "@smithy/middleware-stack": "^2.0.2", + "@smithy/node-config-provider": "^2.0.12", + "@smithy/node-http-handler": "^2.1.5", + "@smithy/protocol-http": "^3.0.5", + "@smithy/smithy-client": "^2.1.6", + "@smithy/types": "^2.3.3", + "@smithy/url-parser": "^2.0.9", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.10", + "@smithy/util-defaults-mode-node": "^2.0.12", + "@smithy/util-retry": "^2.0.2", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.423.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.423.0.tgz", + "integrity": "sha512-EcpkKu02QZbRX6dQE0u7a8RgWrn/5riz1qAlKd7rM8FZJpr/D6GGX8ZzWxjgp7pRUgfNvinTmIudDnyQY3v9Mg==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/credential-provider-node": "3.423.0", + "@aws-sdk/middleware-host-header": "3.418.0", + "@aws-sdk/middleware-logger": "3.418.0", + "@aws-sdk/middleware-recursion-detection": "3.418.0", + "@aws-sdk/middleware-sdk-sts": "3.418.0", + "@aws-sdk/middleware-signing": "3.418.0", + "@aws-sdk/middleware-user-agent": "3.418.0", + "@aws-sdk/region-config-resolver": "3.418.0", + "@aws-sdk/types": "3.418.0", + "@aws-sdk/util-endpoints": "3.418.0", + "@aws-sdk/util-user-agent-browser": "3.418.0", + "@aws-sdk/util-user-agent-node": "3.418.0", + "@smithy/config-resolver": "^2.0.10", + "@smithy/fetch-http-handler": "^2.1.5", + "@smithy/hash-node": "^2.0.9", + "@smithy/invalid-dependency": "^2.0.9", + "@smithy/middleware-content-length": "^2.0.11", + "@smithy/middleware-endpoint": "^2.0.9", + "@smithy/middleware-retry": "^2.0.12", + "@smithy/middleware-serde": "^2.0.9", + "@smithy/middleware-stack": "^2.0.2", + "@smithy/node-config-provider": "^2.0.12", + "@smithy/node-http-handler": "^2.1.5", + "@smithy/protocol-http": "^3.0.5", + "@smithy/smithy-client": "^2.1.6", + "@smithy/types": "^2.3.3", + "@smithy/url-parser": "^2.0.9", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.10", + "@smithy/util-defaults-mode-node": "^2.0.12", + "@smithy/util-retry": "^2.0.2", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.418.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.418.0.tgz", + "integrity": "sha512-e74sS+x63EZUBO+HaI8zor886YdtmULzwKdctsZp5/37Xho1CVUNtEC+fYa69nigBD9afoiH33I4JggaHgrekQ==", + "dependencies": { + "@aws-sdk/types": "3.418.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.3.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.423.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.423.0.tgz", + "integrity": "sha512-7CsFWz8g7dQmblp57XzzxMirO4ClowGZIOwAheBkmk6q1XHbllcHFnbh2kdPyQQ0+JmjDg6waztIc7dY7Ycfvw==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.418.0", + "@aws-sdk/credential-provider-process": "3.418.0", + "@aws-sdk/credential-provider-sso": "3.423.0", + "@aws-sdk/credential-provider-web-identity": "3.418.0", + "@aws-sdk/types": "3.418.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.3.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.423.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.423.0.tgz", + "integrity": "sha512-lygbGJJUnDpgo8OEqdoYd51BKkyBVQ1Catiua/m0aHvL+SCmVrHiYPQPawWYGxpH8X3DXdXa0nd0LkEaevrHRg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.418.0", + "@aws-sdk/credential-provider-ini": "3.423.0", + "@aws-sdk/credential-provider-process": "3.418.0", + "@aws-sdk/credential-provider-sso": "3.423.0", + "@aws-sdk/credential-provider-web-identity": "3.418.0", + "@aws-sdk/types": "3.418.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.3.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.418.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.418.0.tgz", + "integrity": "sha512-xPbdm2WKz1oH6pTkrJoUmr3OLuqvvcPYTQX0IIlc31tmDwDWPQjXGGFD/vwZGIZIkKaFpFxVMgAzfFScxox7dw==", + "dependencies": { + "@aws-sdk/types": "3.418.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.3.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.423.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.423.0.tgz", + "integrity": "sha512-zAH68IjRMmW22USbsCVQ5Q6AHqhmWABwLbZAMocSGMasddTGv/nkA/nUiVCJ/B4LI3P81FoPQVrG5JxNmkNH0w==", + "dependencies": { + "@aws-sdk/client-sso": "3.423.0", + "@aws-sdk/token-providers": "3.418.0", + "@aws-sdk/types": "3.418.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.3.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.418.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.418.0.tgz", + "integrity": "sha512-do7ang565n9p3dS1JdsQY01rUfRx8vkxQqz5M8OlcEHBNiCdi2PvSjNwcBdrv/FKkyIxZb0TImOfBSt40hVdxQ==", + "dependencies": { + "@aws-sdk/types": "3.418.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.3.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.418.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.418.0.tgz", + "integrity": "sha512-LrMTdzalkPw/1ujLCKPLwCGvPMCmT4P+vOZQRbSEVZPnlZk+Aj++aL/RaHou0jL4kJH3zl8iQepriBt4a7UvXQ==", + "dependencies": { + "@aws-sdk/types": "3.418.0", + "@smithy/protocol-http": "^3.0.5", + "@smithy/types": "^2.3.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.418.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.418.0.tgz", + "integrity": "sha512-StKGmyPVfoO/wdNTtKemYwoJsqIl4l7oqarQY7VSf2Mp3mqaa+njLViHsQbirYpyqpgUEusOnuTlH5utxJ1NsQ==", + "dependencies": { + "@aws-sdk/types": "3.418.0", + "@smithy/types": "^2.3.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.418.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.418.0.tgz", + "integrity": "sha512-kKFrIQglBLUFPbHSDy1+bbe3Na2Kd70JSUC3QLMbUHmqipXN8KeXRfAj7vTv97zXl0WzG0buV++WcNwOm1rFjg==", + "dependencies": { + "@aws-sdk/types": "3.418.0", + "@smithy/protocol-http": "^3.0.5", + "@smithy/types": "^2.3.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.418.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.418.0.tgz", + "integrity": "sha512-cW8ijrCTP+mgihvcq4+TbhAcE/we5lFl4ydRqvTdtcSnYQAVQADg47rnTScQiFsPFEB3NKq7BGeyTJF9MKolPA==", + "dependencies": { + "@aws-sdk/middleware-signing": "3.418.0", + "@aws-sdk/types": "3.418.0", + "@smithy/types": "^2.3.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.418.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.418.0.tgz", + "integrity": "sha512-onvs5KoYQE8OlOE740RxWBGtsUyVIgAo0CzRKOQO63ZEYqpL1Os+MS1CGzdNhvQnJgJruE1WW+Ix8fjN30zKPA==", + "dependencies": { + "@aws-sdk/types": "3.418.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.5", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.3.3", + "@smithy/util-middleware": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.418.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.418.0.tgz", + "integrity": "sha512-Jdcztg9Tal9SEAL0dKRrnpKrm6LFlWmAhvuwv0dQ7bNTJxIxyEFbpqdgy7mpQHsLVZgq1Aad/7gT/72c9igyZw==", + "dependencies": { + "@aws-sdk/types": "3.418.0", + "@aws-sdk/util-endpoints": "3.418.0", + "@smithy/protocol-http": "^3.0.5", + "@smithy/types": "^2.3.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.418.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.418.0.tgz", + "integrity": "sha512-lJRZ/9TjZU6yLz+mAwxJkcJZ6BmyYoIJVo1p5+BN//EFdEmC8/c0c9gXMRzfISV/mqWSttdtccpAyN4/goHTYA==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.12", + "@smithy/types": "^2.3.3", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.2", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.418.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.418.0.tgz", + "integrity": "sha512-9P7Q0VN0hEzTngy3Sz5eya2qEOEf0Q8qf1vB3um0gE6ID6EVAdz/nc/DztfN32MFxk8FeVBrCP5vWdoOzmd72g==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.418.0", + "@aws-sdk/middleware-logger": "3.418.0", + "@aws-sdk/middleware-recursion-detection": "3.418.0", + "@aws-sdk/middleware-user-agent": "3.418.0", + "@aws-sdk/types": "3.418.0", + "@aws-sdk/util-endpoints": "3.418.0", + "@aws-sdk/util-user-agent-browser": "3.418.0", + "@aws-sdk/util-user-agent-node": "3.418.0", + "@smithy/config-resolver": "^2.0.10", + "@smithy/fetch-http-handler": "^2.1.5", + "@smithy/hash-node": "^2.0.9", + "@smithy/invalid-dependency": "^2.0.9", + "@smithy/middleware-content-length": "^2.0.11", + "@smithy/middleware-endpoint": "^2.0.9", + "@smithy/middleware-retry": "^2.0.12", + "@smithy/middleware-serde": "^2.0.9", + "@smithy/middleware-stack": "^2.0.2", + "@smithy/node-config-provider": "^2.0.12", + "@smithy/node-http-handler": "^2.1.5", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.5", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.1.6", + "@smithy/types": "^2.3.3", + "@smithy/url-parser": "^2.0.9", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.10", + "@smithy/util-defaults-mode-node": "^2.0.12", + "@smithy/util-retry": "^2.0.2", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.418.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.418.0.tgz", + "integrity": "sha512-y4PQSH+ulfFLY0+FYkaK4qbIaQI9IJNMO2xsxukW6/aNoApNymN1D2FSi2la8Qbp/iPjNDKsG8suNPm9NtsWXQ==", + "dependencies": { + "@smithy/types": "^2.3.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.418.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.418.0.tgz", + "integrity": "sha512-sYSDwRTl7yE7LhHkPzemGzmIXFVHSsi3AQ1KeNEk84eBqxMHHcCc2kqklaBk2roXWe50QDgRMy1ikZUxvtzNHQ==", + "dependencies": { + "@aws-sdk/types": "3.418.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.418.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.418.0.tgz", + "integrity": "sha512-c4p4mc0VV/jIeNH0lsXzhJ1MpWRLuboGtNEpqE4s1Vl9ck2amv9VdUUZUmHbg+bVxlMgRQ4nmiovA4qIrqGuyg==", + "dependencies": { + "@aws-sdk/types": "3.418.0", + "@smithy/types": "^2.3.3", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.418.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.418.0.tgz", + "integrity": "sha512-BXMskXFtg+dmzSCgmnWOffokxIbPr1lFqa1D9kvM3l3IFRiFGx2IyDg+8MAhq11aPDLvoa/BDuQ0Yqma5izOhg==", + "dependencies": { + "@aws-sdk/types": "3.418.0", + "@smithy/node-config-provider": "^2.0.12", + "@smithy/types": "^2.3.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "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.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "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/core/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/@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-compilation-targets/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/@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/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.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/@esbuild/android-arm": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.4.tgz", + "integrity": "sha512-uBIbiYMeSsy2U0XQoOGVVcpIktjLMEKa7ryz2RLr7L/vTnANNEsPVAh4xOv7ondGz6ac1zVb0F8Jx20rQikffQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.4.tgz", + "integrity": "sha512-mRsi2vJsk4Bx/AFsNBqOH2fqedxn5L/moT58xgg51DjX1la64Z3Npicut2VbhvDFO26qjWtPMsVxCd80YTFVeg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.4.tgz", + "integrity": "sha512-4iPufZ1TMOD3oBlGFqHXBpa3KFT46aLl6Vy7gwed0ZSYgHaZ/mihbYb4t7Z9etjkC9Al3ZYIoOaHrU60gcMy7g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.4.tgz", + "integrity": "sha512-Lviw8EzxsVQKpbS+rSt6/6zjn9ashUZ7Tbuvc2YENgRl0yZTktGlachZ9KMJUsVjZEGFVu336kl5lBgDN6PmpA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.4.tgz", + "integrity": "sha512-YHbSFlLgDwglFn0lAO3Zsdrife9jcQXQhgRp77YiTDja23FrC2uwnhXMNkAucthsf+Psr7sTwYEryxz6FPAVqw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.4.tgz", + "integrity": "sha512-vz59ijyrTG22Hshaj620e5yhs2dU1WJy723ofc+KUgxVCM6zxQESmWdMuVmUzxtGqtj5heHyB44PjV/HKsEmuQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.4.tgz", + "integrity": "sha512-3sRbQ6W5kAiVQRBWREGJNd1YE7OgzS0AmOGjDmX/qZZecq8NFlQsQH0IfXjjmD0XtUYqr64e0EKNFjMUlPL3Cw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.4.tgz", + "integrity": "sha512-z/4ArqOo9EImzTi4b6Vq+pthLnepFzJ92BnofU1jgNlcVb+UqynVFdoXMCFreTK7FdhqAzH0vmdwW5373Hm9pg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.4.tgz", + "integrity": "sha512-ZWmWORaPbsPwmyu7eIEATFlaqm0QGt+joRE9sKcnVUG3oBbr/KYdNE2TnkzdQwX6EDRdg/x8Q4EZQTXoClUqqA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.4.tgz", + "integrity": "sha512-EGc4vYM7i1GRUIMqRZNCTzJh25MHePYsnQfKDexD8uPTCm9mK56NIL04LUfX2aaJ+C9vyEp2fJ7jbqFEYgO9lQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.4.tgz", + "integrity": "sha512-WVhIKO26kmm8lPmNrUikxSpXcgd6HDog0cx12BUfA2PkmURHSgx9G6vA19lrlQOMw+UjMZ+l3PpbtzffCxFDRg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.4.tgz", + "integrity": "sha512-keYY+Hlj5w86hNp5JJPuZNbvW4jql7c1eXdBUHIJGTeN/+0QFutU3GrS+c27L+NTmzi73yhtojHk+lr2+502Mw==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.4.tgz", + "integrity": "sha512-tQ92n0WMXyEsCH4m32S21fND8VxNiVazUbU4IUGVXQpWiaAxOBvtOtbEt3cXIV3GEBydYsY8pyeRMJx9kn3rvw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.4.tgz", + "integrity": "sha512-tRRBey6fG9tqGH6V75xH3lFPpj9E8BH+N+zjSUCnFOX93kEzqS0WdyJHkta/mmJHn7MBaa++9P4ARiU4ykjhig==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.4.tgz", + "integrity": "sha512-152aLpQqKZYhThiJ+uAM4PcuLCAOxDsCekIbnGzPKVBRUDlgaaAfaUl5NYkB1hgY6WN4sPkejxKlANgVcGl9Qg==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.4.tgz", + "integrity": "sha512-Mi4aNA3rz1BNFtB7aGadMD0MavmzuuXNTaYL6/uiYIs08U7YMPETpgNn5oue3ICr+inKwItOwSsJDYkrE9ekVg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.4.tgz", + "integrity": "sha512-9+Wxx1i5N/CYo505CTT7T+ix4lVzEdz0uCoYGxM5JDVlP2YdDC1Bdz+Khv6IbqmisT0Si928eAxbmGkcbiuM/A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.4.tgz", + "integrity": "sha512-MFsHleM5/rWRW9EivFssop+OulYVUoVcqkyOkjiynKBCGBj9Lihl7kh9IzrreDyXa4sNkquei5/DTP4uCk25xw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.4.tgz", + "integrity": "sha512-6Xq8SpK46yLvrGxjp6HftkDwPP49puU4OF0hEL4dTxqCbfx09LyrbUj/D7tmIRMj5D5FCUPksBbxyQhp8tmHzw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.4.tgz", + "integrity": "sha512-PkIl7Jq4mP6ke7QKwyg4fD4Xvn8PXisagV/+HntWoDEdmerB2LTukRZg728Yd1Fj+LuEX75t/hKXE2Ppk8Hh1w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.4.tgz", + "integrity": "sha512-ga676Hnvw7/ycdKB53qPusvsKdwrWzEyJ+AtItHGoARszIqvjffTwaaW3b2L6l90i7MO9i+dlAW415INuRhSGg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.4.tgz", + "integrity": "sha512-HP0GDNla1T3ZL8Ko/SHAS2GgtjOg+VmWnnYLhuTksr++EnduYB0f3Y2LzHsUwb2iQ13JGoY6G3R8h6Du/WG6uA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "peer": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", + "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", + "peer": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@glideapps/ts-necessities": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.1.3.tgz", + "integrity": "sha512-q9U8v/n9qbkd2zDYjuX3qtlbl+OIyI9zF+zQhZjfYOE9VMDH7tfcUSJ9p0lXoY3lxmGFne09yi4iiNeQUwV7AA==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "peer": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "peer": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "peer": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/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/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/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/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "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.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kubernetes/client-node": { + "version": "1.0.0-rc3", + "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-1.0.0-rc3.tgz", + "integrity": "sha512-bTYMBZXVrjfi98N5EZbrmPtcT9NY+TddunSEc25DcsRF1c5c93e5jT+zFwId19hG8e/ue5deKe7YDQiRYFpMlQ==", + "dependencies": { + "@types/js-yaml": "^4.0.1", + "@types/node": "^20.3.1", + "@types/node-fetch": "^2.6.3", + "@types/stream-buffers": "^3.0.3", + "@types/tar": "^6.1.1", + "@types/underscore": "^1.8.9", + "@types/ws": "^8.5.4", + "byline": "^5.0.0", + "form-data": "^4.0.0", + "isomorphic-ws": "^5.0.0", + "js-yaml": "^4.1.0", + "jsonpath-plus": "^7.2.0", + "node-fetch": "^2.6.9", + "openid-client": "^5.4.2", + "rfc4648": "^1.3.0", + "stream-buffers": "^3.0.2", + "tar": "^6.1.11", + "tmp-promise": "^3.0.2", + "tslib": "^2.5.0", + "underscore": "^1.9.1", + "url-parse": "^1.4.3", + "ws": "^8.13.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "peer": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "peer": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.6.0.tgz", + "integrity": "sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g==", + "engines": { + "node": ">=8.0.0" + } + }, + "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/@smithy/abort-controller": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.0.10.tgz", + "integrity": "sha512-xn7PnFD3m4rQIG00h1lPuDVnC2QMtTFhzRLX3y56KkgFaCysS7vpNevNBgmNUtmJ4eVFc+66Zucwo2KDLdicOg==", + "dependencies": { + "@smithy/types": "^2.3.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.0.11.tgz", + "integrity": "sha512-q97FnlUmbai1c4JlQJgLVBsvSxgV/7Nvg/JK76E1nRq/U5UM56Eqo3dn2fY7JibqgJLg4LPsGdwtIyqyOk35CQ==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.13", + "@smithy/types": "^2.3.4", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.13.tgz", + "integrity": "sha512-/xe3wNoC4j+BeTemH9t2gSKLBfyZmk8LXB2pQm/TOEYi+QhBgT+PSolNDfNAhrR68eggNE17uOimsrnwSkCt4w==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.13", + "@smithy/property-provider": "^2.0.11", + "@smithy/types": "^2.3.4", + "@smithy/url-parser": "^2.0.10", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.0.10.tgz", + "integrity": "sha512-3SSDgX2nIsFwif6m+I4+ar4KDcZX463Noes8ekBgQHitULiWvaDZX8XqPaRQSQ4bl1vbeVXHklJfv66MnVO+lw==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.3.4", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.0.tgz", + "integrity": "sha512-P2808PM0CsEkXj3rnQAi3QyqRbAAi8iuePYUB5GveJ+dVd1WMv03NM+CYCI14IGXt1j/r7jHGvMJHO+Gv+kdMQ==", + "dependencies": { + "@smithy/protocol-http": "^3.0.6", + "@smithy/querystring-builder": "^2.0.10", + "@smithy/types": "^2.3.4", + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.0.10.tgz", + "integrity": "sha512-jSTf6uzPk/Vf+8aQ7tVXeHfjxe9wRXSCqIZcBymSDTf7/YrVxniBdpyN74iI8ZUOx/Pyagc81OK5FROLaEjbXQ==", + "dependencies": { + "@smithy/types": "^2.3.4", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.0.10.tgz", + "integrity": "sha512-zw9p/zsmJ2cFcW4KMz3CJoznlbRvEA6HG2mvEaX5eAca5dq4VGI2MwPDTfmteC/GsnURS4ogoMQ0p6aHM2SDVQ==", + "dependencies": { + "@smithy/types": "^2.3.4", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.0.12.tgz", + "integrity": "sha512-QRhJTo5TjG7oF7np6yY4ZO9GDKFVzU/GtcqUqyEa96bLHE3yZHgNmsolOQ97pfxPHmFhH4vDP//PdpAIN3uI1Q==", + "dependencies": { + "@smithy/protocol-http": "^3.0.6", + "@smithy/types": "^2.3.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.0.10.tgz", + "integrity": "sha512-O6m4puZc16xfenotZUHL4bRlMrwf4gTp+0I5l954M5KNd3dOK18P+FA/IIUgnXF/dX6hlCUcJkBp7nAzwrePKA==", + "dependencies": { + "@smithy/middleware-serde": "^2.0.10", + "@smithy/types": "^2.3.4", + "@smithy/url-parser": "^2.0.10", + "@smithy/util-middleware": "^2.0.3", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.13.tgz", + "integrity": "sha512-zuOva8xgWC7KYG8rEXyWIcZv2GWszO83DCTU6IKcf/FKu6OBmSE+EYv3EUcCGY+GfiwCX0EyJExC9Lpq9b0w5Q==", + "dependencies": { + "@smithy/node-config-provider": "^2.0.13", + "@smithy/protocol-http": "^3.0.6", + "@smithy/service-error-classification": "^2.0.3", + "@smithy/types": "^2.3.4", + "@smithy/util-middleware": "^2.0.3", + "@smithy/util-retry": "^2.0.3", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.0.10.tgz", + "integrity": "sha512-+A0AFqs768256H/BhVEsBF6HijFbVyAwYRVXY/izJFkTalVWJOp4JA0YdY0dpXQd+AlW0tzs+nMQCE1Ew+DcgQ==", + "dependencies": { + "@smithy/types": "^2.3.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.0.4.tgz", + "integrity": "sha512-MW0KNKfh8ZGLagMZnxcLJWPNXoKqW6XV/st5NnCBmmA2e2JhrUjU0AJ5Ca/yjTyNEKs3xH7AQDwp1YmmpEpmQQ==", + "dependencies": { + "@smithy/types": "^2.3.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.0.13.tgz", + "integrity": "sha512-pPpLqYuJcOq1sj1EGu+DoZK47DUS4gepqSTNgRezmrjnzNlSU2/Dcc9Ebzs+WZ0Z5vXKazuE+k+NksFLo07/AA==", + "dependencies": { + "@smithy/property-provider": "^2.0.11", + "@smithy/shared-ini-file-loader": "^2.0.12", + "@smithy/types": "^2.3.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.1.6.tgz", + "integrity": "sha512-NspvD3aCwiUNtoSTcVHz0RZz1tQ/SaRIe1KPF+r0mAdCZ9eWuhIeJT8ZNPYa1ITn7/Lgg64IyFjqPynZ8KnYQw==", + "dependencies": { + "@smithy/abort-controller": "^2.0.10", + "@smithy/protocol-http": "^3.0.6", + "@smithy/querystring-builder": "^2.0.10", + "@smithy/types": "^2.3.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.0.11.tgz", + "integrity": "sha512-kzuOadu6XvrnlF1iXofpKXYmo4oe19st9/DE8f5gHNaFepb4eTkR8gD8BSdTnNnv7lxfv6uOwZPg4VS6hemX1w==", + "dependencies": { + "@smithy/types": "^2.3.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.0.6.tgz", + "integrity": "sha512-F0jAZzwznMmHaggiZgc7YoS08eGpmLvhVktY/Taz6+OAOHfyIqWSDNgFqYR+WHW9z5fp2XvY4mEUrQgYMQ71jw==", + "dependencies": { + "@smithy/types": "^2.3.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.0.10.tgz", + "integrity": "sha512-uujJGp8jzrrU1UHme8sUKEbawQTcTmUWsh8rbGXYD/lMwNLQ+9jQ9dMDWbbH9Hpoa9RER1BeL/38WzGrbpob2w==", + "dependencies": { + "@smithy/types": "^2.3.4", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.0.10.tgz", + "integrity": "sha512-WSD4EU60Q8scacT5PIpx4Bahn6nWpt+MiYLcBkFt6fOj7AssrNeaNIU2Z0g40ftVmrwLcEOIKGX92ynbVDb3ZA==", + "dependencies": { + "@smithy/types": "^2.3.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.0.3.tgz", + "integrity": "sha512-b+m4QCHXb7oKAkM/jHwHrl5gpqhFoMTHF643L0/vAEkegrcUWyh1UjyoHttuHcP5FnHVVy4EtpPtLkEYD+xMFw==", + "dependencies": { + "@smithy/types": "^2.3.4" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.0.12.tgz", + "integrity": "sha512-umi0wc4UBGYullAgYNUVfGLgVpxQyES47cnomTqzCKeKO5oudO4hyDNj+wzrOjqDFwK2nWYGVgS8Y0JgGietrw==", + "dependencies": { + "@smithy/types": "^2.3.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.0.10.tgz", + "integrity": "sha512-S6gcP4IXfO/VMswovrhxPpqvQvMal7ZRjM4NvblHSPpE5aNBYx67UkHFF3kg0hR3tJKqNpBGbxwq0gzpdHKLRA==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.10", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.3.4", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.3", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.8.tgz", + "integrity": "sha512-Puuc4wuhdTSs8wstkNJ/JtpaFwIh0qDE27zawfRVzzjpXprpT+4wROqO2+NVoZ+6GKv7kz7QgZx6AI5325bSeQ==", + "dependencies": { + "@smithy/middleware-stack": "^2.0.4", + "@smithy/types": "^2.3.4", + "@smithy/util-stream": "^2.0.13", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.3.4.tgz", + "integrity": "sha512-D7xlM9FOMFyFw7YnMXn9dK2KuN6+JhnrZwVt1fWaIu8hCk5CigysweeIT/H/nCo4YV+s8/oqUdLfexbkPZtvqw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.0.10.tgz", + "integrity": "sha512-4TXQFGjHcqru8aH5VRB4dSnOFKCYNX6SR1Do6fwxZ+ExT2onLsh2W77cHpks7ma26W5jv6rI1u7d0+KX9F0aOw==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.10", + "@smithy/types": "^2.3.4", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.0.0.tgz", + "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.12.tgz", + "integrity": "sha512-BCsFPdNThMS2312/Zj3/TtFsXfO2BwkbDNsoWbdtZ0cAv9cE6vqGKllYXmq2Gj6u+Vv8V3wUgBUicNol6s/7Sg==", + "dependencies": { + "@smithy/property-provider": "^2.0.11", + "@smithy/smithy-client": "^2.1.8", + "@smithy/types": "^2.3.4", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.14.tgz", + "integrity": "sha512-EtomtYsWDkBGs0fLeF+7N2df+zIqGix+O4llWqQD+97rbo2hk+GBWeZzBkujKrzFeXNUbPkFqfvZPLdoq4S4XQ==", + "dependencies": { + "@smithy/config-resolver": "^2.0.11", + "@smithy/credential-provider-imds": "^2.0.13", + "@smithy/node-config-provider": "^2.0.13", + "@smithy/property-provider": "^2.0.11", + "@smithy/smithy-client": "^2.1.8", + "@smithy/types": "^2.3.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.0.3.tgz", + "integrity": "sha512-+FOCFYOxd2HO7v/0hkFSETKf7FYQWa08wh/x/4KUeoVBnLR4juw8Qi+TTqZI6E2h5LkzD9uOaxC9lAjrpVzaaA==", + "dependencies": { + "@smithy/types": "^2.3.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.0.3.tgz", + "integrity": "sha512-gw+czMnj82i+EaH7NL7XKkfX/ZKrCS2DIWwJFPKs76bMgkhf0y1C94Lybn7f8GkBI9lfIOUdPYtzm19zQOC8sw==", + "dependencies": { + "@smithy/service-error-classification": "^2.0.3", + "@smithy/types": "^2.3.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.0.13.tgz", + "integrity": "sha512-aeua6pN0WMdQtZNRRJ8J+mop57fezLMsApYbk5Q3q11pyHwZypVPuKoelr7K9PMJZcuYk90dQyUsUAd7hTCeRg==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.2.0", + "@smithy/node-http-handler": "^2.1.6", + "@smithy/types": "^2.3.4", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.0.10.tgz", + "integrity": "sha512-yQjwWVrwYw+/f3hFQccE3zZF7lk6N6xtNcA6jvhWFYhnyKAm6B2mX8Gzftl0TbgoPUpzCvKYlvhaEpVtRpVfVw==", + "dependencies": { + "@smithy/abort-controller": "^2.0.10", + "@smithy/types": "^2.3.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", + "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", + "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.5", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", + "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", + "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", + "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.7.tgz", + "integrity": "sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.5", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.5.tgz", + "integrity": "sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.7.tgz", + "integrity": "sha512-RJZP9WAMMr1514KbdSXkLRrKvYQacjr1+HWnY8pui/uBTBoSgD9ZGR17u/d4nb9NpERp0FkdLBe7hq8NIPBgkg==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "peer": true + }, + "node_modules/@types/node": { + "version": "20.8.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.1.tgz", + "integrity": "sha512-iN6stS2QGMl50pjH0h/dIfmcEUogljAreQZ+cubPw3ISWp5fJrZw9NOh/sDHJfw92A41hCU+Ls5zTIsNYzcnuA==" + }, + "node_modules/@types/node-fetch": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", + "peer": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/stream-buffers": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/stream-buffers/-/stream-buffers-3.0.5.tgz", + "integrity": "sha512-mEKCVRgR+0fM3FUcywARE6J50sz++u/KQL5sBMJKFzLTyX/WsKN2THr7vMic6fWoFfT454LXOnJYUMp8ANNBMw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/tar": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.6.tgz", + "integrity": "sha512-HQ06kiiDXz9uqtmE9ksQUn1ovcPr1gGV9EgaCWo6FGYKD0onNBCetBzL0kfcS8Kbj1EFxJWY9jL2W4ZvvtGI8Q==", + "dependencies": { + "@types/node": "*", + "minipass": "^4.0.0" + } + }, + "node_modules/@types/underscore": { + "version": "1.11.11", + "resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.11.11.tgz", + "integrity": "sha512-J/ZgSP9Yv0S+wfUfeRh9ynktcCvycfW4S9NbzkFdiHLBth+Ctdy5nYg3ZAqUKq7v3gcJce6rXo41zJV6IqsXsQ==" + }, + "node_modules/@types/urijs": { + "version": "1.19.20", + "resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.20.tgz", + "integrity": "sha512-77Mq/2BeHU894J364dUv9tSwxxyCLtcX228Pc8TwZpP5bvOoMns+gZoftp3LYl3FBH8vChpWbuagKGiMki2c1A==" + }, + "node_modules/@types/ws": { + "version": "8.5.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.7.tgz", + "integrity": "sha512-6UrLjiDUvn40CMrAubXuIVtj2PEfKDffJS7ychvnPU44j+KVeXmdHHTgqcM/dxLUTHxlXHiFM8Skmb8ozGdTnQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.26", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.26.tgz", + "integrity": "sha512-Y3vDy2X6zw/ZCumcwLpdhM5L7jmyGpmBCTYMHDLqT2IKVMYRRLdv6ZakA+wxhra6Z/3bwhNbNl9bDGXaFU+6rw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.3.tgz", + "integrity": "sha512-vntq452UHNltxsaaN+L9WyuMch8bMd9CqJ3zhzTPXXidwbf5mqqKCVXEuvRZUqLJSTLeWE65lQwyXsRGnXkCTA==", + "peer": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.3", + "@typescript-eslint/type-utils": "6.7.3", + "@typescript-eslint/utils": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.3.tgz", + "integrity": "sha512-TlutE+iep2o7R8Lf+yoer3zU6/0EAUc8QIBB3GYBc1KGz4c4TRm83xwXUZVPlZ6YCLss4r77jbu6j3sendJoiQ==", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.7.3", + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/typescript-estree": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.3.tgz", + "integrity": "sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.3.tgz", + "integrity": "sha512-Fc68K0aTDrKIBvLnKTZ5Pf3MXK495YErrbHb1R6aTpfK5OdSFj0rVN7ib6Tx6ePrZ2gsjLqr0s98NG7l96KSQw==", + "peer": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.7.3", + "@typescript-eslint/utils": "6.7.3", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.3.tgz", + "integrity": "sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==", + "peer": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.3.tgz", + "integrity": "sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.3.tgz", + "integrity": "sha512-vzLkVder21GpWRrmSR9JxGZ5+ibIUSudXlW52qeKpzUEQhRSmyZiVDDj3crAth7+5tmN1ulvgKaCU2f/bPRCzg==", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.7.3", + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/typescript-estree": "6.7.3", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz", + "integrity": "sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==", + "peer": true, + "dependencies": { + "@typescript-eslint/types": "6.7.3", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peer": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "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==", + "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/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "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-istanbul/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/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==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bintrees": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", + "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "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==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-or-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.1.1.tgz", + "integrity": "sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==" + }, + "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": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "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/byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "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.30001542", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001542.tgz", + "integrity": "sha512-UrtAXVcj1mvPBFQ4sKd38daP8dEcXXr5sQe6QNNinaPd0iA/cxg9/l3VrSdL73jgw5sKyuQ6jNgiKO12W3SsVA==", + "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/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "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==", + "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/collection-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/collection-utils/-/collection-utils-1.0.1.tgz", + "integrity": "sha512-LA2YTIlR7biSpXkKYwwuzGjwL5rjWEZVOSnvdUc7gObvWe4WkjxOpfrdhoP7Hs09YWDVfg0Mal9BpAqLfVEzQg==" + }, + "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==", + "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==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "peer": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "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/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "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/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "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==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "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/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "peer": 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/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff-sequences": { + "version": "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/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "peer": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "peer": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.538", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.538.tgz", + "integrity": "sha512-1a2m63NEookb1beNFTGDihgF3CKL7ksZ7PSA0VloON5DpTEhnOVgaDes8xkrDhkXRxlcN8JymQDGnv+Nn+uvhg==", + "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==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "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/esbuild": { + "version": "0.19.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.4.tgz", + "integrity": "sha512-x7jL0tbRRpv4QUyuDMjONtWFciygUxWaUM1kMX2zWxI0X2YWOt7MSA0g4UdeSiHM8fcYVzpQhKYOycZwxTdZkA==", + "hasInstallScript": true, + "peer": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.4", + "@esbuild/android-arm64": "0.19.4", + "@esbuild/android-x64": "0.19.4", + "@esbuild/darwin-arm64": "0.19.4", + "@esbuild/darwin-x64": "0.19.4", + "@esbuild/freebsd-arm64": "0.19.4", + "@esbuild/freebsd-x64": "0.19.4", + "@esbuild/linux-arm": "0.19.4", + "@esbuild/linux-arm64": "0.19.4", + "@esbuild/linux-ia32": "0.19.4", + "@esbuild/linux-loong64": "0.19.4", + "@esbuild/linux-mips64el": "0.19.4", + "@esbuild/linux-ppc64": "0.19.4", + "@esbuild/linux-riscv64": "0.19.4", + "@esbuild/linux-s390x": "0.19.4", + "@esbuild/linux-x64": "0.19.4", + "@esbuild/netbsd-x64": "0.19.4", + "@esbuild/openbsd-x64": "0.19.4", + "@esbuild/sunos-x64": "0.19.4", + "@esbuild/win32-arm64": "0.19.4", + "@esbuild/win32-ia32": "0.19.4", + "@esbuild/win32-x64": "0.19.4" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.50.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "peer": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "peer": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "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/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/fast-copy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.1.tgz", + "integrity": "sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "peer": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "peer": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "peer": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-patch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-3.1.1.tgz", + "integrity": "sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==" + }, + "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==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "peer": true + }, + "node_modules/fast-redact": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.3.0.tgz", + "integrity": "sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "funding": [ + { + "type": "paypal", + "url": "https://paypal.me/naturalintelligence" + }, + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "peer": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "peer": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "peer": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "peer": true, + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "peer": true + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "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==" + }, + "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.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "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==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-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==", + "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/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "peer": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "peer": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.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/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "peer": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/help-me": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-4.2.0.tgz", + "integrity": "sha512-TAOnTB8Tz5Dw8penUuzHVrKNKlCIbwwbHnXraNJxPwf8LRtE2HlM84RYuezMFcwOJmoYOCWVDyJ8TQGxn9PgxA==", + "dependencies": { + "glob": "^8.0.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/help-me/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/help-me/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/help-me/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/help-me/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-status-codes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", + "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "peer": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "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==", + "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==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "peer": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", + "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", + "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-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-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/jose": { + "version": "4.15.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.3.tgz", + "integrity": "sha512-RZJdL9Qjd1sqNdyiVteRGV/bnWtik/+PJh1JP4kT6+x1QQMn+7ryueRys5BEueuayvSVY8CWGCisCDazeRLTuw==", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/js-base64": { + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz", + "integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==" + }, + "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": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "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-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "peer": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "peer": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "peer": 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/jsonpath-plus": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", + "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "peer": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/kubernetes-fluent-client": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/kubernetes-fluent-client/-/kubernetes-fluent-client-1.6.0.tgz", + "integrity": "sha512-/2NZjEAroRtha82ik4Ns2iaJCS3myA+zljmjuFB9bY8MbmlmLAvNqz2Y0bzSqvYSfOXsVPhgusBMCjYZODB/pg==", + "dependencies": { + "@kubernetes/client-node": "1.0.0-rc3", + "byline": "5.0.0", + "fast-json-patch": "3.1.1", + "http-status-codes": "2.3.0", + "node-fetch": "2.7.0", + "quicktype-core": "23.0.76", + "type-fest": "4.4.0", + "yargs": "17.7.2" + }, + "bin": { + "kubernetes-fluent-client": "dist/cli.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/kubernetes-fluent-client/node_modules/type-fest": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.4.0.tgz", + "integrity": "sha512-HT3RRs7sTfY22KuPQJkD/XjbTbxgP2Je5HPt6H6JEGvcjHd5Lqru75EbrP3tb4FYjNJ+DjLp+MNQTFQU0mhXNw==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "peer": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "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/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "peer": 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-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/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "peer": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "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/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/oidc-token-hash": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", + "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==", + "engines": { + "node": "^10.13.0 || >=12.0.0" + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.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==", + "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/openid-client": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.6.1.tgz", + "integrity": "sha512-PtrWsY+dXg6y8mtMPyL/namZSYVz8pjXz3yJiBNZsEdCnu9miHLB4ELVC85WvneMKo2Rg62Ay7NkuCpM0bgiLQ==", + "dependencies": { + "jose": "^4.15.1", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/openid-client/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==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/openid-client/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "peer": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "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/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "peer": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "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/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "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==", + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pepr": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/pepr/-/pepr-0.14.1.tgz", + "integrity": "sha512-WKqpOZ1mOZhHzN6KgZU1K+fVJRFhRMll2vi9V0JctDJj8RBFEx0hHVtbol9F9pUQWHt3PsY/GMBhNEv1H0v0KA==", + "dependencies": { + "express": "4.18.2", + "fast-json-patch": "3.1.1", + "kubernetes-fluent-client": "1.6.0", + "pino": "8.16.0", + "pino-pretty": "10.2.3", + "prom-client": "15.0.0", + "ramda": "0.29.1" + }, + "bin": { + "pepr": "dist/cli.js" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "6.7.3", + "@typescript-eslint/parser": "6.7.3", + "commander": "11.0.0", + "esbuild": "0.19.4", + "eslint": "8.50.0", + "node-forge": "1.3.1", + "prettier": "3.0.3", + "prompts": "2.4.2", + "typescript": "5.2.2", + "uuid": "9.0.1" + } + }, + "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==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pino": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.16.0.tgz", + "integrity": "sha512-UUmvQ/7KTZt/vHjhRrnyS7h+J7qPBQnpG80V56xmIC+o9IqYmQOw/UIny9S9zYDfRBR0ClouCr464EkBMIT7Fw==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.1.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^2.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.7.0", + "thread-stream": "^2.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", + "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-pretty": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-10.2.3.tgz", + "integrity": "sha512-4jfIUc8TC1GPUfDyMSlW1STeORqkoxec71yhxIpLDQapUu8WOuoz2TTCoidrIssyz78LZC69whBMPIKCMbi3cw==", + "dependencies": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.0", + "fast-safe-stringify": "^2.1.1", + "help-me": "^4.0.1", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^4.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "pino-pretty": "bin.js" + } + }, + "node_modules/pino-std-serializers": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", + "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" + }, + "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/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "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/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-warning": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.2.0.tgz", + "integrity": "sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==" + }, + "node_modules/prom-client": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-15.0.0.tgz", + "integrity": "sha512-UocpgIrKyA2TKLVZDSfm8rGkL13C19YrQBAiG3xo3aDFWcHedxRxI3z+cIcucoxpSO0h5lff5iv/SXoxyeopeA==", + "dependencies": { + "@opentelemetry/api": "^1.4.0", + "tdigest": "^0.1.1" + }, + "engines": { + "node": "^16 || ^18 || >=20" + } + }, + "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==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "peer": true, + "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/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/quicktype-core": { + "version": "23.0.76", + "resolved": "https://registry.npmjs.org/quicktype-core/-/quicktype-core-23.0.76.tgz", + "integrity": "sha512-QinZRNovSTQcFuhRKxeHb22eFmyucbG96EPaQDSbz9qvIPxUhs1BZviNc8HAkHWYFqTSET/xZcEoHpm1DeDbRg==", + "dependencies": { + "@glideapps/ts-necessities": "2.1.3", + "@types/urijs": "^1.19.19", + "browser-or-node": "^2.1.1", + "collection-utils": "^1.0.1", + "cross-fetch": "^4.0.0", + "is-url": "^1.2.4", + "js-base64": "^3.7.5", + "lodash": "^4.17.21", + "pako": "^1.0.6", + "pluralize": "^8.0.0", + "readable-stream": "4.4.2", + "unicode-properties": "^1.4.1", + "urijs": "^1.19.1", + "wordwrap": "^1.0.0", + "yaml": "^2.3.1" + } + }, + "node_modules/ramda": { + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.1.tgz", + "integrity": "sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ramda" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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/readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "engines": { + "node": ">= 12.13.0" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "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-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "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/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "peer": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfc4648": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.2.tgz", + "integrity": "sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg==" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peer": true, + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", + "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" + }, + "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==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/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==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "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==", + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/sonic-boom": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", + "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-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/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "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/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-buffers": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", + "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "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==", + "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==", + "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==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "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==", + "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/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/tdigest": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", + "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", + "dependencies": { + "bintrees": "1.0.2" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "peer": true + }, + "node_modules/thread-stream": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", + "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "peer": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.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/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "peer": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "node_modules/unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "dependencies": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unicode-trie/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urijs": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.11.tgz", + "integrity": "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" + }, + "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==", + "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==" + }, + "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/ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "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/yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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==", + "engines": { + "node": ">=12" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..5bbf18c --- /dev/null +++ b/package.json @@ -0,0 +1,39 @@ +{ + "name": "ecr", + "version": "0.0.1", + "description": "Use ECR as an external Zarf registry", + "keywords": [ + "pepr", + "k8s", + "policy-engine", + "pepr-module", + "security" + ], + "engines": { + "node": ">=18.0.0" + }, + "pepr": { + "name": "ecr", + "uuid": "b95dbd80-e078-5eb9-aaf3-bcb9567417d0", + "onError": "ignore", + "alwaysIgnore": { + "namespaces": [], + "labels": [] + } + }, + "scripts": { + "build": "npx pepr build", + "unit-test": "jest --coverage" + }, + "dependencies": { + "@aws-sdk/client-ecr": "^3.408.0", + "@aws-sdk/client-ecr-public": "^3.413.0", + "pepr": "^0.14.1" + }, + "devDependencies": { + "@jest/globals": "^29.6.4", + "@types/jest": "^29.5.5", + "jest": "^29.6.4", + "ts-jest": "^29.1.1" + } +} diff --git a/packages/eks/eks.yaml b/packages/eks/eks.yaml new file mode 100644 index 0000000..8ccee26 --- /dev/null +++ b/packages/eks/eks.yaml @@ -0,0 +1,28 @@ +# eksctl create cluster --config-file=eks.yaml +apiVersion: eksctl.io/v1alpha5 +kind: ClusterConfig +metadata: + name: "###ZARF_VAR_EKS_CLUSTER_NAME###" + region: "###ZARF_VAR_EKS_CLUSTER_REGION###" + version: "###ZARF_VAR_EKS_CLUSTER_VERSION###" + +# Specify AZs to avoid insufficient capacity error in us-east-1e AZ: https://github.com/eksctl-io/eksctl/issues/3816 +availabilityZones: + - us-east-1a + - us-east-1d + +iam: + withOIDC: true + +addons: + - name: aws-ebs-csi-driver + version: "###ZARF_VAR_EBS_DRIVER_VERSION###" + attachPolicyARNs: + - arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy + +managedNodeGroups: +- instanceType: "###ZARF_VAR_EKS_INSTANCE_TYPE###" + name: "###ZARF_VAR_EKS_CLUSTER_NAME###-ng" + minSize: 3 + maxSize: 6 + spot: true diff --git a/packages/eks/zarf.yaml b/packages/eks/zarf.yaml new file mode 100644 index 0000000..1dc205a --- /dev/null +++ b/packages/eks/zarf.yaml @@ -0,0 +1,67 @@ +kind: ZarfPackageConfig +metadata: + name: distro-eks + description: Deploy a EKS K8s cluster + architecture: multi + version: 0.0.4 + +variables: + - name: EKS_CLUSTER_NAME + description: The name for the EKS cluster + prompt: true + + - name: EKS_INSTANCE_TYPE + description: The EC2 instance type for the worker nodes + default: t3.small + + - name: EKS_CLUSTER_REGION + description: The AWS region to setup the cluster and associated networking + default: us-east-1 + + - name: EKS_CLUSTER_VERSION + description: The Kubernetes version to use for the cluster + default: "1.27" + + - name: EBS_DRIVER_VERSION + description: The AEBS driver version to use for the cluster (must be available on the K8s version) + default: "v1.21.0-eksbuild.1" + +components: + - name: load-eksctl + required: true + files: + - source: eks.yaml + target: eks.yaml + - source: https://github.com/weaveworks/eksctl/releases/download/v0.160.0/eksctl_Darwin_amd64.tar.gz + target: binaries/eksctl_Darwin_x86_64 + executable: true + shasum: 6f68e7248c3df7cdc3ee7f959d851fe979cc3823e13c31afcac57a380644d03b + extractPath: eksctl + - source: https://github.com/weaveworks/eksctl/releases/download/v0.160.0/eksctl_Darwin_arm64.tar.gz + target: binaries/eksctl_Darwin_arm64 + executable: true + shasum: b884a9ea4cc1107de4d609756ea1145b156daa8dbb34d57b3a08e80545f28ac0 + extractPath: eksctl + - source: https://github.com/weaveworks/eksctl/releases/download/v0.160.0/eksctl_Linux_amd64.tar.gz + target: binaries/eksctl_Linux_x86_64 + executable: true + shasum: 9d1f649197dfe0641b804ac34d8bdcd30b632719ebb0062387e6c4b9f866213e + extractPath: eksctl + + - name: deploy-eks-cluster + description: Create an EKS cluster! + actions: + onDeploy: + before: + - cmd: ./binaries/eksctl_$(uname -s)_$(uname -m) create cluster --dry-run -f eks.yaml + - cmd: sleep 15 + - cmd: ./binaries/eksctl_$(uname -s)_$(uname -m) create cluster -f eks.yaml + - cmd: ./binaries/eksctl_$(uname -s)_$(uname -m) utils write-kubeconfig -c ${ZARF_VAR_EKS_CLUSTER_NAME} + onRemove: + before: + # NOTE: This onRemove action assumes the presence of an eksctl binary in a 'binaries' directory from where 'zarf package remove' was ran. + - cmd: ./binaries/eksctl_$(uname -s)_$(uname -m) delete cluster -f eks.yaml --disable-nodegroup-eviction --wait + after: + # clean up after ourselves + - cmd: rm -rf binaries + - cmd: rm -f eks.yaml diff --git a/pepr.ts b/pepr.ts new file mode 100644 index 0000000..2c5838b --- /dev/null +++ b/pepr.ts @@ -0,0 +1,10 @@ +import { PeprModule } from "pepr"; +// cfg loads your pepr configuration from package.json +import cfg from "./package.json"; +import { ECRhook } from "./capabilities/webhook"; + +/** + * This is the main entrypoint for this Pepr module. It is run when the module is started. + * This is where you register your Pepr configurations and capabilities. + */ +new PeprModule(cfg, [ECRhook]); diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..2017ccb --- /dev/null +++ b/renovate.json @@ -0,0 +1,74 @@ +{ + "extends": [ + "config:base", + "group:allNonMajor" + ], + "ignoreDeps": [ + "sigs.k8s.io/kustomize/kyaml" + ], + "ignorePaths": [ + "**/node_modules/**", + "**/bower_components/**", + "**/vendor/**", + "**/__tests__/**", + "**/test/**", + "**/tests/**", + "**/__fixtures__/**" + ], + "packageRules": [ + { + "matchUpdateTypes": [ + "patch", + "pin", + "digest" + ], + "automerge": true, + "automergeType": "pr" + }, + { + "matchDepTypes": [ + "devDependencies" + ], + "automerge": true, + "automergeType": "pr" + } + ], + "platformAutomerge": true, + "platformCommit": true, + "postUpdateOptions": [ + "gomodTidy" + ], + "regexManagers": [ + { + "fileMatch": [ + "(^|/)zarf.yaml$" + ], + "matchStringsStrategy": "recursive", + "matchStrings": [ + "charts:(.|\n)*?(^\\s{4}[\\w:]+|\n$|^\\s{2}-)", + "- name: (?.+)(.|\n)*?url: (?.+)(.|\n)*?version: (?.+)" + ], + "datasourceTemplate": "helm" + }, + { + "fileMatch": [ + "(^|/)zarf.yaml$" + ], + "matchStringsStrategy": "recursive", + "matchStrings": [ + "# renovate: datasource=(?.*?) depName=(?.*?)( versioning=(?.*?))?( registryUrl=(?.*?))?\\s.*?version: (?.*)\\s" + ], + "versioningTemplate": "{{#if versioning}}{{{versioning}}}{{else}}semver{{/if}}" + }, + { + "fileMatch": [ + "(^|/)zarf.yaml$" + ], + "matchStringsStrategy": "recursive", + "matchStrings": [ + "https:\\/\\/github.com\\/(?[\\w\\/\\-\\.\\+\\%]+?)\\/releases\\/download\\/(?[\\w\\/\\-\\.\\+\\%]+?)\\/" + ], + "datasourceTemplate": "github-releases" + } + ] +} diff --git a/revive.toml b/revive.toml new file mode 100644 index 0000000..ebda8f5 --- /dev/null +++ b/revive.toml @@ -0,0 +1,31 @@ +ignoreGeneratedHeader = false +severity = "warning" +confidence = 0.8 +errorCode = 0 +warningCode = 0 +formatter = "stylish" + +[rule.blank-imports] +[rule.context-as-argument] +[rule.context-keys-type] +[rule.dot-imports] +[rule.error-return] +[rule.error-strings] +[rule.error-naming] +[rule.exported] +[rule.if-return] +[rule.increment-decrement] +[rule.var-naming] +[rule.var-declaration] +[rule.package-comments] +[rule.range] +[rule.receiver-naming] +[rule.time-naming] +[rule.unexported-return] +[rule.indent-error-flow] +[rule.errorf] +[rule.empty-block] +[rule.superfluous-else] +[rule.unused-parameter] +[rule.unreachable-code] +[rule.redefines-builtin-id] diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..15058c1 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": true, + "esModuleInterop": true, + "lib": [ + "ES2022" + ], + "module": "CommonJS", + "moduleResolution": "node", + "outDir": "dist", + "resolveJsonModule": true, + "rootDir": ".", + "strict": false, + "target": "ES2022", + "useUnknownInCatchVariables": false + }, + "include": [ + "capabilities/*.ts" + ] +} diff --git a/types.go b/types.go new file mode 100644 index 0000000..f4c1d3c --- /dev/null +++ b/types.go @@ -0,0 +1,19 @@ +package main + +type dockerConfig struct { + Auths dockerConfigEntry `json:"auths"` +} + +type dockerConfigEntry map[string]dockerConfigEntryWithAuth + +type dockerConfigEntryWithAuth struct { + Auth string `json:"auth"` +} + +type registryInfo struct { + Address string `json:"address" jsonschema:"description=URL address of the registry"` +} + +type zarfState struct { + RegistryInfo registryInfo `json:"registryInfo" jsonschema:"description=Information about the container registry Zarf is configured to use"` +} diff --git a/zarf-config.toml b/zarf-config.toml new file mode 100644 index 0000000..f34ba3f --- /dev/null +++ b/zarf-config.toml @@ -0,0 +1,29 @@ +log_level = 'debug' +architecture = 'amd64' + +[package.create.set] +# The image reference to use for the Pepr controller +pepr_image_domain = 'ghcr.io' +pepr_image = 'defenseunicorns/pepr/controller' +pepr_image_tag = 'v0.14.1' + +# The image reference to use for the Zarf agent, defaults to a locally built image +agent_image_domain = 'ghcr.io/' +agent_image = 'defenseunicorns/zarf/agent' +agent_image_tag = 'v0.30.1' + +# The image reference to use for the ECR credential helper, defaults to a locally built image +credential_helper_image_domain = 'ghcr.io/' +credential_helper_image = 'defenseunicorns/zarf-init-aws/ecr-credential-helper' +credential_helper_image_tag = 'local' + +registry_image_domain = '' +registry_image = '' +registry_image_tag = '' + +[package.deploy.set] +aws_region = 'us-east-1' +registry_type = '' +ecr_hook_role_arn = '' +ecr_credential_helper_role_arn = '' +ecr_credential_helper_cron_schedule = '*/1 * * * *' diff --git a/zarf.yaml b/zarf.yaml new file mode 100644 index 0000000..3df9af4 --- /dev/null +++ b/zarf.yaml @@ -0,0 +1,92 @@ +kind: ZarfInitConfig +metadata: + name: init-aws + description: "Zarf Init Package that uses ECR as an external Zarf registry" + url: https://github.com/defenseunicorns/zarf-init-aws + +constants: + - name: PEPR_IMAGE + value: "###ZARF_PKG_TMPL_PEPR_IMAGE###" + - name: PEPR_IMAGE_TAG + value: "###ZARF_PKG_TMPL_PEPR_IMAGE_TAG###" + + - name: CREDENTIAL_HELPER_IMAGE + value: "###ZARF_PKG_TMPL_CREDENTIAL_HELPER_IMAGE###" + - name: CREDENTIAL_HELPER_IMAGE_TAG + value: "###ZARF_PKG_TMPL_CREDENTIAL_HELPER_IMAGE_TAG###" + +variables: + - name: REGISTRY_TYPE + description: "Specify whether you want to use a private or public ECR registry" + prompt: true + + - name: AWS_REGION + description: "The AWS region the ECR registry is located in" + prompt: true + + - name: ECR_HOOK_ROLE_ARN + description: "The ARN of an IAM role to give Pepr necessary permissions to list and create ECR repositories" + prompt: true + + - name: ECR_CREDENTIAL_HELPER_ROLE_ARN + description: "The ARN of an IAM role to give the zarf-ecr-credential-helper necessary permissions to fetch ECR tokens" + prompt: true + + - name: ECR_CREDENTIAL_HELPER_CRON_SCHEDULE + description: "The schedule on which the ECR credential helper CronJob will run. https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#schedule-syntax" + # Run once an hour at the beginning of the hour + default: "0 * * * *" + +components: + - name: ecr-bootstrap + description: "Bootstrap the deployment by creating an ECR repository for the Pepr controller image" + required: true + files: + - source: hack/ecr.sh + target: hack/ecr.sh + executable: true + actions: + onDeploy: + after: + - cmd: ./hack/ecr.sh + description: "Create ECR repository for the Pepr controller image" + + - name: ecr-hook + description: "Pepr webhook that creates ECR repos for images during package deployments" + required: true + manifests: + - name: module + namespace: pepr-system + kustomizations: + - manifests + images: + - "###ZARF_PKG_TMPL_PEPR_IMAGE_DOMAIN###/###ZARF_PKG_TMPL_PEPR_IMAGE###:###ZARF_PKG_TMPL_PEPR_IMAGE_TAG###" + + - name: zarf-agent + required: true + import: + url: oci://ghcr.io/defenseunicorns/packages/init:v0.30.1-skeleton + name: zarf-agent + + - name: zarf-ecr-credential-helper + description: "CronJob that updates Zarf image pull secrets with new ECR tokens" + manifests: + - name: zarf-ecr-credential-helper + namespace: zarf + files: + - manifests/zarf-ecr-credential-helper.yaml + actions: + onCreate: + before: + - cmd: "test \"###ZARF_PKG_TMPL_CREDENTIAL_HELPER_IMAGE_TAG###\" != \"local\" || make build-local-credential-helper-image CREDENTIAL_HELPER_IMAGE_TAG=\"###ZARF_PKG_TMPL_CREDENTIAL_HELPER_IMAGE_TAG###\" ARCH=\"###ZARF_PKG_ARCH###\"" + shell: + windows: pwsh + description: Build the local ECR credential helper image (if 'CREDENTIAL_HELPER_IMAGE_TAG' was specified as 'local') + images: + - "###ZARF_PKG_TMPL_CREDENTIAL_HELPER_IMAGE_DOMAIN######ZARF_PKG_TMPL_CREDENTIAL_HELPER_IMAGE###:###ZARF_PKG_TMPL_CREDENTIAL_HELPER_IMAGE_TAG###" + + # (Optional) Adds a git server to the cluster + - name: git-server + import: + url: oci://ghcr.io/defenseunicorns/packages/init:v0.30.1-skeleton + name: git-server