diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 87cb9ba9..9c13251c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @mfiedorowicz @natm +* @leoparente @mfiedorowicz @natm diff --git a/.github/golangci.yaml b/.github/golangci.yaml index 3cfdf04b..4be75f8c 100644 --- a/.github/golangci.yaml +++ b/.github/golangci.yaml @@ -3,7 +3,7 @@ run: modules-download-mode: readonly output: - format: github-actions + formats: colored-line-number linters: enable: diff --git a/.github/pull_request_labeler.yaml b/.github/pull_request_labeler.yaml index 0fbd1b9a..466c1c4c 100644 --- a/.github/pull_request_labeler.yaml +++ b/.github/pull_request_labeler.yaml @@ -62,30 +62,12 @@ python: - changed-files: - any-glob-to-any-file: '**/*.py' -diode-netbox-plugin: - - changed-files: - - any-glob-to-any-file: - - 'diode-netbox-plugin/*' - - 'diode-netbox-plugin/**/*' - diode-proto: - changed-files: - any-glob-to-any-file: - 'diode-proto/*' - 'diode-proto/**/*' -diode-sdk-go: - - changed-files: - - any-glob-to-any-file: - - 'diode-sdk-go/*' - - 'diode-sdk-go/**/*' - -diode-sdk-python: - - changed-files: - - any-glob-to-any-file: - - 'diode-sdk-python/*' - - 'diode-sdk-python/**/*' - diode-server: - changed-files: - any-glob-to-any-file: diff --git a/.github/workflows/generate_changed_servers_matrix.sh b/.github/workflows/generate_changed_servers_matrix.sh deleted file mode 100755 index 1bed5552..00000000 --- a/.github/workflows/generate_changed_servers_matrix.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env bash - -set -e - -changed_files=$1 -if [ -z "$changed_files" ]; then - echo "Please provide a list of changed files as the first argument." - exit 1 -fi - -distributor_deps=("diode-server/go.mod" "diode-server/go.sum" "diode-server/cmd/distributor/" "diode-server/distributor/" "diode-server/server/") -ingester_deps=("diode-server/go.mod" "diode-server/go.sum" "diode-server/cmd/ingester" "diode-server/ingester/" "diode-server/server/") -reconciler_deps=("diode-server/go.mod" "diode-server/go.sum" "diode-server/cmd/reconciler/" "diode-server/reconciler/" "diode-server/server/") - -repo_root_dir=$(git rev-parse --show-toplevel) - -declare -A changed_servers - -IFS=';' - -check_deps() { - local -n deps=$1 - local file_path=$2 - file_dir="$( dirname "$file_path" )/" - - for dep in "${deps[@]}"; do - if [[ "$dep" == "$file_path" ]]; then - return 0 - fi - if [[ "$file_dir" =~ ^$dep ]]; then - return 0 - fi - done - return 1 -} - -read -ra changed_files_arr <<< "$changed_files" - -for file in "${changed_files_arr[@]}"; do - if [[ ! -f "$repo_root_dir/$file" ]]; then - echo "File $repo_root_dir/$file does not exist, skipping" - continue - fi - - if check_deps distributor_deps "$file" && [[ ! -v changed_servers["distributor"] ]]; then - changed_servers["distributor"]=1 - fi - - if check_deps ingester_deps "$file" && [[ ! -v changed_servers["ingester"] ]]; then - changed_servers["ingester"]=1 - fi - - if check_deps reconciler_deps "$file" && [[ ! -v changed_servers["reconciler"] ]]; then - changed_servers["reconciler"]=1 - fi -done - -changed_servers_num=${#changed_servers[@]} - -matrix_json="{\"include\":[" - -item_num=0 -for server in "${!changed_servers[@]}"; do - matrix_json+="{" - matrix_json+="\"server\":\"${server}\"" - matrix_json+="}" - if [[ $item_num -lt $changed_servers_num-1 ]]; then - matrix_json+="," - fi - item_num=$((item_num+1)) -done - -matrix_json+="]}" - -echo "matrix=$matrix_json" >> $GITHUB_OUTPUT diff --git a/.github/workflows/go-sdk-release.yaml b/.github/workflows/go-sdk-release.yaml deleted file mode 100644 index daa0e563..00000000 --- a/.github/workflows/go-sdk-release.yaml +++ /dev/null @@ -1,53 +0,0 @@ -name: Go SDK - release -on: - workflow_dispatch: - push: - branches: [ release ] - paths: - - "diode-sdk-go/**" -env: - GH_TOKEN: ${{ secrets.ORB_CI_GH_TOKEN }} - SEMANTIC_RELEASE_PACKAGE: ${{ github.repository }} - APP_DIR: diode-sdk-go - -jobs: - get-next-version: - uses: netboxlabs/diode/.github/workflows/reusable_semantic_release_get_next_version.yaml@develop - with: - # passed vars need hard coding - https://docs.github.com/en/actions/using-workflows/reusing-workflows#limitations - app_name: diode-sdk-go - app_dir: diode-sdk-go - secrets: inherit - - build: - name: Build - needs: [ get-next-version ] - runs-on: ubuntu-latest - defaults: - run: - working-directory: ${{ env.APP_DIR }} - env: - BUILD_VERSION: ${{ needs.get-next-version.outputs.new-release-version }} - BUILD_TRACK: release - BUILD_COMMIT: ${{ needs.get-next-version.outputs.short-sha }} - steps: - - uses: actions/checkout@v4 - # - # do the build and inject versions here - # - # - name: Upload Github build artifact - # uses: actions/upload-artifact@v4 - # with: - # name: build-production.zip - # path: services/controlplane/signup-ui/build-production.zip - # retention-days: 1 - # if-no-files-found: error - - semantic-release: - uses: netboxlabs/diode/.github/workflows/reusable_semantic_release.yaml@develop - needs: [ build ] - with: - app_dir: diode-sdk-go - secrets: inherit - - # upload to Docker hub / GHCR here diff --git a/.github/workflows/go-test.yaml b/.github/workflows/go-test.yaml index 1cf06d59..58b11be3 100644 --- a/.github/workflows/go-test.yaml +++ b/.github/workflows/go-test.yaml @@ -5,26 +5,56 @@ on: - "!release" pull_request: +concurrency: + group: ${{ github.workflow }} + cancel-in-progress: false + +permissions: + contents: write + pull-requests: write + jobs: go-test: runs-on: ubuntu-latest - strategy: - matrix: - go: [ - "diode-sdk-go", - "diode-server", - ] + timeout-minutes: 10 + defaults: + run: + working-directory: diode-server steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Go uses: actions/setup-go@v4 with: - go-version: '1.21.x' + go-version: '1.22' check-latest: true - - name: Run go build ${{ matrix.go }} - working-directory: ${{ matrix.go }} + - name: Run go build run: go build ./... - - name: Run go test ${{ matrix.go }} - working-directory: ${{ matrix.go }} - run: go test -race ./... + - name: Install additional dependencies + run: | + go install github.com/mfridman/tparse@v0.14.0 + - name: Run go test + id: go-test + run: | + make test-coverage + echo 'coverage-report<> $GITHUB_OUTPUT + cat .coverage/test-report.md >> $GITHUB_OUTPUT + echo 'EOF' >> $GITHUB_OUTPUT + echo "coverage-total=$(cat .coverage/coverage.txt)" >> $GITHUB_OUTPUT + - name: Find comment + uses: peter-evans/find-comment@v3 + id: existing-comment + with: + issue-number: ${{ github.event.pull_request.number }} + comment-author: 'github-actions[bot]' + body-includes: Go test coverage + - name: Post comment + uses: peter-evans/create-or-update-comment@v4 + with: + comment-id: ${{ steps.existing-comment.outputs.comment-id }} + issue-number: ${{ github.event.pull_request.number }} + body: | + Go test coverage + ${{ steps.go-test.outputs.coverage-report }} + Total coverage: ${{ steps.go-test.outputs.coverage-total }}% + edit-mode: replace diff --git a/.github/workflows/golangci-lint.yaml b/.github/workflows/golangci-lint.yaml index a21429a4..11a80268 100644 --- a/.github/workflows/golangci-lint.yaml +++ b/.github/workflows/golangci-lint.yaml @@ -10,24 +10,20 @@ permissions: jobs: golangci: - strategy: - matrix: - go: [ - "diode-sdk-go", - "diode-server", - ] runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v4 + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Go + uses: actions/setup-go@v4 with: - go-version: '1.21' - cache: false - - name: golangci-lint ${{ matrix.go }} + go-version: '1.22' + check-latest: true + - name: Lint uses: golangci/golangci-lint-action@v3 with: version: v1.54 - working-directory: ${{ matrix.go }} + working-directory: diode-server args: --config ../.github/golangci.yaml skip-pkg-cache: true skip-build-cache: true diff --git a/.github/workflows/python-netbox-plugin-lint.yml b/.github/workflows/python-netbox-plugin-lint.yml deleted file mode 100644 index 0b90fc73..00000000 --- a/.github/workflows/python-netbox-plugin-lint.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Python Netbox plugin - lint -on: - workflow_dispatch: - push: - branches: - - "!release" - paths: - - "diode-netbox-plugin/**" - -jobs: - tests: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: [ "3.7", "3.8", "3.9", "3.10", "3.11", "3.12" ] - defaults: - run: - working-directory: diode-sdk-python - steps: - - uses: actions/checkout@v4 - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python }} - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install . - pip install .[dev] - pip install .[test] - - - name: Lint with Ruff - run: | - ruff --output-format=github diode-netbox-plugin/netbox_diode_plugin/ diode-netbox-plugin/tests/ - continue-on-error: true diff --git a/.github/workflows/python-netbox-plugin-release.yaml b/.github/workflows/python-netbox-plugin-release.yaml deleted file mode 100644 index c9e7fd3e..00000000 --- a/.github/workflows/python-netbox-plugin-release.yaml +++ /dev/null @@ -1,74 +0,0 @@ -name: Python Netbox plugin - release -on: - workflow_dispatch: - push: - branches: [release] - paths: - - "diode-netbox-plugin/**" -env: - GH_TOKEN: ${{ secrets.ORB_CI_GH_TOKEN }} - SEMANTIC_RELEASE_PACKAGE: ${{ github.repository }} - APP_DIR: diode-netbox-plugin - PYTHON_RUNTIME_VERSION: "3.11" - PYTHON_PACKAGE_NAME: netboxlabs-diode-netbox-plugin - -jobs: - get-next-version: - uses: netboxlabs/diode/.github/workflows/reusable_semantic_release_get_next_version.yaml@develop - with: - # passed vars need hard coding - https://docs.github.com/en/actions/using-workflows/reusing-workflows#limitations - app_name: diode-netbox-plugin - app_dir: diode-netbox-plugin - secrets: inherit - - build: - name: Build - needs: [get-next-version] - runs-on: ubuntu-latest - permissions: - id-token: write - contents: read - defaults: - run: - working-directory: ${{ env.APP_DIR }} - env: - BUILD_VERSION: ${{ needs.get-next-version.outputs.new-release-version }} - BUILD_TRACK: release - BUILD_COMMIT: ${{ needs.get-next-version.outputs.short-sha }} - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v5 - with: - python-version: ${{ env.PYTHON_RUNTIME_VERSION }} - - name: Insert version variables into Python - run: | - sed -i "s/__commit_hash__ = .*/__commit_hash__ = \"${BUILD_COMMIT}\"/" netbox_diode_plugin/version.py - sed -i "s/__track__ = .*/__track__ = \"${BUILD_TRACK}\"/" netbox_diode_plugin/version.py - sed -i "s/__version__ = .*/__version__ = \"${BUILD_VERSION}\"/" netbox_diode_plugin/version.py - - name: Display contents of version.py - run: cat netbox_diode_plugin/version.py - - name: Build sdist package - run: | - pip install toml-cli - toml set --toml-path pyproject.toml project.version ${{ env.BUILD_VERSION }} - cat pyproject.toml | grep version - python3 -m pip install --upgrade build - python3 -m build --sdist --outdir dist/ - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: ${{ env.PYTHON_PACKAGE_NAME }}-${{ env.BUILD_VERSION }}.tar.gz - path: ${{ env.APP_DIR }}/dist/${{ env.PYTHON_PACKAGE_NAME }}-${{ env.BUILD_VERSION }}.tar.gz - retention-days: 30 - if-no-files-found: error - - name: Publish release distributions to PyPI - uses: pypa/gh-action-pypi-publish@release/v1 - with: - packages-dir: ${{ env.APP_DIR }}/dist - - semantic-release: - uses: netboxlabs/diode/.github/workflows/reusable_semantic_release.yaml@develop - needs: [build] - with: - app_dir: diode-netbox-plugin - secrets: inherit diff --git a/.github/workflows/python-sdk-lint-tests.yml b/.github/workflows/python-sdk-lint-tests.yml deleted file mode 100644 index 262396dd..00000000 --- a/.github/workflows/python-sdk-lint-tests.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: Python SDK - lint and tests -on: - workflow_dispatch: - push: - branches: - - "!release" - paths: - - "diode-sdk-python/**" - -jobs: - tests: - runs-on: ubuntu-latest - strategy: - matrix: - python: [ "3.11"] - defaults: - run: - working-directory: diode-sdk-python - steps: - - uses: actions/checkout@v4 - - name: Setup Python - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python }} - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install . - pip install .[dev] - pip install .[test] - - - name: Run tests with coverage - run: | - set -o pipefail - pytest --junitxml=pytest.xml --cov-report=term-missing:skip-covered --cov=netboxlabs/ | tee pytest-coverage.txt - - - name: Pytest coverage comment - uses: MishaKav/pytest-coverage-comment@main - with: - pytest-coverage-path: ./pytest-coverage.txt - junitxml-path: ./pytest.xml - - - name: Lint with Ruff - run: | - ruff --output-format=github netboxlabs/ tests/ - continue-on-error: true diff --git a/.github/workflows/python-sdk-release.yaml b/.github/workflows/python-sdk-release.yaml deleted file mode 100644 index 932691c3..00000000 --- a/.github/workflows/python-sdk-release.yaml +++ /dev/null @@ -1,74 +0,0 @@ -name: Python SDK - release -on: - workflow_dispatch: - push: - branches: [release] - paths: - - "diode-sdk-python/**" -env: - GH_TOKEN: ${{ secrets.ORB_CI_GH_TOKEN }} - SEMANTIC_RELEASE_PACKAGE: ${{ github.repository }} - APP_DIR: diode-sdk-python - PYTHON_RUNTIME_VERSION: "3.11" - PYTHON_PACKAGE_NAME: netboxlabs-diode-sdk - -jobs: - get-next-version: - uses: netboxlabs/diode/.github/workflows/reusable_semantic_release_get_next_version.yaml@develop - with: - # passed vars need hard coding - https://docs.github.com/en/actions/using-workflows/reusing-workflows#limitations - app_name: diode-sdk-python - app_dir: diode-sdk-python - secrets: inherit - - build: - name: Build - needs: [get-next-version] - runs-on: ubuntu-latest - permissions: - id-token: write - contents: read - defaults: - run: - working-directory: ${{ env.APP_DIR }} - env: - BUILD_VERSION: ${{ needs.get-next-version.outputs.new-release-version }} - BUILD_TRACK: release - BUILD_COMMIT: ${{ needs.get-next-version.outputs.short-sha }} - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v5 - with: - python-version: ${{ env.PYTHON_RUNTIME_VERSION }} - - name: Insert version variables into Python - run: | - sed -i "s/__commit_hash__ = .*/__commit_hash__ = \"${BUILD_COMMIT}\"/" netboxlabs/diode/sdk/version.py - sed -i "s/__track__ = .*/__track__ = \"${BUILD_TRACK}\"/" netboxlabs/diode/sdk/version.py - sed -i "s/__version__ = .*/__version__ = \"${BUILD_VERSION}\"/" netboxlabs/diode/sdk/version.py - - name: Display contents of version.py - run: cat netboxlabs/diode/sdk/version.py - - name: Build sdist package - run: | - pip install toml-cli - toml set --toml-path pyproject.toml project.version ${{ env.BUILD_VERSION }} - cat pyproject.toml | grep version - python3 -m pip install --upgrade build - python3 -m build --sdist --outdir dist/ - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: ${{ env.PYTHON_PACKAGE_NAME }}-${{ env.BUILD_VERSION }}.tar.gz - path: ${{ env.APP_DIR }}/dist/${{ env.PYTHON_PACKAGE_NAME }}-${{ env.BUILD_VERSION }}.tar.gz - retention-days: 30 - if-no-files-found: error - - name: Publish release distributions to PyPI - uses: pypa/gh-action-pypi-publish@release/v1 - with: - packages-dir: ${{ env.APP_DIR }}/dist - - semantic-release: - uses: netboxlabs/diode/.github/workflows/reusable_semantic_release.yaml@develop - needs: [build] - with: - app_dir: diode-sdk-python - secrets: inherit diff --git a/.github/workflows/reusable_semantic_release.yaml b/.github/workflows/reusable_semantic_release.yaml index c209fd1e..de423dc9 100644 --- a/.github/workflows/reusable_semantic_release.yaml +++ b/.github/workflows/reusable_semantic_release.yaml @@ -1,7 +1,10 @@ -name: Reusable - Semantic Release - Release +name: Semantic Release - Release on: workflow_call: inputs: + app_name: + type: string + required: true app_dir: type: string required: true @@ -17,11 +20,72 @@ jobs: defaults: run: working-directory: ${{ inputs.app_dir }} + concurrency: + group: semantic-release + cancel-in-progress: false steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: "21.4.0" + - name: Write package.json + uses: DamianReeves/write-file-action@master + with: + path: ${{ inputs.app_dir }}/package.json + write-mode: overwrite + contents: | + { + "name": "${{ inputs.app_name }}", + "version": "1.0.0", + "extends": "semantic-release-monorepo", + "devDependencies": { + "semantic-release-monorepo": "^7.0.0", + "semantic-release-export-data": "^1.0.1", + "@semantic-release/changelog": "^6.0.3" + } + } + - name: Write .releaserc.json + uses: DamianReeves/write-file-action@master + with: + path: ${{ inputs.app_dir }}/.releaserc.json + write-mode: overwrite + contents: | + { + "branches": "release", + "repositoryUrl": "https://github.com/netboxlabs/diode", + "debug": "true", + "extends": "semantic-release-monorepo", + "tagFormat": "${{ inputs.app_name }}/v${version}", + "plugins": [ + ["semantic-release-export-data"], + ["@semantic-release/commit-analyzer", { + "releaseRules": [ + { "message": "*", "release": "patch"}, + { "message": "fix*", "release": "patch" }, + { "message": "feat*", "release": "minor" }, + { "message": "perf*", "release": "major" } + ] + }], + "@semantic-release/release-notes-generator", + [ + "@semantic-release/changelog", + { + "changelogFile": "CHANGELOG.md", + "changelogTitle": "# Semantic Versioning Changelog" + } + ], + [ + "@semantic-release/github", + { + "assets": [ + { + "path": "release/**" + } + ] + } + ] + ] + } - name: setup semantic-release run: npm i - name: Release diff --git a/.github/workflows/reusable_semantic_release_get_next_version.yaml b/.github/workflows/reusable_semantic_release_get_next_version.yaml index e0907d9c..42e5ebec 100644 --- a/.github/workflows/reusable_semantic_release_get_next_version.yaml +++ b/.github/workflows/reusable_semantic_release_get_next_version.yaml @@ -1,19 +1,19 @@ -name: Reusable - Semantic Release - Get Next Version +name: Semantic Release - Get Next Version on: workflow_call: inputs: - app_name: + app_name: type: string required: true - app_dir: + app_dir: type: string required: true outputs: - new-release-published: + new-release-published: value: ${{ jobs.get-next-version.outputs.new-release-published }} - new-release-version: + new-release-version: value: ${{ jobs.get-next-version.outputs.new-release-version }} - short-sha: + short-sha: value: ${{ jobs.get-next-version.outputs.short-sha }} env: @@ -32,6 +32,68 @@ jobs: - uses: actions/setup-node@v4 with: node-version: "lts/*" + - name: Write package.json + uses: DamianReeves/write-file-action@master + with: + path: ${{ inputs.app_dir }}/package.json + write-mode: overwrite + contents: | + { + "name": "${{ inputs.app_name }}", + "version": "1.0.0", + "extends": "semantic-release-monorepo", + "devDependencies": { + "semantic-release-monorepo": "^7.0.0", + "semantic-release-export-data": "^1.0.1", + "@semantic-release/changelog": "^6.0.3", + "@semantic-release/commit-analyzer": "^9.0.2", + "@semantic-release/github": "^8.0.0", + "@semantic-release/npm": "^9.0.0", + "@semantic-release/release-notes-generator": "^10.0.0" + } + } + - name: Write .releaserc.json + uses: DamianReeves/write-file-action@master + with: + path: ${{ inputs.app_dir }}/.releaserc.json + write-mode: overwrite + contents: | + { + "branches": "release", + "repositoryUrl": "https://github.com/netboxlabs/diode", + "debug": "true", + "extends": "semantic-release-monorepo", + "tagFormat": "${{ inputs.app_name }}/v${version}", + "plugins": [ + ["semantic-release-export-data"], + ["@semantic-release/commit-analyzer", { + "releaseRules": [ + { "message": "*", "release": "patch"}, + { "message": "fix*", "release": "patch" }, + { "message": "feat*", "release": "minor" }, + { "message": "perf*", "release": "major" } + ] + }], + "@semantic-release/release-notes-generator", + [ + "@semantic-release/changelog", + { + "changelogFile": "CHANGELOG.md", + "changelogTitle": "# Semantic Versioning Changelog" + } + ], + [ + "@semantic-release/github", + { + "assets": [ + { + "path": "release/**" + } + ] + } + ] + ] + } - name: setup semantic-release run: npm i - name: release dry-run @@ -41,11 +103,11 @@ jobs: id: get-next-version - name: Set short sha output id: short-sha - run: echo "::set-output name=short-sha::${GITHUB_SHA::7}" + run: echo "short-sha=${GITHUB_SHA::7}" >> $GITHUB_OUTPUT - name: Set release version id: release-version run: | - echo "::set-output name=release-version::`echo ${{ steps.get-next-version.outputs.new-release-version }} | sed 's/${{ inputs.app_name }}-v//g'`" + echo "release-version=`echo ${{ steps.get-next-version.outputs.new-release-version }} | sed 's/${{ inputs.app_name }}-v//g'`" >> $GITHUB_OUTPUT outputs: new-release-published: ${{ steps.get-next-version.outputs.new-release-published }} new-release-version: ${{ steps.release-version.outputs.release-version }} diff --git a/.github/workflows/server-release.yaml b/.github/workflows/server-release.yaml index dd9b6c82..4bd83956 100644 --- a/.github/workflows/server-release.yaml +++ b/.github/workflows/server-release.yaml @@ -3,89 +3,100 @@ on: workflow_dispatch: push: branches: [ release ] - paths: - - "diode-server/**" + +concurrency: + group: ${{ github.workflow }} + cancel-in-progress: false + env: GH_TOKEN: ${{ secrets.ORB_CI_GH_TOKEN }} SEMANTIC_RELEASE_PACKAGE: ${{ github.repository }} + GO_VERSION: '1.22' jobs: setup: name: Setup runs-on: ubuntu-latest outputs: - matrix: ${{ steps.generate-matrix.outputs.matrix }} - short_sha: ${{ steps.set-sha.outputs.short_sha }} + apps: ${{ steps.apps.outputs.apps }} steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - name: Set short SHA - id: short-sha - run: | - echo "short_sha=${GITHUB_SHA::7}" >> $GITHUB_OUTPUT - - name: Get changed dirs - id: get-changed-dirs + - name: Get apps + id: apps run: | - echo "changed-dirs=$(git diff --name-only ${{ github.event.before }} ${{ steps.short-sha.outputs.short_sha }} | sort -u | tr '\n' ';')" >> $GITHUB_OUTPUT - - name: Generate servers matrix - id: generate-matrix - run: .github/workflows/generate_changed_servers_matrix.sh "${{ steps.get-changed-dirs.outputs.changed-dirs }}" - - name: Echo test - run: | - echo "matrix: ${{ steps.generate-matrix.outputs.matrix }}" + echo 'apps=["ingester", "reconciler"]' >> "$GITHUB_OUTPUT" get-next-version: - uses: netboxlabs/diode/.github/workflows/reusable_semantic_release_get_next_version.yaml@develop + name: Get next version - ${{ matrix.app }} needs: [ setup ] + uses: netboxlabs/diode/.github/workflows/reusable_semantic_release_get_next_version.yaml@develop strategy: fail-fast: false - matrix: ${{ fromJson(needs.setup.outputs.matrix) }} - if: needs.setup.outputs.matrix != '' + matrix: + app: ${{ fromJSON(needs.setup.outputs.apps) }} with: - # passed vars need hard coding - https://docs.github.com/en/actions/using-workflows/reusing-workflows#limitations - app_name: ${{ matrix.server }} - app_dir: diode-server/cmd/${{ matrix.server }} + app_name: diode-${{ matrix.app }} + app_dir: diode-server/cmd/${{ matrix.app }} secrets: inherit build: - name: Build ${{ matrix.server }} - needs: [ get-next-version, setup ] + name: Build - ${{ matrix.app }} + needs: [ setup, get-next-version ] + runs-on: ubuntu-latest strategy: fail-fast: false - matrix: ${{ fromJson(needs.setup.outputs.matrix) }} - runs-on: ubuntu-latest - if: needs.setup.outputs.matrix != '' - defaults: - run: - working-directory: diode-server/cmd/${{ matrix.server }} + matrix: + app: ${{ fromJSON(needs.setup.outputs.apps) }} + if: needs.get-next-version.outputs.new-release-published == 'true' env: BUILD_VERSION: ${{ needs.get-next-version.outputs.new-release-version }} - BUILD_TRACK: release BUILD_COMMIT: ${{ needs.get-next-version.outputs.short-sha }} steps: - - uses: actions/checkout@v4 - # - # do the build and inject versions here - # - # - name: Upload Github build artifact - # uses: actions/upload-artifact@v4 - # with: - # name: build-production.zip - # path: services/controlplane/signup-ui/build-production.zip - # retention-days: 1 - # if-no-files-found: error + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Set build info + run: | + echo $BUILD_COMMIT > ./diode-server/version/BUILD_COMMIT.txt + echo $BUILD_VERSION > ./diode-server/version/BUILD_VERSION.txt + + - name: Build image and push + uses: docker/build-push-action@v6 + with: + context: diode-server + file: diode-server/docker/Dockerfile-build + platforms: linux/amd64,linux/arm64 + push: true + cache-from: type=gha + cache-to: type=gha,mode=max + tags: | + netboxlabs/diode-${{ matrix.app }}:latest + netboxlabs/diode-${{ matrix.app }}:${{ env.BUILD_VERSION }} + build-args: | + GO_VERSION=${{ env.GO_VERSION }} + SVC=${{ matrix.app }} semantic-release: + name: Semantic release - ${{ matrix.app }} uses: netboxlabs/diode/.github/workflows/reusable_semantic_release.yaml@develop - needs: [ build, setup ] + needs: [ setup, build ] strategy: fail-fast: false - matrix: ${{ fromJson(needs.setup.outputs.matrix) }} - if: needs.setup.outputs.matrix != '' + matrix: + app: ${{ fromJSON(needs.setup.outputs.apps) }} + if: needs.setup.outputs.app != '' with: - app_dir: diode-server/cmd/${{ matrix.server }} + app_name: diode-${{ matrix.app }} + app_dir: diode-server/cmd/${{ matrix.app }} secrets: inherit - - # upload to Docker hub / GHCR here \ No newline at end of file diff --git a/.gitignore b/.gitignore index fc5351bb..e085b141 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ venv.bak/ coverage.txt # diode-server +diode-server/.coverage/ diode-server/build/ # Python @@ -32,4 +33,4 @@ __pycache__/ build/ dist/ .eggs/ -*.egg-info \ No newline at end of file +*.egg-info diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..fcaed8aa --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,164 @@ +# PolyForm Shield License 1.0.0 + + + +## Acceptance + +In order to get any license under these terms, you must agree +to them as both strict obligations and conditions to all +your licenses. + +## Copyright License + +The licensor grants you a copyright license for the +software to do everything you might do with the software +that would otherwise infringe the licensor's copyright +in it for any permitted purpose. However, you may +only distribute the software according to [Distribution +License](#distribution-license) and make changes or new works +based on the software according to [Changes and New Works +License](#changes-and-new-works-license). + +## Distribution License + +The licensor grants you an additional copyright license +to distribute copies of the software. Your license +to distribute covers distributing the software with +changes and new works permitted by [Changes and New Works +License](#changes-and-new-works-license). + +## Notices + +You must ensure that anyone who gets a copy of any part of +the software from you also gets a copy of these terms or the +URL for them above, as well as copies of any plain-text lines +beginning with `Required Notice:` that the licensor provided +with the software. For example: + +> Required Notice: Copyright Yoyodyne, Inc. (http://example.com) + +## Changes and New Works License + +The licensor grants you an additional copyright license to +make changes and new works based on the software for any +permitted purpose. + +## Patent License + +The licensor grants you a patent license for the software that +covers patent claims the licensor can license, or becomes able +to license, that you would infringe by using the software. + +## Noncompete + +Any purpose is a permitted purpose, except for providing any +product that competes with the software or any product the +licensor or any of its affiliates provides using the software. + +## Competition + +Goods and services compete even when they provide functionality +through different kinds of interfaces or for different technical +platforms. Applications can compete with services, libraries +with plugins, frameworks with development tools, and so on, +even if they're written in different programming languages +or for different computer architectures. Goods and services +compete even when provided free of charge. If you market a +product as a practical substitute for the software or another +product, it definitely competes. + +## New Products + +If you are using the software to provide a product that does +not compete, but the licensor or any of its affiliates brings +your product into competition by providing a new version of +the software or another product using the software, you may +continue using versions of the software available under these +terms beforehand to provide your competing product, but not +any later versions. + +## Discontinued Products + +You may begin using the software to compete with a product +or service that the licensor or any of its affiliates has +stopped providing, unless the licensor includes a plain-text +line beginning with `Licensor Line of Business:` with the +software that mentions that line of business. For example: + +> Licensor Line of Business: YoyodyneCMS Content Management +System (http://example.com/cms) + +## Sales of Business + +If the licensor or any of its affiliates sells a line of +business developing the software or using the software +to provide a product, the buyer can also enforce +[Noncompete](#noncompete) for that product. + +## Fair Use + +You may have "fair use" rights for the software under the +law. These terms do not limit them. + +## No Other Rights + +These terms do not allow you to sublicense or transfer any of +your licenses to anyone else, or prevent the licensor from +granting licenses to anyone else. These terms do not imply +any other licenses. + +## Patent Defense + +If you make any written claim that the software infringes or +contributes to infringement of any patent, your patent license +for the software granted under these terms ends immediately. If +your company makes such a claim, your patent license ends +immediately for work on behalf of your company. + +## Violations + +The first time you are notified in writing that you have +violated any of these terms, or done anything with the software +not covered by your licenses, your licenses can nonetheless +continue if you come into full compliance with these terms, +and take practical steps to correct past violations, within +32 days of receiving notice. Otherwise, all your licenses +end immediately. + +## No Liability + +***As far as the law allows, the software comes as is, without +any warranty or condition, and the licensor will not be liable +to you for any damages arising out of these terms or the use +or nature of the software, under any kind of legal claim.*** + +## Definitions + +The **licensor** is the individual or entity offering these +terms, and the **software** is the software the licensor makes +available under these terms. + +A **product** can be a good or service, or a combination +of them. + +**You** refers to the individual or entity agreeing to these +terms. + +**Your company** is any legal entity, sole proprietorship, +or other kind of organization that you work for, plus all +its affiliates. + +**Affiliates** means the other organizations than an +organization has control over, is under the control of, or is +under common control with. + +**Control** means ownership of substantially all the assets of +an entity, or the power to direct its management and policies +by vote, contract, or otherwise. Control can be direct or +indirect. + +**Your licenses** are all the licenses granted to you for the +software under these terms. + +**Use** means anything you do with the software requiring one +of your licenses. \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..f7058b03 --- /dev/null +++ b/Makefile @@ -0,0 +1,12 @@ +.PHONY: gen-diode-sdk-go gen-diode-sdk-python + +gen-diode-sdk-go: + @cd diode-proto/ && buf format -w && buf generate --template buf.gen.go.yaml + +gen-diode-go-internal: + @cd diode-proto/ && buf format -w && buf generate --template buf.gen.go-internal.yaml + +gen-diode-sdk-python: + @cd diode-proto/ && buf format -w && buf generate --template buf.gen.py.yaml --include-imports + @find ../diode-sdk-python/netboxlabs/diode/sdk \( -name '*.py' -o -name '*.pyi' \) \ + -exec sed -i '' 's/^from diode.v1/from netboxlabs.diode.sdk.diode.v1/; s/^from validate/from netboxlabs.diode.sdk.validate/' {} \; diff --git a/README.md b/README.md index bd22597f..16e3e817 100644 --- a/README.md +++ b/README.md @@ -1 +1,17 @@ -# diode \ No newline at end of file +# Diode + +Diode is a service designed to streamline the process of data ingestion and reconciliation for NetBox users. It aims to lower the barriers to entry for integrating existing network infrastructure data into NetBox and reduce the maintenance efforts required to keep the data up-to-date. + +## Usage + +## Related Projects + +- [diode-netbox-plugin](https://github.com/netboxlabs/diode-netbox-plugin) - The Diode NetBox plugin is a NetBox plugin and a required component of the Diode ingestion service. +- [diode-sdk-python](https://github.com/netboxlabs/diode-sdk-python) - Diode SDK Python is a Python library for interacting with the Diode ingestion service utilizing gRPC. +- [diode-agent](https://github.com/netboxlabs/diode-agent) - A collection of agents that leverage the Diode SDK to interact with the Diode server. + +## License + +Distributed under the PolyForm Shield License 1.0.0 License. See [LICENSE.md](./LICENSE.md) for more information. + +Diode protocol buffers are distributed under the Apache 2.0 License. See [LICENSE.txt](./diode-proto/LICENSE.txt) for more information. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..4e819dbc --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,5 @@ +# Security Policy + +## Reporting a Vulnerability + +Please send any suspected vulnerability report to security@netboxlabs.com diff --git a/diode-netbox-plugin/.releaserc.json b/diode-netbox-plugin/.releaserc.json deleted file mode 100644 index a02bb5f3..00000000 --- a/diode-netbox-plugin/.releaserc.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "branches": "release", - "repositoryUrl": "https://github.com/netboxlabs/diode", - "debug": "true", - "extends": "semantic-release-monorepo", - "tagFormat": "diode-netbox-plugin/v${version}", - "plugins": [ - ["semantic-release-export-data"], - ["@semantic-release/commit-analyzer", { - "releaseRules": [ - { "message": "*", "release": "patch"}, - { "message": "fix*", "release": "patch" }, - { "message": "feat*", "release": "minor" }, - { "message": "perf*", "release": "major" } - ] - }], - "@semantic-release/release-notes-generator", - [ - "@semantic-release/changelog", - { - "changelogFile": "CHANGELOG.md", - "changelogTitle": "# Semantic Versioning Changelog" - } - ], - [ - "@semantic-release/github", - { - "assets": [ - { - "path": "release/**" - } - ] - } - ] - ] -} diff --git a/diode-netbox-plugin/LICENSE.txt b/diode-netbox-plugin/LICENSE.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/diode-netbox-plugin/README.md b/diode-netbox-plugin/README.md deleted file mode 100644 index f82241c0..00000000 --- a/diode-netbox-plugin/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Diode NetBox Plugin - -## Installation - -```bash -pip install netboxlabs-diode-netbox-plugin -``` - -In your `configuration.py` file, add `netbox_diode_plugin` to the `PLUGINS` list. - -```python -PLUGINS = [ - "netbox_diode_plugin", -] -``` - -Create a plugin configuration entry: - -```python -PLUGINS_CONFIG = { - "netbox_diode_plugin": { - - } -} -``` diff --git a/diode-netbox-plugin/diode-netbox-plugin.iml b/diode-netbox-plugin/diode-netbox-plugin.iml deleted file mode 100644 index 06c0b237..00000000 --- a/diode-netbox-plugin/diode-netbox-plugin.iml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/diode-netbox-plugin/netbox_diode_plugin/__init__.py b/diode-netbox-plugin/netbox_diode_plugin/__init__.py deleted file mode 100644 index 3c9c45b6..00000000 --- a/diode-netbox-plugin/netbox_diode_plugin/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""Diode Netbox Plugin.""" - -from extras.plugins import PluginConfig -from .version import version_semver - - -class NetBoxDiodePluginConfig(PluginConfig): - name = "netbox_diode_plugin" - verbose_name = "NetBox Labs, Diode Plugin" - description = "Diode plugin for NetBox." - version = version_semver() - base_url = "diode" - min_version = "3.7.2" - - def ready(self): - super().ready() - - from . import signals # noqa: F401 - - -config = NetBoxDiodePluginConfig diff --git a/diode-netbox-plugin/netbox_diode_plugin/api/__init__.py b/diode-netbox-plugin/netbox_diode_plugin/api/__init__.py deleted file mode 100644 index 54f875f1..00000000 --- a/diode-netbox-plugin/netbox_diode_plugin/api/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""Diode Netbox Plugin - API.""" diff --git a/diode-netbox-plugin/netbox_diode_plugin/management/__init__.py b/diode-netbox-plugin/netbox_diode_plugin/management/__init__.py deleted file mode 100644 index 89239e40..00000000 --- a/diode-netbox-plugin/netbox_diode_plugin/management/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""Diode Netbox Plugin - Management.""" diff --git a/diode-netbox-plugin/netbox_diode_plugin/management/commands/__init__.py b/diode-netbox-plugin/netbox_diode_plugin/management/commands/__init__.py deleted file mode 100644 index 0ae9db5b..00000000 --- a/diode-netbox-plugin/netbox_diode_plugin/management/commands/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""Diode Netbox Plugin - Management commands.""" diff --git a/diode-netbox-plugin/netbox_diode_plugin/migrations/__init__.py b/diode-netbox-plugin/netbox_diode_plugin/migrations/__init__.py deleted file mode 100644 index 7cd32684..00000000 --- a/diode-netbox-plugin/netbox_diode_plugin/migrations/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""Diode Netbox Plugin - Database migrations.""" diff --git a/diode-netbox-plugin/netbox_diode_plugin/models.py b/diode-netbox-plugin/netbox_diode_plugin/models.py deleted file mode 100644 index 986cff31..00000000 --- a/diode-netbox-plugin/netbox_diode_plugin/models.py +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""Diode Netbox Plugin - Models.""" - -import uuid -from django.db import models -from utilities.querysets import RestrictedQuerySet diff --git a/diode-netbox-plugin/netbox_diode_plugin/navigation.py b/diode-netbox-plugin/netbox_diode_plugin/navigation.py deleted file mode 100644 index 453ed3bd..00000000 --- a/diode-netbox-plugin/netbox_diode_plugin/navigation.py +++ /dev/null @@ -1,22 +0,0 @@ -from extras.plugins import PluginMenu, PluginMenuItem -from django.conf import settings -from packaging import version - -# default arguments for the PluginMenuItem class -display_state = { - "link": "plugins:netbox_diode_plugin:display_state", - "link_text": "Display state", - "staff_only": True # 3.6+ feature -} - - -menu = PluginMenu( - label="NetBox Labs", - groups=( - ( - "Diode", - (PluginMenuItem(**display_state),), - ), - ), - icon_class="mdi mdi-arrow-collapse-right", -) diff --git a/diode-netbox-plugin/netbox_diode_plugin/pyproject.toml b/diode-netbox-plugin/netbox_diode_plugin/pyproject.toml deleted file mode 100644 index ce255a34..00000000 --- a/diode-netbox-plugin/netbox_diode_plugin/pyproject.toml +++ /dev/null @@ -1,11 +0,0 @@ -[tool.ruff] - -line-length = 140 - -[tool.ruff.format] -quote-style = "double" -indent-style = "space" - -[tool.ruff.lint] -select = ["C", "D", "E", "F", "I", "R", "UP", "W"] -ignore = ["F401", "D203", "D212", "D400", "D401", "D404", "RET504"] diff --git a/diode-netbox-plugin/netbox_diode_plugin/signals.py b/diode-netbox-plugin/netbox_diode_plugin/signals.py deleted file mode 100644 index c3b1ed61..00000000 --- a/diode-netbox-plugin/netbox_diode_plugin/signals.py +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""Diode Netbox Plugin - Signals.""" - -import logging - - -logger = logging.getLogger("netbox.netbox_diode_plugin") diff --git a/diode-netbox-plugin/netbox_diode_plugin/tables.py b/diode-netbox-plugin/netbox_diode_plugin/tables.py deleted file mode 100644 index e53324de..00000000 --- a/diode-netbox-plugin/netbox_diode_plugin/tables.py +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""Diode Netbox Plugin - Tables.""" - -from django_tables2 import tables diff --git a/diode-netbox-plugin/netbox_diode_plugin/templates/diode/display_state.html b/diode-netbox-plugin/netbox_diode_plugin/templates/diode/display_state.html deleted file mode 100644 index 9211e806..00000000 --- a/diode-netbox-plugin/netbox_diode_plugin/templates/diode/display_state.html +++ /dev/null @@ -1,9 +0,0 @@ -{% extends 'base/layout.html' %} - -{% block title %} -Display state -{% endblock title %} - -{% block content %} -

State placeholder

-{% endblock content %} \ No newline at end of file diff --git a/diode-netbox-plugin/netbox_diode_plugin/urls.py b/diode-netbox-plugin/netbox_diode_plugin/urls.py deleted file mode 100644 index a29472e8..00000000 --- a/diode-netbox-plugin/netbox_diode_plugin/urls.py +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""Diode Netbox Plugin - URLs.""" - -from django.urls import path -from . import views - -urlpatterns = ( - path("display-state/", views.DisplayStateView.as_view(), name="display_state"), - -) diff --git a/diode-netbox-plugin/netbox_diode_plugin/version.py b/diode-netbox-plugin/netbox_diode_plugin/version.py deleted file mode 100644 index 2de2087c..00000000 --- a/diode-netbox-plugin/netbox_diode_plugin/version.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""Version stamp.""" - -# These properties are injected at build time by the build process. - -__commit_hash__ = "unknown" -__track__ = "dev" -__version__ = "0.0.0" - - -def version_display(): - """Display the version, track and hash together.""" - return f"v{__version__}-{__track__}-{__commit_hash__}" - - -def version_semver(): - """Semantic version.""" - return __version__ diff --git a/diode-netbox-plugin/netbox_diode_plugin/views.py b/diode-netbox-plugin/netbox_diode_plugin/views.py deleted file mode 100644 index 7dd402af..00000000 --- a/diode-netbox-plugin/netbox_diode_plugin/views.py +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""Diode Netbox Plugin - Views.""" - -from django.shortcuts import redirect, render -from django.views.generic import View -from django_tables2 import SingleTableView - - -class DisplayStateView(View): - def get(self, request): - return render(request, "netbox_diode_plugin/display_state.html") - diff --git a/diode-netbox-plugin/package-lock.json b/diode-netbox-plugin/package-lock.json deleted file mode 100644 index 4cfbf4d6..00000000 --- a/diode-netbox-plugin/package-lock.json +++ /dev/null @@ -1,6902 +0,0 @@ -{ - "name": "diode-netbox-plugin", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "diode-netbox-plugin", - "version": "1.0.0", - "devDependencies": { - "@semantic-release/changelog": "^6.0.3", - "semantic-release-export-data": "^1.0.1", - "semantic-release-monorepo": "^7.0.0" - } - }, - "node_modules/@actions/core": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.1.tgz", - "integrity": "sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==", - "dev": true, - "dependencies": { - "@actions/http-client": "^2.0.1", - "uuid": "^8.3.2" - } - }, - "node_modules/@actions/http-client": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.0.tgz", - "integrity": "sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==", - "dev": true, - "dependencies": { - "tunnel": "^0.0.6", - "undici": "^5.25.4" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "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/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/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/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "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/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/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", - "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", - "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/endpoint": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", - "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/graphql": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", - "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "18.1.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", - "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", - "dev": true, - "peer": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", - "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/tsconfig": "^1.0.2", - "@octokit/types": "^9.2.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=4" - } - }, - "node_modules/@octokit/plugin-retry": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-4.1.6.tgz", - "integrity": "sha512-obkYzIgEC75r8+9Pnfiiqy3y/x1bc3QLE5B7qvv9wi9Kj0R5tGQFC6QMBg1154WQ9lAVypuQDGyp3hNpp15gQQ==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-throttling": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-5.2.3.tgz", - "integrity": "sha512-C9CFg9mrf6cugneKiaI841iG8DOv6P5XXkjmiNNut+swePxQ7RWEdAZRp5rJoE1hjsIqiYcKa/ZkOQ+ujPI39Q==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": "^4.0.0" - } - }, - "node_modules/@octokit/request": { - "version": "6.2.8", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", - "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/tsconfig": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", - "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", - "dev": true, - "peer": true - }, - "node_modules/@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true, - "peer": true - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", - "dev": true, - "peer": true, - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@semantic-release/changelog": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.3.tgz", - "integrity": "sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==", - "dev": true, - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "fs-extra": "^11.0.0", - "lodash": "^4.17.4" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0" - } - }, - "node_modules/@semantic-release/commit-analyzer": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", - "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", - "dev": true, - "peer": true, - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", - "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", - "dev": true, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@semantic-release/github": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.1.0.tgz", - "integrity": "sha512-erR9E5rpdsz0dW1I7785JtndQuMWN/iDcemcptf67tBNOmBUN0b2YNOgcjYUnBpgRpZ5ozfBHrK7Bz+2ets/Dg==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/core": "^4.2.1", - "@octokit/plugin-paginate-rest": "^6.1.2", - "@octokit/plugin-retry": "^4.1.3", - "@octokit/plugin-throttling": "^5.2.3", - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^11.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^3.0.0", - "p-filter": "^2.0.0", - "url-join": "^4.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/npm": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-9.0.2.tgz", - "integrity": "sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==", - "dev": true, - "peer": true, - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "execa": "^5.0.0", - "fs-extra": "^11.0.0", - "lodash": "^4.17.15", - "nerf-dart": "^1.0.0", - "normalize-url": "^6.0.0", - "npm": "^8.3.0", - "rc": "^1.2.8", - "read-pkg": "^5.0.0", - "registry-auth-token": "^5.0.0", - "semver": "^7.1.2", - "tempy": "^1.0.0" - }, - "engines": { - "node": ">=16 || ^14.17" - }, - "peerDependencies": { - "semantic-release": ">=19.0.0" - } - }, - "node_modules/@semantic-release/release-notes-generator": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", - "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", - "dev": true, - "peer": true, - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "get-stream": "^6.0.0", - "import-from": "^4.0.0", - "into-stream": "^6.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true, - "peer": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true, - "peer": true - }, - "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "peer": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", - "dev": true, - "peer": true, - "dependencies": { - "type-fest": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "dev": true, - "peer": true - }, - "node_modules/argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", - "dev": true - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true, - "peer": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true, - "peer": true - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "dev": true, - "peer": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "peer": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "dev": true, - "peer": true, - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, - "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "peer": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "peer": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "peer": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "peer": true, - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dev": true, - "peer": true, - "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/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, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "peer": true, - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "peer": true, - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "peer": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true, - "peer": true, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "peer": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dev": true, - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true, - "peer": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "peer": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "peer": true - }, - "node_modules/env-ci": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz", - "integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==", - "dev": true, - "peer": true, - "dependencies": { - "execa": "^5.0.0", - "fromentries": "^1.3.2", - "java-properties": "^1.0.0" - }, - "engines": { - "node": ">=10.17" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "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/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, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "peer": 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/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "peer": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/file-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/file-url/-/file-url-3.0.0.tgz", - "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-versions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", - "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", - "dev": true, - "peer": true, - "dependencies": { - "semver-regex": "^3.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "peer": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "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/git-log-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", - "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", - "dev": true, - "dependencies": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - } - }, - "node_modules/git-log-parser/node_modules/split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", - "dev": true, - "dependencies": { - "through2": "~2.0.0" - } - }, - "node_modules/git-log-parser/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.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/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "peer": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hook-std": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", - "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dev": true, - "peer": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", - "dev": true, - "peer": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "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, - "peer": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "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-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "peer": true - }, - "node_modules/into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", - "dev": true, - "peer": true, - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "peer": true, - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", - "dev": true, - "peer": true, - "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - }, - "engines": { - "node": ">=10.13" - } - }, - "node_modules/java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "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/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "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-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "peer": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "peer": true - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "peer": true, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.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/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "peer": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "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, - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "dev": true, - "peer": true - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true, - "peer": true - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true, - "peer": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "peer": true - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true, - "peer": true - }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", - "dev": true, - "peer": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, - "peer": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/marked-terminal": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.2.0.tgz", - "integrity": "sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-escapes": "^6.2.0", - "cardinal": "^2.1.1", - "chalk": "^5.2.0", - "cli-table3": "^0.6.3", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.3.0" - }, - "engines": { - "node": ">=14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "peer": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "peer": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "peer": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.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==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "peer": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "peer": true - }, - "node_modules/nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", - "dev": true, - "peer": true - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "peer": true, - "dependencies": { - "lodash": "^4.17.21" - } - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "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==", - "dev": true, - "peer": true, - "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/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm": { - "version": "8.19.4", - "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.4.tgz", - "integrity": "sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/ci-detect", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/run-script", - "abbrev", - "archy", - "cacache", - "chalk", - "chownr", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "mkdirp", - "mkdirp-infer-owner", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "opener", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "read-package-json", - "read-package-json-fast", - "readdir-scoped-modules", - "rimraf", - "semver", - "ssri", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dev": true, - "peer": true, - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/config": "^4.2.1", - "@npmcli/fs": "^2.1.0", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/package-json": "^2.0.0", - "@npmcli/run-script": "^4.2.1", - "abbrev": "~1.1.1", - "archy": "~1.0.0", - "cacache": "^16.1.3", - "chalk": "^4.1.2", - "chownr": "^2.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.2", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.12", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "graceful-fs": "^4.2.10", - "hosted-git-info": "^5.2.1", - "ini": "^3.0.1", - "init-package-json": "^3.0.2", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^2.3.1", - "libnpmaccess": "^6.0.4", - "libnpmdiff": "^4.0.5", - "libnpmexec": "^4.0.14", - "libnpmfund": "^3.0.5", - "libnpmhook": "^8.0.4", - "libnpmorg": "^4.0.4", - "libnpmpack": "^4.1.3", - "libnpmpublish": "^6.0.5", - "libnpmsearch": "^5.0.4", - "libnpmteam": "^4.0.4", - "libnpmversion": "^3.0.7", - "make-fetch-happen": "^10.2.0", - "minimatch": "^5.1.0", - "minipass": "^3.1.6", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "ms": "^2.1.2", - "node-gyp": "^9.1.0", - "nopt": "^6.0.0", - "npm-audit-report": "^3.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.1.0", - "npm-pick-manifest": "^7.0.2", - "npm-profile": "^6.2.0", - "npm-registry-fetch": "^13.3.1", - "npm-user-validate": "^1.0.1", - "npmlog": "^6.0.2", - "opener": "^1.5.2", - "p-map": "^4.0.0", - "pacote": "^13.6.2", - "parse-conflict-json": "^2.0.2", - "proc-log": "^2.0.1", - "qrcode-terminal": "^0.12.0", - "read": "~1.0.7", - "read-package-json": "^5.0.2", - "read-package-json-fast": "^2.0.3", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.1", - "tar": "^6.1.11", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^2.0.0", - "validate-npm-package-name": "^4.0.0", - "which": "^2.0.2", - "write-file-atomic": "^4.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.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, - "peer": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "5.6.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/metavuln-calculator": "^3.0.1", - "@npmcli/move-file": "^2.0.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/package-json": "^2.0.0", - "@npmcli/query": "^1.2.0", - "@npmcli/run-script": "^4.1.3", - "bin-links": "^3.0.3", - "cacache": "^16.1.3", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^5.2.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "minimatch": "^5.1.0", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.0.0", - "npm-pick-manifest": "^7.0.2", - "npm-registry-fetch": "^13.0.0", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.0", - "treeverse": "^2.0.0", - "walk-up-path": "^1.0.0" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/ci-detect": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "4.2.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/map-workspaces": "^2.0.2", - "ini": "^3.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "proc-log": "^2.0.0", - "read-package-json-fast": "^2.0.3", - "semver": "^7.3.5", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "2.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^8.0.1", - "minimatch": "^5.0.1", - "read-package-json-fast": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "cacache": "^16.0.0", - "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "infer-owner": "^1.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "1.2.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-package-arg": "^9.1.0", - "postcss-selector-parser": "^6.0.10", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "4.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@tootallnate/once": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/agent-base": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/npm/node_modules/agentkeepalive": { - "version": "4.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/asap": { - "version": "2.0.6", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/bin-links": { - "version": "3.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "cmd-shim": "^5.0.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0", - "read-cmd-shim": "^3.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/builtins": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "16.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "ip-regex": "^4.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "mkdirp-infer-owner": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/debuglog": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/depd": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/dezalgo": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/diff": { - "version": "5.1.0", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.12", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/gauge": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "8.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "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/npm/node_modules/graceful-fs": { - "version": "4.2.10", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/has": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/npm/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "5.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minimatch": "^5.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/ini": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-package-arg": "^9.0.1", - "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/ip": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "cidr-regex": "^3.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.10.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/just-diff": { - "version": "5.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.4.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "6.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "4.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/disparity-colors": "^2.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^5.0.1", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1", - "tar": "^6.1.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "4.0.14", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/fs": "^2.1.1", - "@npmcli/run-script": "^4.2.0", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^9.0.1", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "proc-log": "^2.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", - "semver": "^7.3.7", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "3.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/arborist": "^5.6.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "8.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "4.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/run-script": "^4.1.3", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "6.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "normalize-package-data": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0", - "semver": "^7.3.7", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "5.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "3.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/run-script": "^4.1.3", - "json-parse-even-better-errors": "^2.3.1", - "proc-log": "^2.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "7.13.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "10.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "5.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/minipass": { - "version": "3.3.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "2.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/mkdirp-infer-owner": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "0.0.8", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "9.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.22 || ^14.13 || >=16" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "4.0.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-normalize-package-bin": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "9.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "5.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "7.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^2.0.0", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "6.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "13.3.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true - }, - "node_modules/npm/node_modules/npmlog": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/once": { - "version": "1.4.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/opener": { - "version": "1.5.2", - "dev": true, - "inBundle": true, - "license": "(WTFPL OR MIT)", - "peer": true, - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/pacote": { - "version": "13.6.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.1", - "just-diff": "^5.0.1", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.10", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/proc-log": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "0.3.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "read": "1" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "peer": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/read": { - "version": "1.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json": { - "version": "5.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/readable-stream": { - "version": "3.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/readdir-scoped-modules": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.3.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.7.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "dev": true, - "inBundle": true, - "license": "CC-BY-3.0", - "peer": true - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.11", - "dev": true, - "inBundle": true, - "license": "CC0-1.0", - "peer": true - }, - "node_modules/npm/node_modules/ssri": { - "version": "9.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "6.1.11", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/treeverse": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/unique-filename": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/npm/node_modules/which": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "peer": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "peer": true, - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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, - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "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/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", - "dev": true, - "peer": true, - "dependencies": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "peer": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==", - "dev": true, - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true, - "peer": true - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ramda": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", - "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==", - "dev": true - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "peer": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "peer": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/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==", - "dev": true - }, - "node_modules/read-pkg/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==", - "dev": true, - "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-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "peer": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "dev": true, - "peer": true, - "dependencies": { - "esprima": "~4.0.0" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dev": true, - "peer": true, - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/semantic-release": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-19.0.5.tgz", - "integrity": "sha512-NMPKdfpXTnPn49FDogMBi36SiBfXkSOJqCkk0E4iWOY1tusvvgBwqUmxTX1kmlT6kIYed9YwNKD1sfPpqa5yaA==", - "dev": true, - "peer": true, - "dependencies": { - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/error": "^3.0.0", - "@semantic-release/github": "^8.0.0", - "@semantic-release/npm": "^9.0.0", - "@semantic-release/release-notes-generator": "^10.0.0", - "aggregate-error": "^3.0.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.0.0", - "env-ci": "^5.0.0", - "execa": "^5.0.0", - "figures": "^3.0.0", - "find-versions": "^4.0.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^2.0.0", - "hosted-git-info": "^4.0.0", - "lodash": "^4.17.21", - "marked": "^4.0.10", - "marked-terminal": "^5.0.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "p-reduce": "^2.0.0", - "read-pkg-up": "^7.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^3.1.1", - "signale": "^1.2.1", - "yargs": "^16.2.0" - }, - "bin": { - "semantic-release": "bin/semantic-release.js" - }, - "engines": { - "node": ">=16 || ^14.17" - } - }, - "node_modules/semantic-release-export-data": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semantic-release-export-data/-/semantic-release-export-data-1.0.1.tgz", - "integrity": "sha512-6vlgrrzzcMi/REhQd65Bh4dfSKmgwXOJ/Q2RVlT9WsU4Ya1T2qGpkSrMfG/n6oFRrqBdbDlyZgxNd94ziW+vSg==", - "dev": true, - "dependencies": { - "@actions/core": "^1.10.0" - }, - "peerDependencies": { - "semantic-release": ">=18" - } - }, - "node_modules/semantic-release-monorepo": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/semantic-release-monorepo/-/semantic-release-monorepo-7.0.8.tgz", - "integrity": "sha512-L2n7FZEYvjxXop6C7svk8xZH1/2N58CV1dN+veeAGZ8363FG+AKNKLN1r4wAL86e5xIu1HiOOASm10X+rN6XWg==", - "dev": true, - "dependencies": { - "debug": "^3.1.0", - "execa": "^0.8.0", - "file-url": "^3.0.0", - "fs-extra": "^10.0.1", - "get-stream": "^6.0.1", - "git-log-parser": "^1.2.0", - "p-each-series": "^2.1.0", - "p-limit": "^1.2.0", - "pkg-up": "^2.0.0", - "ramda": "^0.25.0", - "read-pkg": "^5.0.0", - "semantic-release-plugin-decorators": "^3.0.0", - "tempy": "1.0.1" - }, - "peerDependencies": { - "semantic-release": ">=15.11.x < 20" - } - }, - "node_modules/semantic-release-monorepo/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/semantic-release-monorepo/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/semantic-release-monorepo/node_modules/execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==", - "dev": true, - "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/execa/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/semantic-release-monorepo/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/semantic-release-monorepo/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/semantic-release-monorepo/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/semantic-release-monorepo/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/semantic-release-monorepo/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/semantic-release-monorepo/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - }, - "node_modules/semantic-release-plugin-decorators": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/semantic-release-plugin-decorators/-/semantic-release-plugin-decorators-3.0.3.tgz", - "integrity": "sha512-YTB2z64yyqEzABJ3yFesV9s5izZ4oKdbYDTu/2whVdlGQYCwsWkw9XYRCnvXzPdWPSWYmCPdJwMJ5w433rncig==", - "dev": true, - "peerDependencies": { - "semantic-release": ">=11 < 20" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "peer": true, - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/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, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-regex": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", - "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "peer": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/signale/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, - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/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, - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/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, - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/signale/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, - "peer": true - }, - "node_modules/signale/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "peer": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/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, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/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, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "peer": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "peer": true, - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/split2/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==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "dev": true, - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "peer": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", - "dev": true, - "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "peer": true - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "peer": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/through2/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==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "peer": true - }, - "node_modules/traverse": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", - "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, - "node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undici": { - "version": "5.28.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", - "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", - "dev": true, - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true, - "peer": true - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true, - "peer": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "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==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "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==", - "dev": true, - "peer": true - }, - "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==", - "dev": true, - "peer": true, - "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==", - "dev": true, - "peer": true, - "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==", - "dev": true, - "peer": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "peer": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - } - } -} diff --git a/diode-netbox-plugin/package.json b/diode-netbox-plugin/package.json deleted file mode 100644 index 4465ce80..00000000 --- a/diode-netbox-plugin/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "diode-netbox-plugin", - "version": "1.0.0", - "extends": "semantic-release-monorepo", - "devDependencies": { - "semantic-release-monorepo": "^7.0.0", - "semantic-release-export-data": "^1.0.1", - "@semantic-release/changelog": "^6.0.3" - } -} diff --git a/diode-netbox-plugin/pyproject.toml b/diode-netbox-plugin/pyproject.toml deleted file mode 100644 index 850266b9..00000000 --- a/diode-netbox-plugin/pyproject.toml +++ /dev/null @@ -1,56 +0,0 @@ -[project] -name = "netboxlabs-diode-netbox-plugin" -version = "0.0.1" # Overwritten during the build process -description = "NetBox Labs, Diode Netbox plugin" -readme = "README.md" # Optional -requires-python = ">=3.7" -license = {file = "LICENSE.txt"} -authors = [ - {name = "NetBox Labs", email = "support@netboxlabs.com" } # Optional -] -maintainers = [ - {name = "NetBox Labs", email = "support@netboxlabs.com" } # Optional -] - -classifiers = [ # Optional - "Development Status :: 3 - Alpha", - "Intended Audience :: Developers", - "Topic :: Software Development :: Build Tools", - "License :: OSI Approved :: MIT License", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: 3.9', - 'Programming Language :: Python :: 3.10', - 'Programming Language :: Python :: 3.11', -] - -dependencies = [ # Optional -] - -[project.optional-dependencies] # Optional -dev = ["black", "check-manifest", "ruff"] -test = ["coverage", "pytest", "pytest-cov"] - -[project.urls] # Optional -"Homepage" = "https://netboxlabs.com/" - -[project.scripts] # Optional - -[tool.setuptools] - -[build-system] -requires = ["setuptools>=43.0.0", "wheel"] -build-backend = "setuptools.build_meta" - - -[tool.ruff] -line-length = 140 - -[tool.ruff.format] -quote-style = "double" -indent-style = "space" - -[tool.ruff.lint] -select = ["C", "D", "E", "F", "I", "R", "UP", "W"] -ignore = ["F401", "D203", "D212", "D400", "D401", "D404", "RET504"] diff --git a/diode-netbox-plugin/tests/test_version.py b/diode-netbox-plugin/tests/test_version.py deleted file mode 100644 index d14336aa..00000000 --- a/diode-netbox-plugin/tests/test_version.py +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""NetBox Labs - Tests.""" - -from netbox_diode_plugin.version import version_semver - - -def test_version(): - """Check the injected semver.""" - assert version_semver() == "0.0.0" diff --git a/diode-proto/LICENSE.txt b/diode-proto/LICENSE.txt new file mode 100644 index 00000000..cd676f4c --- /dev/null +++ b/diode-proto/LICENSE.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2024 NetBox Labs, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/diode-proto/README.md b/diode-proto/README.md index 156074e0..94d82094 100644 --- a/diode-proto/README.md +++ b/diode-proto/README.md @@ -1,3 +1,7 @@ -# Diode proto definitions +# Diode protocol buffers TBD + +## License + +Distributed under the Apache 2.0 License. See [LICENSE.txt](./LICENSE.txt) for more information. diff --git a/diode-proto/buf.gen.go-internal.yaml b/diode-proto/buf.gen.go-internal.yaml new file mode 100644 index 00000000..a1c55c22 --- /dev/null +++ b/diode-proto/buf.gen.go-internal.yaml @@ -0,0 +1,11 @@ +version: v1 +plugins: + - plugin: go + out: ../diode-server/gen/ + opt: module=github.com/netboxlabs/diode-sdk-go + - plugin: buf.build/grpc/go:v1.3.0 + out: ../diode-server/gen/ + opt: module=github.com/netboxlabs/diode-sdk-go + - plugin: buf.build/bufbuild/validate-go:v1.0.4 + out: ../diode-server/gen/ + opt: module=github.com/netboxlabs/diode-sdk-go diff --git a/diode-proto/buf.gen.go.yaml b/diode-proto/buf.gen.go.yaml new file mode 100644 index 00000000..4ac9ec6c --- /dev/null +++ b/diode-proto/buf.gen.go.yaml @@ -0,0 +1,15 @@ +version: v1 +plugins: + - plugin: go + out: ../../diode-sdk-go/ + opt: module=github.com/netboxlabs/diode-sdk-go + - plugin: buf.build/grpc/go:v1.3.0 + out: ../../diode-sdk-go/ + opt: module=github.com/netboxlabs/diode-sdk-go + - plugin: buf.build/bufbuild/validate-go:v1.0.4 + out: ../../diode-sdk-go/ + opt: module=github.com/netboxlabs/diode-sdk-go + - plugin: buf.build/community/pseudomuto-doc:v1.5.1 + out: ../docs/ + opt: + - markdown,diode-proto.md diff --git a/diode-proto/buf.gen.py.yaml b/diode-proto/buf.gen.py.yaml new file mode 100644 index 00000000..465d094f --- /dev/null +++ b/diode-proto/buf.gen.py.yaml @@ -0,0 +1,8 @@ +version: v1 +plugins: + - plugin: buf.build/protocolbuffers/python:v26.1 + out: ../../diode-sdk-python/netboxlabs/diode/sdk/ + - plugin: buf.build/protocolbuffers/pyi:v26.1 + out: ../../diode-sdk-python/netboxlabs/diode/sdk/ + - plugin: buf.build/grpc/python:v1.62.1 + out: ../../diode-sdk-python/netboxlabs/diode/sdk/ diff --git a/diode-proto/buf.gen.yaml b/diode-proto/buf.gen.yaml deleted file mode 100644 index be809531..00000000 --- a/diode-proto/buf.gen.yaml +++ /dev/null @@ -1,19 +0,0 @@ -version: v1 -plugins: - - plugin: go - out: ../diode-sdk-go/ - opt: module=github.com/netboxlabs/diode/diode-sdk-go - - plugin: buf.build/grpc/go:v1.3.0 - out: ../diode-sdk-go/ - opt: module=github.com/netboxlabs/diode/diode-sdk-go - - plugin: buf.build/bufbuild/validate-go:v1.0.4 - out: ../diode-sdk-go/ - opt: module=github.com/netboxlabs/diode/diode-sdk-go - - plugin: buf.build/protocolbuffers/python:v25.1 - out: ../diode-sdk-python/netboxlabs/diode/sdk/ - - plugin: buf.build/grpc/python:v1.60.0 - out: ../diode-sdk-python/netboxlabs/diode/sdk/ - - plugin: buf.build/community/pseudomuto-doc:v1.5.1 - out: ../docs/ - opt: - - markdown,diode-proto.md diff --git a/diode-proto/buf.lock b/diode-proto/buf.lock index 6675af88..7e30502a 100644 --- a/diode-proto/buf.lock +++ b/diode-proto/buf.lock @@ -9,5 +9,5 @@ deps: - remote: buf.build owner: googleapis repository: googleapis - commit: 7e6f6e774e29406da95bd61cdcdbc8bc - digest: shake256:fe43dd2265ea0c07d76bd925eeba612667cf4c948d2ce53d6e367e1b4b3cb5fa69a51e6acb1a6a50d32f894f054a35e6c0406f6808a483f2752e10c866ffbf73 + commit: 7a6bc1e3207144b38e9066861e1de0ff + digest: shake256:d646836485c34192401253703c4e7ce899c826fceec060bf4b2a62c4749bd9976dc960833e134a1f814725e1ffd60b1bb3cf0335a7e99ef0e8cec34b070ffb66 diff --git a/diode-proto/diode/v1/device.proto b/diode-proto/diode/v1/device.proto deleted file mode 100644 index f0d449a2..00000000 --- a/diode-proto/diode/v1/device.proto +++ /dev/null @@ -1,26 +0,0 @@ -syntax = "proto3"; - -package diode.v1; - -import "google/protobuf/any.proto"; -import "validate/validate.proto"; - -option go_package = "github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb"; - -// A device -message Device { - string name = 1 [(validate.rules).string = {max_len: 64}]; - string device_fqdn = 2 [(validate.rules).string = { - min_len: 1, - max_len: 255 - }]; - google.protobuf.Any device_type = 3 [(validate.rules).any.required = true]; - google.protobuf.Any role = 4 [(validate.rules).any.required = true]; - google.protobuf.Any platform = 5; - string serial = 6 [(validate.rules).string = {max_len: 50}]; - google.protobuf.Any site = 7 [(validate.rules).any.required = true]; - int32 vc_position = 8 [(validate.rules).int32 = { - gte: 0, - lte: 255 - }]; -} diff --git a/diode-proto/diode/v1/device_role.proto b/diode-proto/diode/v1/device_role.proto deleted file mode 100644 index 2dcac9ef..00000000 --- a/diode-proto/diode/v1/device_role.proto +++ /dev/null @@ -1,21 +0,0 @@ -syntax = "proto3"; - -package diode.v1; - -import "validate/validate.proto"; - -option go_package = "github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb"; - -// A device role -message DeviceRole { - string name = 1 [(validate.rules).string = { - min_len: 1, - max_len: 100 - }]; - string slug = 2 [(validate.rules).string = { - min_len: 1, - max_len: 100, - pattern: "^[-a-zA-Z0-9_]+$" - }]; - bool vm_role = 3; -} diff --git a/diode-proto/diode/v1/device_type.proto b/diode-proto/diode/v1/device_type.proto deleted file mode 100644 index 867fe495..00000000 --- a/diode-proto/diode/v1/device_type.proto +++ /dev/null @@ -1,22 +0,0 @@ -syntax = "proto3"; - -package diode.v1; - -import "google/protobuf/any.proto"; -import "validate/validate.proto"; - -option go_package = "github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb"; - -// A device type -message DeviceType { - google.protobuf.Any manufacturer = 1 [(validate.rules).any.required = true]; - string model = 2 [(validate.rules).string = { - min_len: 1, - max_len: 100 - }]; - string slug = 3 [(validate.rules).string = { - min_len: 1, - max_len: 100, - pattern: "^[-a-zA-Z0-9_]+$" - }]; -} diff --git a/diode-proto/diode/v1/distributor.proto b/diode-proto/diode/v1/distributor.proto deleted file mode 100644 index 3a4b52c3..00000000 --- a/diode-proto/diode/v1/distributor.proto +++ /dev/null @@ -1,72 +0,0 @@ -syntax = "proto3"; - -package diode.v1; - -import "diode/v1/device.proto"; -import "diode/v1/device_role.proto"; -import "diode/v1/device_type.proto"; -import "diode/v1/interface.proto"; -import "diode/v1/manufacturer.proto"; -import "diode/v1/platform.proto"; -import "diode/v1/site.proto"; -import "google/protobuf/timestamp.proto"; -import "validate/validate.proto"; - -option go_package = "github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb"; - -// An ingest entity wrapper -message IngestEntity { - oneof data { - Site site = 1; - Platform platform = 2; - Manufacturer manufacturer = 3; - Device device = 4; - DeviceRole device_role = 5; - DeviceType device_type = 6; - Interface interface = 7; - } - - // The timestamp of the data discovery at source - google.protobuf.Timestamp timestamp = 8 [ - (validate.rules).timestamp.required = true, - (validate.rules).timestamp.lt_now = true - ]; -} - -// The request to push data -message PushRequest { - string stream = 1 [(validate.rules).string = { - min_len: 1, - max_len: 255 - }]; - repeated IngestEntity data = 2 [(validate.rules).repeated = { - min_items: 1, - max_items: 1000 - }]; - - string id = 3 [(validate.rules).string.uuid = true]; - string producer_app_name = 4 [(validate.rules).string = { - min_len: 1, - max_len: 255 - }]; - string producer_app_version = 5 [(validate.rules).string = { - min_len: 1, - max_len: 255 - }]; - string sdk_name = 6 [(validate.rules).string = { - min_len: 1, - max_len: 255 - }]; - string sdk_version = 7 [(validate.rules).string = {pattern: "^(\\d)+\\.(\\d)+\\.(\\d)+$"}]; -} - -// The response from the push request -message PushResponse { - repeated string errors = 1; -} - -// Distributor API -service DistributorService { - // Ingests data into the system - rpc Push(PushRequest) returns (PushResponse) {} -} diff --git a/diode-proto/diode/v1/ingester.proto b/diode-proto/diode/v1/ingester.proto new file mode 100644 index 00000000..d0e892be --- /dev/null +++ b/diode-proto/diode/v1/ingester.proto @@ -0,0 +1,418 @@ +syntax = "proto3"; + +package diode.v1; + +import "google/protobuf/timestamp.proto"; +import "validate/validate.proto"; + +option go_package = "github.com/netboxlabs/diode-sdk-go/diode/v1/diodepb"; + +// A device +message Device { + string name = 1 [(validate.rules).string = {max_len: 64}]; + string device_fqdn = 2 [(validate.rules).string = { + min_len: 1 + max_len: 255 + }]; + DeviceType device_type = 3; + Role role = 4; + Platform platform = 5; + string serial = 6 [(validate.rules).string = {max_len: 50}]; + Site site = 7; + string asset_tag = 8 [(validate.rules).string = {max_len: 200}]; + string status = 9 [(validate.rules).string = { + in: [ + "offline", + "active", + "planned", + "staged", + "failed", + "inventory", + "decommissioning" + ] + }]; + string description = 10 [(validate.rules).string = {max_len: 200}]; + string comments = 11; + repeated Tag tags = 12; + IPAddress primary_ip4 = 13; + IPAddress primary_ip6 = 14; +} + +// An interface +message Interface { + Device device = 1 [(validate.rules).any.required = true]; + string name = 2 [(validate.rules).string = { + min_len: 1 + max_len: 64 + }]; + string label = 3 [(validate.rules).string = { + min_len: 1 + max_len: 64 + }]; + string type = 4 [(validate.rules).string = { + in: [ + "virtual", + "bridge", + "lag", + "100base-fx", + "100base-lfx", + "100base-tx", + "100base-t1", + "1000base-t", + "1000base-x-gbic", + "1000base-x-sfp", + "2.5gbase-t", + "5gbase-t", + "10gbase-t", + "10gbase-cx4", + "10gbase-x-sfpp", + "10gbase-x-xfp", + "10gbase-x-xenpak", + "10gbase-x-x2", + "25gbase-x-sfp28", + "50gbase-x-sfp56", + "40gbase-x-qsfpp", + "50gbase-x-sfp28", + "100gbase-x-cfp", + "100gbase-x-cfp2", + "100gbase-x-cfp4", + "100gbase-x-cxp", + "100gbase-x-cpak", + "100gbase-x-dsfp", + "100gbase-x-sfpdd", + "100gbase-x-qsfp28", + "100gbase-x-qsfpdd", + "200gbase-x-cfp2", + "200gbase-x-qsfp56", + "200gbase-x-qsfpdd", + "400gbase-x-cfp2", + "400gbase-x-qsfp112", + "400gbase-x-qsfpdd", + "400gbase-x-osfp", + "400gbase-x-osfp-rhs", + "400gbase-x-cdfp", + "400gbase-x-cfp8", + "800gbase-x-qsfpdd", + "800gbase-x-osfp", + "1000base-kx", + "10gbase-kr", + "10gbase-kx4", + "25gbase-kr", + "40gbase-kr4", + "50gbase-kr", + "100gbase-kp4", + "100gbase-kr2", + "100gbase-kr4", + "ieee802.11a", + "ieee802.11g", + "ieee802.11n", + "ieee802.11ac", + "ieee802.11ad", + "ieee802.11ax", + "ieee802.11ay", + "ieee802.15.1", + "other-wireless", + "gsm", + "cdma", + "lte", + "sonet-oc3", + "sonet-oc12", + "sonet-oc48", + "sonet-oc192", + "sonet-oc768", + "sonet-oc1920", + "sonet-oc3840", + "1gfc-sfp", + "2gfc-sfp", + "4gfc-sfp", + "8gfc-sfpp", + "16gfc-sfpp", + "32gfc-sfp28", + "64gfc-qsfpp", + "128gfc-qsfp28", + "infiniband-sdr", + "infiniband-ddr", + "infiniband-qdr", + "infiniband-fdr10", + "infiniband-fdr", + "infiniband-edr", + "infiniband-hdr", + "infiniband-ndr", + "infiniband-xdr", + "t1", + "e1", + "t3", + "e3", + "xdsl", + "docsis", + "gpon", + "xg-pon", + "xgs-pon", + "ng-pon2", + "epon", + "10g-epon", + "cisco-stackwise", + "cisco-stackwise-plus", + "cisco-flexstack", + "cisco-flexstack-plus", + "cisco-stackwise-80", + "cisco-stackwise-160", + "cisco-stackwise-320", + "cisco-stackwise-480", + "cisco-stackwise-1t", + "juniper-vcp", + "extreme-summitstack", + "extreme-summitstack-128", + "extreme-summitstack-256", + "extreme-summitstack-512", + "other" + ] + }]; + bool enabled = 5; + int32 mtu = 6 [(validate.rules).int32 = { + gte: 1 + lte: 65536 + }]; + string mac_address = 7; + int32 speed = 8 [(validate.rules).int32 = {gte: 0}]; + string wwn = 9; + bool mgmt_only = 10; + string description = 11 [(validate.rules).string = {max_len: 200}]; + bool mark_connected = 12; + string mode = 13 [(validate.rules).string = { + in: [ + "access", + "tagged", + "tagged-all" + ] + }]; + repeated Tag tags = 14; +} + +// An IP address. +message IPAddress { + string address = 1 [(validate.rules).string.ip = true]; + oneof assigned_object { + Interface interface = 2; + } + string status = 3 [(validate.rules).string = { + in: [ + "active", + "reserved", + "deprecated", + "dhcp", + "slaac" + ] + }]; + string role = 4 [(validate.rules).string = { + in: [ + "loopback", + "secondary", + "anycast", + "vip", + "vrrp", + "hsrp", + "glbp", + "carp" + ] + }]; + string dns_name = 5 [(validate.rules).string = { + max_len: 255 + pattern: "^([0-9A-Za-z_-]+|\\*)(\\.[0-9A-Za-z_-]+)*\\.?$" + }]; + string description = 6 [(validate.rules).string = {max_len: 200}]; + string comments = 7; + repeated Tag tags = 8; +} + +// A device type +message DeviceType { + string model = 1 [(validate.rules).string = { + min_len: 1 + max_len: 100 + }]; + string slug = 2 [(validate.rules).string = { + min_len: 1 + max_len: 100 + pattern: "^[-a-zA-Z0-9_]+$" + }]; + Manufacturer manufacturer = 3; + string description = 4 [(validate.rules).string = {max_len: 200}]; + string comments = 5; + string part_number = 6 [(validate.rules).string = {max_len: 50}]; + repeated Tag tags = 7; +} + +// A manufacturer +message Manufacturer { + string name = 1 [(validate.rules).string = { + min_len: 1 + max_len: 100 + }]; + string slug = 2 [(validate.rules).string = { + min_len: 1 + max_len: 100 + pattern: "^[-a-zA-Z0-9_]+$" + }]; + string description = 3 [(validate.rules).string = {max_len: 200}]; + repeated Tag tags = 4; +} + +// A platform +message Platform { + string name = 1 [(validate.rules).string = { + min_len: 1 + max_len: 100 + }]; + string slug = 2 [(validate.rules).string = { + min_len: 1 + max_len: 100 + pattern: "^[-a-zA-Z0-9_]+$" + }]; + Manufacturer manufacturer = 3; + string description = 4 [(validate.rules).string = {max_len: 200}]; + repeated Tag tags = 5; +} + +// An IPAM prefix. +message Prefix { + string prefix = 1 [(validate.rules).string.ip = true]; + Site site = 2; + string status = 3 [(validate.rules).string = { + in: [ + "active", + "container", + "reserved", + "deprecated" + ] + }]; + bool is_pool = 4; + bool mark_utilized = 5; + string description = 6 [(validate.rules).string = {max_len: 200}]; + string comments = 7; + repeated Tag tags = 8; +} + +// A role +message Role { + string name = 1 [(validate.rules).string = { + min_len: 1 + max_len: 100 + }]; + string slug = 2 [(validate.rules).string = { + min_len: 1 + max_len: 100 + pattern: "^[-a-zA-Z0-9_]+$" + }]; + string color = 3 [(validate.rules).string = { + min_len: 6 + max_len: 6 + pattern: "^[0-9a-f]{6}$" + }]; + string description = 4 [(validate.rules).string = {max_len: 200}]; + repeated Tag tags = 5; +} + +// A site +message Site { + string name = 1 [(validate.rules).string = { + min_len: 1 + max_len: 100 + }]; + string slug = 2 [(validate.rules).string = { + min_len: 1 + max_len: 100 + pattern: "^[-a-zA-Z0-9_]+$" + }]; + string status = 3 [(validate.rules).string = { + in: [ + "planned", + "staging", + "active", + "decommissioning", + "retired" + ] + }]; + string facility = 4 [(validate.rules).string = {max_len: 50}]; + string time_zone = 5; + string description = 6 [(validate.rules).string = {max_len: 200}]; + string comments = 7; + repeated Tag tags = 8; +} + +// A tag +message Tag { + string name = 1 [(validate.rules).string = { + min_len: 1 + max_len: 100 + }]; + string slug = 2 [(validate.rules).string = { + min_len: 1 + max_len: 100 + pattern: "^[-a-zA-Z0-9_]+$" + }]; + string color = 3 [(validate.rules).string = { + min_len: 6 + max_len: 6 + pattern: "^[0-9a-f]{6}$" + }]; +} + +// An ingest entity wrapper +message Entity { + oneof entity { + Site site = 1; + Platform platform = 2; + Manufacturer manufacturer = 3; + Device device = 4; + Role device_role = 5; + DeviceType device_type = 6; + Interface interface = 7; + IPAddress ip_address = 9; + Prefix prefix = 10; + } + + // The timestamp of the data discovery at source + google.protobuf.Timestamp timestamp = 8 [ + (validate.rules).timestamp.required = true, + (validate.rules).timestamp.lt_now = true + ]; +} + +// The request to ingest the data +message IngestRequest { + string stream = 1 [(validate.rules).string = { + min_len: 1 + max_len: 255 + }]; + repeated Entity entities = 2 [(validate.rules).repeated = { + min_items: 1 + max_items: 1000 + }]; + + string id = 3 [(validate.rules).string.uuid = true]; + string producer_app_name = 4 [(validate.rules).string = { + min_len: 1 + max_len: 255 + }]; + string producer_app_version = 5 [(validate.rules).string = { + min_len: 1 + max_len: 255 + }]; + string sdk_name = 6 [(validate.rules).string = { + min_len: 1 + max_len: 255 + }]; + string sdk_version = 7 [(validate.rules).string = {pattern: "^(\\d)+\\.(\\d)+\\.(\\d)+$"}]; +} + +// The response from the ingest request +message IngestResponse { + repeated string errors = 1; +} + +// Ingestion API +service IngesterService { + // Ingests data into the system + rpc Ingest(IngestRequest) returns (IngestResponse) {} +} diff --git a/diode-proto/diode/v1/interface.proto b/diode-proto/diode/v1/interface.proto deleted file mode 100644 index c8f229ad..00000000 --- a/diode-proto/diode/v1/interface.proto +++ /dev/null @@ -1,143 +0,0 @@ -syntax = "proto3"; - -package diode.v1; - -import "google/protobuf/any.proto"; -import "validate/validate.proto"; - -option go_package = "github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb"; - -// An interface -message Interface { - google.protobuf.Any device = 1 [(validate.rules).any.required = true]; - string name = 2 [(validate.rules).string = { - min_len: 1, - max_len: 64 - }]; - string type = 3 [(validate.rules).string = { - in: [ - "virtual", - "bridge", - "lag", - "100base-fx", - "100base-lfx", - "100base-tx", - "100base-t1", - "1000base-t", - "1000base-x-gbic", - "1000base-x-sfp", - "2.5gbase-t", - "5gbase-t", - "10gbase-t", - "10gbase-cx4", - "10gbase-x-sfpp", - "10gbase-x-xfp", - "10gbase-x-xenpak", - "10gbase-x-x2", - "25gbase-x-sfp28", - "50gbase-x-sfp56", - "40gbase-x-qsfpp", - "50gbase-x-sfp28", - "100gbase-x-cfp", - "100gbase-x-cfp2", - "100gbase-x-cfp4", - "100gbase-x-cxp", - "100gbase-x-cpak", - "100gbase-x-dsfp", - "100gbase-x-sfpdd", - "100gbase-x-qsfp28", - "100gbase-x-qsfpdd", - "200gbase-x-cfp2", - "200gbase-x-qsfp56", - "200gbase-x-qsfpdd", - "400gbase-x-cfp2", - "400gbase-x-qsfp112", - "400gbase-x-qsfpdd", - "400gbase-x-osfp", - "400gbase-x-osfp-rhs", - "400gbase-x-cdfp", - "400gbase-x-cfp8", - "800gbase-x-qsfpdd", - "800gbase-x-osfp", - "1000base-kx", - "10gbase-kr", - "10gbase-kx4", - "25gbase-kr", - "40gbase-kr4", - "50gbase-kr", - "100gbase-kp4", - "100gbase-kr2", - "100gbase-kr4", - "ieee802.11a", - "ieee802.11g", - "ieee802.11n", - "ieee802.11ac", - "ieee802.11ad", - "ieee802.11ax", - "ieee802.11ay", - "ieee802.15.1", - "other-wireless", - "gsm", - "cdma", - "lte", - "sonet-oc3", - "sonet-oc12", - "sonet-oc48", - "sonet-oc192", - "sonet-oc768", - "sonet-oc1920", - "sonet-oc3840", - "1gfc-sfp", - "2gfc-sfp", - "4gfc-sfp", - "8gfc-sfpp", - "16gfc-sfpp", - "32gfc-sfp28", - "64gfc-qsfpp", - "128gfc-qsfp28", - "infiniband-sdr", - "infiniband-ddr", - "infiniband-qdr", - "infiniband-fdr10", - "infiniband-fdr", - "infiniband-edr", - "infiniband-hdr", - "infiniband-ndr", - "infiniband-xdr", - "t1", - "e1", - "t3", - "e3", - "xdsl", - "docsis", - "gpon", - "xg-pon", - "xgs-pon", - "ng-pon2", - "epon", - "10g-epon", - "cisco-stackwise", - "cisco-stackwise-plus", - "cisco-flexstack", - "cisco-flexstack-plus", - "cisco-stackwise-80", - "cisco-stackwise-160", - "cisco-stackwise-320", - "cisco-stackwise-480", - "cisco-stackwise-1t", - "juniper-vcp", - "extreme-summitstack", - "extreme-summitstack-128", - "extreme-summitstack-256", - "extreme-summitstack-512", - "other" - ] - }]; - bool enabled = 4; - int32 mtu = 5 [(validate.rules).int32 = { - gte: 1, - lte: 65536 - }]; - string mac_address = 6; - bool mgmt_only = 7; -} diff --git a/diode-proto/diode/v1/manufacturer.proto b/diode-proto/diode/v1/manufacturer.proto deleted file mode 100644 index 588f793b..00000000 --- a/diode-proto/diode/v1/manufacturer.proto +++ /dev/null @@ -1,20 +0,0 @@ -syntax = "proto3"; - -package diode.v1; - -import "validate/validate.proto"; - -option go_package = "github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb"; - -// A manufacturer -message Manufacturer { - string name = 1 [(validate.rules).string = { - min_len: 1, - max_len: 100 - }]; - string slug = 2 [(validate.rules).string = { - min_len: 1, - max_len: 100, - pattern: "^[-a-zA-Z0-9_]+$" - }]; -} diff --git a/diode-proto/diode/v1/platform.proto b/diode-proto/diode/v1/platform.proto deleted file mode 100644 index c7602c12..00000000 --- a/diode-proto/diode/v1/platform.proto +++ /dev/null @@ -1,19 +0,0 @@ -syntax = "proto3"; - -package diode.v1; - -import "validate/validate.proto"; - -option go_package = "github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb"; - -// A platform -message Platform { - string name = 1 [(validate.rules).string = { - min_len: 1, - max_len: 100 - }]; - string slug = 2 [(validate.rules).string = { - min_len: 1, - max_len: 100 - }]; -} diff --git a/diode-proto/diode/v1/site.proto b/diode-proto/diode/v1/site.proto deleted file mode 100644 index 1d0f42e2..00000000 --- a/diode-proto/diode/v1/site.proto +++ /dev/null @@ -1,20 +0,0 @@ -syntax = "proto3"; - -package diode.v1; - -import "validate/validate.proto"; - -option go_package = "github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb"; - -// A site -message Site { - string name = 1 [(validate.rules).string = { - min_len: 1, - max_len: 100 - }]; - string slug = 2 [(validate.rules).string = { - min_len: 1, - max_len: 100, - pattern: "^[-a-zA-Z0-9_]+$" - }]; -} diff --git a/diode-sdk-go/.releaserc.json b/diode-sdk-go/.releaserc.json deleted file mode 100644 index bf949bb6..00000000 --- a/diode-sdk-go/.releaserc.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "branches": "release", - "repositoryUrl": "https://github.com/netboxlabs/diode", - "debug": "true", - "extends": "semantic-release-monorepo", - "tagFormat": "diode-sdk-go/v${version}", - "plugins": [ - [ - "semantic-release-export-data" - ], - [ - "@semantic-release/commit-analyzer", - { - "releaseRules": [ - { - "message": "*", - "release": "patch" - }, - { - "message": "fix*", - "release": "patch" - }, - { - "message": "feat*", - "release": "minor" - }, - { - "message": "perf*", - "release": "major" - } - ] - } - ], - "@semantic-release/release-notes-generator", - [ - "@semantic-release/changelog", - { - "changelogFile": "CHANGELOG.md", - "changelogTitle": "# Semantic Versioning Changelog" - } - ], - [ - "@semantic-release/github", - { - "assets": [ - { - "path": "release/**" - } - ] - } - ] - ] -} diff --git a/diode-sdk-go/README.md b/diode-sdk-go/README.md deleted file mode 100644 index 0d855506..00000000 --- a/diode-sdk-go/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Diode SDK Go - -TBD diff --git a/diode-sdk-go/diode/v1/client.go b/diode-sdk-go/diode/v1/client.go deleted file mode 100644 index 25da6701..00000000 --- a/diode-sdk-go/diode/v1/client.go +++ /dev/null @@ -1,183 +0,0 @@ -package diode - -import ( - "context" - "crypto/tls" - "errors" - "fmt" - "os" - "strconv" - "time" - - "github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/credentials/insecure" - "google.golang.org/grpc/metadata" -) - -const ( - // SDKName is the name of the Diode SDK - SDKName = "diode-sdk-go" - - // SDKVersion is the version of the Diode SDK - SDKVersion = "0.1.0" - - // DiodeAPIKeyEnvVarName is the environment variable name for the Diode API key - DiodeAPIKeyEnvVarName = "DIODE_API_KEY" - - // DiodeGRPCInsecureEnvVarName is the environment variable name for the Diode gRPC disabling transport security - DiodeGRPCInsecureEnvVarName = "DIODE_GRPC_INSECURE" - - // DiodeGRPCHostEnvVarName is the environment variable name for the Diode gRPC host - DiodeGRPCHostEnvVarName = "DIODE_GRPC_HOST" - - // DiodeGRPCPortEnvVarName is the environment variable name for the Diode gRPC port - DiodeGRPCPortEnvVarName = "DIODE_GRPC_PORT" - - // DiodeGRPCTimeoutSecondsEnvVarName is the environment variable name for the Diode gRPC timeout in seconds - DiodeGRPCTimeoutSecondsEnvVarName = "DIODE_GRPC_TIMEOUT_SECONDS" - - authAPIKeyName = "diode-api-key" - - defaultGRPCHost = "127.0.0.1" - - defaultGRPCPort = "8081" - - defaultGRPCTimeoutSeconds = 5 -) - -var ( - // ErrInvalidTimeout is an error for invalid timeout value - ErrInvalidTimeout = errors.New("invalid timeout value") -) - -// Client is an interface that defines the methods available from Diode API -type Client interface { - // Close closes the connection to the API service - Close() error - - // Push sends a push request to the distributor service - Push(context.Context, *diodepb.PushRequest, ...grpc.CallOption) (*diodepb.PushResponse, error) -} - -// GRPCClient is a gRPC implementation of the distributor service -type GRPCClient struct { - // gRPC virtual connection - conn *grpc.ClientConn - - // The gRPC API client - client diodepb.DistributorServiceClient - - // An API key for the Diode API - apiKey *string -} - -// Close closes the connection to the API service -func (g *GRPCClient) Close() error { - if g.conn != nil { - return g.conn.Close() - } - return nil -} - -// Push sends a push request to the distributor service -func (g *GRPCClient) Push(ctx context.Context, req *diodepb.PushRequest, opt ...grpc.CallOption) (*diodepb.PushResponse, error) { - return g.client.Push(ctx, req, opt...) -} - -func authUnaryInterceptor(apiKey string) grpc.DialOption { - return grpc.WithUnaryInterceptor(func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { - if apiKey != "" { - ctx = metadata.NewOutgoingContext(ctx, metadata.Pairs(authAPIKeyName, apiKey)) - } - return invoker(ctx, method, req, reply, cc, opts...) - }) -} - -// NewClient creates a new distributor client based on gRPC -func NewClient(ctx context.Context) (Client, error) { - apiKey, ok := os.LookupEnv(DiodeAPIKeyEnvVarName) - if !ok { - return nil, fmt.Errorf("environment variable %s not found", DiodeAPIKeyEnvVarName) - } - - dialOpts := []grpc.DialOption{ - grpc.WithUserAgent(userAgent()), - authUnaryInterceptor(apiKey), - } - - if grpcInsecure() { - dialOpts = append(dialOpts, grpc.WithTransportCredentials(insecure.NewCredentials())) - } else { - dialOpts = append(dialOpts, grpc.WithTransportCredentials(credentials.NewTLS(new(tls.Config)))) - } - - timeout, err := grpcTimeout() - if err != nil { - return nil, err - } - - ctx, cancel := context.WithTimeout(ctx, timeout) - defer cancel() - - target := grpcTarget() - - conn, err := grpc.DialContext(ctx, target, dialOpts...) - if err != nil { - return nil, err - } - - c := &GRPCClient{ - conn: conn, - client: diodepb.NewDistributorServiceClient(conn), - apiKey: &apiKey, - } - - return c, nil -} - -func userAgent() string { - return fmt.Sprintf("%s/%s", SDKName, SDKVersion) -} - -func grpcTarget() string { - host, ok := os.LookupEnv(DiodeGRPCHostEnvVarName) - if !ok { - host = defaultGRPCHost - } - - port, ok := os.LookupEnv(DiodeGRPCPortEnvVarName) - if !ok { - port = defaultGRPCPort - } - - return fmt.Sprintf("%s:%s", host, port) -} - -func grpcTimeout() (time.Duration, error) { - timeoutSecondsStr, ok := os.LookupEnv(DiodeGRPCTimeoutSecondsEnvVarName) - if !ok || len(timeoutSecondsStr) == 0 { - return defaultGRPCTimeoutSeconds * time.Second, nil - } - - timeout, err := strconv.Atoi(timeoutSecondsStr) - if err != nil || timeout <= 0 { - return 0, ErrInvalidTimeout - } - return time.Duration(timeout) * time.Second, nil -} - -func grpcInsecure() bool { - insecureStr, ok := os.LookupEnv(DiodeGRPCInsecureEnvVarName) - if !ok { - return false - } - - insecureVal, err := strconv.ParseBool(insecureStr) - if err != nil { - return false - } - - return insecureVal -} diff --git a/diode-sdk-go/diode/v1/client_test.go b/diode-sdk-go/diode/v1/client_test.go deleted file mode 100644 index 60cbe03d..00000000 --- a/diode-sdk-go/diode/v1/client_test.go +++ /dev/null @@ -1,113 +0,0 @@ -package diode_test - -import ( - "context" - "os" - "testing" - - "github.com/netboxlabs/diode/diode-sdk-go/diode/v1" - "github.com/stretchr/testify/require" -) - -func TestNewClient(t *testing.T) { - cleanUpEnvVars() - - _ = os.Setenv(diode.DiodeAPIKeyEnvVarName, "nothingtoseehere") - - client, err := diode.NewClient(context.Background()) - require.NoError(t, err) - require.NotNil(t, client) - require.NoError(t, client.Close()) -} - -func TestNewClientWithMissingAPIKey(t *testing.T) { - cleanUpEnvVars() - - client, err := diode.NewClient(context.Background()) - require.Nil(t, client) - require.EqualError(t, err, "environment variable DIODE_API_KEY not found") -} - -func TestNewClientWithTimeout(t *testing.T) { - tests := []struct { - desc string - timeoutStr string - err error - }{ - { - desc: "timeout with valid value", - timeoutStr: "10", - err: nil, - }, - { - desc: "timeout with negative value", - timeoutStr: "-1", - err: diode.ErrInvalidTimeout, - }, - { - desc: "timeout with non-parseable value", - timeoutStr: "10a", - err: diode.ErrInvalidTimeout, - }, - } - - for _, tt := range tests { - t.Run(tt.desc, func(t *testing.T) { - cleanUpEnvVars() - - _ = os.Setenv(diode.DiodeAPIKeyEnvVarName, "nothingtoseehere") - _ = os.Setenv(diode.DiodeGRPCTimeoutSecondsEnvVarName, tt.timeoutStr) - - client, err := diode.NewClient(context.Background()) - if tt.err == nil { - require.NoError(t, err) - require.NotNil(t, client) - require.NoError(t, client.Close()) - } else { - require.Nil(t, client) - require.EqualError(t, err, tt.err.Error()) - } - }) - } -} - -func TestNewClientWithInsecureGRPC(t *testing.T) { - tests := []struct { - desc string - value string - }{ - { - desc: "insecure gRPC enabled", - value: "true", - }, - { - desc: "insecure gRPC disabled", - value: "false", - }, - { - desc: "insecure gRPC disabled with invalid value", - value: "invalidvalue", - }, - } - - for _, tt := range tests { - t.Run(tt.desc, func(t *testing.T) { - cleanUpEnvVars() - - _ = os.Setenv(diode.DiodeAPIKeyEnvVarName, "nothingtoseehere") - _ = os.Setenv(diode.DiodeGRPCInsecureEnvVarName, tt.value) - - client, err := diode.NewClient(context.Background()) - require.NoError(t, err) - require.NotNil(t, client) - }) - } -} - -func cleanUpEnvVars() { - _ = os.Unsetenv(diode.DiodeAPIKeyEnvVarName) - _ = os.Unsetenv(diode.DiodeGRPCHostEnvVarName) - _ = os.Unsetenv(diode.DiodeGRPCPortEnvVarName) - _ = os.Unsetenv(diode.DiodeGRPCTimeoutSecondsEnvVarName) - _ = os.Unsetenv(diode.DiodeGRPCInsecureEnvVarName) -} diff --git a/diode-sdk-go/diode/v1/diodepb/device.pb.go b/diode-sdk-go/diode/v1/diodepb/device.pb.go deleted file mode 100644 index e3570621..00000000 --- a/diode-sdk-go/diode/v1/diodepb/device.pb.go +++ /dev/null @@ -1,234 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.32.0 -// protoc (unknown) -// source: diode/v1/device.proto - -package diodepb - -import ( - _ "github.com/envoyproxy/protoc-gen-validate/validate" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - anypb "google.golang.org/protobuf/types/known/anypb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// A device -type Device struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - DeviceFqdn string `protobuf:"bytes,2,opt,name=device_fqdn,json=deviceFqdn,proto3" json:"device_fqdn,omitempty"` - DeviceType *anypb.Any `protobuf:"bytes,3,opt,name=device_type,json=deviceType,proto3" json:"device_type,omitempty"` - Role *anypb.Any `protobuf:"bytes,4,opt,name=role,proto3" json:"role,omitempty"` - Platform *anypb.Any `protobuf:"bytes,5,opt,name=platform,proto3" json:"platform,omitempty"` - Serial string `protobuf:"bytes,6,opt,name=serial,proto3" json:"serial,omitempty"` - Site *anypb.Any `protobuf:"bytes,7,opt,name=site,proto3" json:"site,omitempty"` - VcPosition int32 `protobuf:"varint,8,opt,name=vc_position,json=vcPosition,proto3" json:"vc_position,omitempty"` -} - -func (x *Device) Reset() { - *x = Device{} - if protoimpl.UnsafeEnabled { - mi := &file_diode_v1_device_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Device) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Device) ProtoMessage() {} - -func (x *Device) ProtoReflect() protoreflect.Message { - mi := &file_diode_v1_device_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Device.ProtoReflect.Descriptor instead. -func (*Device) Descriptor() ([]byte, []int) { - return file_diode_v1_device_proto_rawDescGZIP(), []int{0} -} - -func (x *Device) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Device) GetDeviceFqdn() string { - if x != nil { - return x.DeviceFqdn - } - return "" -} - -func (x *Device) GetDeviceType() *anypb.Any { - if x != nil { - return x.DeviceType - } - return nil -} - -func (x *Device) GetRole() *anypb.Any { - if x != nil { - return x.Role - } - return nil -} - -func (x *Device) GetPlatform() *anypb.Any { - if x != nil { - return x.Platform - } - return nil -} - -func (x *Device) GetSerial() string { - if x != nil { - return x.Serial - } - return "" -} - -func (x *Device) GetSite() *anypb.Any { - if x != nil { - return x.Site - } - return nil -} - -func (x *Device) GetVcPosition() int32 { - if x != nil { - return x.VcPosition - } - return 0 -} - -var File_diode_v1_device_proto protoreflect.FileDescriptor - -var file_diode_v1_device_proto_rawDesc = []byte{ - 0x0a, 0x15, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2e, 0x76, - 0x31, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xfb, 0x02, 0x0a, 0x06, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x1b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x40, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, - 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x66, 0x71, 0x64, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x0a, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x46, 0x71, 0x64, 0x6e, 0x12, 0x3f, 0x0a, 0x0b, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0xa2, 0x01, 0x02, 0x08, 0x01, 0x52, - 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x72, - 0x6f, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x42, - 0x08, 0xfa, 0x42, 0x05, 0xa2, 0x01, 0x02, 0x08, 0x01, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, - 0x30, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, - 0x6d, 0x12, 0x1f, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x32, 0x52, 0x06, 0x73, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x12, 0x32, 0x0a, 0x04, 0x73, 0x69, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0xa2, 0x01, 0x02, 0x08, 0x01, - 0x52, 0x04, 0x73, 0x69, 0x74, 0x65, 0x12, 0x2b, 0x0a, 0x0b, 0x76, 0x63, 0x5f, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x42, 0x0a, 0xfa, 0x42, 0x07, - 0x1a, 0x05, 0x18, 0xff, 0x01, 0x28, 0x00, 0x52, 0x0a, 0x76, 0x63, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x42, 0x3b, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x6e, 0x65, 0x74, 0x62, 0x6f, 0x78, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x64, 0x69, 0x6f, - 0x64, 0x65, 0x2f, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2d, 0x73, 0x64, 0x6b, 0x2d, 0x67, 0x6f, 0x2f, - 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x70, 0x62, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_diode_v1_device_proto_rawDescOnce sync.Once - file_diode_v1_device_proto_rawDescData = file_diode_v1_device_proto_rawDesc -) - -func file_diode_v1_device_proto_rawDescGZIP() []byte { - file_diode_v1_device_proto_rawDescOnce.Do(func() { - file_diode_v1_device_proto_rawDescData = protoimpl.X.CompressGZIP(file_diode_v1_device_proto_rawDescData) - }) - return file_diode_v1_device_proto_rawDescData -} - -var file_diode_v1_device_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_diode_v1_device_proto_goTypes = []interface{}{ - (*Device)(nil), // 0: diode.v1.Device - (*anypb.Any)(nil), // 1: google.protobuf.Any -} -var file_diode_v1_device_proto_depIdxs = []int32{ - 1, // 0: diode.v1.Device.device_type:type_name -> google.protobuf.Any - 1, // 1: diode.v1.Device.role:type_name -> google.protobuf.Any - 1, // 2: diode.v1.Device.platform:type_name -> google.protobuf.Any - 1, // 3: diode.v1.Device.site:type_name -> google.protobuf.Any - 4, // [4:4] is the sub-list for method output_type - 4, // [4:4] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name -} - -func init() { file_diode_v1_device_proto_init() } -func file_diode_v1_device_proto_init() { - if File_diode_v1_device_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_diode_v1_device_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Device); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_diode_v1_device_proto_rawDesc, - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_diode_v1_device_proto_goTypes, - DependencyIndexes: file_diode_v1_device_proto_depIdxs, - MessageInfos: file_diode_v1_device_proto_msgTypes, - }.Build() - File_diode_v1_device_proto = out.File - file_diode_v1_device_proto_rawDesc = nil - file_diode_v1_device_proto_goTypes = nil - file_diode_v1_device_proto_depIdxs = nil -} diff --git a/diode-sdk-go/diode/v1/diodepb/device.pb.validate.go b/diode-sdk-go/diode/v1/diodepb/device.pb.validate.go deleted file mode 100644 index f8b9e4d9..00000000 --- a/diode-sdk-go/diode/v1/diodepb/device.pb.validate.go +++ /dev/null @@ -1,252 +0,0 @@ -// Code generated by protoc-gen-validate. DO NOT EDIT. -// source: diode/v1/device.proto - -package diodepb - -import ( - "bytes" - "errors" - "fmt" - "net" - "net/mail" - "net/url" - "regexp" - "sort" - "strings" - "time" - "unicode/utf8" - - "google.golang.org/protobuf/types/known/anypb" -) - -// ensure the imports are used -var ( - _ = bytes.MinRead - _ = errors.New("") - _ = fmt.Print - _ = utf8.UTFMax - _ = (*regexp.Regexp)(nil) - _ = (*strings.Reader)(nil) - _ = net.IPv4len - _ = time.Duration(0) - _ = (*url.URL)(nil) - _ = (*mail.Address)(nil) - _ = anypb.Any{} - _ = sort.Sort -) - -// Validate checks the field values on Device with the rules defined in the -// proto definition for this message. If any rules are violated, the first -// error encountered is returned, or nil if there are no violations. -func (m *Device) Validate() error { - return m.validate(false) -} - -// ValidateAll checks the field values on Device with the rules defined in the -// proto definition for this message. If any rules are violated, the result is -// a list of violation errors wrapped in DeviceMultiError, or nil if none found. -func (m *Device) ValidateAll() error { - return m.validate(true) -} - -func (m *Device) validate(all bool) error { - if m == nil { - return nil - } - - var errors []error - - if utf8.RuneCountInString(m.GetName()) > 64 { - err := DeviceValidationError{ - field: "Name", - reason: "value length must be at most 64 runes", - } - if !all { - return err - } - errors = append(errors, err) - } - - if l := utf8.RuneCountInString(m.GetDeviceFqdn()); l < 1 || l > 255 { - err := DeviceValidationError{ - field: "DeviceFqdn", - reason: "value length must be between 1 and 255 runes, inclusive", - } - if !all { - return err - } - errors = append(errors, err) - } - - if m.GetDeviceType() == nil { - err := DeviceValidationError{ - field: "DeviceType", - reason: "value is required", - } - if !all { - return err - } - errors = append(errors, err) - } - - if a := m.GetDeviceType(); a != nil { - - } - - if m.GetRole() == nil { - err := DeviceValidationError{ - field: "Role", - reason: "value is required", - } - if !all { - return err - } - errors = append(errors, err) - } - - if a := m.GetRole(); a != nil { - - } - - if all { - switch v := interface{}(m.GetPlatform()).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, DeviceValidationError{ - field: "Platform", - reason: "embedded message failed validation", - cause: err, - }) - } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, DeviceValidationError{ - field: "Platform", - reason: "embedded message failed validation", - cause: err, - }) - } - } - } else if v, ok := interface{}(m.GetPlatform()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return DeviceValidationError{ - field: "Platform", - reason: "embedded message failed validation", - cause: err, - } - } - } - - if utf8.RuneCountInString(m.GetSerial()) > 50 { - err := DeviceValidationError{ - field: "Serial", - reason: "value length must be at most 50 runes", - } - if !all { - return err - } - errors = append(errors, err) - } - - if m.GetSite() == nil { - err := DeviceValidationError{ - field: "Site", - reason: "value is required", - } - if !all { - return err - } - errors = append(errors, err) - } - - if a := m.GetSite(); a != nil { - - } - - if val := m.GetVcPosition(); val < 0 || val > 255 { - err := DeviceValidationError{ - field: "VcPosition", - reason: "value must be inside range [0, 255]", - } - if !all { - return err - } - errors = append(errors, err) - } - - if len(errors) > 0 { - return DeviceMultiError(errors) - } - - return nil -} - -// DeviceMultiError is an error wrapping multiple validation errors returned by -// Device.ValidateAll() if the designated constraints aren't met. -type DeviceMultiError []error - -// Error returns a concatenation of all the error messages it wraps. -func (m DeviceMultiError) Error() string { - var msgs []string - for _, err := range m { - msgs = append(msgs, err.Error()) - } - return strings.Join(msgs, "; ") -} - -// AllErrors returns a list of validation violation errors. -func (m DeviceMultiError) AllErrors() []error { return m } - -// DeviceValidationError is the validation error returned by Device.Validate if -// the designated constraints aren't met. -type DeviceValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e DeviceValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e DeviceValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e DeviceValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e DeviceValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e DeviceValidationError) ErrorName() string { return "DeviceValidationError" } - -// Error satisfies the builtin error interface -func (e DeviceValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sDevice.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = DeviceValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = DeviceValidationError{} diff --git a/diode-sdk-go/diode/v1/diodepb/device_role.pb.go b/diode-sdk-go/diode/v1/diodepb/device_role.pb.go deleted file mode 100644 index 4be63261..00000000 --- a/diode-sdk-go/diode/v1/diodepb/device_role.pb.go +++ /dev/null @@ -1,170 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.32.0 -// protoc (unknown) -// source: diode/v1/device_role.proto - -package diodepb - -import ( - _ "github.com/envoyproxy/protoc-gen-validate/validate" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// A device role -type DeviceRole struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Slug string `protobuf:"bytes,2,opt,name=slug,proto3" json:"slug,omitempty"` - VmRole bool `protobuf:"varint,3,opt,name=vm_role,json=vmRole,proto3" json:"vm_role,omitempty"` -} - -func (x *DeviceRole) Reset() { - *x = DeviceRole{} - if protoimpl.UnsafeEnabled { - mi := &file_diode_v1_device_role_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeviceRole) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeviceRole) ProtoMessage() {} - -func (x *DeviceRole) ProtoReflect() protoreflect.Message { - mi := &file_diode_v1_device_role_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeviceRole.ProtoReflect.Descriptor instead. -func (*DeviceRole) Descriptor() ([]byte, []int) { - return file_diode_v1_device_role_proto_rawDescGZIP(), []int{0} -} - -func (x *DeviceRole) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *DeviceRole) GetSlug() string { - if x != nil { - return x.Slug - } - return "" -} - -func (x *DeviceRole) GetVmRole() bool { - if x != nil { - return x.VmRole - } - return false -} - -var File_diode_v1_device_role_proto protoreflect.FileDescriptor - -var file_diode_v1_device_role_proto_rawDesc = []byte{ - 0x0a, 0x1a, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x64, 0x69, - 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, - 0x75, 0x0a, 0x0a, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x1d, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xfa, 0x42, 0x06, - 0x72, 0x04, 0x10, 0x01, 0x18, 0x64, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x04, - 0x73, 0x6c, 0x75, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1b, 0xfa, 0x42, 0x18, 0x72, - 0x16, 0x10, 0x01, 0x18, 0x64, 0x32, 0x10, 0x5e, 0x5b, 0x2d, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, - 0x30, 0x2d, 0x39, 0x5f, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x12, 0x17, 0x0a, - 0x07, 0x76, 0x6d, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x76, 0x6d, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x3b, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x65, 0x74, 0x62, 0x6f, 0x78, 0x6c, 0x61, 0x62, 0x73, 0x2f, - 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2d, 0x73, 0x64, 0x6b, 0x2d, - 0x67, 0x6f, 0x2f, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x69, 0x6f, 0x64, - 0x65, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_diode_v1_device_role_proto_rawDescOnce sync.Once - file_diode_v1_device_role_proto_rawDescData = file_diode_v1_device_role_proto_rawDesc -) - -func file_diode_v1_device_role_proto_rawDescGZIP() []byte { - file_diode_v1_device_role_proto_rawDescOnce.Do(func() { - file_diode_v1_device_role_proto_rawDescData = protoimpl.X.CompressGZIP(file_diode_v1_device_role_proto_rawDescData) - }) - return file_diode_v1_device_role_proto_rawDescData -} - -var file_diode_v1_device_role_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_diode_v1_device_role_proto_goTypes = []interface{}{ - (*DeviceRole)(nil), // 0: diode.v1.DeviceRole -} -var file_diode_v1_device_role_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_diode_v1_device_role_proto_init() } -func file_diode_v1_device_role_proto_init() { - if File_diode_v1_device_role_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_diode_v1_device_role_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeviceRole); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_diode_v1_device_role_proto_rawDesc, - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_diode_v1_device_role_proto_goTypes, - DependencyIndexes: file_diode_v1_device_role_proto_depIdxs, - MessageInfos: file_diode_v1_device_role_proto_msgTypes, - }.Build() - File_diode_v1_device_role_proto = out.File - file_diode_v1_device_role_proto_rawDesc = nil - file_diode_v1_device_role_proto_goTypes = nil - file_diode_v1_device_role_proto_depIdxs = nil -} diff --git a/diode-sdk-go/diode/v1/diodepb/device_role.pb.validate.go b/diode-sdk-go/diode/v1/diodepb/device_role.pb.validate.go deleted file mode 100644 index 83c62357..00000000 --- a/diode-sdk-go/diode/v1/diodepb/device_role.pb.validate.go +++ /dev/null @@ -1,172 +0,0 @@ -// Code generated by protoc-gen-validate. DO NOT EDIT. -// source: diode/v1/device_role.proto - -package diodepb - -import ( - "bytes" - "errors" - "fmt" - "net" - "net/mail" - "net/url" - "regexp" - "sort" - "strings" - "time" - "unicode/utf8" - - "google.golang.org/protobuf/types/known/anypb" -) - -// ensure the imports are used -var ( - _ = bytes.MinRead - _ = errors.New("") - _ = fmt.Print - _ = utf8.UTFMax - _ = (*regexp.Regexp)(nil) - _ = (*strings.Reader)(nil) - _ = net.IPv4len - _ = time.Duration(0) - _ = (*url.URL)(nil) - _ = (*mail.Address)(nil) - _ = anypb.Any{} - _ = sort.Sort -) - -// Validate checks the field values on DeviceRole with the rules defined in the -// proto definition for this message. If any rules are violated, the first -// error encountered is returned, or nil if there are no violations. -func (m *DeviceRole) Validate() error { - return m.validate(false) -} - -// ValidateAll checks the field values on DeviceRole with the rules defined in -// the proto definition for this message. If any rules are violated, the -// result is a list of violation errors wrapped in DeviceRoleMultiError, or -// nil if none found. -func (m *DeviceRole) ValidateAll() error { - return m.validate(true) -} - -func (m *DeviceRole) validate(all bool) error { - if m == nil { - return nil - } - - var errors []error - - if l := utf8.RuneCountInString(m.GetName()); l < 1 || l > 100 { - err := DeviceRoleValidationError{ - field: "Name", - reason: "value length must be between 1 and 100 runes, inclusive", - } - if !all { - return err - } - errors = append(errors, err) - } - - if l := utf8.RuneCountInString(m.GetSlug()); l < 1 || l > 100 { - err := DeviceRoleValidationError{ - field: "Slug", - reason: "value length must be between 1 and 100 runes, inclusive", - } - if !all { - return err - } - errors = append(errors, err) - } - - if !_DeviceRole_Slug_Pattern.MatchString(m.GetSlug()) { - err := DeviceRoleValidationError{ - field: "Slug", - reason: "value does not match regex pattern \"^[-a-zA-Z0-9_]+$\"", - } - if !all { - return err - } - errors = append(errors, err) - } - - // no validation rules for VmRole - - if len(errors) > 0 { - return DeviceRoleMultiError(errors) - } - - return nil -} - -// DeviceRoleMultiError is an error wrapping multiple validation errors -// returned by DeviceRole.ValidateAll() if the designated constraints aren't met. -type DeviceRoleMultiError []error - -// Error returns a concatenation of all the error messages it wraps. -func (m DeviceRoleMultiError) Error() string { - var msgs []string - for _, err := range m { - msgs = append(msgs, err.Error()) - } - return strings.Join(msgs, "; ") -} - -// AllErrors returns a list of validation violation errors. -func (m DeviceRoleMultiError) AllErrors() []error { return m } - -// DeviceRoleValidationError is the validation error returned by -// DeviceRole.Validate if the designated constraints aren't met. -type DeviceRoleValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e DeviceRoleValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e DeviceRoleValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e DeviceRoleValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e DeviceRoleValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e DeviceRoleValidationError) ErrorName() string { return "DeviceRoleValidationError" } - -// Error satisfies the builtin error interface -func (e DeviceRoleValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sDeviceRole.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = DeviceRoleValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = DeviceRoleValidationError{} - -var _DeviceRole_Slug_Pattern = regexp.MustCompile("^[-a-zA-Z0-9_]+$") diff --git a/diode-sdk-go/diode/v1/diodepb/device_type.pb.go b/diode-sdk-go/diode/v1/diodepb/device_type.pb.go deleted file mode 100644 index 07413cf5..00000000 --- a/diode-sdk-go/diode/v1/diodepb/device_type.pb.go +++ /dev/null @@ -1,178 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.32.0 -// protoc (unknown) -// source: diode/v1/device_type.proto - -package diodepb - -import ( - _ "github.com/envoyproxy/protoc-gen-validate/validate" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - anypb "google.golang.org/protobuf/types/known/anypb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// A device type -type DeviceType struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Manufacturer *anypb.Any `protobuf:"bytes,1,opt,name=manufacturer,proto3" json:"manufacturer,omitempty"` - Model string `protobuf:"bytes,2,opt,name=model,proto3" json:"model,omitempty"` - Slug string `protobuf:"bytes,3,opt,name=slug,proto3" json:"slug,omitempty"` -} - -func (x *DeviceType) Reset() { - *x = DeviceType{} - if protoimpl.UnsafeEnabled { - mi := &file_diode_v1_device_type_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeviceType) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeviceType) ProtoMessage() {} - -func (x *DeviceType) ProtoReflect() protoreflect.Message { - mi := &file_diode_v1_device_type_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeviceType.ProtoReflect.Descriptor instead. -func (*DeviceType) Descriptor() ([]byte, []int) { - return file_diode_v1_device_type_proto_rawDescGZIP(), []int{0} -} - -func (x *DeviceType) GetManufacturer() *anypb.Any { - if x != nil { - return x.Manufacturer - } - return nil -} - -func (x *DeviceType) GetModel() string { - if x != nil { - return x.Model - } - return "" -} - -func (x *DeviceType) GetSlug() string { - if x != nil { - return x.Slug - } - return "" -} - -var File_diode_v1_device_type_proto protoreflect.FileDescriptor - -var file_diode_v1_device_type_proto_rawDesc = []byte{ - 0x0a, 0x1a, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x64, 0x69, - 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa2, 0x01, 0x0a, 0x0a, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x42, 0x0a, 0x0c, 0x6d, 0x61, 0x6e, - 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0xa2, 0x01, 0x02, 0x08, 0x01, 0x52, - 0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x12, 0x1f, 0x0a, - 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xfa, 0x42, - 0x06, 0x72, 0x04, 0x10, 0x01, 0x18, 0x64, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x2f, - 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1b, 0xfa, 0x42, - 0x18, 0x72, 0x16, 0x10, 0x01, 0x18, 0x64, 0x32, 0x10, 0x5e, 0x5b, 0x2d, 0x61, 0x2d, 0x7a, 0x41, - 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x42, - 0x3b, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x65, - 0x74, 0x62, 0x6f, 0x78, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x64, - 0x69, 0x6f, 0x64, 0x65, 0x2d, 0x73, 0x64, 0x6b, 0x2d, 0x67, 0x6f, 0x2f, 0x64, 0x69, 0x6f, 0x64, - 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_diode_v1_device_type_proto_rawDescOnce sync.Once - file_diode_v1_device_type_proto_rawDescData = file_diode_v1_device_type_proto_rawDesc -) - -func file_diode_v1_device_type_proto_rawDescGZIP() []byte { - file_diode_v1_device_type_proto_rawDescOnce.Do(func() { - file_diode_v1_device_type_proto_rawDescData = protoimpl.X.CompressGZIP(file_diode_v1_device_type_proto_rawDescData) - }) - return file_diode_v1_device_type_proto_rawDescData -} - -var file_diode_v1_device_type_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_diode_v1_device_type_proto_goTypes = []interface{}{ - (*DeviceType)(nil), // 0: diode.v1.DeviceType - (*anypb.Any)(nil), // 1: google.protobuf.Any -} -var file_diode_v1_device_type_proto_depIdxs = []int32{ - 1, // 0: diode.v1.DeviceType.manufacturer:type_name -> google.protobuf.Any - 1, // [1:1] is the sub-list for method output_type - 1, // [1:1] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name -} - -func init() { file_diode_v1_device_type_proto_init() } -func file_diode_v1_device_type_proto_init() { - if File_diode_v1_device_type_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_diode_v1_device_type_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeviceType); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_diode_v1_device_type_proto_rawDesc, - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_diode_v1_device_type_proto_goTypes, - DependencyIndexes: file_diode_v1_device_type_proto_depIdxs, - MessageInfos: file_diode_v1_device_type_proto_msgTypes, - }.Build() - File_diode_v1_device_type_proto = out.File - file_diode_v1_device_type_proto_rawDesc = nil - file_diode_v1_device_type_proto_goTypes = nil - file_diode_v1_device_type_proto_depIdxs = nil -} diff --git a/diode-sdk-go/diode/v1/diodepb/device_type.pb.validate.go b/diode-sdk-go/diode/v1/diodepb/device_type.pb.validate.go deleted file mode 100644 index 3439a947..00000000 --- a/diode-sdk-go/diode/v1/diodepb/device_type.pb.validate.go +++ /dev/null @@ -1,185 +0,0 @@ -// Code generated by protoc-gen-validate. DO NOT EDIT. -// source: diode/v1/device_type.proto - -package diodepb - -import ( - "bytes" - "errors" - "fmt" - "net" - "net/mail" - "net/url" - "regexp" - "sort" - "strings" - "time" - "unicode/utf8" - - "google.golang.org/protobuf/types/known/anypb" -) - -// ensure the imports are used -var ( - _ = bytes.MinRead - _ = errors.New("") - _ = fmt.Print - _ = utf8.UTFMax - _ = (*regexp.Regexp)(nil) - _ = (*strings.Reader)(nil) - _ = net.IPv4len - _ = time.Duration(0) - _ = (*url.URL)(nil) - _ = (*mail.Address)(nil) - _ = anypb.Any{} - _ = sort.Sort -) - -// Validate checks the field values on DeviceType with the rules defined in the -// proto definition for this message. If any rules are violated, the first -// error encountered is returned, or nil if there are no violations. -func (m *DeviceType) Validate() error { - return m.validate(false) -} - -// ValidateAll checks the field values on DeviceType with the rules defined in -// the proto definition for this message. If any rules are violated, the -// result is a list of violation errors wrapped in DeviceTypeMultiError, or -// nil if none found. -func (m *DeviceType) ValidateAll() error { - return m.validate(true) -} - -func (m *DeviceType) validate(all bool) error { - if m == nil { - return nil - } - - var errors []error - - if m.GetManufacturer() == nil { - err := DeviceTypeValidationError{ - field: "Manufacturer", - reason: "value is required", - } - if !all { - return err - } - errors = append(errors, err) - } - - if a := m.GetManufacturer(); a != nil { - - } - - if l := utf8.RuneCountInString(m.GetModel()); l < 1 || l > 100 { - err := DeviceTypeValidationError{ - field: "Model", - reason: "value length must be between 1 and 100 runes, inclusive", - } - if !all { - return err - } - errors = append(errors, err) - } - - if l := utf8.RuneCountInString(m.GetSlug()); l < 1 || l > 100 { - err := DeviceTypeValidationError{ - field: "Slug", - reason: "value length must be between 1 and 100 runes, inclusive", - } - if !all { - return err - } - errors = append(errors, err) - } - - if !_DeviceType_Slug_Pattern.MatchString(m.GetSlug()) { - err := DeviceTypeValidationError{ - field: "Slug", - reason: "value does not match regex pattern \"^[-a-zA-Z0-9_]+$\"", - } - if !all { - return err - } - errors = append(errors, err) - } - - if len(errors) > 0 { - return DeviceTypeMultiError(errors) - } - - return nil -} - -// DeviceTypeMultiError is an error wrapping multiple validation errors -// returned by DeviceType.ValidateAll() if the designated constraints aren't met. -type DeviceTypeMultiError []error - -// Error returns a concatenation of all the error messages it wraps. -func (m DeviceTypeMultiError) Error() string { - var msgs []string - for _, err := range m { - msgs = append(msgs, err.Error()) - } - return strings.Join(msgs, "; ") -} - -// AllErrors returns a list of validation violation errors. -func (m DeviceTypeMultiError) AllErrors() []error { return m } - -// DeviceTypeValidationError is the validation error returned by -// DeviceType.Validate if the designated constraints aren't met. -type DeviceTypeValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e DeviceTypeValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e DeviceTypeValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e DeviceTypeValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e DeviceTypeValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e DeviceTypeValidationError) ErrorName() string { return "DeviceTypeValidationError" } - -// Error satisfies the builtin error interface -func (e DeviceTypeValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sDeviceType.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = DeviceTypeValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = DeviceTypeValidationError{} - -var _DeviceType_Slug_Pattern = regexp.MustCompile("^[-a-zA-Z0-9_]+$") diff --git a/diode-sdk-go/diode/v1/diodepb/distributor.pb.go b/diode-sdk-go/diode/v1/diodepb/distributor.pb.go deleted file mode 100644 index 0fa43661..00000000 --- a/diode-sdk-go/diode/v1/diodepb/distributor.pb.go +++ /dev/null @@ -1,537 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.32.0 -// protoc (unknown) -// source: diode/v1/distributor.proto - -package diodepb - -import ( - _ "github.com/envoyproxy/protoc-gen-validate/validate" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - timestamppb "google.golang.org/protobuf/types/known/timestamppb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// An ingest entity wrapper -type IngestEntity struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Data: - // - // *IngestEntity_Site - // *IngestEntity_Platform - // *IngestEntity_Manufacturer - // *IngestEntity_Device - // *IngestEntity_DeviceRole - // *IngestEntity_DeviceType - // *IngestEntity_Interface - Data isIngestEntity_Data `protobuf_oneof:"data"` - // The timestamp of the data discovery at source - Timestamp *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=timestamp,proto3" json:"timestamp,omitempty"` -} - -func (x *IngestEntity) Reset() { - *x = IngestEntity{} - if protoimpl.UnsafeEnabled { - mi := &file_diode_v1_distributor_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *IngestEntity) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*IngestEntity) ProtoMessage() {} - -func (x *IngestEntity) ProtoReflect() protoreflect.Message { - mi := &file_diode_v1_distributor_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use IngestEntity.ProtoReflect.Descriptor instead. -func (*IngestEntity) Descriptor() ([]byte, []int) { - return file_diode_v1_distributor_proto_rawDescGZIP(), []int{0} -} - -func (m *IngestEntity) GetData() isIngestEntity_Data { - if m != nil { - return m.Data - } - return nil -} - -func (x *IngestEntity) GetSite() *Site { - if x, ok := x.GetData().(*IngestEntity_Site); ok { - return x.Site - } - return nil -} - -func (x *IngestEntity) GetPlatform() *Platform { - if x, ok := x.GetData().(*IngestEntity_Platform); ok { - return x.Platform - } - return nil -} - -func (x *IngestEntity) GetManufacturer() *Manufacturer { - if x, ok := x.GetData().(*IngestEntity_Manufacturer); ok { - return x.Manufacturer - } - return nil -} - -func (x *IngestEntity) GetDevice() *Device { - if x, ok := x.GetData().(*IngestEntity_Device); ok { - return x.Device - } - return nil -} - -func (x *IngestEntity) GetDeviceRole() *DeviceRole { - if x, ok := x.GetData().(*IngestEntity_DeviceRole); ok { - return x.DeviceRole - } - return nil -} - -func (x *IngestEntity) GetDeviceType() *DeviceType { - if x, ok := x.GetData().(*IngestEntity_DeviceType); ok { - return x.DeviceType - } - return nil -} - -func (x *IngestEntity) GetInterface() *Interface { - if x, ok := x.GetData().(*IngestEntity_Interface); ok { - return x.Interface - } - return nil -} - -func (x *IngestEntity) GetTimestamp() *timestamppb.Timestamp { - if x != nil { - return x.Timestamp - } - return nil -} - -type isIngestEntity_Data interface { - isIngestEntity_Data() -} - -type IngestEntity_Site struct { - Site *Site `protobuf:"bytes,1,opt,name=site,proto3,oneof"` -} - -type IngestEntity_Platform struct { - Platform *Platform `protobuf:"bytes,2,opt,name=platform,proto3,oneof"` -} - -type IngestEntity_Manufacturer struct { - Manufacturer *Manufacturer `protobuf:"bytes,3,opt,name=manufacturer,proto3,oneof"` -} - -type IngestEntity_Device struct { - Device *Device `protobuf:"bytes,4,opt,name=device,proto3,oneof"` -} - -type IngestEntity_DeviceRole struct { - DeviceRole *DeviceRole `protobuf:"bytes,5,opt,name=device_role,json=deviceRole,proto3,oneof"` -} - -type IngestEntity_DeviceType struct { - DeviceType *DeviceType `protobuf:"bytes,6,opt,name=device_type,json=deviceType,proto3,oneof"` -} - -type IngestEntity_Interface struct { - Interface *Interface `protobuf:"bytes,7,opt,name=interface,proto3,oneof"` -} - -func (*IngestEntity_Site) isIngestEntity_Data() {} - -func (*IngestEntity_Platform) isIngestEntity_Data() {} - -func (*IngestEntity_Manufacturer) isIngestEntity_Data() {} - -func (*IngestEntity_Device) isIngestEntity_Data() {} - -func (*IngestEntity_DeviceRole) isIngestEntity_Data() {} - -func (*IngestEntity_DeviceType) isIngestEntity_Data() {} - -func (*IngestEntity_Interface) isIngestEntity_Data() {} - -// The request to push data -type PushRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Stream string `protobuf:"bytes,1,opt,name=stream,proto3" json:"stream,omitempty"` - Data []*IngestEntity `protobuf:"bytes,2,rep,name=data,proto3" json:"data,omitempty"` - Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` - ProducerAppName string `protobuf:"bytes,4,opt,name=producer_app_name,json=producerAppName,proto3" json:"producer_app_name,omitempty"` - ProducerAppVersion string `protobuf:"bytes,5,opt,name=producer_app_version,json=producerAppVersion,proto3" json:"producer_app_version,omitempty"` - SdkName string `protobuf:"bytes,6,opt,name=sdk_name,json=sdkName,proto3" json:"sdk_name,omitempty"` - SdkVersion string `protobuf:"bytes,7,opt,name=sdk_version,json=sdkVersion,proto3" json:"sdk_version,omitempty"` -} - -func (x *PushRequest) Reset() { - *x = PushRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_diode_v1_distributor_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PushRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PushRequest) ProtoMessage() {} - -func (x *PushRequest) ProtoReflect() protoreflect.Message { - mi := &file_diode_v1_distributor_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PushRequest.ProtoReflect.Descriptor instead. -func (*PushRequest) Descriptor() ([]byte, []int) { - return file_diode_v1_distributor_proto_rawDescGZIP(), []int{1} -} - -func (x *PushRequest) GetStream() string { - if x != nil { - return x.Stream - } - return "" -} - -func (x *PushRequest) GetData() []*IngestEntity { - if x != nil { - return x.Data - } - return nil -} - -func (x *PushRequest) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *PushRequest) GetProducerAppName() string { - if x != nil { - return x.ProducerAppName - } - return "" -} - -func (x *PushRequest) GetProducerAppVersion() string { - if x != nil { - return x.ProducerAppVersion - } - return "" -} - -func (x *PushRequest) GetSdkName() string { - if x != nil { - return x.SdkName - } - return "" -} - -func (x *PushRequest) GetSdkVersion() string { - if x != nil { - return x.SdkVersion - } - return "" -} - -// The response from the push request -type PushResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Errors []string `protobuf:"bytes,1,rep,name=errors,proto3" json:"errors,omitempty"` -} - -func (x *PushResponse) Reset() { - *x = PushResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_diode_v1_distributor_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PushResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PushResponse) ProtoMessage() {} - -func (x *PushResponse) ProtoReflect() protoreflect.Message { - mi := &file_diode_v1_distributor_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use PushResponse.ProtoReflect.Descriptor instead. -func (*PushResponse) Descriptor() ([]byte, []int) { - return file_diode_v1_distributor_proto_rawDescGZIP(), []int{2} -} - -func (x *PushResponse) GetErrors() []string { - if x != nil { - return x.Errors - } - return nil -} - -var File_diode_v1_distributor_proto protoreflect.FileDescriptor - -var file_diode_v1_distributor_proto_rawDesc = []byte{ - 0x0a, 0x1a, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x69, 0x73, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x64, 0x69, - 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x15, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, - 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x64, - 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x72, - 0x6f, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x64, 0x69, 0x6f, 0x64, 0x65, - 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x1b, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, - 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x64, 0x69, - 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x13, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, - 0x73, 0x69, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc5, 0x03, 0x0a, 0x0c, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x45, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x04, 0x73, 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x69, 0x74, 0x65, 0x48, 0x00, 0x52, 0x04, 0x73, 0x69, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x70, - 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, - 0x6d, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x3c, 0x0a, - 0x0c, 0x6d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, - 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x6d, - 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x06, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x64, 0x69, - 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, - 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, - 0x69, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x6f, - 0x6c, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x6f, 0x6c, 0x65, - 0x12, 0x37, 0x0a, 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x64, - 0x69, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, - 0x65, 0x48, 0x00, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x12, 0x44, - 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x0a, 0xfa, - 0x42, 0x07, 0xb2, 0x01, 0x04, 0x08, 0x01, 0x38, 0x01, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xe0, 0x02, 0x0a, - 0x0b, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x06, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, - 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x12, 0x37, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, - 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x92, 0x01, 0x05, 0x08, 0x01, - 0x10, 0xe8, 0x07, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, - 0xfa, 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x65, 0x72, 0x41, 0x70, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x14, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, - 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x12, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x65, 0x72, 0x41, - 0x70, 0x70, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x08, 0x73, 0x64, 0x6b, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, - 0x72, 0x05, 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x07, 0x73, 0x64, 0x6b, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x3d, 0x0a, 0x0b, 0x73, 0x64, 0x6b, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1c, 0xfa, 0x42, 0x19, 0x72, 0x17, 0x32, 0x15, 0x5e, 0x28, - 0x5c, 0x64, 0x29, 0x2b, 0x5c, 0x2e, 0x28, 0x5c, 0x64, 0x29, 0x2b, 0x5c, 0x2e, 0x28, 0x5c, 0x64, - 0x29, 0x2b, 0x24, 0x52, 0x0a, 0x73, 0x64, 0x6b, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x26, 0x0a, 0x0c, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x32, 0x4d, 0x0a, 0x12, 0x44, 0x69, 0x73, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x6f, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x37, 0x0a, - 0x04, 0x50, 0x75, 0x73, 0x68, 0x12, 0x15, 0x2e, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x64, - 0x69, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x3b, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x65, 0x74, 0x62, 0x6f, 0x78, 0x6c, 0x61, 0x62, 0x73, 0x2f, - 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2d, 0x73, 0x64, 0x6b, 0x2d, - 0x67, 0x6f, 0x2f, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x69, 0x6f, 0x64, - 0x65, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_diode_v1_distributor_proto_rawDescOnce sync.Once - file_diode_v1_distributor_proto_rawDescData = file_diode_v1_distributor_proto_rawDesc -) - -func file_diode_v1_distributor_proto_rawDescGZIP() []byte { - file_diode_v1_distributor_proto_rawDescOnce.Do(func() { - file_diode_v1_distributor_proto_rawDescData = protoimpl.X.CompressGZIP(file_diode_v1_distributor_proto_rawDescData) - }) - return file_diode_v1_distributor_proto_rawDescData -} - -var file_diode_v1_distributor_proto_msgTypes = make([]protoimpl.MessageInfo, 3) -var file_diode_v1_distributor_proto_goTypes = []interface{}{ - (*IngestEntity)(nil), // 0: diode.v1.IngestEntity - (*PushRequest)(nil), // 1: diode.v1.PushRequest - (*PushResponse)(nil), // 2: diode.v1.PushResponse - (*Site)(nil), // 3: diode.v1.Site - (*Platform)(nil), // 4: diode.v1.Platform - (*Manufacturer)(nil), // 5: diode.v1.Manufacturer - (*Device)(nil), // 6: diode.v1.Device - (*DeviceRole)(nil), // 7: diode.v1.DeviceRole - (*DeviceType)(nil), // 8: diode.v1.DeviceType - (*Interface)(nil), // 9: diode.v1.Interface - (*timestamppb.Timestamp)(nil), // 10: google.protobuf.Timestamp -} -var file_diode_v1_distributor_proto_depIdxs = []int32{ - 3, // 0: diode.v1.IngestEntity.site:type_name -> diode.v1.Site - 4, // 1: diode.v1.IngestEntity.platform:type_name -> diode.v1.Platform - 5, // 2: diode.v1.IngestEntity.manufacturer:type_name -> diode.v1.Manufacturer - 6, // 3: diode.v1.IngestEntity.device:type_name -> diode.v1.Device - 7, // 4: diode.v1.IngestEntity.device_role:type_name -> diode.v1.DeviceRole - 8, // 5: diode.v1.IngestEntity.device_type:type_name -> diode.v1.DeviceType - 9, // 6: diode.v1.IngestEntity.interface:type_name -> diode.v1.Interface - 10, // 7: diode.v1.IngestEntity.timestamp:type_name -> google.protobuf.Timestamp - 0, // 8: diode.v1.PushRequest.data:type_name -> diode.v1.IngestEntity - 1, // 9: diode.v1.DistributorService.Push:input_type -> diode.v1.PushRequest - 2, // 10: diode.v1.DistributorService.Push:output_type -> diode.v1.PushResponse - 10, // [10:11] is the sub-list for method output_type - 9, // [9:10] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name -} - -func init() { file_diode_v1_distributor_proto_init() } -func file_diode_v1_distributor_proto_init() { - if File_diode_v1_distributor_proto != nil { - return - } - file_diode_v1_device_proto_init() - file_diode_v1_device_role_proto_init() - file_diode_v1_device_type_proto_init() - file_diode_v1_interface_proto_init() - file_diode_v1_manufacturer_proto_init() - file_diode_v1_platform_proto_init() - file_diode_v1_site_proto_init() - if !protoimpl.UnsafeEnabled { - file_diode_v1_distributor_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IngestEntity); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_diode_v1_distributor_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PushRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_diode_v1_distributor_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PushResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_diode_v1_distributor_proto_msgTypes[0].OneofWrappers = []interface{}{ - (*IngestEntity_Site)(nil), - (*IngestEntity_Platform)(nil), - (*IngestEntity_Manufacturer)(nil), - (*IngestEntity_Device)(nil), - (*IngestEntity_DeviceRole)(nil), - (*IngestEntity_DeviceType)(nil), - (*IngestEntity_Interface)(nil), - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_diode_v1_distributor_proto_rawDesc, - NumEnums: 0, - NumMessages: 3, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_diode_v1_distributor_proto_goTypes, - DependencyIndexes: file_diode_v1_distributor_proto_depIdxs, - MessageInfos: file_diode_v1_distributor_proto_msgTypes, - }.Build() - File_diode_v1_distributor_proto = out.File - file_diode_v1_distributor_proto_rawDesc = nil - file_diode_v1_distributor_proto_goTypes = nil - file_diode_v1_distributor_proto_depIdxs = nil -} diff --git a/diode-sdk-go/diode/v1/diodepb/distributor.pb.validate.go b/diode-sdk-go/diode/v1/diodepb/distributor.pb.validate.go deleted file mode 100644 index 75376a11..00000000 --- a/diode-sdk-go/diode/v1/diodepb/distributor.pb.validate.go +++ /dev/null @@ -1,791 +0,0 @@ -// Code generated by protoc-gen-validate. DO NOT EDIT. -// source: diode/v1/distributor.proto - -package diodepb - -import ( - "bytes" - "errors" - "fmt" - "net" - "net/mail" - "net/url" - "regexp" - "sort" - "strings" - "time" - "unicode/utf8" - - "google.golang.org/protobuf/types/known/anypb" -) - -// ensure the imports are used -var ( - _ = bytes.MinRead - _ = errors.New("") - _ = fmt.Print - _ = utf8.UTFMax - _ = (*regexp.Regexp)(nil) - _ = (*strings.Reader)(nil) - _ = net.IPv4len - _ = time.Duration(0) - _ = (*url.URL)(nil) - _ = (*mail.Address)(nil) - _ = anypb.Any{} - _ = sort.Sort -) - -// define the regex for a UUID once up-front -var _distributor_uuidPattern = regexp.MustCompile("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$") - -// Validate checks the field values on IngestEntity with the rules defined in -// the proto definition for this message. If any rules are violated, the first -// error encountered is returned, or nil if there are no violations. -func (m *IngestEntity) Validate() error { - return m.validate(false) -} - -// ValidateAll checks the field values on IngestEntity with the rules defined -// in the proto definition for this message. If any rules are violated, the -// result is a list of violation errors wrapped in IngestEntityMultiError, or -// nil if none found. -func (m *IngestEntity) ValidateAll() error { - return m.validate(true) -} - -func (m *IngestEntity) validate(all bool) error { - if m == nil { - return nil - } - - var errors []error - - if m.GetTimestamp() == nil { - err := IngestEntityValidationError{ - field: "Timestamp", - reason: "value is required", - } - if !all { - return err - } - errors = append(errors, err) - } - - if t := m.GetTimestamp(); t != nil { - ts, err := t.AsTime(), t.CheckValid() - if err != nil { - err = IngestEntityValidationError{ - field: "Timestamp", - reason: "value is not a valid timestamp", - cause: err, - } - if !all { - return err - } - errors = append(errors, err) - } else { - - now := time.Now() - - if ts.Sub(now) >= 0 { - err := IngestEntityValidationError{ - field: "Timestamp", - reason: "value must be less than now", - } - if !all { - return err - } - errors = append(errors, err) - } - - } - } - - switch v := m.Data.(type) { - case *IngestEntity_Site: - if v == nil { - err := IngestEntityValidationError{ - field: "Data", - reason: "oneof value cannot be a typed-nil", - } - if !all { - return err - } - errors = append(errors, err) - } - - if all { - switch v := interface{}(m.GetSite()).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, IngestEntityValidationError{ - field: "Site", - reason: "embedded message failed validation", - cause: err, - }) - } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, IngestEntityValidationError{ - field: "Site", - reason: "embedded message failed validation", - cause: err, - }) - } - } - } else if v, ok := interface{}(m.GetSite()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return IngestEntityValidationError{ - field: "Site", - reason: "embedded message failed validation", - cause: err, - } - } - } - - case *IngestEntity_Platform: - if v == nil { - err := IngestEntityValidationError{ - field: "Data", - reason: "oneof value cannot be a typed-nil", - } - if !all { - return err - } - errors = append(errors, err) - } - - if all { - switch v := interface{}(m.GetPlatform()).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, IngestEntityValidationError{ - field: "Platform", - reason: "embedded message failed validation", - cause: err, - }) - } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, IngestEntityValidationError{ - field: "Platform", - reason: "embedded message failed validation", - cause: err, - }) - } - } - } else if v, ok := interface{}(m.GetPlatform()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return IngestEntityValidationError{ - field: "Platform", - reason: "embedded message failed validation", - cause: err, - } - } - } - - case *IngestEntity_Manufacturer: - if v == nil { - err := IngestEntityValidationError{ - field: "Data", - reason: "oneof value cannot be a typed-nil", - } - if !all { - return err - } - errors = append(errors, err) - } - - if all { - switch v := interface{}(m.GetManufacturer()).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, IngestEntityValidationError{ - field: "Manufacturer", - reason: "embedded message failed validation", - cause: err, - }) - } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, IngestEntityValidationError{ - field: "Manufacturer", - reason: "embedded message failed validation", - cause: err, - }) - } - } - } else if v, ok := interface{}(m.GetManufacturer()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return IngestEntityValidationError{ - field: "Manufacturer", - reason: "embedded message failed validation", - cause: err, - } - } - } - - case *IngestEntity_Device: - if v == nil { - err := IngestEntityValidationError{ - field: "Data", - reason: "oneof value cannot be a typed-nil", - } - if !all { - return err - } - errors = append(errors, err) - } - - if all { - switch v := interface{}(m.GetDevice()).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, IngestEntityValidationError{ - field: "Device", - reason: "embedded message failed validation", - cause: err, - }) - } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, IngestEntityValidationError{ - field: "Device", - reason: "embedded message failed validation", - cause: err, - }) - } - } - } else if v, ok := interface{}(m.GetDevice()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return IngestEntityValidationError{ - field: "Device", - reason: "embedded message failed validation", - cause: err, - } - } - } - - case *IngestEntity_DeviceRole: - if v == nil { - err := IngestEntityValidationError{ - field: "Data", - reason: "oneof value cannot be a typed-nil", - } - if !all { - return err - } - errors = append(errors, err) - } - - if all { - switch v := interface{}(m.GetDeviceRole()).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, IngestEntityValidationError{ - field: "DeviceRole", - reason: "embedded message failed validation", - cause: err, - }) - } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, IngestEntityValidationError{ - field: "DeviceRole", - reason: "embedded message failed validation", - cause: err, - }) - } - } - } else if v, ok := interface{}(m.GetDeviceRole()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return IngestEntityValidationError{ - field: "DeviceRole", - reason: "embedded message failed validation", - cause: err, - } - } - } - - case *IngestEntity_DeviceType: - if v == nil { - err := IngestEntityValidationError{ - field: "Data", - reason: "oneof value cannot be a typed-nil", - } - if !all { - return err - } - errors = append(errors, err) - } - - if all { - switch v := interface{}(m.GetDeviceType()).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, IngestEntityValidationError{ - field: "DeviceType", - reason: "embedded message failed validation", - cause: err, - }) - } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, IngestEntityValidationError{ - field: "DeviceType", - reason: "embedded message failed validation", - cause: err, - }) - } - } - } else if v, ok := interface{}(m.GetDeviceType()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return IngestEntityValidationError{ - field: "DeviceType", - reason: "embedded message failed validation", - cause: err, - } - } - } - - case *IngestEntity_Interface: - if v == nil { - err := IngestEntityValidationError{ - field: "Data", - reason: "oneof value cannot be a typed-nil", - } - if !all { - return err - } - errors = append(errors, err) - } - - if all { - switch v := interface{}(m.GetInterface()).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, IngestEntityValidationError{ - field: "Interface", - reason: "embedded message failed validation", - cause: err, - }) - } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, IngestEntityValidationError{ - field: "Interface", - reason: "embedded message failed validation", - cause: err, - }) - } - } - } else if v, ok := interface{}(m.GetInterface()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return IngestEntityValidationError{ - field: "Interface", - reason: "embedded message failed validation", - cause: err, - } - } - } - - default: - _ = v // ensures v is used - } - - if len(errors) > 0 { - return IngestEntityMultiError(errors) - } - - return nil -} - -// IngestEntityMultiError is an error wrapping multiple validation errors -// returned by IngestEntity.ValidateAll() if the designated constraints aren't met. -type IngestEntityMultiError []error - -// Error returns a concatenation of all the error messages it wraps. -func (m IngestEntityMultiError) Error() string { - var msgs []string - for _, err := range m { - msgs = append(msgs, err.Error()) - } - return strings.Join(msgs, "; ") -} - -// AllErrors returns a list of validation violation errors. -func (m IngestEntityMultiError) AllErrors() []error { return m } - -// IngestEntityValidationError is the validation error returned by -// IngestEntity.Validate if the designated constraints aren't met. -type IngestEntityValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e IngestEntityValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e IngestEntityValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e IngestEntityValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e IngestEntityValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e IngestEntityValidationError) ErrorName() string { return "IngestEntityValidationError" } - -// Error satisfies the builtin error interface -func (e IngestEntityValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sIngestEntity.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = IngestEntityValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = IngestEntityValidationError{} - -// Validate checks the field values on PushRequest with the rules defined in -// the proto definition for this message. If any rules are violated, the first -// error encountered is returned, or nil if there are no violations. -func (m *PushRequest) Validate() error { - return m.validate(false) -} - -// ValidateAll checks the field values on PushRequest with the rules defined in -// the proto definition for this message. If any rules are violated, the -// result is a list of violation errors wrapped in PushRequestMultiError, or -// nil if none found. -func (m *PushRequest) ValidateAll() error { - return m.validate(true) -} - -func (m *PushRequest) validate(all bool) error { - if m == nil { - return nil - } - - var errors []error - - if l := utf8.RuneCountInString(m.GetStream()); l < 1 || l > 255 { - err := PushRequestValidationError{ - field: "Stream", - reason: "value length must be between 1 and 255 runes, inclusive", - } - if !all { - return err - } - errors = append(errors, err) - } - - if l := len(m.GetData()); l < 1 || l > 1000 { - err := PushRequestValidationError{ - field: "Data", - reason: "value must contain between 1 and 1000 items, inclusive", - } - if !all { - return err - } - errors = append(errors, err) - } - - for idx, item := range m.GetData() { - _, _ = idx, item - - if all { - switch v := interface{}(item).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, PushRequestValidationError{ - field: fmt.Sprintf("Data[%v]", idx), - reason: "embedded message failed validation", - cause: err, - }) - } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, PushRequestValidationError{ - field: fmt.Sprintf("Data[%v]", idx), - reason: "embedded message failed validation", - cause: err, - }) - } - } - } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return PushRequestValidationError{ - field: fmt.Sprintf("Data[%v]", idx), - reason: "embedded message failed validation", - cause: err, - } - } - } - - } - - if err := m._validateUuid(m.GetId()); err != nil { - err = PushRequestValidationError{ - field: "Id", - reason: "value must be a valid UUID", - cause: err, - } - if !all { - return err - } - errors = append(errors, err) - } - - if l := utf8.RuneCountInString(m.GetProducerAppName()); l < 1 || l > 255 { - err := PushRequestValidationError{ - field: "ProducerAppName", - reason: "value length must be between 1 and 255 runes, inclusive", - } - if !all { - return err - } - errors = append(errors, err) - } - - if l := utf8.RuneCountInString(m.GetProducerAppVersion()); l < 1 || l > 255 { - err := PushRequestValidationError{ - field: "ProducerAppVersion", - reason: "value length must be between 1 and 255 runes, inclusive", - } - if !all { - return err - } - errors = append(errors, err) - } - - if l := utf8.RuneCountInString(m.GetSdkName()); l < 1 || l > 255 { - err := PushRequestValidationError{ - field: "SdkName", - reason: "value length must be between 1 and 255 runes, inclusive", - } - if !all { - return err - } - errors = append(errors, err) - } - - if !_PushRequest_SdkVersion_Pattern.MatchString(m.GetSdkVersion()) { - err := PushRequestValidationError{ - field: "SdkVersion", - reason: "value does not match regex pattern \"^(\\\\d)+\\\\.(\\\\d)+\\\\.(\\\\d)+$\"", - } - if !all { - return err - } - errors = append(errors, err) - } - - if len(errors) > 0 { - return PushRequestMultiError(errors) - } - - return nil -} - -func (m *PushRequest) _validateUuid(uuid string) error { - if matched := _distributor_uuidPattern.MatchString(uuid); !matched { - return errors.New("invalid uuid format") - } - - return nil -} - -// PushRequestMultiError is an error wrapping multiple validation errors -// returned by PushRequest.ValidateAll() if the designated constraints aren't met. -type PushRequestMultiError []error - -// Error returns a concatenation of all the error messages it wraps. -func (m PushRequestMultiError) Error() string { - var msgs []string - for _, err := range m { - msgs = append(msgs, err.Error()) - } - return strings.Join(msgs, "; ") -} - -// AllErrors returns a list of validation violation errors. -func (m PushRequestMultiError) AllErrors() []error { return m } - -// PushRequestValidationError is the validation error returned by -// PushRequest.Validate if the designated constraints aren't met. -type PushRequestValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e PushRequestValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e PushRequestValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e PushRequestValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e PushRequestValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e PushRequestValidationError) ErrorName() string { return "PushRequestValidationError" } - -// Error satisfies the builtin error interface -func (e PushRequestValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sPushRequest.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = PushRequestValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = PushRequestValidationError{} - -var _PushRequest_SdkVersion_Pattern = regexp.MustCompile("^(\\d)+\\.(\\d)+\\.(\\d)+$") - -// Validate checks the field values on PushResponse with the rules defined in -// the proto definition for this message. If any rules are violated, the first -// error encountered is returned, or nil if there are no violations. -func (m *PushResponse) Validate() error { - return m.validate(false) -} - -// ValidateAll checks the field values on PushResponse with the rules defined -// in the proto definition for this message. If any rules are violated, the -// result is a list of violation errors wrapped in PushResponseMultiError, or -// nil if none found. -func (m *PushResponse) ValidateAll() error { - return m.validate(true) -} - -func (m *PushResponse) validate(all bool) error { - if m == nil { - return nil - } - - var errors []error - - if len(errors) > 0 { - return PushResponseMultiError(errors) - } - - return nil -} - -// PushResponseMultiError is an error wrapping multiple validation errors -// returned by PushResponse.ValidateAll() if the designated constraints aren't met. -type PushResponseMultiError []error - -// Error returns a concatenation of all the error messages it wraps. -func (m PushResponseMultiError) Error() string { - var msgs []string - for _, err := range m { - msgs = append(msgs, err.Error()) - } - return strings.Join(msgs, "; ") -} - -// AllErrors returns a list of validation violation errors. -func (m PushResponseMultiError) AllErrors() []error { return m } - -// PushResponseValidationError is the validation error returned by -// PushResponse.Validate if the designated constraints aren't met. -type PushResponseValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e PushResponseValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e PushResponseValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e PushResponseValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e PushResponseValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e PushResponseValidationError) ErrorName() string { return "PushResponseValidationError" } - -// Error satisfies the builtin error interface -func (e PushResponseValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sPushResponse.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = PushResponseValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = PushResponseValidationError{} diff --git a/diode-sdk-go/diode/v1/diodepb/distributor_grpc.pb.go b/diode-sdk-go/diode/v1/diodepb/distributor_grpc.pb.go deleted file mode 100644 index 468eca40..00000000 --- a/diode-sdk-go/diode/v1/diodepb/distributor_grpc.pb.go +++ /dev/null @@ -1,111 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc (unknown) -// source: diode/v1/distributor.proto - -package diodepb - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -const ( - DistributorService_Push_FullMethodName = "/diode.v1.DistributorService/Push" -) - -// DistributorServiceClient is the client API for DistributorService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type DistributorServiceClient interface { - // Ingests data into the system - Push(ctx context.Context, in *PushRequest, opts ...grpc.CallOption) (*PushResponse, error) -} - -type distributorServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewDistributorServiceClient(cc grpc.ClientConnInterface) DistributorServiceClient { - return &distributorServiceClient{cc} -} - -func (c *distributorServiceClient) Push(ctx context.Context, in *PushRequest, opts ...grpc.CallOption) (*PushResponse, error) { - out := new(PushResponse) - err := c.cc.Invoke(ctx, DistributorService_Push_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// DistributorServiceServer is the server API for DistributorService service. -// All implementations must embed UnimplementedDistributorServiceServer -// for forward compatibility -type DistributorServiceServer interface { - // Ingests data into the system - Push(context.Context, *PushRequest) (*PushResponse, error) - mustEmbedUnimplementedDistributorServiceServer() -} - -// UnimplementedDistributorServiceServer must be embedded to have forward compatible implementations. -type UnimplementedDistributorServiceServer struct { -} - -func (UnimplementedDistributorServiceServer) Push(context.Context, *PushRequest) (*PushResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Push not implemented") -} -func (UnimplementedDistributorServiceServer) mustEmbedUnimplementedDistributorServiceServer() {} - -// UnsafeDistributorServiceServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to DistributorServiceServer will -// result in compilation errors. -type UnsafeDistributorServiceServer interface { - mustEmbedUnimplementedDistributorServiceServer() -} - -func RegisterDistributorServiceServer(s grpc.ServiceRegistrar, srv DistributorServiceServer) { - s.RegisterService(&DistributorService_ServiceDesc, srv) -} - -func _DistributorService_Push_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PushRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(DistributorServiceServer).Push(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: DistributorService_Push_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(DistributorServiceServer).Push(ctx, req.(*PushRequest)) - } - return interceptor(ctx, in, info, handler) -} - -// DistributorService_ServiceDesc is the grpc.ServiceDesc for DistributorService service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var DistributorService_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "diode.v1.DistributorService", - HandlerType: (*DistributorServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Push", - Handler: _DistributorService_Push_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "diode/v1/distributor.proto", -} diff --git a/diode-sdk-go/diode/v1/diodepb/interface.pb.go b/diode-sdk-go/diode/v1/diodepb/interface.pb.go deleted file mode 100644 index 7bb186a6..00000000 --- a/diode-sdk-go/diode/v1/diodepb/interface.pb.go +++ /dev/null @@ -1,317 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.32.0 -// protoc (unknown) -// source: diode/v1/interface.proto - -package diodepb - -import ( - _ "github.com/envoyproxy/protoc-gen-validate/validate" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - anypb "google.golang.org/protobuf/types/known/anypb" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// An interface -type Interface struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Device *anypb.Any `protobuf:"bytes,1,opt,name=device,proto3" json:"device,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Type string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"` - Enabled bool `protobuf:"varint,4,opt,name=enabled,proto3" json:"enabled,omitempty"` - Mtu int32 `protobuf:"varint,5,opt,name=mtu,proto3" json:"mtu,omitempty"` - MacAddress string `protobuf:"bytes,6,opt,name=mac_address,json=macAddress,proto3" json:"mac_address,omitempty"` - MgmtOnly bool `protobuf:"varint,7,opt,name=mgmt_only,json=mgmtOnly,proto3" json:"mgmt_only,omitempty"` -} - -func (x *Interface) Reset() { - *x = Interface{} - if protoimpl.UnsafeEnabled { - mi := &file_diode_v1_interface_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Interface) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Interface) ProtoMessage() {} - -func (x *Interface) ProtoReflect() protoreflect.Message { - mi := &file_diode_v1_interface_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Interface.ProtoReflect.Descriptor instead. -func (*Interface) Descriptor() ([]byte, []int) { - return file_diode_v1_interface_proto_rawDescGZIP(), []int{0} -} - -func (x *Interface) GetDevice() *anypb.Any { - if x != nil { - return x.Device - } - return nil -} - -func (x *Interface) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Interface) GetType() string { - if x != nil { - return x.Type - } - return "" -} - -func (x *Interface) GetEnabled() bool { - if x != nil { - return x.Enabled - } - return false -} - -func (x *Interface) GetMtu() int32 { - if x != nil { - return x.Mtu - } - return 0 -} - -func (x *Interface) GetMacAddress() string { - if x != nil { - return x.MacAddress - } - return "" -} - -func (x *Interface) GetMgmtOnly() bool { - if x != nil { - return x.MgmtOnly - } - return false -} - -var File_diode_v1_interface_proto protoreflect.FileDescriptor - -var file_diode_v1_interface_proto_rawDesc = []byte{ - 0x0a, 0x18, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x66, 0x61, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x64, 0x69, 0x6f, 0x64, - 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd6, 0x0e, 0x0a, 0x09, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x42, 0x08, 0xfa, 0x42, - 0x05, 0xa2, 0x01, 0x02, 0x08, 0x01, 0x52, 0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xfa, 0x42, - 0x06, 0x72, 0x04, 0x10, 0x01, 0x18, 0x40, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0xfa, 0x0c, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0xe5, 0x0c, 0xfa, - 0x42, 0xe1, 0x0c, 0x72, 0xde, 0x0c, 0x52, 0x07, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x52, - 0x06, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x52, 0x03, 0x6c, 0x61, 0x67, 0x52, 0x0a, 0x31, 0x30, - 0x30, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x66, 0x78, 0x52, 0x0b, 0x31, 0x30, 0x30, 0x62, 0x61, 0x73, - 0x65, 0x2d, 0x6c, 0x66, 0x78, 0x52, 0x0a, 0x31, 0x30, 0x30, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x74, - 0x78, 0x52, 0x0a, 0x31, 0x30, 0x30, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x74, 0x31, 0x52, 0x0a, 0x31, - 0x30, 0x30, 0x30, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x74, 0x52, 0x0f, 0x31, 0x30, 0x30, 0x30, 0x62, - 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x67, 0x62, 0x69, 0x63, 0x52, 0x0e, 0x31, 0x30, 0x30, 0x30, - 0x62, 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x73, 0x66, 0x70, 0x52, 0x0a, 0x32, 0x2e, 0x35, 0x67, - 0x62, 0x61, 0x73, 0x65, 0x2d, 0x74, 0x52, 0x08, 0x35, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x74, - 0x52, 0x09, 0x31, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x74, 0x52, 0x0b, 0x31, 0x30, 0x67, - 0x62, 0x61, 0x73, 0x65, 0x2d, 0x63, 0x78, 0x34, 0x52, 0x0e, 0x31, 0x30, 0x67, 0x62, 0x61, 0x73, - 0x65, 0x2d, 0x78, 0x2d, 0x73, 0x66, 0x70, 0x70, 0x52, 0x0d, 0x31, 0x30, 0x67, 0x62, 0x61, 0x73, - 0x65, 0x2d, 0x78, 0x2d, 0x78, 0x66, 0x70, 0x52, 0x10, 0x31, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, - 0x2d, 0x78, 0x2d, 0x78, 0x65, 0x6e, 0x70, 0x61, 0x6b, 0x52, 0x0c, 0x31, 0x30, 0x67, 0x62, 0x61, - 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x78, 0x32, 0x52, 0x0f, 0x32, 0x35, 0x67, 0x62, 0x61, 0x73, 0x65, - 0x2d, 0x78, 0x2d, 0x73, 0x66, 0x70, 0x32, 0x38, 0x52, 0x0f, 0x35, 0x30, 0x67, 0x62, 0x61, 0x73, - 0x65, 0x2d, 0x78, 0x2d, 0x73, 0x66, 0x70, 0x35, 0x36, 0x52, 0x0f, 0x34, 0x30, 0x67, 0x62, 0x61, - 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x71, 0x73, 0x66, 0x70, 0x70, 0x52, 0x0f, 0x35, 0x30, 0x67, 0x62, - 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x73, 0x66, 0x70, 0x32, 0x38, 0x52, 0x0e, 0x31, 0x30, 0x30, - 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x63, 0x66, 0x70, 0x52, 0x0f, 0x31, 0x30, 0x30, - 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x63, 0x66, 0x70, 0x32, 0x52, 0x0f, 0x31, 0x30, - 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x63, 0x66, 0x70, 0x34, 0x52, 0x0e, 0x31, - 0x30, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x63, 0x78, 0x70, 0x52, 0x0f, 0x31, - 0x30, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x63, 0x70, 0x61, 0x6b, 0x52, 0x0f, - 0x31, 0x30, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x64, 0x73, 0x66, 0x70, 0x52, - 0x10, 0x31, 0x30, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x73, 0x66, 0x70, 0x64, - 0x64, 0x52, 0x11, 0x31, 0x30, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x71, 0x73, - 0x66, 0x70, 0x32, 0x38, 0x52, 0x11, 0x31, 0x30, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x78, - 0x2d, 0x71, 0x73, 0x66, 0x70, 0x64, 0x64, 0x52, 0x0f, 0x32, 0x30, 0x30, 0x67, 0x62, 0x61, 0x73, - 0x65, 0x2d, 0x78, 0x2d, 0x63, 0x66, 0x70, 0x32, 0x52, 0x11, 0x32, 0x30, 0x30, 0x67, 0x62, 0x61, - 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x71, 0x73, 0x66, 0x70, 0x35, 0x36, 0x52, 0x11, 0x32, 0x30, 0x30, - 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x71, 0x73, 0x66, 0x70, 0x64, 0x64, 0x52, 0x0f, - 0x34, 0x30, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x63, 0x66, 0x70, 0x32, 0x52, - 0x12, 0x34, 0x30, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x71, 0x73, 0x66, 0x70, - 0x31, 0x31, 0x32, 0x52, 0x11, 0x34, 0x30, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, - 0x71, 0x73, 0x66, 0x70, 0x64, 0x64, 0x52, 0x0f, 0x34, 0x30, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, - 0x2d, 0x78, 0x2d, 0x6f, 0x73, 0x66, 0x70, 0x52, 0x13, 0x34, 0x30, 0x30, 0x67, 0x62, 0x61, 0x73, - 0x65, 0x2d, 0x78, 0x2d, 0x6f, 0x73, 0x66, 0x70, 0x2d, 0x72, 0x68, 0x73, 0x52, 0x0f, 0x34, 0x30, - 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x63, 0x64, 0x66, 0x70, 0x52, 0x0f, 0x34, - 0x30, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x63, 0x66, 0x70, 0x38, 0x52, 0x11, - 0x38, 0x30, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x71, 0x73, 0x66, 0x70, 0x64, - 0x64, 0x52, 0x0f, 0x38, 0x30, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x78, 0x2d, 0x6f, 0x73, - 0x66, 0x70, 0x52, 0x0b, 0x31, 0x30, 0x30, 0x30, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x6b, 0x78, 0x52, - 0x0a, 0x31, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x6b, 0x72, 0x52, 0x0b, 0x31, 0x30, 0x67, - 0x62, 0x61, 0x73, 0x65, 0x2d, 0x6b, 0x78, 0x34, 0x52, 0x0a, 0x32, 0x35, 0x67, 0x62, 0x61, 0x73, - 0x65, 0x2d, 0x6b, 0x72, 0x52, 0x0b, 0x34, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x6b, 0x72, - 0x34, 0x52, 0x0a, 0x35, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x6b, 0x72, 0x52, 0x0c, 0x31, - 0x30, 0x30, 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x6b, 0x70, 0x34, 0x52, 0x0c, 0x31, 0x30, 0x30, - 0x67, 0x62, 0x61, 0x73, 0x65, 0x2d, 0x6b, 0x72, 0x32, 0x52, 0x0c, 0x31, 0x30, 0x30, 0x67, 0x62, - 0x61, 0x73, 0x65, 0x2d, 0x6b, 0x72, 0x34, 0x52, 0x0b, 0x69, 0x65, 0x65, 0x65, 0x38, 0x30, 0x32, - 0x2e, 0x31, 0x31, 0x61, 0x52, 0x0b, 0x69, 0x65, 0x65, 0x65, 0x38, 0x30, 0x32, 0x2e, 0x31, 0x31, - 0x67, 0x52, 0x0b, 0x69, 0x65, 0x65, 0x65, 0x38, 0x30, 0x32, 0x2e, 0x31, 0x31, 0x6e, 0x52, 0x0c, - 0x69, 0x65, 0x65, 0x65, 0x38, 0x30, 0x32, 0x2e, 0x31, 0x31, 0x61, 0x63, 0x52, 0x0c, 0x69, 0x65, - 0x65, 0x65, 0x38, 0x30, 0x32, 0x2e, 0x31, 0x31, 0x61, 0x64, 0x52, 0x0c, 0x69, 0x65, 0x65, 0x65, - 0x38, 0x30, 0x32, 0x2e, 0x31, 0x31, 0x61, 0x78, 0x52, 0x0c, 0x69, 0x65, 0x65, 0x65, 0x38, 0x30, - 0x32, 0x2e, 0x31, 0x31, 0x61, 0x79, 0x52, 0x0c, 0x69, 0x65, 0x65, 0x65, 0x38, 0x30, 0x32, 0x2e, - 0x31, 0x35, 0x2e, 0x31, 0x52, 0x0e, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x2d, 0x77, 0x69, 0x72, 0x65, - 0x6c, 0x65, 0x73, 0x73, 0x52, 0x03, 0x67, 0x73, 0x6d, 0x52, 0x04, 0x63, 0x64, 0x6d, 0x61, 0x52, - 0x03, 0x6c, 0x74, 0x65, 0x52, 0x09, 0x73, 0x6f, 0x6e, 0x65, 0x74, 0x2d, 0x6f, 0x63, 0x33, 0x52, - 0x0a, 0x73, 0x6f, 0x6e, 0x65, 0x74, 0x2d, 0x6f, 0x63, 0x31, 0x32, 0x52, 0x0a, 0x73, 0x6f, 0x6e, - 0x65, 0x74, 0x2d, 0x6f, 0x63, 0x34, 0x38, 0x52, 0x0b, 0x73, 0x6f, 0x6e, 0x65, 0x74, 0x2d, 0x6f, - 0x63, 0x31, 0x39, 0x32, 0x52, 0x0b, 0x73, 0x6f, 0x6e, 0x65, 0x74, 0x2d, 0x6f, 0x63, 0x37, 0x36, - 0x38, 0x52, 0x0c, 0x73, 0x6f, 0x6e, 0x65, 0x74, 0x2d, 0x6f, 0x63, 0x31, 0x39, 0x32, 0x30, 0x52, - 0x0c, 0x73, 0x6f, 0x6e, 0x65, 0x74, 0x2d, 0x6f, 0x63, 0x33, 0x38, 0x34, 0x30, 0x52, 0x08, 0x31, - 0x67, 0x66, 0x63, 0x2d, 0x73, 0x66, 0x70, 0x52, 0x08, 0x32, 0x67, 0x66, 0x63, 0x2d, 0x73, 0x66, - 0x70, 0x52, 0x08, 0x34, 0x67, 0x66, 0x63, 0x2d, 0x73, 0x66, 0x70, 0x52, 0x09, 0x38, 0x67, 0x66, - 0x63, 0x2d, 0x73, 0x66, 0x70, 0x70, 0x52, 0x0a, 0x31, 0x36, 0x67, 0x66, 0x63, 0x2d, 0x73, 0x66, - 0x70, 0x70, 0x52, 0x0b, 0x33, 0x32, 0x67, 0x66, 0x63, 0x2d, 0x73, 0x66, 0x70, 0x32, 0x38, 0x52, - 0x0b, 0x36, 0x34, 0x67, 0x66, 0x63, 0x2d, 0x71, 0x73, 0x66, 0x70, 0x70, 0x52, 0x0d, 0x31, 0x32, - 0x38, 0x67, 0x66, 0x63, 0x2d, 0x71, 0x73, 0x66, 0x70, 0x32, 0x38, 0x52, 0x0e, 0x69, 0x6e, 0x66, - 0x69, 0x6e, 0x69, 0x62, 0x61, 0x6e, 0x64, 0x2d, 0x73, 0x64, 0x72, 0x52, 0x0e, 0x69, 0x6e, 0x66, - 0x69, 0x6e, 0x69, 0x62, 0x61, 0x6e, 0x64, 0x2d, 0x64, 0x64, 0x72, 0x52, 0x0e, 0x69, 0x6e, 0x66, - 0x69, 0x6e, 0x69, 0x62, 0x61, 0x6e, 0x64, 0x2d, 0x71, 0x64, 0x72, 0x52, 0x10, 0x69, 0x6e, 0x66, - 0x69, 0x6e, 0x69, 0x62, 0x61, 0x6e, 0x64, 0x2d, 0x66, 0x64, 0x72, 0x31, 0x30, 0x52, 0x0e, 0x69, - 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x62, 0x61, 0x6e, 0x64, 0x2d, 0x66, 0x64, 0x72, 0x52, 0x0e, 0x69, - 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x62, 0x61, 0x6e, 0x64, 0x2d, 0x65, 0x64, 0x72, 0x52, 0x0e, 0x69, - 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x62, 0x61, 0x6e, 0x64, 0x2d, 0x68, 0x64, 0x72, 0x52, 0x0e, 0x69, - 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x62, 0x61, 0x6e, 0x64, 0x2d, 0x6e, 0x64, 0x72, 0x52, 0x0e, 0x69, - 0x6e, 0x66, 0x69, 0x6e, 0x69, 0x62, 0x61, 0x6e, 0x64, 0x2d, 0x78, 0x64, 0x72, 0x52, 0x02, 0x74, - 0x31, 0x52, 0x02, 0x65, 0x31, 0x52, 0x02, 0x74, 0x33, 0x52, 0x02, 0x65, 0x33, 0x52, 0x04, 0x78, - 0x64, 0x73, 0x6c, 0x52, 0x06, 0x64, 0x6f, 0x63, 0x73, 0x69, 0x73, 0x52, 0x04, 0x67, 0x70, 0x6f, - 0x6e, 0x52, 0x06, 0x78, 0x67, 0x2d, 0x70, 0x6f, 0x6e, 0x52, 0x07, 0x78, 0x67, 0x73, 0x2d, 0x70, - 0x6f, 0x6e, 0x52, 0x07, 0x6e, 0x67, 0x2d, 0x70, 0x6f, 0x6e, 0x32, 0x52, 0x04, 0x65, 0x70, 0x6f, - 0x6e, 0x52, 0x08, 0x31, 0x30, 0x67, 0x2d, 0x65, 0x70, 0x6f, 0x6e, 0x52, 0x0f, 0x63, 0x69, 0x73, - 0x63, 0x6f, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x77, 0x69, 0x73, 0x65, 0x52, 0x14, 0x63, 0x69, - 0x73, 0x63, 0x6f, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x77, 0x69, 0x73, 0x65, 0x2d, 0x70, 0x6c, - 0x75, 0x73, 0x52, 0x0f, 0x63, 0x69, 0x73, 0x63, 0x6f, 0x2d, 0x66, 0x6c, 0x65, 0x78, 0x73, 0x74, - 0x61, 0x63, 0x6b, 0x52, 0x14, 0x63, 0x69, 0x73, 0x63, 0x6f, 0x2d, 0x66, 0x6c, 0x65, 0x78, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x2d, 0x70, 0x6c, 0x75, 0x73, 0x52, 0x12, 0x63, 0x69, 0x73, 0x63, 0x6f, - 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x77, 0x69, 0x73, 0x65, 0x2d, 0x38, 0x30, 0x52, 0x13, 0x63, - 0x69, 0x73, 0x63, 0x6f, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x77, 0x69, 0x73, 0x65, 0x2d, 0x31, - 0x36, 0x30, 0x52, 0x13, 0x63, 0x69, 0x73, 0x63, 0x6f, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x77, - 0x69, 0x73, 0x65, 0x2d, 0x33, 0x32, 0x30, 0x52, 0x13, 0x63, 0x69, 0x73, 0x63, 0x6f, 0x2d, 0x73, - 0x74, 0x61, 0x63, 0x6b, 0x77, 0x69, 0x73, 0x65, 0x2d, 0x34, 0x38, 0x30, 0x52, 0x12, 0x63, 0x69, - 0x73, 0x63, 0x6f, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x77, 0x69, 0x73, 0x65, 0x2d, 0x31, 0x74, - 0x52, 0x0b, 0x6a, 0x75, 0x6e, 0x69, 0x70, 0x65, 0x72, 0x2d, 0x76, 0x63, 0x70, 0x52, 0x13, 0x65, - 0x78, 0x74, 0x72, 0x65, 0x6d, 0x65, 0x2d, 0x73, 0x75, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x74, 0x61, - 0x63, 0x6b, 0x52, 0x17, 0x65, 0x78, 0x74, 0x72, 0x65, 0x6d, 0x65, 0x2d, 0x73, 0x75, 0x6d, 0x6d, - 0x69, 0x74, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2d, 0x31, 0x32, 0x38, 0x52, 0x17, 0x65, 0x78, 0x74, - 0x72, 0x65, 0x6d, 0x65, 0x2d, 0x73, 0x75, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x2d, 0x32, 0x35, 0x36, 0x52, 0x17, 0x65, 0x78, 0x74, 0x72, 0x65, 0x6d, 0x65, 0x2d, 0x73, 0x75, - 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2d, 0x35, 0x31, 0x32, 0x52, 0x05, 0x6f, - 0x74, 0x68, 0x65, 0x72, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x03, 0x6d, 0x74, 0x75, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x05, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x1a, 0x06, 0x18, 0x80, 0x80, 0x04, 0x28, 0x01, 0x52, 0x03, - 0x6d, 0x74, 0x75, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x63, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x67, 0x6d, 0x74, 0x5f, 0x6f, 0x6e, 0x6c, - 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x6d, 0x67, 0x6d, 0x74, 0x4f, 0x6e, 0x6c, - 0x79, 0x42, 0x3b, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x6e, 0x65, 0x74, 0x62, 0x6f, 0x78, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x64, 0x69, 0x6f, 0x64, 0x65, - 0x2f, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2d, 0x73, 0x64, 0x6b, 0x2d, 0x67, 0x6f, 0x2f, 0x64, 0x69, - 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_diode_v1_interface_proto_rawDescOnce sync.Once - file_diode_v1_interface_proto_rawDescData = file_diode_v1_interface_proto_rawDesc -) - -func file_diode_v1_interface_proto_rawDescGZIP() []byte { - file_diode_v1_interface_proto_rawDescOnce.Do(func() { - file_diode_v1_interface_proto_rawDescData = protoimpl.X.CompressGZIP(file_diode_v1_interface_proto_rawDescData) - }) - return file_diode_v1_interface_proto_rawDescData -} - -var file_diode_v1_interface_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_diode_v1_interface_proto_goTypes = []interface{}{ - (*Interface)(nil), // 0: diode.v1.Interface - (*anypb.Any)(nil), // 1: google.protobuf.Any -} -var file_diode_v1_interface_proto_depIdxs = []int32{ - 1, // 0: diode.v1.Interface.device:type_name -> google.protobuf.Any - 1, // [1:1] is the sub-list for method output_type - 1, // [1:1] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name -} - -func init() { file_diode_v1_interface_proto_init() } -func file_diode_v1_interface_proto_init() { - if File_diode_v1_interface_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_diode_v1_interface_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Interface); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_diode_v1_interface_proto_rawDesc, - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_diode_v1_interface_proto_goTypes, - DependencyIndexes: file_diode_v1_interface_proto_depIdxs, - MessageInfos: file_diode_v1_interface_proto_msgTypes, - }.Build() - File_diode_v1_interface_proto = out.File - file_diode_v1_interface_proto_rawDesc = nil - file_diode_v1_interface_proto_goTypes = nil - file_diode_v1_interface_proto_depIdxs = nil -} diff --git a/diode-sdk-go/diode/v1/diodepb/interface.pb.validate.go b/diode-sdk-go/diode/v1/diodepb/interface.pb.validate.go deleted file mode 100644 index 6e95115d..00000000 --- a/diode-sdk-go/diode/v1/diodepb/interface.pb.validate.go +++ /dev/null @@ -1,307 +0,0 @@ -// Code generated by protoc-gen-validate. DO NOT EDIT. -// source: diode/v1/interface.proto - -package diodepb - -import ( - "bytes" - "errors" - "fmt" - "net" - "net/mail" - "net/url" - "regexp" - "sort" - "strings" - "time" - "unicode/utf8" - - "google.golang.org/protobuf/types/known/anypb" -) - -// ensure the imports are used -var ( - _ = bytes.MinRead - _ = errors.New("") - _ = fmt.Print - _ = utf8.UTFMax - _ = (*regexp.Regexp)(nil) - _ = (*strings.Reader)(nil) - _ = net.IPv4len - _ = time.Duration(0) - _ = (*url.URL)(nil) - _ = (*mail.Address)(nil) - _ = anypb.Any{} - _ = sort.Sort -) - -// Validate checks the field values on Interface with the rules defined in the -// proto definition for this message. If any rules are violated, the first -// error encountered is returned, or nil if there are no violations. -func (m *Interface) Validate() error { - return m.validate(false) -} - -// ValidateAll checks the field values on Interface with the rules defined in -// the proto definition for this message. If any rules are violated, the -// result is a list of violation errors wrapped in InterfaceMultiError, or nil -// if none found. -func (m *Interface) ValidateAll() error { - return m.validate(true) -} - -func (m *Interface) validate(all bool) error { - if m == nil { - return nil - } - - var errors []error - - if m.GetDevice() == nil { - err := InterfaceValidationError{ - field: "Device", - reason: "value is required", - } - if !all { - return err - } - errors = append(errors, err) - } - - if a := m.GetDevice(); a != nil { - - } - - if l := utf8.RuneCountInString(m.GetName()); l < 1 || l > 64 { - err := InterfaceValidationError{ - field: "Name", - reason: "value length must be between 1 and 64 runes, inclusive", - } - if !all { - return err - } - errors = append(errors, err) - } - - if _, ok := _Interface_Type_InLookup[m.GetType()]; !ok { - err := InterfaceValidationError{ - field: "Type", - reason: "value must be in list [virtual bridge lag 100base-fx 100base-lfx 100base-tx 100base-t1 1000base-t 1000base-x-gbic 1000base-x-sfp 2.5gbase-t 5gbase-t 10gbase-t 10gbase-cx4 10gbase-x-sfpp 10gbase-x-xfp 10gbase-x-xenpak 10gbase-x-x2 25gbase-x-sfp28 50gbase-x-sfp56 40gbase-x-qsfpp 50gbase-x-sfp28 100gbase-x-cfp 100gbase-x-cfp2 100gbase-x-cfp4 100gbase-x-cxp 100gbase-x-cpak 100gbase-x-dsfp 100gbase-x-sfpdd 100gbase-x-qsfp28 100gbase-x-qsfpdd 200gbase-x-cfp2 200gbase-x-qsfp56 200gbase-x-qsfpdd 400gbase-x-cfp2 400gbase-x-qsfp112 400gbase-x-qsfpdd 400gbase-x-osfp 400gbase-x-osfp-rhs 400gbase-x-cdfp 400gbase-x-cfp8 800gbase-x-qsfpdd 800gbase-x-osfp 1000base-kx 10gbase-kr 10gbase-kx4 25gbase-kr 40gbase-kr4 50gbase-kr 100gbase-kp4 100gbase-kr2 100gbase-kr4 ieee802.11a ieee802.11g ieee802.11n ieee802.11ac ieee802.11ad ieee802.11ax ieee802.11ay ieee802.15.1 other-wireless gsm cdma lte sonet-oc3 sonet-oc12 sonet-oc48 sonet-oc192 sonet-oc768 sonet-oc1920 sonet-oc3840 1gfc-sfp 2gfc-sfp 4gfc-sfp 8gfc-sfpp 16gfc-sfpp 32gfc-sfp28 64gfc-qsfpp 128gfc-qsfp28 infiniband-sdr infiniband-ddr infiniband-qdr infiniband-fdr10 infiniband-fdr infiniband-edr infiniband-hdr infiniband-ndr infiniband-xdr t1 e1 t3 e3 xdsl docsis gpon xg-pon xgs-pon ng-pon2 epon 10g-epon cisco-stackwise cisco-stackwise-plus cisco-flexstack cisco-flexstack-plus cisco-stackwise-80 cisco-stackwise-160 cisco-stackwise-320 cisco-stackwise-480 cisco-stackwise-1t juniper-vcp extreme-summitstack extreme-summitstack-128 extreme-summitstack-256 extreme-summitstack-512 other]", - } - if !all { - return err - } - errors = append(errors, err) - } - - // no validation rules for Enabled - - if val := m.GetMtu(); val < 1 || val > 65536 { - err := InterfaceValidationError{ - field: "Mtu", - reason: "value must be inside range [1, 65536]", - } - if !all { - return err - } - errors = append(errors, err) - } - - // no validation rules for MacAddress - - // no validation rules for MgmtOnly - - if len(errors) > 0 { - return InterfaceMultiError(errors) - } - - return nil -} - -// InterfaceMultiError is an error wrapping multiple validation errors returned -// by Interface.ValidateAll() if the designated constraints aren't met. -type InterfaceMultiError []error - -// Error returns a concatenation of all the error messages it wraps. -func (m InterfaceMultiError) Error() string { - var msgs []string - for _, err := range m { - msgs = append(msgs, err.Error()) - } - return strings.Join(msgs, "; ") -} - -// AllErrors returns a list of validation violation errors. -func (m InterfaceMultiError) AllErrors() []error { return m } - -// InterfaceValidationError is the validation error returned by -// Interface.Validate if the designated constraints aren't met. -type InterfaceValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e InterfaceValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e InterfaceValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e InterfaceValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e InterfaceValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e InterfaceValidationError) ErrorName() string { return "InterfaceValidationError" } - -// Error satisfies the builtin error interface -func (e InterfaceValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sInterface.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = InterfaceValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = InterfaceValidationError{} - -var _Interface_Type_InLookup = map[string]struct{}{ - "virtual": {}, - "bridge": {}, - "lag": {}, - "100base-fx": {}, - "100base-lfx": {}, - "100base-tx": {}, - "100base-t1": {}, - "1000base-t": {}, - "1000base-x-gbic": {}, - "1000base-x-sfp": {}, - "2.5gbase-t": {}, - "5gbase-t": {}, - "10gbase-t": {}, - "10gbase-cx4": {}, - "10gbase-x-sfpp": {}, - "10gbase-x-xfp": {}, - "10gbase-x-xenpak": {}, - "10gbase-x-x2": {}, - "25gbase-x-sfp28": {}, - "50gbase-x-sfp56": {}, - "40gbase-x-qsfpp": {}, - "50gbase-x-sfp28": {}, - "100gbase-x-cfp": {}, - "100gbase-x-cfp2": {}, - "100gbase-x-cfp4": {}, - "100gbase-x-cxp": {}, - "100gbase-x-cpak": {}, - "100gbase-x-dsfp": {}, - "100gbase-x-sfpdd": {}, - "100gbase-x-qsfp28": {}, - "100gbase-x-qsfpdd": {}, - "200gbase-x-cfp2": {}, - "200gbase-x-qsfp56": {}, - "200gbase-x-qsfpdd": {}, - "400gbase-x-cfp2": {}, - "400gbase-x-qsfp112": {}, - "400gbase-x-qsfpdd": {}, - "400gbase-x-osfp": {}, - "400gbase-x-osfp-rhs": {}, - "400gbase-x-cdfp": {}, - "400gbase-x-cfp8": {}, - "800gbase-x-qsfpdd": {}, - "800gbase-x-osfp": {}, - "1000base-kx": {}, - "10gbase-kr": {}, - "10gbase-kx4": {}, - "25gbase-kr": {}, - "40gbase-kr4": {}, - "50gbase-kr": {}, - "100gbase-kp4": {}, - "100gbase-kr2": {}, - "100gbase-kr4": {}, - "ieee802.11a": {}, - "ieee802.11g": {}, - "ieee802.11n": {}, - "ieee802.11ac": {}, - "ieee802.11ad": {}, - "ieee802.11ax": {}, - "ieee802.11ay": {}, - "ieee802.15.1": {}, - "other-wireless": {}, - "gsm": {}, - "cdma": {}, - "lte": {}, - "sonet-oc3": {}, - "sonet-oc12": {}, - "sonet-oc48": {}, - "sonet-oc192": {}, - "sonet-oc768": {}, - "sonet-oc1920": {}, - "sonet-oc3840": {}, - "1gfc-sfp": {}, - "2gfc-sfp": {}, - "4gfc-sfp": {}, - "8gfc-sfpp": {}, - "16gfc-sfpp": {}, - "32gfc-sfp28": {}, - "64gfc-qsfpp": {}, - "128gfc-qsfp28": {}, - "infiniband-sdr": {}, - "infiniband-ddr": {}, - "infiniband-qdr": {}, - "infiniband-fdr10": {}, - "infiniband-fdr": {}, - "infiniband-edr": {}, - "infiniband-hdr": {}, - "infiniband-ndr": {}, - "infiniband-xdr": {}, - "t1": {}, - "e1": {}, - "t3": {}, - "e3": {}, - "xdsl": {}, - "docsis": {}, - "gpon": {}, - "xg-pon": {}, - "xgs-pon": {}, - "ng-pon2": {}, - "epon": {}, - "10g-epon": {}, - "cisco-stackwise": {}, - "cisco-stackwise-plus": {}, - "cisco-flexstack": {}, - "cisco-flexstack-plus": {}, - "cisco-stackwise-80": {}, - "cisco-stackwise-160": {}, - "cisco-stackwise-320": {}, - "cisco-stackwise-480": {}, - "cisco-stackwise-1t": {}, - "juniper-vcp": {}, - "extreme-summitstack": {}, - "extreme-summitstack-128": {}, - "extreme-summitstack-256": {}, - "extreme-summitstack-512": {}, - "other": {}, -} diff --git a/diode-sdk-go/diode/v1/diodepb/manufacturer.pb.go b/diode-sdk-go/diode/v1/diodepb/manufacturer.pb.go deleted file mode 100644 index 93ff0e2d..00000000 --- a/diode-sdk-go/diode/v1/diodepb/manufacturer.pb.go +++ /dev/null @@ -1,161 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.32.0 -// protoc (unknown) -// source: diode/v1/manufacturer.proto - -package diodepb - -import ( - _ "github.com/envoyproxy/protoc-gen-validate/validate" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// A manufacturer -type Manufacturer struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Slug string `protobuf:"bytes,2,opt,name=slug,proto3" json:"slug,omitempty"` -} - -func (x *Manufacturer) Reset() { - *x = Manufacturer{} - if protoimpl.UnsafeEnabled { - mi := &file_diode_v1_manufacturer_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Manufacturer) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Manufacturer) ProtoMessage() {} - -func (x *Manufacturer) ProtoReflect() protoreflect.Message { - mi := &file_diode_v1_manufacturer_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Manufacturer.ProtoReflect.Descriptor instead. -func (*Manufacturer) Descriptor() ([]byte, []int) { - return file_diode_v1_manufacturer_proto_rawDescGZIP(), []int{0} -} - -func (x *Manufacturer) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Manufacturer) GetSlug() string { - if x != nil { - return x.Slug - } - return "" -} - -var File_diode_v1_manufacturer_proto protoreflect.FileDescriptor - -var file_diode_v1_manufacturer_proto_rawDesc = []byte{ - 0x0a, 0x1b, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x75, 0x66, - 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x64, - 0x69, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x22, 0x5e, 0x0a, 0x0c, 0x4d, 0x61, 0x6e, 0x75, 0x66, 0x61, 0x63, 0x74, 0x75, 0x72, 0x65, 0x72, - 0x12, 0x1d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, - 0xfa, 0x42, 0x06, 0x72, 0x04, 0x10, 0x01, 0x18, 0x64, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x2f, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1b, 0xfa, - 0x42, 0x18, 0x72, 0x16, 0x10, 0x01, 0x18, 0x64, 0x32, 0x10, 0x5e, 0x5b, 0x2d, 0x61, 0x2d, 0x7a, - 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, - 0x42, 0x3b, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, - 0x65, 0x74, 0x62, 0x6f, 0x78, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, - 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2d, 0x73, 0x64, 0x6b, 0x2d, 0x67, 0x6f, 0x2f, 0x64, 0x69, 0x6f, - 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x70, 0x62, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_diode_v1_manufacturer_proto_rawDescOnce sync.Once - file_diode_v1_manufacturer_proto_rawDescData = file_diode_v1_manufacturer_proto_rawDesc -) - -func file_diode_v1_manufacturer_proto_rawDescGZIP() []byte { - file_diode_v1_manufacturer_proto_rawDescOnce.Do(func() { - file_diode_v1_manufacturer_proto_rawDescData = protoimpl.X.CompressGZIP(file_diode_v1_manufacturer_proto_rawDescData) - }) - return file_diode_v1_manufacturer_proto_rawDescData -} - -var file_diode_v1_manufacturer_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_diode_v1_manufacturer_proto_goTypes = []interface{}{ - (*Manufacturer)(nil), // 0: diode.v1.Manufacturer -} -var file_diode_v1_manufacturer_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_diode_v1_manufacturer_proto_init() } -func file_diode_v1_manufacturer_proto_init() { - if File_diode_v1_manufacturer_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_diode_v1_manufacturer_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Manufacturer); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_diode_v1_manufacturer_proto_rawDesc, - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_diode_v1_manufacturer_proto_goTypes, - DependencyIndexes: file_diode_v1_manufacturer_proto_depIdxs, - MessageInfos: file_diode_v1_manufacturer_proto_msgTypes, - }.Build() - File_diode_v1_manufacturer_proto = out.File - file_diode_v1_manufacturer_proto_rawDesc = nil - file_diode_v1_manufacturer_proto_goTypes = nil - file_diode_v1_manufacturer_proto_depIdxs = nil -} diff --git a/diode-sdk-go/diode/v1/diodepb/manufacturer.pb.validate.go b/diode-sdk-go/diode/v1/diodepb/manufacturer.pb.validate.go deleted file mode 100644 index 0a6b50c3..00000000 --- a/diode-sdk-go/diode/v1/diodepb/manufacturer.pb.validate.go +++ /dev/null @@ -1,170 +0,0 @@ -// Code generated by protoc-gen-validate. DO NOT EDIT. -// source: diode/v1/manufacturer.proto - -package diodepb - -import ( - "bytes" - "errors" - "fmt" - "net" - "net/mail" - "net/url" - "regexp" - "sort" - "strings" - "time" - "unicode/utf8" - - "google.golang.org/protobuf/types/known/anypb" -) - -// ensure the imports are used -var ( - _ = bytes.MinRead - _ = errors.New("") - _ = fmt.Print - _ = utf8.UTFMax - _ = (*regexp.Regexp)(nil) - _ = (*strings.Reader)(nil) - _ = net.IPv4len - _ = time.Duration(0) - _ = (*url.URL)(nil) - _ = (*mail.Address)(nil) - _ = anypb.Any{} - _ = sort.Sort -) - -// Validate checks the field values on Manufacturer with the rules defined in -// the proto definition for this message. If any rules are violated, the first -// error encountered is returned, or nil if there are no violations. -func (m *Manufacturer) Validate() error { - return m.validate(false) -} - -// ValidateAll checks the field values on Manufacturer with the rules defined -// in the proto definition for this message. If any rules are violated, the -// result is a list of violation errors wrapped in ManufacturerMultiError, or -// nil if none found. -func (m *Manufacturer) ValidateAll() error { - return m.validate(true) -} - -func (m *Manufacturer) validate(all bool) error { - if m == nil { - return nil - } - - var errors []error - - if l := utf8.RuneCountInString(m.GetName()); l < 1 || l > 100 { - err := ManufacturerValidationError{ - field: "Name", - reason: "value length must be between 1 and 100 runes, inclusive", - } - if !all { - return err - } - errors = append(errors, err) - } - - if l := utf8.RuneCountInString(m.GetSlug()); l < 1 || l > 100 { - err := ManufacturerValidationError{ - field: "Slug", - reason: "value length must be between 1 and 100 runes, inclusive", - } - if !all { - return err - } - errors = append(errors, err) - } - - if !_Manufacturer_Slug_Pattern.MatchString(m.GetSlug()) { - err := ManufacturerValidationError{ - field: "Slug", - reason: "value does not match regex pattern \"^[-a-zA-Z0-9_]+$\"", - } - if !all { - return err - } - errors = append(errors, err) - } - - if len(errors) > 0 { - return ManufacturerMultiError(errors) - } - - return nil -} - -// ManufacturerMultiError is an error wrapping multiple validation errors -// returned by Manufacturer.ValidateAll() if the designated constraints aren't met. -type ManufacturerMultiError []error - -// Error returns a concatenation of all the error messages it wraps. -func (m ManufacturerMultiError) Error() string { - var msgs []string - for _, err := range m { - msgs = append(msgs, err.Error()) - } - return strings.Join(msgs, "; ") -} - -// AllErrors returns a list of validation violation errors. -func (m ManufacturerMultiError) AllErrors() []error { return m } - -// ManufacturerValidationError is the validation error returned by -// Manufacturer.Validate if the designated constraints aren't met. -type ManufacturerValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e ManufacturerValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e ManufacturerValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e ManufacturerValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e ManufacturerValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e ManufacturerValidationError) ErrorName() string { return "ManufacturerValidationError" } - -// Error satisfies the builtin error interface -func (e ManufacturerValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sManufacturer.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = ManufacturerValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = ManufacturerValidationError{} - -var _Manufacturer_Slug_Pattern = regexp.MustCompile("^[-a-zA-Z0-9_]+$") diff --git a/diode-sdk-go/diode/v1/diodepb/platform.pb.go b/diode-sdk-go/diode/v1/diodepb/platform.pb.go deleted file mode 100644 index 3b2df861..00000000 --- a/diode-sdk-go/diode/v1/diodepb/platform.pb.go +++ /dev/null @@ -1,159 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.32.0 -// protoc (unknown) -// source: diode/v1/platform.proto - -package diodepb - -import ( - _ "github.com/envoyproxy/protoc-gen-validate/validate" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// A platform -type Platform struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Slug string `protobuf:"bytes,2,opt,name=slug,proto3" json:"slug,omitempty"` -} - -func (x *Platform) Reset() { - *x = Platform{} - if protoimpl.UnsafeEnabled { - mi := &file_diode_v1_platform_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Platform) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Platform) ProtoMessage() {} - -func (x *Platform) ProtoReflect() protoreflect.Message { - mi := &file_diode_v1_platform_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Platform.ProtoReflect.Descriptor instead. -func (*Platform) Descriptor() ([]byte, []int) { - return file_diode_v1_platform_proto_rawDescGZIP(), []int{0} -} - -func (x *Platform) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Platform) GetSlug() string { - if x != nil { - return x.Slug - } - return "" -} - -var File_diode_v1_platform_proto protoreflect.FileDescriptor - -var file_diode_v1_platform_proto_rawDesc = []byte{ - 0x0a, 0x17, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6c, 0x61, 0x74, 0x66, - 0x6f, 0x72, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x64, 0x69, 0x6f, 0x64, 0x65, - 0x2e, 0x76, 0x31, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x48, 0x0a, 0x08, - 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x1d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x72, 0x04, 0x10, 0x01, 0x18, - 0x64, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x72, 0x04, 0x10, 0x01, 0x18, 0x64, - 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x42, 0x3b, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x65, 0x74, 0x62, 0x6f, 0x78, 0x6c, 0x61, 0x62, 0x73, 0x2f, - 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2d, 0x73, 0x64, 0x6b, 0x2d, - 0x67, 0x6f, 0x2f, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x69, 0x6f, 0x64, - 0x65, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_diode_v1_platform_proto_rawDescOnce sync.Once - file_diode_v1_platform_proto_rawDescData = file_diode_v1_platform_proto_rawDesc -) - -func file_diode_v1_platform_proto_rawDescGZIP() []byte { - file_diode_v1_platform_proto_rawDescOnce.Do(func() { - file_diode_v1_platform_proto_rawDescData = protoimpl.X.CompressGZIP(file_diode_v1_platform_proto_rawDescData) - }) - return file_diode_v1_platform_proto_rawDescData -} - -var file_diode_v1_platform_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_diode_v1_platform_proto_goTypes = []interface{}{ - (*Platform)(nil), // 0: diode.v1.Platform -} -var file_diode_v1_platform_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_diode_v1_platform_proto_init() } -func file_diode_v1_platform_proto_init() { - if File_diode_v1_platform_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_diode_v1_platform_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Platform); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_diode_v1_platform_proto_rawDesc, - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_diode_v1_platform_proto_goTypes, - DependencyIndexes: file_diode_v1_platform_proto_depIdxs, - MessageInfos: file_diode_v1_platform_proto_msgTypes, - }.Build() - File_diode_v1_platform_proto = out.File - file_diode_v1_platform_proto_rawDesc = nil - file_diode_v1_platform_proto_goTypes = nil - file_diode_v1_platform_proto_depIdxs = nil -} diff --git a/diode-sdk-go/diode/v1/diodepb/platform.pb.validate.go b/diode-sdk-go/diode/v1/diodepb/platform.pb.validate.go deleted file mode 100644 index 74126190..00000000 --- a/diode-sdk-go/diode/v1/diodepb/platform.pb.validate.go +++ /dev/null @@ -1,157 +0,0 @@ -// Code generated by protoc-gen-validate. DO NOT EDIT. -// source: diode/v1/platform.proto - -package diodepb - -import ( - "bytes" - "errors" - "fmt" - "net" - "net/mail" - "net/url" - "regexp" - "sort" - "strings" - "time" - "unicode/utf8" - - "google.golang.org/protobuf/types/known/anypb" -) - -// ensure the imports are used -var ( - _ = bytes.MinRead - _ = errors.New("") - _ = fmt.Print - _ = utf8.UTFMax - _ = (*regexp.Regexp)(nil) - _ = (*strings.Reader)(nil) - _ = net.IPv4len - _ = time.Duration(0) - _ = (*url.URL)(nil) - _ = (*mail.Address)(nil) - _ = anypb.Any{} - _ = sort.Sort -) - -// Validate checks the field values on Platform with the rules defined in the -// proto definition for this message. If any rules are violated, the first -// error encountered is returned, or nil if there are no violations. -func (m *Platform) Validate() error { - return m.validate(false) -} - -// ValidateAll checks the field values on Platform with the rules defined in -// the proto definition for this message. If any rules are violated, the -// result is a list of violation errors wrapped in PlatformMultiError, or nil -// if none found. -func (m *Platform) ValidateAll() error { - return m.validate(true) -} - -func (m *Platform) validate(all bool) error { - if m == nil { - return nil - } - - var errors []error - - if l := utf8.RuneCountInString(m.GetName()); l < 1 || l > 100 { - err := PlatformValidationError{ - field: "Name", - reason: "value length must be between 1 and 100 runes, inclusive", - } - if !all { - return err - } - errors = append(errors, err) - } - - if l := utf8.RuneCountInString(m.GetSlug()); l < 1 || l > 100 { - err := PlatformValidationError{ - field: "Slug", - reason: "value length must be between 1 and 100 runes, inclusive", - } - if !all { - return err - } - errors = append(errors, err) - } - - if len(errors) > 0 { - return PlatformMultiError(errors) - } - - return nil -} - -// PlatformMultiError is an error wrapping multiple validation errors returned -// by Platform.ValidateAll() if the designated constraints aren't met. -type PlatformMultiError []error - -// Error returns a concatenation of all the error messages it wraps. -func (m PlatformMultiError) Error() string { - var msgs []string - for _, err := range m { - msgs = append(msgs, err.Error()) - } - return strings.Join(msgs, "; ") -} - -// AllErrors returns a list of validation violation errors. -func (m PlatformMultiError) AllErrors() []error { return m } - -// PlatformValidationError is the validation error returned by -// Platform.Validate if the designated constraints aren't met. -type PlatformValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e PlatformValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e PlatformValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e PlatformValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e PlatformValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e PlatformValidationError) ErrorName() string { return "PlatformValidationError" } - -// Error satisfies the builtin error interface -func (e PlatformValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sPlatform.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = PlatformValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = PlatformValidationError{} diff --git a/diode-sdk-go/diode/v1/diodepb/site.pb.go b/diode-sdk-go/diode/v1/diodepb/site.pb.go deleted file mode 100644 index 944c171a..00000000 --- a/diode-sdk-go/diode/v1/diodepb/site.pb.go +++ /dev/null @@ -1,160 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.32.0 -// protoc (unknown) -// source: diode/v1/site.proto - -package diodepb - -import ( - _ "github.com/envoyproxy/protoc-gen-validate/validate" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// A site -type Site struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Slug string `protobuf:"bytes,2,opt,name=slug,proto3" json:"slug,omitempty"` -} - -func (x *Site) Reset() { - *x = Site{} - if protoimpl.UnsafeEnabled { - mi := &file_diode_v1_site_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Site) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Site) ProtoMessage() {} - -func (x *Site) ProtoReflect() protoreflect.Message { - mi := &file_diode_v1_site_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Site.ProtoReflect.Descriptor instead. -func (*Site) Descriptor() ([]byte, []int) { - return file_diode_v1_site_proto_rawDescGZIP(), []int{0} -} - -func (x *Site) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Site) GetSlug() string { - if x != nil { - return x.Slug - } - return "" -} - -var File_diode_v1_site_proto protoreflect.FileDescriptor - -var file_diode_v1_site_proto_rawDesc = []byte{ - 0x0a, 0x13, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x69, 0x74, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x1a, - 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x56, 0x0a, 0x04, 0x53, 0x69, 0x74, 0x65, - 0x12, 0x1d, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x09, - 0xfa, 0x42, 0x06, 0x72, 0x04, 0x10, 0x01, 0x18, 0x64, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x2f, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1b, 0xfa, - 0x42, 0x18, 0x72, 0x16, 0x10, 0x01, 0x18, 0x64, 0x32, 0x10, 0x5e, 0x5b, 0x2d, 0x61, 0x2d, 0x7a, - 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5f, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, - 0x42, 0x3b, 0x5a, 0x39, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, - 0x65, 0x74, 0x62, 0x6f, 0x78, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, - 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2d, 0x73, 0x64, 0x6b, 0x2d, 0x67, 0x6f, 0x2f, 0x64, 0x69, 0x6f, - 0x64, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x70, 0x62, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_diode_v1_site_proto_rawDescOnce sync.Once - file_diode_v1_site_proto_rawDescData = file_diode_v1_site_proto_rawDesc -) - -func file_diode_v1_site_proto_rawDescGZIP() []byte { - file_diode_v1_site_proto_rawDescOnce.Do(func() { - file_diode_v1_site_proto_rawDescData = protoimpl.X.CompressGZIP(file_diode_v1_site_proto_rawDescData) - }) - return file_diode_v1_site_proto_rawDescData -} - -var file_diode_v1_site_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_diode_v1_site_proto_goTypes = []interface{}{ - (*Site)(nil), // 0: diode.v1.Site -} -var file_diode_v1_site_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_diode_v1_site_proto_init() } -func file_diode_v1_site_proto_init() { - if File_diode_v1_site_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_diode_v1_site_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Site); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_diode_v1_site_proto_rawDesc, - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_diode_v1_site_proto_goTypes, - DependencyIndexes: file_diode_v1_site_proto_depIdxs, - MessageInfos: file_diode_v1_site_proto_msgTypes, - }.Build() - File_diode_v1_site_proto = out.File - file_diode_v1_site_proto_rawDesc = nil - file_diode_v1_site_proto_goTypes = nil - file_diode_v1_site_proto_depIdxs = nil -} diff --git a/diode-sdk-go/diode/v1/diodepb/site.pb.validate.go b/diode-sdk-go/diode/v1/diodepb/site.pb.validate.go deleted file mode 100644 index 7ff6ca1e..00000000 --- a/diode-sdk-go/diode/v1/diodepb/site.pb.validate.go +++ /dev/null @@ -1,169 +0,0 @@ -// Code generated by protoc-gen-validate. DO NOT EDIT. -// source: diode/v1/site.proto - -package diodepb - -import ( - "bytes" - "errors" - "fmt" - "net" - "net/mail" - "net/url" - "regexp" - "sort" - "strings" - "time" - "unicode/utf8" - - "google.golang.org/protobuf/types/known/anypb" -) - -// ensure the imports are used -var ( - _ = bytes.MinRead - _ = errors.New("") - _ = fmt.Print - _ = utf8.UTFMax - _ = (*regexp.Regexp)(nil) - _ = (*strings.Reader)(nil) - _ = net.IPv4len - _ = time.Duration(0) - _ = (*url.URL)(nil) - _ = (*mail.Address)(nil) - _ = anypb.Any{} - _ = sort.Sort -) - -// Validate checks the field values on Site with the rules defined in the proto -// definition for this message. If any rules are violated, the first error -// encountered is returned, or nil if there are no violations. -func (m *Site) Validate() error { - return m.validate(false) -} - -// ValidateAll checks the field values on Site with the rules defined in the -// proto definition for this message. If any rules are violated, the result is -// a list of violation errors wrapped in SiteMultiError, or nil if none found. -func (m *Site) ValidateAll() error { - return m.validate(true) -} - -func (m *Site) validate(all bool) error { - if m == nil { - return nil - } - - var errors []error - - if l := utf8.RuneCountInString(m.GetName()); l < 1 || l > 100 { - err := SiteValidationError{ - field: "Name", - reason: "value length must be between 1 and 100 runes, inclusive", - } - if !all { - return err - } - errors = append(errors, err) - } - - if l := utf8.RuneCountInString(m.GetSlug()); l < 1 || l > 100 { - err := SiteValidationError{ - field: "Slug", - reason: "value length must be between 1 and 100 runes, inclusive", - } - if !all { - return err - } - errors = append(errors, err) - } - - if !_Site_Slug_Pattern.MatchString(m.GetSlug()) { - err := SiteValidationError{ - field: "Slug", - reason: "value does not match regex pattern \"^[-a-zA-Z0-9_]+$\"", - } - if !all { - return err - } - errors = append(errors, err) - } - - if len(errors) > 0 { - return SiteMultiError(errors) - } - - return nil -} - -// SiteMultiError is an error wrapping multiple validation errors returned by -// Site.ValidateAll() if the designated constraints aren't met. -type SiteMultiError []error - -// Error returns a concatenation of all the error messages it wraps. -func (m SiteMultiError) Error() string { - var msgs []string - for _, err := range m { - msgs = append(msgs, err.Error()) - } - return strings.Join(msgs, "; ") -} - -// AllErrors returns a list of validation violation errors. -func (m SiteMultiError) AllErrors() []error { return m } - -// SiteValidationError is the validation error returned by Site.Validate if the -// designated constraints aren't met. -type SiteValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e SiteValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e SiteValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e SiteValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e SiteValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e SiteValidationError) ErrorName() string { return "SiteValidationError" } - -// Error satisfies the builtin error interface -func (e SiteValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sSite.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = SiteValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = SiteValidationError{} - -var _Site_Slug_Pattern = regexp.MustCompile("^[-a-zA-Z0-9_]+$") diff --git a/diode-sdk-go/go.mod b/diode-sdk-go/go.mod deleted file mode 100644 index fa890626..00000000 --- a/diode-sdk-go/go.mod +++ /dev/null @@ -1,21 +0,0 @@ -module github.com/netboxlabs/diode/diode-sdk-go - -go 1.21 - -require ( - github.com/envoyproxy/protoc-gen-validate v1.0.4 - github.com/stretchr/testify v1.8.4 - google.golang.org/grpc v1.61.0 - google.golang.org/protobuf v1.32.0 -) - -require ( - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/net v0.20.0 // indirect - golang.org/x/sys v0.16.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect -) diff --git a/diode-sdk-go/go.sum b/diode-sdk-go/go.sum deleted file mode 100644 index e7ac6282..00000000 --- a/diode-sdk-go/go.sum +++ /dev/null @@ -1,33 +0,0 @@ -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/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= -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/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -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/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= -google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= -google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= -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.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/diode-sdk-go/package-lock.json b/diode-sdk-go/package-lock.json deleted file mode 100644 index 5212c5b8..00000000 --- a/diode-sdk-go/package-lock.json +++ /dev/null @@ -1,6902 +0,0 @@ -{ - "name": "diode-sdk-go", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "diode-sdk-go", - "version": "0.1.0", - "devDependencies": { - "@semantic-release/changelog": "^6.0.3", - "semantic-release-export-data": "^1.0.1", - "semantic-release-monorepo": "^7.0.0" - } - }, - "node_modules/@actions/core": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.1.tgz", - "integrity": "sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==", - "dev": true, - "dependencies": { - "@actions/http-client": "^2.0.1", - "uuid": "^8.3.2" - } - }, - "node_modules/@actions/http-client": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.0.tgz", - "integrity": "sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==", - "dev": true, - "dependencies": { - "tunnel": "^0.0.6", - "undici": "^5.25.4" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "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/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/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/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "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/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/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", - "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", - "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/endpoint": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", - "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/graphql": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", - "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "18.1.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", - "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", - "dev": true, - "peer": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", - "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/tsconfig": "^1.0.2", - "@octokit/types": "^9.2.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=4" - } - }, - "node_modules/@octokit/plugin-retry": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-4.1.6.tgz", - "integrity": "sha512-obkYzIgEC75r8+9Pnfiiqy3y/x1bc3QLE5B7qvv9wi9Kj0R5tGQFC6QMBg1154WQ9lAVypuQDGyp3hNpp15gQQ==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-throttling": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-5.2.3.tgz", - "integrity": "sha512-C9CFg9mrf6cugneKiaI841iG8DOv6P5XXkjmiNNut+swePxQ7RWEdAZRp5rJoE1hjsIqiYcKa/ZkOQ+ujPI39Q==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": "^4.0.0" - } - }, - "node_modules/@octokit/request": { - "version": "6.2.8", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", - "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/tsconfig": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", - "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", - "dev": true, - "peer": true - }, - "node_modules/@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true, - "peer": true - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", - "dev": true, - "peer": true, - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@semantic-release/changelog": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.3.tgz", - "integrity": "sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==", - "dev": true, - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "fs-extra": "^11.0.0", - "lodash": "^4.17.4" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0" - } - }, - "node_modules/@semantic-release/commit-analyzer": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", - "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", - "dev": true, - "peer": true, - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", - "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", - "dev": true, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@semantic-release/github": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.1.0.tgz", - "integrity": "sha512-erR9E5rpdsz0dW1I7785JtndQuMWN/iDcemcptf67tBNOmBUN0b2YNOgcjYUnBpgRpZ5ozfBHrK7Bz+2ets/Dg==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/core": "^4.2.1", - "@octokit/plugin-paginate-rest": "^6.1.2", - "@octokit/plugin-retry": "^4.1.3", - "@octokit/plugin-throttling": "^5.2.3", - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^11.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^3.0.0", - "p-filter": "^2.0.0", - "url-join": "^4.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/npm": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-9.0.2.tgz", - "integrity": "sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==", - "dev": true, - "peer": true, - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "execa": "^5.0.0", - "fs-extra": "^11.0.0", - "lodash": "^4.17.15", - "nerf-dart": "^1.0.0", - "normalize-url": "^6.0.0", - "npm": "^8.3.0", - "rc": "^1.2.8", - "read-pkg": "^5.0.0", - "registry-auth-token": "^5.0.0", - "semver": "^7.1.2", - "tempy": "^1.0.0" - }, - "engines": { - "node": ">=16 || ^14.17" - }, - "peerDependencies": { - "semantic-release": ">=19.0.0" - } - }, - "node_modules/@semantic-release/release-notes-generator": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", - "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", - "dev": true, - "peer": true, - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "get-stream": "^6.0.0", - "import-from": "^4.0.0", - "into-stream": "^6.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true, - "peer": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true, - "peer": true - }, - "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "peer": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", - "dev": true, - "peer": true, - "dependencies": { - "type-fest": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "dev": true, - "peer": true - }, - "node_modules/argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", - "dev": true - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true, - "peer": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true, - "peer": true - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "dev": true, - "peer": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "peer": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "dev": true, - "peer": true, - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, - "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "peer": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "peer": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "peer": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "peer": true, - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dev": true, - "peer": true, - "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/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, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "peer": true, - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "peer": true, - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "peer": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true, - "peer": true, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "peer": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dev": true, - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true, - "peer": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "peer": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "peer": true - }, - "node_modules/env-ci": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz", - "integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==", - "dev": true, - "peer": true, - "dependencies": { - "execa": "^5.0.0", - "fromentries": "^1.3.2", - "java-properties": "^1.0.0" - }, - "engines": { - "node": ">=10.17" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "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/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, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "peer": 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/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "peer": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/file-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/file-url/-/file-url-3.0.0.tgz", - "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-versions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", - "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", - "dev": true, - "peer": true, - "dependencies": { - "semver-regex": "^3.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "peer": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "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/git-log-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", - "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", - "dev": true, - "dependencies": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - } - }, - "node_modules/git-log-parser/node_modules/split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", - "dev": true, - "dependencies": { - "through2": "~2.0.0" - } - }, - "node_modules/git-log-parser/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.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/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "peer": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hook-std": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", - "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dev": true, - "peer": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", - "dev": true, - "peer": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "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, - "peer": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "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-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "peer": true - }, - "node_modules/into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", - "dev": true, - "peer": true, - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "peer": true, - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", - "dev": true, - "peer": true, - "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - }, - "engines": { - "node": ">=10.13" - } - }, - "node_modules/java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "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/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "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-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "peer": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "peer": true - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "peer": true, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.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/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "peer": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "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, - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "dev": true, - "peer": true - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true, - "peer": true - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true, - "peer": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "peer": true - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true, - "peer": true - }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", - "dev": true, - "peer": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, - "peer": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/marked-terminal": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.2.0.tgz", - "integrity": "sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-escapes": "^6.2.0", - "cardinal": "^2.1.1", - "chalk": "^5.2.0", - "cli-table3": "^0.6.3", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.3.0" - }, - "engines": { - "node": ">=14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "peer": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "peer": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "peer": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.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==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "peer": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "peer": true - }, - "node_modules/nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", - "dev": true, - "peer": true - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "peer": true, - "dependencies": { - "lodash": "^4.17.21" - } - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "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==", - "dev": true, - "peer": true, - "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/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm": { - "version": "8.19.4", - "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.4.tgz", - "integrity": "sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/ci-detect", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/run-script", - "abbrev", - "archy", - "cacache", - "chalk", - "chownr", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "mkdirp", - "mkdirp-infer-owner", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "opener", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "read-package-json", - "read-package-json-fast", - "readdir-scoped-modules", - "rimraf", - "semver", - "ssri", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dev": true, - "peer": true, - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/config": "^4.2.1", - "@npmcli/fs": "^2.1.0", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/package-json": "^2.0.0", - "@npmcli/run-script": "^4.2.1", - "abbrev": "~1.1.1", - "archy": "~1.0.0", - "cacache": "^16.1.3", - "chalk": "^4.1.2", - "chownr": "^2.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.2", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.12", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "graceful-fs": "^4.2.10", - "hosted-git-info": "^5.2.1", - "ini": "^3.0.1", - "init-package-json": "^3.0.2", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^2.3.1", - "libnpmaccess": "^6.0.4", - "libnpmdiff": "^4.0.5", - "libnpmexec": "^4.0.14", - "libnpmfund": "^3.0.5", - "libnpmhook": "^8.0.4", - "libnpmorg": "^4.0.4", - "libnpmpack": "^4.1.3", - "libnpmpublish": "^6.0.5", - "libnpmsearch": "^5.0.4", - "libnpmteam": "^4.0.4", - "libnpmversion": "^3.0.7", - "make-fetch-happen": "^10.2.0", - "minimatch": "^5.1.0", - "minipass": "^3.1.6", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "ms": "^2.1.2", - "node-gyp": "^9.1.0", - "nopt": "^6.0.0", - "npm-audit-report": "^3.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.1.0", - "npm-pick-manifest": "^7.0.2", - "npm-profile": "^6.2.0", - "npm-registry-fetch": "^13.3.1", - "npm-user-validate": "^1.0.1", - "npmlog": "^6.0.2", - "opener": "^1.5.2", - "p-map": "^4.0.0", - "pacote": "^13.6.2", - "parse-conflict-json": "^2.0.2", - "proc-log": "^2.0.1", - "qrcode-terminal": "^0.12.0", - "read": "~1.0.7", - "read-package-json": "^5.0.2", - "read-package-json-fast": "^2.0.3", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.1", - "tar": "^6.1.11", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^2.0.0", - "validate-npm-package-name": "^4.0.0", - "which": "^2.0.2", - "write-file-atomic": "^4.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.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, - "peer": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "5.6.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/metavuln-calculator": "^3.0.1", - "@npmcli/move-file": "^2.0.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/package-json": "^2.0.0", - "@npmcli/query": "^1.2.0", - "@npmcli/run-script": "^4.1.3", - "bin-links": "^3.0.3", - "cacache": "^16.1.3", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^5.2.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "minimatch": "^5.1.0", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.0.0", - "npm-pick-manifest": "^7.0.2", - "npm-registry-fetch": "^13.0.0", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.0", - "treeverse": "^2.0.0", - "walk-up-path": "^1.0.0" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/ci-detect": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "4.2.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/map-workspaces": "^2.0.2", - "ini": "^3.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "proc-log": "^2.0.0", - "read-package-json-fast": "^2.0.3", - "semver": "^7.3.5", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "2.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^8.0.1", - "minimatch": "^5.0.1", - "read-package-json-fast": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "cacache": "^16.0.0", - "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "infer-owner": "^1.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "1.2.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-package-arg": "^9.1.0", - "postcss-selector-parser": "^6.0.10", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "4.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@tootallnate/once": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/agent-base": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/npm/node_modules/agentkeepalive": { - "version": "4.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/asap": { - "version": "2.0.6", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/bin-links": { - "version": "3.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "cmd-shim": "^5.0.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0", - "read-cmd-shim": "^3.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/builtins": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "16.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "ip-regex": "^4.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "mkdirp-infer-owner": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/debuglog": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/depd": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/dezalgo": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/diff": { - "version": "5.1.0", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.12", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/gauge": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "8.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "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/npm/node_modules/graceful-fs": { - "version": "4.2.10", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/has": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/npm/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "5.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minimatch": "^5.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/ini": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-package-arg": "^9.0.1", - "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/ip": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "cidr-regex": "^3.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.10.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/just-diff": { - "version": "5.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.4.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "6.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "4.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/disparity-colors": "^2.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^5.0.1", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1", - "tar": "^6.1.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "4.0.14", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/fs": "^2.1.1", - "@npmcli/run-script": "^4.2.0", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^9.0.1", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "proc-log": "^2.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", - "semver": "^7.3.7", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "3.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/arborist": "^5.6.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "8.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "4.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/run-script": "^4.1.3", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "6.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "normalize-package-data": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0", - "semver": "^7.3.7", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "5.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "3.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/run-script": "^4.1.3", - "json-parse-even-better-errors": "^2.3.1", - "proc-log": "^2.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "7.13.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "10.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "5.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/minipass": { - "version": "3.3.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "2.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/mkdirp-infer-owner": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "0.0.8", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "9.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.22 || ^14.13 || >=16" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "4.0.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-normalize-package-bin": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "9.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "5.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "7.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^2.0.0", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "6.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "13.3.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true - }, - "node_modules/npm/node_modules/npmlog": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/once": { - "version": "1.4.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/opener": { - "version": "1.5.2", - "dev": true, - "inBundle": true, - "license": "(WTFPL OR MIT)", - "peer": true, - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/pacote": { - "version": "13.6.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.1", - "just-diff": "^5.0.1", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.10", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/proc-log": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "0.3.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "read": "1" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "peer": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/read": { - "version": "1.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json": { - "version": "5.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/readable-stream": { - "version": "3.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/readdir-scoped-modules": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.3.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.7.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "dev": true, - "inBundle": true, - "license": "CC-BY-3.0", - "peer": true - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.11", - "dev": true, - "inBundle": true, - "license": "CC0-1.0", - "peer": true - }, - "node_modules/npm/node_modules/ssri": { - "version": "9.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "6.1.11", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/treeverse": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/unique-filename": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/npm/node_modules/which": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "peer": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "peer": true, - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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, - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "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/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", - "dev": true, - "peer": true, - "dependencies": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "peer": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==", - "dev": true, - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true, - "peer": true - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ramda": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", - "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==", - "dev": true - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "peer": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "peer": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/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==", - "dev": true - }, - "node_modules/read-pkg/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==", - "dev": true, - "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-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "peer": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "dev": true, - "peer": true, - "dependencies": { - "esprima": "~4.0.0" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dev": true, - "peer": true, - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/semantic-release": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-19.0.5.tgz", - "integrity": "sha512-NMPKdfpXTnPn49FDogMBi36SiBfXkSOJqCkk0E4iWOY1tusvvgBwqUmxTX1kmlT6kIYed9YwNKD1sfPpqa5yaA==", - "dev": true, - "peer": true, - "dependencies": { - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/error": "^3.0.0", - "@semantic-release/github": "^8.0.0", - "@semantic-release/npm": "^9.0.0", - "@semantic-release/release-notes-generator": "^10.0.0", - "aggregate-error": "^3.0.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.0.0", - "env-ci": "^5.0.0", - "execa": "^5.0.0", - "figures": "^3.0.0", - "find-versions": "^4.0.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^2.0.0", - "hosted-git-info": "^4.0.0", - "lodash": "^4.17.21", - "marked": "^4.0.10", - "marked-terminal": "^5.0.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "p-reduce": "^2.0.0", - "read-pkg-up": "^7.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^3.1.1", - "signale": "^1.2.1", - "yargs": "^16.2.0" - }, - "bin": { - "semantic-release": "bin/semantic-release.js" - }, - "engines": { - "node": ">=16 || ^14.17" - } - }, - "node_modules/semantic-release-export-data": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semantic-release-export-data/-/semantic-release-export-data-1.0.1.tgz", - "integrity": "sha512-6vlgrrzzcMi/REhQd65Bh4dfSKmgwXOJ/Q2RVlT9WsU4Ya1T2qGpkSrMfG/n6oFRrqBdbDlyZgxNd94ziW+vSg==", - "dev": true, - "dependencies": { - "@actions/core": "^1.10.0" - }, - "peerDependencies": { - "semantic-release": ">=18" - } - }, - "node_modules/semantic-release-monorepo": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/semantic-release-monorepo/-/semantic-release-monorepo-7.0.8.tgz", - "integrity": "sha512-L2n7FZEYvjxXop6C7svk8xZH1/2N58CV1dN+veeAGZ8363FG+AKNKLN1r4wAL86e5xIu1HiOOASm10X+rN6XWg==", - "dev": true, - "dependencies": { - "debug": "^3.1.0", - "execa": "^0.8.0", - "file-url": "^3.0.0", - "fs-extra": "^10.0.1", - "get-stream": "^6.0.1", - "git-log-parser": "^1.2.0", - "p-each-series": "^2.1.0", - "p-limit": "^1.2.0", - "pkg-up": "^2.0.0", - "ramda": "^0.25.0", - "read-pkg": "^5.0.0", - "semantic-release-plugin-decorators": "^3.0.0", - "tempy": "1.0.1" - }, - "peerDependencies": { - "semantic-release": ">=15.11.x < 20" - } - }, - "node_modules/semantic-release-monorepo/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/semantic-release-monorepo/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/semantic-release-monorepo/node_modules/execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==", - "dev": true, - "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/execa/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/semantic-release-monorepo/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/semantic-release-monorepo/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/semantic-release-monorepo/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/semantic-release-monorepo/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/semantic-release-monorepo/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/semantic-release-monorepo/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - }, - "node_modules/semantic-release-plugin-decorators": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/semantic-release-plugin-decorators/-/semantic-release-plugin-decorators-3.0.3.tgz", - "integrity": "sha512-YTB2z64yyqEzABJ3yFesV9s5izZ4oKdbYDTu/2whVdlGQYCwsWkw9XYRCnvXzPdWPSWYmCPdJwMJ5w433rncig==", - "dev": true, - "peerDependencies": { - "semantic-release": ">=11 < 20" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "peer": true, - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/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, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-regex": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", - "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "peer": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/signale/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, - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/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, - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/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, - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/signale/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, - "peer": true - }, - "node_modules/signale/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "peer": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/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, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/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, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "peer": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "peer": true, - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/split2/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==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "dev": true, - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "peer": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", - "dev": true, - "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "peer": true - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "peer": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/through2/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==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "peer": true - }, - "node_modules/traverse": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", - "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, - "node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undici": { - "version": "5.28.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", - "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", - "dev": true, - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true, - "peer": true - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true, - "peer": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "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==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "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==", - "dev": true, - "peer": true - }, - "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==", - "dev": true, - "peer": true, - "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==", - "dev": true, - "peer": true, - "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==", - "dev": true, - "peer": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "peer": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - } - } -} diff --git a/diode-sdk-go/package.json b/diode-sdk-go/package.json deleted file mode 100644 index c60165a9..00000000 --- a/diode-sdk-go/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "diode-sdk-go", - "version": "0.1.0", - "extends": "semantic-release-monorepo", - "devDependencies": { - "semantic-release-monorepo": "^7.0.0", - "semantic-release-export-data": "^1.0.1", - "@semantic-release/changelog": "^6.0.3" - } -} diff --git a/diode-sdk-python/.releaserc.json b/diode-sdk-python/.releaserc.json deleted file mode 100644 index 747384ae..00000000 --- a/diode-sdk-python/.releaserc.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "branches": "release", - "repositoryUrl": "https://github.com/netboxlabs/diode", - "debug": "true", - "extends": "semantic-release-monorepo", - "tagFormat": "diode-sdk-python/v${version}", - "plugins": [ - ["semantic-release-export-data"], - ["@semantic-release/commit-analyzer", { - "releaseRules": [ - { "message": "*", "release": "patch"}, - { "message": "fix*", "release": "patch" }, - { "message": "feat*", "release": "minor" }, - { "message": "perf*", "release": "major" } - ] - }], - "@semantic-release/release-notes-generator", - [ - "@semantic-release/changelog", - { - "changelogFile": "CHANGELOG.md", - "changelogTitle": "# Semantic Versioning Changelog" - } - ], - [ - "@semantic-release/github", - { - "assets": [ - { - "path": "release/**" - } - ] - } - ] - ] -} diff --git a/diode-sdk-python/LICENSE.txt b/diode-sdk-python/LICENSE.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/diode-sdk-python/README.md b/diode-sdk-python/README.md deleted file mode 100644 index 6c9c62f8..00000000 --- a/diode-sdk-python/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Diode SDK Python - -## Installation - -```bash -pip install netboxlabs-diode-sdk -``` - -## Development notes - -```python -ruff netboxlabs/ -black netboxlabs/ -``` diff --git a/diode-sdk-python/diode-sdk-python.iml b/diode-sdk-python/diode-sdk-python.iml deleted file mode 100644 index 7adbd525..00000000 --- a/diode-sdk-python/diode-sdk-python.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/diode-sdk-python/diode/v1/device_pb2.py b/diode-sdk-python/diode/v1/device_pb2.py deleted file mode 100644 index 09d13f62..00000000 --- a/diode-sdk-python/diode/v1/device_pb2.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: diode/v1/device.proto -# Protobuf Python Version: 4.25.1 -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder - -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x15\x64iode/v1/device.proto\x12\x08\x64iode.v1\x1a\x19google/protobuf/any.proto\x1a\x17validate/validate.proto\"\xfb\x02\n\x06\x44\x65vice\x12\x1b\n\x04name\x18\x01 \x01(\tB\x07\xfa\x42\x04r\x02\x18@R\x04name\x12+\n\x0b\x64\x65vice_fqdn\x18\x02 \x01(\tB\n\xfa\x42\x07r\x05\x10\x01\x18\xff\x01R\ndeviceFqdn\x12?\n\x0b\x64\x65vice_type\x18\x03 \x01(\x0b\x32\x14.google.protobuf.AnyB\x08\xfa\x42\x05\xa2\x01\x02\x08\x01R\ndeviceType\x12\x32\n\x04role\x18\x04 \x01(\x0b\x32\x14.google.protobuf.AnyB\x08\xfa\x42\x05\xa2\x01\x02\x08\x01R\x04role\x12\x30\n\x08platform\x18\x05 \x01(\x0b\x32\x14.google.protobuf.AnyR\x08platform\x12\x1f\n\x06serial\x18\x06 \x01(\tB\x07\xfa\x42\x04r\x02\x18\x32R\x06serial\x12\x32\n\x04site\x18\x07 \x01(\x0b\x32\x14.google.protobuf.AnyB\x08\xfa\x42\x05\xa2\x01\x02\x08\x01R\x04site\x12+\n\x0bvc_position\x18\x08 \x01(\x05\x42\n\xfa\x42\x07\x1a\x05\x18\xff\x01(\x00R\nvcPositionB;Z9github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepbb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'diode.v1.device_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - _globals['DESCRIPTOR']._options = None - _globals['DESCRIPTOR']._serialized_options = b'Z9github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb' - _globals['_DEVICE'].fields_by_name['name']._options = None - _globals['_DEVICE'].fields_by_name['name']._serialized_options = b'\372B\004r\002\030@' - _globals['_DEVICE'].fields_by_name['device_fqdn']._options = None - _globals['_DEVICE'].fields_by_name['device_fqdn']._serialized_options = b'\372B\007r\005\020\001\030\377\001' - _globals['_DEVICE'].fields_by_name['device_type']._options = None - _globals['_DEVICE'].fields_by_name['device_type']._serialized_options = b'\372B\005\242\001\002\010\001' - _globals['_DEVICE'].fields_by_name['role']._options = None - _globals['_DEVICE'].fields_by_name['role']._serialized_options = b'\372B\005\242\001\002\010\001' - _globals['_DEVICE'].fields_by_name['serial']._options = None - _globals['_DEVICE'].fields_by_name['serial']._serialized_options = b'\372B\004r\002\0302' - _globals['_DEVICE'].fields_by_name['site']._options = None - _globals['_DEVICE'].fields_by_name['site']._serialized_options = b'\372B\005\242\001\002\010\001' - _globals['_DEVICE'].fields_by_name['vc_position']._options = None - _globals['_DEVICE'].fields_by_name['vc_position']._serialized_options = b'\372B\007\032\005\030\377\001(\000' - _globals['_DEVICE']._serialized_start = 88 - _globals['_DEVICE']._serialized_end = 467 -# @@protoc_insertion_point(module_scope) diff --git a/diode-sdk-python/diode/v1/device_pb2_grpc.py b/diode-sdk-python/diode/v1/device_pb2_grpc.py deleted file mode 100644 index 2dd5fd3f..00000000 --- a/diode-sdk-python/diode/v1/device_pb2_grpc.py +++ /dev/null @@ -1,2 +0,0 @@ -# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! -"""Client and server classes corresponding to protobuf-defined services.""" diff --git a/diode-sdk-python/diode/v1/device_role_pb2.py b/diode-sdk-python/diode/v1/device_role_pb2.py deleted file mode 100644 index a4923b27..00000000 --- a/diode-sdk-python/diode/v1/device_role_pb2.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: diode/v1/device_role.proto -# Protobuf Python Version: 4.25.1 -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder - -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x1a\x64iode/v1/device_role.proto\x12\x08\x64iode.v1\x1a\x17validate/validate.proto\"u\n\nDeviceRole\x12\x1d\n\x04name\x18\x01 \x01(\tB\t\xfa\x42\x06r\x04\x10\x01\x18\x64R\x04name\x12/\n\x04slug\x18\x02 \x01(\tB\x1b\xfa\x42\x18r\x16\x10\x01\x18\x64\x32\x10^[-a-zA-Z0-9_]+$R\x04slug\x12\x17\n\x07vm_role\x18\x03 \x01(\x08R\x06vmRoleB;Z9github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepbb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'diode.v1.device_role_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - _globals['DESCRIPTOR']._options = None - _globals['DESCRIPTOR']._serialized_options = b'Z9github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb' - _globals['_DEVICEROLE'].fields_by_name['name']._options = None - _globals['_DEVICEROLE'].fields_by_name['name']._serialized_options = b'\372B\006r\004\020\001\030d' - _globals['_DEVICEROLE'].fields_by_name['slug']._options = None - _globals['_DEVICEROLE'].fields_by_name[ - 'slug']._serialized_options = b'\372B\030r\026\020\001\030d2\020^[-a-zA-Z0-9_]+$' - _globals['_DEVICEROLE']._serialized_start = 65 - _globals['_DEVICEROLE']._serialized_end = 182 -# @@protoc_insertion_point(module_scope) diff --git a/diode-sdk-python/diode/v1/device_role_pb2_grpc.py b/diode-sdk-python/diode/v1/device_role_pb2_grpc.py deleted file mode 100644 index 2dd5fd3f..00000000 --- a/diode-sdk-python/diode/v1/device_role_pb2_grpc.py +++ /dev/null @@ -1,2 +0,0 @@ -# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! -"""Client and server classes corresponding to protobuf-defined services.""" diff --git a/diode-sdk-python/diode/v1/device_type_pb2.py b/diode-sdk-python/diode/v1/device_type_pb2.py deleted file mode 100644 index eadd4de6..00000000 --- a/diode-sdk-python/diode/v1/device_type_pb2.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: diode/v1/device_type.proto -# Protobuf Python Version: 4.25.1 -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder - -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x1a\x64iode/v1/device_type.proto\x12\x08\x64iode.v1\x1a\x19google/protobuf/any.proto\x1a\x17validate/validate.proto\"\xa2\x01\n\nDeviceType\x12\x42\n\x0cmanufacturer\x18\x01 \x01(\x0b\x32\x14.google.protobuf.AnyB\x08\xfa\x42\x05\xa2\x01\x02\x08\x01R\x0cmanufacturer\x12\x1f\n\x05model\x18\x02 \x01(\tB\t\xfa\x42\x06r\x04\x10\x01\x18\x64R\x05model\x12/\n\x04slug\x18\x03 \x01(\tB\x1b\xfa\x42\x18r\x16\x10\x01\x18\x64\x32\x10^[-a-zA-Z0-9_]+$R\x04slugB;Z9github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepbb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'diode.v1.device_type_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - _globals['DESCRIPTOR']._options = None - _globals['DESCRIPTOR']._serialized_options = b'Z9github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb' - _globals['_DEVICETYPE'].fields_by_name['manufacturer']._options = None - _globals['_DEVICETYPE'].fields_by_name['manufacturer']._serialized_options = b'\372B\005\242\001\002\010\001' - _globals['_DEVICETYPE'].fields_by_name['model']._options = None - _globals['_DEVICETYPE'].fields_by_name['model']._serialized_options = b'\372B\006r\004\020\001\030d' - _globals['_DEVICETYPE'].fields_by_name['slug']._options = None - _globals['_DEVICETYPE'].fields_by_name[ - 'slug']._serialized_options = b'\372B\030r\026\020\001\030d2\020^[-a-zA-Z0-9_]+$' - _globals['_DEVICETYPE']._serialized_start = 93 - _globals['_DEVICETYPE']._serialized_end = 255 -# @@protoc_insertion_point(module_scope) diff --git a/diode-sdk-python/diode/v1/device_type_pb2_grpc.py b/diode-sdk-python/diode/v1/device_type_pb2_grpc.py deleted file mode 100644 index 2dd5fd3f..00000000 --- a/diode-sdk-python/diode/v1/device_type_pb2_grpc.py +++ /dev/null @@ -1,2 +0,0 @@ -# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! -"""Client and server classes corresponding to protobuf-defined services.""" diff --git a/diode-sdk-python/diode/v1/distributor_pb2.py b/diode-sdk-python/diode/v1/distributor_pb2.py deleted file mode 100644 index 2f524bd7..00000000 --- a/diode-sdk-python/diode/v1/distributor_pb2.py +++ /dev/null @@ -1,51 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: diode/v1/distributor.proto -# Protobuf Python Version: 4.25.1 -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder - -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x1a\x64iode/v1/distributor.proto\x12\x08\x64iode.v1\x1a\x15\x64iode/v1/device.proto\x1a\x1a\x64iode/v1/device_role.proto\x1a\x1a\x64iode/v1/device_type.proto\x1a\x18\x64iode/v1/interface.proto\x1a\x1b\x64iode/v1/manufacturer.proto\x1a\x17\x64iode/v1/platform.proto\x1a\x13\x64iode/v1/site.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x17validate/validate.proto\"\xc5\x03\n\x0cIngestEntity\x12$\n\x04site\x18\x01 \x01(\x0b\x32\x0e.diode.v1.SiteH\x00R\x04site\x12\x30\n\x08platform\x18\x02 \x01(\x0b\x32\x12.diode.v1.PlatformH\x00R\x08platform\x12<\n\x0cmanufacturer\x18\x03 \x01(\x0b\x32\x16.diode.v1.ManufacturerH\x00R\x0cmanufacturer\x12*\n\x06\x64\x65vice\x18\x04 \x01(\x0b\x32\x10.diode.v1.DeviceH\x00R\x06\x64\x65vice\x12\x37\n\x0b\x64\x65vice_role\x18\x05 \x01(\x0b\x32\x14.diode.v1.DeviceRoleH\x00R\ndeviceRole\x12\x37\n\x0b\x64\x65vice_type\x18\x06 \x01(\x0b\x32\x14.diode.v1.DeviceTypeH\x00R\ndeviceType\x12\x33\n\tinterface\x18\x07 \x01(\x0b\x32\x13.diode.v1.InterfaceH\x00R\tinterface\x12\x44\n\ttimestamp\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\n\xfa\x42\x07\xb2\x01\x04\x08\x01\x38\x01R\ttimestampB\x06\n\x04\x64\x61ta\"\xe0\x02\n\x0bPushRequest\x12\"\n\x06stream\x18\x01 \x01(\tB\n\xfa\x42\x07r\x05\x10\x01\x18\xff\x01R\x06stream\x12\x37\n\x04\x64\x61ta\x18\x02 \x03(\x0b\x32\x16.diode.v1.IngestEntityB\x0b\xfa\x42\x08\x92\x01\x05\x08\x01\x10\xe8\x07R\x04\x64\x61ta\x12\x18\n\x02id\x18\x03 \x01(\tB\x08\xfa\x42\x05r\x03\xb0\x01\x01R\x02id\x12\x36\n\x11producer_app_name\x18\x04 \x01(\tB\n\xfa\x42\x07r\x05\x10\x01\x18\xff\x01R\x0fproducerAppName\x12<\n\x14producer_app_version\x18\x05 \x01(\tB\n\xfa\x42\x07r\x05\x10\x01\x18\xff\x01R\x12producerAppVersion\x12%\n\x08sdk_name\x18\x06 \x01(\tB\n\xfa\x42\x07r\x05\x10\x01\x18\xff\x01R\x07sdkName\x12=\n\x0bsdk_version\x18\x07 \x01(\tB\x1c\xfa\x42\x19r\x17\x32\x15^(\\d)+\\.(\\d)+\\.(\\d)+$R\nsdkVersion\"&\n\x0cPushResponse\x12\x16\n\x06\x65rrors\x18\x01 \x03(\tR\x06\x65rrors2M\n\x12\x44istributorService\x12\x37\n\x04Push\x12\x15.diode.v1.PushRequest\x1a\x16.diode.v1.PushResponse\"\x00\x42;Z9github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepbb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'diode.v1.distributor_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - _globals['DESCRIPTOR']._options = None - _globals['DESCRIPTOR']._serialized_options = b'Z9github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb' - _globals['_INGESTENTITY'].fields_by_name['timestamp']._options = None - _globals['_INGESTENTITY'].fields_by_name['timestamp']._serialized_options = b'\372B\007\262\001\004\010\0018\001' - _globals['_PUSHREQUEST'].fields_by_name['stream']._options = None - _globals['_PUSHREQUEST'].fields_by_name['stream']._serialized_options = b'\372B\007r\005\020\001\030\377\001' - _globals['_PUSHREQUEST'].fields_by_name['data']._options = None - _globals['_PUSHREQUEST'].fields_by_name['data']._serialized_options = b'\372B\010\222\001\005\010\001\020\350\007' - _globals['_PUSHREQUEST'].fields_by_name['id']._options = None - _globals['_PUSHREQUEST'].fields_by_name['id']._serialized_options = b'\372B\005r\003\260\001\001' - _globals['_PUSHREQUEST'].fields_by_name['producer_app_name']._options = None - _globals['_PUSHREQUEST'].fields_by_name[ - 'producer_app_name']._serialized_options = b'\372B\007r\005\020\001\030\377\001' - _globals['_PUSHREQUEST'].fields_by_name['producer_app_version']._options = None - _globals['_PUSHREQUEST'].fields_by_name[ - 'producer_app_version']._serialized_options = b'\372B\007r\005\020\001\030\377\001' - _globals['_PUSHREQUEST'].fields_by_name['sdk_name']._options = None - _globals['_PUSHREQUEST'].fields_by_name['sdk_name']._serialized_options = b'\372B\007r\005\020\001\030\377\001' - _globals['_PUSHREQUEST'].fields_by_name['sdk_version']._options = None - _globals['_PUSHREQUEST'].fields_by_name[ - 'sdk_version']._serialized_options = b'\372B\031r\0272\025^(\\d)+\\.(\\d)+\\.(\\d)+$' - _globals['_INGESTENTITY']._serialized_start = 279 - _globals['_INGESTENTITY']._serialized_end = 732 - _globals['_PUSHREQUEST']._serialized_start = 735 - _globals['_PUSHREQUEST']._serialized_end = 1087 - _globals['_PUSHRESPONSE']._serialized_start = 1089 - _globals['_PUSHRESPONSE']._serialized_end = 1127 - _globals['_DISTRIBUTORSERVICE']._serialized_start = 1129 - _globals['_DISTRIBUTORSERVICE']._serialized_end = 1206 -# @@protoc_insertion_point(module_scope) diff --git a/diode-sdk-python/diode/v1/distributor_pb2_grpc.py b/diode-sdk-python/diode/v1/distributor_pb2_grpc.py deleted file mode 100644 index 1adcf0d0..00000000 --- a/diode-sdk-python/diode/v1/distributor_pb2_grpc.py +++ /dev/null @@ -1,70 +0,0 @@ -# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! -"""Client and server classes corresponding to protobuf-defined services.""" -import grpc - -from diode.v1 import distributor_pb2 as diode_dot_v1_dot_distributor__pb2 - - -class DistributorServiceStub(object): - """Distributor API - """ - - def __init__(self, channel): - """Constructor. - - Args: - channel: A grpc.Channel. - """ - self.Push = channel.unary_unary( - '/diode.v1.DistributorService/Push', - request_serializer=diode_dot_v1_dot_distributor__pb2.PushRequest.SerializeToString, - response_deserializer=diode_dot_v1_dot_distributor__pb2.PushResponse.FromString, - ) - - -class DistributorServiceServicer(object): - """Distributor API - """ - - def Push(self, request, context): - """Ingests data into the system - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - - -def add_DistributorServiceServicer_to_server(servicer, server): - rpc_method_handlers = { - 'Push': grpc.unary_unary_rpc_method_handler( - servicer.Push, - request_deserializer=diode_dot_v1_dot_distributor__pb2.PushRequest.FromString, - response_serializer=diode_dot_v1_dot_distributor__pb2.PushResponse.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler( - 'diode.v1.DistributorService', rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) - - -# This class is part of an EXPERIMENTAL API. -class DistributorService(object): - """Distributor API - """ - - @staticmethod - def Push(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/diode.v1.DistributorService/Push', - diode_dot_v1_dot_distributor__pb2.PushRequest.SerializeToString, - diode_dot_v1_dot_distributor__pb2.PushResponse.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/diode-sdk-python/diode/v1/interface_pb2.py b/diode-sdk-python/diode/v1/interface_pb2.py deleted file mode 100644 index bff672cd..00000000 --- a/diode-sdk-python/diode/v1/interface_pb2.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: diode/v1/interface.proto -# Protobuf Python Version: 4.25.1 -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder - -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x18\x64iode/v1/interface.proto\x12\x08\x64iode.v1\x1a\x19google/protobuf/any.proto\x1a\x17validate/validate.proto\"\xd6\x0e\n\tInterface\x12\x36\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32\x14.google.protobuf.AnyB\x08\xfa\x42\x05\xa2\x01\x02\x08\x01R\x06\x64\x65vice\x12\x1d\n\x04name\x18\x02 \x01(\tB\t\xfa\x42\x06r\x04\x10\x01\x18@R\x04name\x12\xfa\x0c\n\x04type\x18\x03 \x01(\tB\xe5\x0c\xfa\x42\xe1\x0cr\xde\x0cR\x07virtualR\x06\x62ridgeR\x03lagR\n100base-fxR\x0b\x31\x30\x30\x62\x61se-lfxR\n100base-txR\n100base-t1R\n1000base-tR\x0f\x31\x30\x30\x30\x62\x61se-x-gbicR\x0e\x31\x30\x30\x30\x62\x61se-x-sfpR\n2.5gbase-tR\x08\x35gbase-tR\t10gbase-tR\x0b\x31\x30gbase-cx4R\x0e\x31\x30gbase-x-sfppR\r10gbase-x-xfpR\x10\x31\x30gbase-x-xenpakR\x0c\x31\x30gbase-x-x2R\x0f\x32\x35gbase-x-sfp28R\x0f\x35\x30gbase-x-sfp56R\x0f\x34\x30gbase-x-qsfppR\x0f\x35\x30gbase-x-sfp28R\x0e\x31\x30\x30gbase-x-cfpR\x0f\x31\x30\x30gbase-x-cfp2R\x0f\x31\x30\x30gbase-x-cfp4R\x0e\x31\x30\x30gbase-x-cxpR\x0f\x31\x30\x30gbase-x-cpakR\x0f\x31\x30\x30gbase-x-dsfpR\x10\x31\x30\x30gbase-x-sfpddR\x11\x31\x30\x30gbase-x-qsfp28R\x11\x31\x30\x30gbase-x-qsfpddR\x0f\x32\x30\x30gbase-x-cfp2R\x11\x32\x30\x30gbase-x-qsfp56R\x11\x32\x30\x30gbase-x-qsfpddR\x0f\x34\x30\x30gbase-x-cfp2R\x12\x34\x30\x30gbase-x-qsfp112R\x11\x34\x30\x30gbase-x-qsfpddR\x0f\x34\x30\x30gbase-x-osfpR\x13\x34\x30\x30gbase-x-osfp-rhsR\x0f\x34\x30\x30gbase-x-cdfpR\x0f\x34\x30\x30gbase-x-cfp8R\x11\x38\x30\x30gbase-x-qsfpddR\x0f\x38\x30\x30gbase-x-osfpR\x0b\x31\x30\x30\x30\x62\x61se-kxR\n10gbase-krR\x0b\x31\x30gbase-kx4R\n25gbase-krR\x0b\x34\x30gbase-kr4R\n50gbase-krR\x0c\x31\x30\x30gbase-kp4R\x0c\x31\x30\x30gbase-kr2R\x0c\x31\x30\x30gbase-kr4R\x0bieee802.11aR\x0bieee802.11gR\x0bieee802.11nR\x0cieee802.11acR\x0cieee802.11adR\x0cieee802.11axR\x0cieee802.11ayR\x0cieee802.15.1R\x0eother-wirelessR\x03gsmR\x04\x63\x64maR\x03lteR\tsonet-oc3R\nsonet-oc12R\nsonet-oc48R\x0bsonet-oc192R\x0bsonet-oc768R\x0csonet-oc1920R\x0csonet-oc3840R\x08\x31gfc-sfpR\x08\x32gfc-sfpR\x08\x34gfc-sfpR\t8gfc-sfppR\n16gfc-sfppR\x0b\x33\x32gfc-sfp28R\x0b\x36\x34gfc-qsfppR\r128gfc-qsfp28R\x0einfiniband-sdrR\x0einfiniband-ddrR\x0einfiniband-qdrR\x10infiniband-fdr10R\x0einfiniband-fdrR\x0einfiniband-edrR\x0einfiniband-hdrR\x0einfiniband-ndrR\x0einfiniband-xdrR\x02t1R\x02\x65\x31R\x02t3R\x02\x65\x33R\x04xdslR\x06\x64ocsisR\x04gponR\x06xg-ponR\x07xgs-ponR\x07ng-pon2R\x04\x65ponR\x08\x31\x30g-eponR\x0f\x63isco-stackwiseR\x14\x63isco-stackwise-plusR\x0f\x63isco-flexstackR\x14\x63isco-flexstack-plusR\x12\x63isco-stackwise-80R\x13\x63isco-stackwise-160R\x13\x63isco-stackwise-320R\x13\x63isco-stackwise-480R\x12\x63isco-stackwise-1tR\x0bjuniper-vcpR\x13\x65xtreme-summitstackR\x17\x65xtreme-summitstack-128R\x17\x65xtreme-summitstack-256R\x17\x65xtreme-summitstack-512R\x05otherR\x04type\x12\x18\n\x07\x65nabled\x18\x04 \x01(\x08R\x07\x65nabled\x12\x1d\n\x03mtu\x18\x05 \x01(\x05\x42\x0b\xfa\x42\x08\x1a\x06\x18\x80\x80\x04(\x01R\x03mtu\x12\x1f\n\x0bmac_address\x18\x06 \x01(\tR\nmacAddress\x12\x1b\n\tmgmt_only\x18\x07 \x01(\x08R\x08mgmtOnlyB;Z9github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepbb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'diode.v1.interface_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - _globals['DESCRIPTOR']._options = None - _globals['DESCRIPTOR']._serialized_options = b'Z9github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb' - _globals['_INTERFACE'].fields_by_name['device']._options = None - _globals['_INTERFACE'].fields_by_name['device']._serialized_options = b'\372B\005\242\001\002\010\001' - _globals['_INTERFACE'].fields_by_name['name']._options = None - _globals['_INTERFACE'].fields_by_name['name']._serialized_options = b'\372B\006r\004\020\001\030@' - _globals['_INTERFACE'].fields_by_name['type']._options = None - _globals['_INTERFACE'].fields_by_name[ - 'type']._serialized_options = b'\372B\341\014r\336\014R\007virtualR\006bridgeR\003lagR\n100base-fxR\013100base-lfxR\n100base-txR\n100base-t1R\n1000base-tR\0171000base-x-gbicR\0161000base-x-sfpR\n2.5gbase-tR\0105gbase-tR\t10gbase-tR\01310gbase-cx4R\01610gbase-x-sfppR\r10gbase-x-xfpR\02010gbase-x-xenpakR\01410gbase-x-x2R\01725gbase-x-sfp28R\01750gbase-x-sfp56R\01740gbase-x-qsfppR\01750gbase-x-sfp28R\016100gbase-x-cfpR\017100gbase-x-cfp2R\017100gbase-x-cfp4R\016100gbase-x-cxpR\017100gbase-x-cpakR\017100gbase-x-dsfpR\020100gbase-x-sfpddR\021100gbase-x-qsfp28R\021100gbase-x-qsfpddR\017200gbase-x-cfp2R\021200gbase-x-qsfp56R\021200gbase-x-qsfpddR\017400gbase-x-cfp2R\022400gbase-x-qsfp112R\021400gbase-x-qsfpddR\017400gbase-x-osfpR\023400gbase-x-osfp-rhsR\017400gbase-x-cdfpR\017400gbase-x-cfp8R\021800gbase-x-qsfpddR\017800gbase-x-osfpR\0131000base-kxR\n10gbase-krR\01310gbase-kx4R\n25gbase-krR\01340gbase-kr4R\n50gbase-krR\014100gbase-kp4R\014100gbase-kr2R\014100gbase-kr4R\013ieee802.11aR\013ieee802.11gR\013ieee802.11nR\014ieee802.11acR\014ieee802.11adR\014ieee802.11axR\014ieee802.11ayR\014ieee802.15.1R\016other-wirelessR\003gsmR\004cdmaR\003lteR\tsonet-oc3R\nsonet-oc12R\nsonet-oc48R\013sonet-oc192R\013sonet-oc768R\014sonet-oc1920R\014sonet-oc3840R\0101gfc-sfpR\0102gfc-sfpR\0104gfc-sfpR\t8gfc-sfppR\n16gfc-sfppR\01332gfc-sfp28R\01364gfc-qsfppR\r128gfc-qsfp28R\016infiniband-sdrR\016infiniband-ddrR\016infiniband-qdrR\020infiniband-fdr10R\016infiniband-fdrR\016infiniband-edrR\016infiniband-hdrR\016infiniband-ndrR\016infiniband-xdrR\002t1R\002e1R\002t3R\002e3R\004xdslR\006docsisR\004gponR\006xg-ponR\007xgs-ponR\007ng-pon2R\004eponR\01010g-eponR\017cisco-stackwiseR\024cisco-stackwise-plusR\017cisco-flexstackR\024cisco-flexstack-plusR\022cisco-stackwise-80R\023cisco-stackwise-160R\023cisco-stackwise-320R\023cisco-stackwise-480R\022cisco-stackwise-1tR\013juniper-vcpR\023extreme-summitstackR\027extreme-summitstack-128R\027extreme-summitstack-256R\027extreme-summitstack-512R\005other' - _globals['_INTERFACE'].fields_by_name['mtu']._options = None - _globals['_INTERFACE'].fields_by_name['mtu']._serialized_options = b'\372B\010\032\006\030\200\200\004(\001' - _globals['_INTERFACE']._serialized_start = 91 - _globals['_INTERFACE']._serialized_end = 1969 -# @@protoc_insertion_point(module_scope) diff --git a/diode-sdk-python/diode/v1/interface_pb2_grpc.py b/diode-sdk-python/diode/v1/interface_pb2_grpc.py deleted file mode 100644 index 2dd5fd3f..00000000 --- a/diode-sdk-python/diode/v1/interface_pb2_grpc.py +++ /dev/null @@ -1,2 +0,0 @@ -# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! -"""Client and server classes corresponding to protobuf-defined services.""" diff --git a/diode-sdk-python/diode/v1/manufacturer_pb2.py b/diode-sdk-python/diode/v1/manufacturer_pb2.py deleted file mode 100644 index 8c48b78a..00000000 --- a/diode-sdk-python/diode/v1/manufacturer_pb2.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: diode/v1/manufacturer.proto -# Protobuf Python Version: 4.25.1 -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder - -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x1b\x64iode/v1/manufacturer.proto\x12\x08\x64iode.v1\x1a\x17validate/validate.proto\"^\n\x0cManufacturer\x12\x1d\n\x04name\x18\x01 \x01(\tB\t\xfa\x42\x06r\x04\x10\x01\x18\x64R\x04name\x12/\n\x04slug\x18\x02 \x01(\tB\x1b\xfa\x42\x18r\x16\x10\x01\x18\x64\x32\x10^[-a-zA-Z0-9_]+$R\x04slugB;Z9github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepbb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'diode.v1.manufacturer_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - _globals['DESCRIPTOR']._options = None - _globals['DESCRIPTOR']._serialized_options = b'Z9github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb' - _globals['_MANUFACTURER'].fields_by_name['name']._options = None - _globals['_MANUFACTURER'].fields_by_name['name']._serialized_options = b'\372B\006r\004\020\001\030d' - _globals['_MANUFACTURER'].fields_by_name['slug']._options = None - _globals['_MANUFACTURER'].fields_by_name[ - 'slug']._serialized_options = b'\372B\030r\026\020\001\030d2\020^[-a-zA-Z0-9_]+$' - _globals['_MANUFACTURER']._serialized_start = 66 - _globals['_MANUFACTURER']._serialized_end = 160 -# @@protoc_insertion_point(module_scope) diff --git a/diode-sdk-python/diode/v1/manufacturer_pb2_grpc.py b/diode-sdk-python/diode/v1/manufacturer_pb2_grpc.py deleted file mode 100644 index 2dd5fd3f..00000000 --- a/diode-sdk-python/diode/v1/manufacturer_pb2_grpc.py +++ /dev/null @@ -1,2 +0,0 @@ -# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! -"""Client and server classes corresponding to protobuf-defined services.""" diff --git a/diode-sdk-python/diode/v1/platform_pb2.py b/diode-sdk-python/diode/v1/platform_pb2.py deleted file mode 100644 index 539d8156..00000000 --- a/diode-sdk-python/diode/v1/platform_pb2.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: diode/v1/platform.proto -# Protobuf Python Version: 4.25.1 -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder - -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x17\x64iode/v1/platform.proto\x12\x08\x64iode.v1\x1a\x17validate/validate.proto\"H\n\x08Platform\x12\x1d\n\x04name\x18\x01 \x01(\tB\t\xfa\x42\x06r\x04\x10\x01\x18\x64R\x04name\x12\x1d\n\x04slug\x18\x02 \x01(\tB\t\xfa\x42\x06r\x04\x10\x01\x18\x64R\x04slugB;Z9github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepbb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'diode.v1.platform_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - _globals['DESCRIPTOR']._options = None - _globals['DESCRIPTOR']._serialized_options = b'Z9github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb' - _globals['_PLATFORM'].fields_by_name['name']._options = None - _globals['_PLATFORM'].fields_by_name['name']._serialized_options = b'\372B\006r\004\020\001\030d' - _globals['_PLATFORM'].fields_by_name['slug']._options = None - _globals['_PLATFORM'].fields_by_name['slug']._serialized_options = b'\372B\006r\004\020\001\030d' - _globals['_PLATFORM']._serialized_start = 62 - _globals['_PLATFORM']._serialized_end = 134 -# @@protoc_insertion_point(module_scope) diff --git a/diode-sdk-python/diode/v1/platform_pb2_grpc.py b/diode-sdk-python/diode/v1/platform_pb2_grpc.py deleted file mode 100644 index 2dd5fd3f..00000000 --- a/diode-sdk-python/diode/v1/platform_pb2_grpc.py +++ /dev/null @@ -1,2 +0,0 @@ -# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! -"""Client and server classes corresponding to protobuf-defined services.""" diff --git a/diode-sdk-python/diode/v1/site_pb2.py b/diode-sdk-python/diode/v1/site_pb2.py deleted file mode 100644 index e6b2946e..00000000 --- a/diode-sdk-python/diode/v1/site_pb2.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: diode/v1/site.proto -# Protobuf Python Version: 4.25.1 -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder - -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x13\x64iode/v1/site.proto\x12\x08\x64iode.v1\x1a\x17validate/validate.proto\"V\n\x04Site\x12\x1d\n\x04name\x18\x01 \x01(\tB\t\xfa\x42\x06r\x04\x10\x01\x18\x64R\x04name\x12/\n\x04slug\x18\x02 \x01(\tB\x1b\xfa\x42\x18r\x16\x10\x01\x18\x64\x32\x10^[-a-zA-Z0-9_]+$R\x04slugB;Z9github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepbb\x06proto3') - -_globals = globals() -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'diode.v1.site_pb2', _globals) -if _descriptor._USE_C_DESCRIPTORS == False: - _globals['DESCRIPTOR']._options = None - _globals['DESCRIPTOR']._serialized_options = b'Z9github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb' - _globals['_SITE'].fields_by_name['name']._options = None - _globals['_SITE'].fields_by_name['name']._serialized_options = b'\372B\006r\004\020\001\030d' - _globals['_SITE'].fields_by_name['slug']._options = None - _globals['_SITE'].fields_by_name['slug']._serialized_options = b'\372B\030r\026\020\001\030d2\020^[-a-zA-Z0-9_]+$' - _globals['_SITE']._serialized_start = 58 - _globals['_SITE']._serialized_end = 144 -# @@protoc_insertion_point(module_scope) diff --git a/diode-sdk-python/diode/v1/site_pb2_grpc.py b/diode-sdk-python/diode/v1/site_pb2_grpc.py deleted file mode 100644 index 2dd5fd3f..00000000 --- a/diode-sdk-python/diode/v1/site_pb2_grpc.py +++ /dev/null @@ -1,2 +0,0 @@ -# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! -"""Client and server classes corresponding to protobuf-defined services.""" diff --git a/diode-sdk-python/netboxlabs/__init__.py b/diode-sdk-python/netboxlabs/__init__.py deleted file mode 100644 index 0ac7d254..00000000 --- a/diode-sdk-python/netboxlabs/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""NetBox Labs - namespace.""" diff --git a/diode-sdk-python/netboxlabs/diode/__init__.py b/diode-sdk-python/netboxlabs/diode/__init__.py deleted file mode 100644 index 5219c595..00000000 --- a/diode-sdk-python/netboxlabs/diode/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""NetBox Labs - Diode namespace.""" diff --git a/diode-sdk-python/netboxlabs/diode/sdk/__init__.py b/diode-sdk-python/netboxlabs/diode/sdk/__init__.py deleted file mode 100644 index 61db2996..00000000 --- a/diode-sdk-python/netboxlabs/diode/sdk/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""NetBox Labs, Diode - SDK.""" - -from netboxlabs.diode.sdk.client_config import ClientConfiguration - -assert ClientConfiguration diff --git a/diode-sdk-python/netboxlabs/diode/sdk/client_config.py b/diode-sdk-python/netboxlabs/diode/sdk/client_config.py deleted file mode 100644 index fb0b6eff..00000000 --- a/diode-sdk-python/netboxlabs/diode/sdk/client_config.py +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""NetBox Labs, Diode - Client configuration.""" - - -class ClientConfiguration: - """Diode client configuration.""" - - _name = None - _version = None - - def __init__(self, name: str, version: str): - """Initiate a new client configuration.""" - self._name = name - self._version = version - # TODO: ensure version is a valid semver - # TODO: obtain meta data about the environment; Python version, CPU arch, OS - - @property - def name(self) -> str: - """Retrieve the name.""" - return self._name - - @property - def version(self) -> str: - """Retrieve the version.""" - return self._version diff --git a/diode-sdk-python/netboxlabs/diode/sdk/version.py b/diode-sdk-python/netboxlabs/diode/sdk/version.py deleted file mode 100644 index 2de2087c..00000000 --- a/diode-sdk-python/netboxlabs/diode/sdk/version.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""Version stamp.""" - -# These properties are injected at build time by the build process. - -__commit_hash__ = "unknown" -__track__ = "dev" -__version__ = "0.0.0" - - -def version_display(): - """Display the version, track and hash together.""" - return f"v{__version__}-{__track__}-{__commit_hash__}" - - -def version_semver(): - """Semantic version.""" - return __version__ diff --git a/diode-sdk-python/package-lock.json b/diode-sdk-python/package-lock.json deleted file mode 100644 index 6bbf6d94..00000000 --- a/diode-sdk-python/package-lock.json +++ /dev/null @@ -1,6902 +0,0 @@ -{ - "name": "diode-sdk-python", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "diode-sdk-python", - "version": "1.0.0", - "devDependencies": { - "@semantic-release/changelog": "^6.0.3", - "semantic-release-export-data": "^1.0.1", - "semantic-release-monorepo": "^7.0.0" - } - }, - "node_modules/@actions/core": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.1.tgz", - "integrity": "sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==", - "dev": true, - "dependencies": { - "@actions/http-client": "^2.0.1", - "uuid": "^8.3.2" - } - }, - "node_modules/@actions/http-client": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.0.tgz", - "integrity": "sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==", - "dev": true, - "dependencies": { - "tunnel": "^0.0.6", - "undici": "^5.25.4" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "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/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/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/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "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/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/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", - "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", - "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/endpoint": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", - "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/graphql": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", - "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "18.1.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", - "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", - "dev": true, - "peer": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", - "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/tsconfig": "^1.0.2", - "@octokit/types": "^9.2.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=4" - } - }, - "node_modules/@octokit/plugin-retry": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-4.1.6.tgz", - "integrity": "sha512-obkYzIgEC75r8+9Pnfiiqy3y/x1bc3QLE5B7qvv9wi9Kj0R5tGQFC6QMBg1154WQ9lAVypuQDGyp3hNpp15gQQ==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-throttling": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-5.2.3.tgz", - "integrity": "sha512-C9CFg9mrf6cugneKiaI841iG8DOv6P5XXkjmiNNut+swePxQ7RWEdAZRp5rJoE1hjsIqiYcKa/ZkOQ+ujPI39Q==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": "^4.0.0" - } - }, - "node_modules/@octokit/request": { - "version": "6.2.8", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", - "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/tsconfig": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", - "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", - "dev": true, - "peer": true - }, - "node_modules/@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true, - "peer": true - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", - "dev": true, - "peer": true, - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@semantic-release/changelog": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.3.tgz", - "integrity": "sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==", - "dev": true, - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "fs-extra": "^11.0.0", - "lodash": "^4.17.4" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0" - } - }, - "node_modules/@semantic-release/commit-analyzer": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", - "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", - "dev": true, - "peer": true, - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", - "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", - "dev": true, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@semantic-release/github": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.1.0.tgz", - "integrity": "sha512-erR9E5rpdsz0dW1I7785JtndQuMWN/iDcemcptf67tBNOmBUN0b2YNOgcjYUnBpgRpZ5ozfBHrK7Bz+2ets/Dg==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/core": "^4.2.1", - "@octokit/plugin-paginate-rest": "^6.1.2", - "@octokit/plugin-retry": "^4.1.3", - "@octokit/plugin-throttling": "^5.2.3", - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^11.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^3.0.0", - "p-filter": "^2.0.0", - "url-join": "^4.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/npm": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-9.0.2.tgz", - "integrity": "sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==", - "dev": true, - "peer": true, - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "execa": "^5.0.0", - "fs-extra": "^11.0.0", - "lodash": "^4.17.15", - "nerf-dart": "^1.0.0", - "normalize-url": "^6.0.0", - "npm": "^8.3.0", - "rc": "^1.2.8", - "read-pkg": "^5.0.0", - "registry-auth-token": "^5.0.0", - "semver": "^7.1.2", - "tempy": "^1.0.0" - }, - "engines": { - "node": ">=16 || ^14.17" - }, - "peerDependencies": { - "semantic-release": ">=19.0.0" - } - }, - "node_modules/@semantic-release/release-notes-generator": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", - "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", - "dev": true, - "peer": true, - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "get-stream": "^6.0.0", - "import-from": "^4.0.0", - "into-stream": "^6.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true, - "peer": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true, - "peer": true - }, - "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "peer": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", - "dev": true, - "peer": true, - "dependencies": { - "type-fest": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "dev": true, - "peer": true - }, - "node_modules/argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", - "dev": true - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true, - "peer": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true, - "peer": true - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "dev": true, - "peer": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "peer": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "dev": true, - "peer": true, - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, - "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "peer": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "peer": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "peer": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "peer": true, - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dev": true, - "peer": true, - "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/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, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "peer": true, - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "peer": true, - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "peer": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true, - "peer": true, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "peer": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dev": true, - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true, - "peer": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "peer": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "peer": true - }, - "node_modules/env-ci": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz", - "integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==", - "dev": true, - "peer": true, - "dependencies": { - "execa": "^5.0.0", - "fromentries": "^1.3.2", - "java-properties": "^1.0.0" - }, - "engines": { - "node": ">=10.17" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "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/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, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "peer": 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/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "peer": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/file-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/file-url/-/file-url-3.0.0.tgz", - "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-versions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", - "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", - "dev": true, - "peer": true, - "dependencies": { - "semver-regex": "^3.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "peer": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "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/git-log-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", - "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", - "dev": true, - "dependencies": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - } - }, - "node_modules/git-log-parser/node_modules/split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", - "dev": true, - "dependencies": { - "through2": "~2.0.0" - } - }, - "node_modules/git-log-parser/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.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/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "peer": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hook-std": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", - "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dev": true, - "peer": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", - "dev": true, - "peer": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "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, - "peer": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "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-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "peer": true - }, - "node_modules/into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", - "dev": true, - "peer": true, - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "peer": true, - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", - "dev": true, - "peer": true, - "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - }, - "engines": { - "node": ">=10.13" - } - }, - "node_modules/java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "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/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "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-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "peer": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "peer": true - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "peer": true, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.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/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "peer": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "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, - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "dev": true, - "peer": true - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true, - "peer": true - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true, - "peer": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "peer": true - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true, - "peer": true - }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", - "dev": true, - "peer": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, - "peer": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/marked-terminal": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.2.0.tgz", - "integrity": "sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-escapes": "^6.2.0", - "cardinal": "^2.1.1", - "chalk": "^5.2.0", - "cli-table3": "^0.6.3", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.3.0" - }, - "engines": { - "node": ">=14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "peer": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "peer": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "peer": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.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==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "peer": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "peer": true - }, - "node_modules/nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", - "dev": true, - "peer": true - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "peer": true, - "dependencies": { - "lodash": "^4.17.21" - } - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "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==", - "dev": true, - "peer": true, - "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/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm": { - "version": "8.19.4", - "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.4.tgz", - "integrity": "sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/ci-detect", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/run-script", - "abbrev", - "archy", - "cacache", - "chalk", - "chownr", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "mkdirp", - "mkdirp-infer-owner", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "opener", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "read-package-json", - "read-package-json-fast", - "readdir-scoped-modules", - "rimraf", - "semver", - "ssri", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dev": true, - "peer": true, - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/config": "^4.2.1", - "@npmcli/fs": "^2.1.0", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/package-json": "^2.0.0", - "@npmcli/run-script": "^4.2.1", - "abbrev": "~1.1.1", - "archy": "~1.0.0", - "cacache": "^16.1.3", - "chalk": "^4.1.2", - "chownr": "^2.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.2", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.12", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "graceful-fs": "^4.2.10", - "hosted-git-info": "^5.2.1", - "ini": "^3.0.1", - "init-package-json": "^3.0.2", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^2.3.1", - "libnpmaccess": "^6.0.4", - "libnpmdiff": "^4.0.5", - "libnpmexec": "^4.0.14", - "libnpmfund": "^3.0.5", - "libnpmhook": "^8.0.4", - "libnpmorg": "^4.0.4", - "libnpmpack": "^4.1.3", - "libnpmpublish": "^6.0.5", - "libnpmsearch": "^5.0.4", - "libnpmteam": "^4.0.4", - "libnpmversion": "^3.0.7", - "make-fetch-happen": "^10.2.0", - "minimatch": "^5.1.0", - "minipass": "^3.1.6", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "ms": "^2.1.2", - "node-gyp": "^9.1.0", - "nopt": "^6.0.0", - "npm-audit-report": "^3.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.1.0", - "npm-pick-manifest": "^7.0.2", - "npm-profile": "^6.2.0", - "npm-registry-fetch": "^13.3.1", - "npm-user-validate": "^1.0.1", - "npmlog": "^6.0.2", - "opener": "^1.5.2", - "p-map": "^4.0.0", - "pacote": "^13.6.2", - "parse-conflict-json": "^2.0.2", - "proc-log": "^2.0.1", - "qrcode-terminal": "^0.12.0", - "read": "~1.0.7", - "read-package-json": "^5.0.2", - "read-package-json-fast": "^2.0.3", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.1", - "tar": "^6.1.11", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^2.0.0", - "validate-npm-package-name": "^4.0.0", - "which": "^2.0.2", - "write-file-atomic": "^4.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.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, - "peer": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "5.6.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/metavuln-calculator": "^3.0.1", - "@npmcli/move-file": "^2.0.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/package-json": "^2.0.0", - "@npmcli/query": "^1.2.0", - "@npmcli/run-script": "^4.1.3", - "bin-links": "^3.0.3", - "cacache": "^16.1.3", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^5.2.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "minimatch": "^5.1.0", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.0.0", - "npm-pick-manifest": "^7.0.2", - "npm-registry-fetch": "^13.0.0", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.0", - "treeverse": "^2.0.0", - "walk-up-path": "^1.0.0" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/ci-detect": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "4.2.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/map-workspaces": "^2.0.2", - "ini": "^3.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "proc-log": "^2.0.0", - "read-package-json-fast": "^2.0.3", - "semver": "^7.3.5", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "2.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^8.0.1", - "minimatch": "^5.0.1", - "read-package-json-fast": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "cacache": "^16.0.0", - "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "infer-owner": "^1.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "1.2.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-package-arg": "^9.1.0", - "postcss-selector-parser": "^6.0.10", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "4.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@tootallnate/once": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/agent-base": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/npm/node_modules/agentkeepalive": { - "version": "4.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/asap": { - "version": "2.0.6", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/bin-links": { - "version": "3.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "cmd-shim": "^5.0.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0", - "read-cmd-shim": "^3.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/builtins": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "16.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "ip-regex": "^4.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "mkdirp-infer-owner": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/debuglog": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/depd": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/dezalgo": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/diff": { - "version": "5.1.0", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.12", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/gauge": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "8.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "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/npm/node_modules/graceful-fs": { - "version": "4.2.10", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/has": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/npm/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "5.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minimatch": "^5.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/ini": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-package-arg": "^9.0.1", - "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/ip": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "cidr-regex": "^3.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.10.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/just-diff": { - "version": "5.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.4.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "6.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "4.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/disparity-colors": "^2.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^5.0.1", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1", - "tar": "^6.1.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "4.0.14", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/fs": "^2.1.1", - "@npmcli/run-script": "^4.2.0", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^9.0.1", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "proc-log": "^2.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", - "semver": "^7.3.7", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "3.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/arborist": "^5.6.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "8.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "4.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/run-script": "^4.1.3", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "6.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "normalize-package-data": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0", - "semver": "^7.3.7", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "5.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "3.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/run-script": "^4.1.3", - "json-parse-even-better-errors": "^2.3.1", - "proc-log": "^2.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "7.13.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "10.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "5.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/minipass": { - "version": "3.3.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "2.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/mkdirp-infer-owner": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "0.0.8", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "9.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.22 || ^14.13 || >=16" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "4.0.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-normalize-package-bin": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "9.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "5.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "7.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^2.0.0", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "6.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "13.3.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true - }, - "node_modules/npm/node_modules/npmlog": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/once": { - "version": "1.4.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/opener": { - "version": "1.5.2", - "dev": true, - "inBundle": true, - "license": "(WTFPL OR MIT)", - "peer": true, - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/pacote": { - "version": "13.6.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.1", - "just-diff": "^5.0.1", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.10", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/proc-log": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "0.3.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "read": "1" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "peer": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/read": { - "version": "1.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json": { - "version": "5.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/readable-stream": { - "version": "3.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/readdir-scoped-modules": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.3.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.7.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "dev": true, - "inBundle": true, - "license": "CC-BY-3.0", - "peer": true - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.11", - "dev": true, - "inBundle": true, - "license": "CC0-1.0", - "peer": true - }, - "node_modules/npm/node_modules/ssri": { - "version": "9.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "6.1.11", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/treeverse": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/unique-filename": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/npm/node_modules/which": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "peer": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "peer": true, - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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, - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "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/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", - "dev": true, - "peer": true, - "dependencies": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "peer": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==", - "dev": true, - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true, - "peer": true - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ramda": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", - "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==", - "dev": true - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "peer": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "peer": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/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==", - "dev": true - }, - "node_modules/read-pkg/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==", - "dev": true, - "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-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "peer": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "dev": true, - "peer": true, - "dependencies": { - "esprima": "~4.0.0" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dev": true, - "peer": true, - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/semantic-release": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-19.0.5.tgz", - "integrity": "sha512-NMPKdfpXTnPn49FDogMBi36SiBfXkSOJqCkk0E4iWOY1tusvvgBwqUmxTX1kmlT6kIYed9YwNKD1sfPpqa5yaA==", - "dev": true, - "peer": true, - "dependencies": { - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/error": "^3.0.0", - "@semantic-release/github": "^8.0.0", - "@semantic-release/npm": "^9.0.0", - "@semantic-release/release-notes-generator": "^10.0.0", - "aggregate-error": "^3.0.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.0.0", - "env-ci": "^5.0.0", - "execa": "^5.0.0", - "figures": "^3.0.0", - "find-versions": "^4.0.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^2.0.0", - "hosted-git-info": "^4.0.0", - "lodash": "^4.17.21", - "marked": "^4.0.10", - "marked-terminal": "^5.0.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "p-reduce": "^2.0.0", - "read-pkg-up": "^7.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^3.1.1", - "signale": "^1.2.1", - "yargs": "^16.2.0" - }, - "bin": { - "semantic-release": "bin/semantic-release.js" - }, - "engines": { - "node": ">=16 || ^14.17" - } - }, - "node_modules/semantic-release-export-data": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semantic-release-export-data/-/semantic-release-export-data-1.0.1.tgz", - "integrity": "sha512-6vlgrrzzcMi/REhQd65Bh4dfSKmgwXOJ/Q2RVlT9WsU4Ya1T2qGpkSrMfG/n6oFRrqBdbDlyZgxNd94ziW+vSg==", - "dev": true, - "dependencies": { - "@actions/core": "^1.10.0" - }, - "peerDependencies": { - "semantic-release": ">=18" - } - }, - "node_modules/semantic-release-monorepo": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/semantic-release-monorepo/-/semantic-release-monorepo-7.0.8.tgz", - "integrity": "sha512-L2n7FZEYvjxXop6C7svk8xZH1/2N58CV1dN+veeAGZ8363FG+AKNKLN1r4wAL86e5xIu1HiOOASm10X+rN6XWg==", - "dev": true, - "dependencies": { - "debug": "^3.1.0", - "execa": "^0.8.0", - "file-url": "^3.0.0", - "fs-extra": "^10.0.1", - "get-stream": "^6.0.1", - "git-log-parser": "^1.2.0", - "p-each-series": "^2.1.0", - "p-limit": "^1.2.0", - "pkg-up": "^2.0.0", - "ramda": "^0.25.0", - "read-pkg": "^5.0.0", - "semantic-release-plugin-decorators": "^3.0.0", - "tempy": "1.0.1" - }, - "peerDependencies": { - "semantic-release": ">=15.11.x < 20" - } - }, - "node_modules/semantic-release-monorepo/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/semantic-release-monorepo/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/semantic-release-monorepo/node_modules/execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==", - "dev": true, - "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/execa/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/semantic-release-monorepo/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/semantic-release-monorepo/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/semantic-release-monorepo/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/semantic-release-monorepo/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/semantic-release-monorepo/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/semantic-release-monorepo/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - }, - "node_modules/semantic-release-plugin-decorators": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/semantic-release-plugin-decorators/-/semantic-release-plugin-decorators-3.0.3.tgz", - "integrity": "sha512-YTB2z64yyqEzABJ3yFesV9s5izZ4oKdbYDTu/2whVdlGQYCwsWkw9XYRCnvXzPdWPSWYmCPdJwMJ5w433rncig==", - "dev": true, - "peerDependencies": { - "semantic-release": ">=11 < 20" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "peer": true, - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/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, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-regex": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", - "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "peer": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/signale/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, - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/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, - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/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, - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/signale/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, - "peer": true - }, - "node_modules/signale/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "peer": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/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, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/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, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "peer": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "peer": true, - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/split2/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==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "dev": true, - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "peer": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", - "dev": true, - "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "peer": true - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "peer": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/through2/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==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "peer": true - }, - "node_modules/traverse": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", - "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, - "node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undici": { - "version": "5.28.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", - "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", - "dev": true, - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true, - "peer": true - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true, - "peer": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "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==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "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==", - "dev": true, - "peer": true - }, - "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==", - "dev": true, - "peer": true, - "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==", - "dev": true, - "peer": true, - "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==", - "dev": true, - "peer": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "peer": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - } - } -} diff --git a/diode-sdk-python/package.json b/diode-sdk-python/package.json deleted file mode 100644 index 8b84cbcb..00000000 --- a/diode-sdk-python/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "diode-sdk-python", - "version": "1.0.0", - "extends": "semantic-release-monorepo", - "devDependencies": { - "semantic-release-monorepo": "^7.0.0", - "semantic-release-export-data": "^1.0.1", - "@semantic-release/changelog": "^6.0.3" - } -} diff --git a/diode-sdk-python/pyproject.toml b/diode-sdk-python/pyproject.toml deleted file mode 100644 index 86b2af7d..00000000 --- a/diode-sdk-python/pyproject.toml +++ /dev/null @@ -1,57 +0,0 @@ -[project] -name = "netboxlabs-diode-sdk" -version = "0.0.1" # Overwritten during the build process -description = "NetBox Labs, Diode SDK" -readme = "README.md" # Optional -requires-python = ">=3.7" -license = {file = "LICENSE.txt"} -authors = [ - {name = "NetBox Labs", email = "support@netboxlabs.com" } # Optional -] -maintainers = [ - {name = "NetBox Labs", email = "support@netboxlabs.com" } # Optional -] - -classifiers = [ # Optional - "Development Status :: 3 - Alpha", - "Intended Audience :: Developers", - "Topic :: Software Development :: Build Tools", - "License :: OSI Approved :: MIT License", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: 3.9', - 'Programming Language :: Python :: 3.10', - 'Programming Language :: Python :: 3.11', -] - -dependencies = [ # Optional -] - -[project.optional-dependencies] # Optional -dev = ["black", "check-manifest", "ruff"] -test = ["coverage", "pytest", "pytest-cov"] - -[project.urls] # Optional -"Homepage" = "https://netboxlabs.com/" - -[project.scripts] # Optional - -[tool.setuptools] -packages = ["netboxlabs.diode.sdk"] - -[build-system] -requires = ["setuptools>=43.0.0", "wheel"] -build-backend = "setuptools.build_meta" - - -[tool.ruff] -line-length = 140 - -[tool.ruff.format] -quote-style = "double" -indent-style = "space" - -[tool.ruff.lint] -select = ["C", "D", "E", "F", "I", "R", "UP", "W"] -ignore = ["F401", "D203", "D212", "D400", "D401", "D404", "RET504"] diff --git a/diode-sdk-python/tests/test_client_config.py b/diode-sdk-python/tests/test_client_config.py deleted file mode 100644 index 128beb85..00000000 --- a/diode-sdk-python/tests/test_client_config.py +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""NetBox Labs - Tests.""" - -from netboxlabs.diode.sdk import ClientConfiguration - - -def test_init(): - """Ensure we can initiate a client configuration.""" - config = ClientConfiguration(name="my-producer", version="0.0.1") - assert config.name == "my-producer" - assert config.version == "0.0.1" diff --git a/diode-sdk-python/tests/test_version.py b/diode-sdk-python/tests/test_version.py deleted file mode 100644 index a73c8829..00000000 --- a/diode-sdk-python/tests/test_version.py +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env python -# Copyright 2024 NetBox Labs Inc -"""NetBox Labs - Tests.""" - -from netboxlabs.diode.sdk.version import version_semver - - -def test_version(): - """Check the injected semver.""" - assert version_semver() == "0.0.0" diff --git a/diode-server/.mockery.yaml b/diode-server/.mockery.yaml new file mode 100644 index 00000000..22c45968 --- /dev/null +++ b/diode-server/.mockery.yaml @@ -0,0 +1,10 @@ +mockname: "{{.InterfaceName}}" +structname: "{{.InterfaceName}}.go" +filename: "{{.InterfaceName | lower }}.go" +with-expecter: true +packages: + github.com/netboxlabs/diode/diode-server/netboxdiodeplugin: + config: + all: true + dir: "{{.InterfaceDir}}/mocks" + outpkg: mocks diff --git a/diode-server/Makefile b/diode-server/Makefile index 962da6df..79d3a583 100644 --- a/diode-server/Makefile +++ b/diode-server/Makefile @@ -1,17 +1,27 @@ -.PHONY: deps lint test build-all docker-all docker-compose-up docker-compose-down clean - -SERVICES := $(shell find ./cmd/* -type d -exec basename {} \;) -BUILD_SERVICES = $(addprefix build-,$(SERVICES)) -DOCKER_SERVICES = $(addprefix docker-,$(SERVICES)) -BUILD_DIR ?= ./build -LD_FLAGS ?= -w -s -CGO_ENABLED ?= 0 -GOARCH ?= $(shell go env GOARCH) -GOOS = linux -ORG_NAME = netboxlabs -REPO_NAME = diode -DIODE_VERSION = $(shell cat version/VERSION.txt) -COMMIT_SHA = $(shell git rev-parse --short HEAD) +.PHONY: deps lint test test-coverage build-all docker-all docker-compose-up docker-compose-down clean reconciler-proto-gen + +SERVICES := $(shell find ./cmd/* -type d -exec basename {} \;) +BUILD_SERVICES = $(addprefix build-,$(SERVICES)) +DOCKER_SERVICES = $(addprefix docker-,$(SERVICES)) +BUILD_DIR ?= ./build +LD_FLAGS ?= -w -s +CGO_ENABLED ?= 0 +GOPATH ?= $(shell go env GOPATH) +GOARCH ?= $(shell go env GOARCH) +GOOS = linux +ORG_NAME = netboxlabs +REPO_NAME = diode +ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) +VERSION_DIR = $(ROOT_DIR)/version +DIODE_VERSION := $(shell cat $(VERSION_DIR)/BUILD_VERSION.txt) +COMMIT_SHA := $(shell git rev-parse --short HEAD) +VALIDATE_PKG_DIR := $(shell find $(GOPATH)/pkg/mod/github.com/envoyproxy/protoc-gen-validate@* -type d -prune | sort | tail -1) + +ifneq ($(shell docker compose version 2>/dev/null),) + DOCKER_COMPOSE := docker compose +else + DOCKER_COMPOSE := docker-compose +endif deps: @go mod tidy @@ -22,6 +32,12 @@ lint: test: @go test -race ./... +test-coverage: + @mkdir -p .coverage + @go test -race -cover -json -coverprofile=.coverage/cover.out.tmp ./... | grep -Ev "diodepb|reconcilerpb|cmd|mocks|sentry" | tparse -format=markdown > .coverage/test-report.md + @cat .coverage/cover.out.tmp | grep -Ev "diodepb|reconcilerpb|cmd|mocks|sentry" > .coverage/cover.out + @go tool cover -func=.coverage/cover.out | grep total | awk '{print substr($$3, 1, length($$3)-1)}' > .coverage/coverage.txt + .PHONY: $(BUILD_SERVICES) $(BUILD_SERVICES): @$(eval SVC=$(subst build-,,$@)) @@ -49,11 +65,20 @@ docker-all: $(DOCKER_SERVICES) docker-compose-up: docker-all @DIODE_VERSION=$(DIODE_VERSION) COMMIT_SHA=$(COMMIT_SHA) \ - docker-compose -f docker/docker-compose.yaml -f docker/docker-compose.netbox.yaml up -d + $(DOCKER_COMPOSE) --env-file docker/sample.env -f docker/docker-compose.yaml up -d --build docker-compose-down: @DIODE_VERSION=$(DIODE_VERSION) COMMIT_SHA=$(COMMIT_SHA) \ - docker-compose -f docker/docker-compose.yaml -f docker/docker-compose.netbox.yaml down + $(DOCKER_COMPOSE) --env-file docker/sample.env -f docker/docker-compose.yaml down --remove-orphans + +docker-compose-netbox-up: docker-all + $(DOCKER_COMPOSE) -f docker/docker-compose.netbox.yaml up -d --build + +docker-compose-netbox-down: + $(DOCKER_COMPOSE) -f docker/docker-compose.netbox.yaml down clean: @rm -rf $(BUILD_DIR)/* + +reconciler-proto-gen: + @cd proto/ && buf format -w && buf generate --template buf.gen.yaml diff --git a/diode-server/README.md b/diode-server/README.md index 4fdac96c..5145e14d 100644 --- a/diode-server/README.md +++ b/diode-server/README.md @@ -1,3 +1,16 @@ # Diode servers -TBD +Diode server is splited into two services: + +### Ingester Service + +- Responsible for receiving and validating ingestion data. +- Utilizes `IngesterService.Ingest` RPC method. +- Supports single API key for data source authorization. +- Validates incoming data and pushes it into Redis streams. + +### Reconciler Service + +- Processes data from Redis streams and converts it for storage. +- Manages data sources and their API keys. +- Implements a reconciliation engine to detect and store deltas between ingested data and the current NetBox object state. diff --git a/diode-server/cmd/distributor/.releaserc.json b/diode-server/cmd/distributor/.releaserc.json deleted file mode 100644 index 4eafe78b..00000000 --- a/diode-server/cmd/distributor/.releaserc.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "branches": "release", - "repositoryUrl": "https://github.com/netboxlabs/diode", - "debug": "true", - "extends": "semantic-release-monorepo", - "tagFormat": "diode-distributor/v${version}", - "plugins": [ - [ - "semantic-release-export-data" - ], - [ - "@semantic-release/commit-analyzer", - { - "releaseRules": [ - { - "message": "*", - "release": "patch" - }, - { - "message": "fix*", - "release": "patch" - }, - { - "message": "feat*", - "release": "minor" - }, - { - "message": "perf*", - "release": "major" - } - ] - } - ], - "@semantic-release/release-notes-generator", - [ - "@semantic-release/changelog", - { - "changelogFile": "CHANGELOG.md", - "changelogTitle": "# Semantic Versioning Changelog" - } - ], - [ - "@semantic-release/github", - { - "assets": [ - { - "path": "release/**" - } - ] - } - ] - ] -} diff --git a/diode-server/cmd/distributor/main.go b/diode-server/cmd/distributor/main.go deleted file mode 100644 index c114a1a5..00000000 --- a/diode-server/cmd/distributor/main.go +++ /dev/null @@ -1,33 +0,0 @@ -package main - -import ( - "context" - "os" - - "github.com/netboxlabs/diode/diode-server/distributor" - "github.com/netboxlabs/diode/diode-server/server" -) - -func main() { - ctx := context.Background() - s := server.New(ctx, "diode-distributor") - - distributorComponent, err := distributor.New(ctx, s.Logger()) - if err != nil { - s.Logger().Error("failed to instantiate distributor component", "error", err) - os.Exit(1) - } - - if err := s.RegisterComponent(distributorComponent); err != nil { - s.Logger().Error("failed to register distributor component", "error", err) - os.Exit(1) - } - - // instantiate a prom service for /metrics - // prometheusSvc, err := prometheus.New() - - if err := s.Run(); err != nil { - s.Logger().Error("server failure", "serverName", s.Name(), "error", err) - os.Exit(1) - } -} diff --git a/diode-server/cmd/distributor/package-lock.json b/diode-server/cmd/distributor/package-lock.json deleted file mode 100644 index fd9a68f6..00000000 --- a/diode-server/cmd/distributor/package-lock.json +++ /dev/null @@ -1,6902 +0,0 @@ -{ - "name": "diode-distributor", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "diode-distributor", - "version": "0.1.0", - "devDependencies": { - "@semantic-release/changelog": "^6.0.3", - "semantic-release-export-data": "^1.0.1", - "semantic-release-monorepo": "^7.0.0" - } - }, - "node_modules/@actions/core": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.1.tgz", - "integrity": "sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==", - "dev": true, - "dependencies": { - "@actions/http-client": "^2.0.1", - "uuid": "^8.3.2" - } - }, - "node_modules/@actions/http-client": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.0.tgz", - "integrity": "sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==", - "dev": true, - "dependencies": { - "tunnel": "^0.0.6", - "undici": "^5.25.4" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.23.4", - "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/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/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/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "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/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/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@octokit/auth-token": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", - "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", - "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/endpoint": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", - "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/graphql": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", - "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "18.1.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", - "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", - "dev": true, - "peer": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", - "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/tsconfig": "^1.0.2", - "@octokit/types": "^9.2.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=4" - } - }, - "node_modules/@octokit/plugin-retry": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-4.1.6.tgz", - "integrity": "sha512-obkYzIgEC75r8+9Pnfiiqy3y/x1bc3QLE5B7qvv9wi9Kj0R5tGQFC6QMBg1154WQ9lAVypuQDGyp3hNpp15gQQ==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-throttling": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-5.2.3.tgz", - "integrity": "sha512-C9CFg9mrf6cugneKiaI841iG8DOv6P5XXkjmiNNut+swePxQ7RWEdAZRp5rJoE1hjsIqiYcKa/ZkOQ+ujPI39Q==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "bottleneck": "^2.15.3" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": "^4.0.0" - } - }, - "node_modules/@octokit/request": { - "version": "6.2.8", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", - "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/tsconfig": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", - "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", - "dev": true, - "peer": true - }, - "node_modules/@octokit/types": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", - "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/openapi-types": "^18.0.0" - } - }, - "node_modules/@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "4.2.10" - }, - "engines": { - "node": ">=12.22.0" - } - }, - "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true, - "peer": true - }, - "node_modules/@pnpm/npm-conf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", - "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", - "dev": true, - "peer": true, - "dependencies": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@semantic-release/changelog": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/changelog/-/changelog-6.0.3.tgz", - "integrity": "sha512-dZuR5qByyfe3Y03TpmCvAxCyTnp7r5XwtHRf/8vD9EAn4ZWbavUX8adMtXYzE86EVh0gyLA7lm5yW4IV30XUag==", - "dev": true, - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "fs-extra": "^11.0.0", - "lodash": "^4.17.4" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0" - } - }, - "node_modules/@semantic-release/commit-analyzer": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-9.0.2.tgz", - "integrity": "sha512-E+dr6L+xIHZkX4zNMe6Rnwg4YQrWNXK+rNsvwOPpdFppvZO1olE2fIgWhv89TkQErygevbjsZFSIxp+u6w2e5g==", - "dev": true, - "peer": true, - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "import-from": "^4.0.0", - "lodash": "^4.17.4", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@semantic-release/error/-/error-3.0.0.tgz", - "integrity": "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw==", - "dev": true, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@semantic-release/github": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-8.1.0.tgz", - "integrity": "sha512-erR9E5rpdsz0dW1I7785JtndQuMWN/iDcemcptf67tBNOmBUN0b2YNOgcjYUnBpgRpZ5ozfBHrK7Bz+2ets/Dg==", - "dev": true, - "peer": true, - "dependencies": { - "@octokit/core": "^4.2.1", - "@octokit/plugin-paginate-rest": "^6.1.2", - "@octokit/plugin-retry": "^4.1.3", - "@octokit/plugin-throttling": "^5.2.3", - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "debug": "^4.0.0", - "dir-glob": "^3.0.0", - "fs-extra": "^11.0.0", - "globby": "^11.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "issue-parser": "^6.0.0", - "lodash": "^4.17.4", - "mime": "^3.0.0", - "p-filter": "^2.0.0", - "url-join": "^4.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@semantic-release/npm": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-9.0.2.tgz", - "integrity": "sha512-zgsynF6McdzxPnFet+a4iO9HpAlARXOM5adz7VGVCvj0ne8wtL2ZOQoDV2wZPDmdEotDIbVeJjafhelZjs9j6g==", - "dev": true, - "peer": true, - "dependencies": { - "@semantic-release/error": "^3.0.0", - "aggregate-error": "^3.0.0", - "execa": "^5.0.0", - "fs-extra": "^11.0.0", - "lodash": "^4.17.15", - "nerf-dart": "^1.0.0", - "normalize-url": "^6.0.0", - "npm": "^8.3.0", - "rc": "^1.2.8", - "read-pkg": "^5.0.0", - "registry-auth-token": "^5.0.0", - "semver": "^7.1.2", - "tempy": "^1.0.0" - }, - "engines": { - "node": ">=16 || ^14.17" - }, - "peerDependencies": { - "semantic-release": ">=19.0.0" - } - }, - "node_modules/@semantic-release/release-notes-generator": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-10.0.3.tgz", - "integrity": "sha512-k4x4VhIKneOWoBGHkx0qZogNjCldLPRiAjnIpMnlUh6PtaWXp/T+C9U7/TaNDDtgDa5HMbHl4WlREdxHio6/3w==", - "dev": true, - "peer": true, - "dependencies": { - "conventional-changelog-angular": "^5.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-filter": "^2.0.0", - "conventional-commits-parser": "^3.2.3", - "debug": "^4.0.0", - "get-stream": "^6.0.0", - "import-from": "^4.0.0", - "into-stream": "^6.0.0", - "lodash": "^4.17.4", - "read-pkg-up": "^7.0.0" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "semantic-release": ">=18.0.0-beta.1" - } - }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true, - "peer": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "dev": true, - "peer": true - }, - "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", - "dev": true, - "peer": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", - "dev": true, - "peer": true, - "dependencies": { - "type-fest": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "dev": true, - "peer": true - }, - "node_modules/argv-formatter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/argv-formatter/-/argv-formatter-1.0.0.tgz", - "integrity": "sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==", - "dev": true - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true, - "peer": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true, - "peer": true - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", - "dev": true, - "peer": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "peer": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "dev": true, - "peer": true, - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, - "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", - "dev": true, - "peer": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "peer": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "peer": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "peer": true, - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dev": true, - "peer": true, - "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/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, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "peer": true, - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "peer": true, - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "peer": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true, - "peer": true, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "peer": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dev": true, - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true, - "peer": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "peer": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "peer": true - }, - "node_modules/env-ci": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-5.5.0.tgz", - "integrity": "sha512-o0JdWIbOLP+WJKIUt36hz1ImQQFuN92nhsfTkHHap+J8CiI8WgGpH/a9jEGHh4/TU5BUUGjlnKXNoDb57+ne+A==", - "dev": true, - "peer": true, - "dependencies": { - "execa": "^5.0.0", - "fromentries": "^1.3.2", - "java-properties": "^1.0.0" - }, - "engines": { - "node": ">=10.17" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "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/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, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "peer": 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/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "peer": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/file-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/file-url/-/file-url-3.0.0.tgz", - "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-versions": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz", - "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==", - "dev": true, - "peer": true, - "dependencies": { - "semver-regex": "^3.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, - "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "peer": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "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/git-log-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/git-log-parser/-/git-log-parser-1.2.0.tgz", - "integrity": "sha512-rnCVNfkTL8tdNryFuaY0fYiBWEBcgF748O6ZI61rslBvr2o7U65c2/6npCRqH40vuAhtgtDiqLTJjBVdrejCzA==", - "dev": true, - "dependencies": { - "argv-formatter": "~1.0.0", - "spawn-error-forwarder": "~1.0.0", - "split2": "~1.0.0", - "stream-combiner2": "~1.1.1", - "through2": "~2.0.0", - "traverse": "~0.6.6" - } - }, - "node_modules/git-log-parser/node_modules/split2": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-1.0.0.tgz", - "integrity": "sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==", - "dev": true, - "dependencies": { - "through2": "~2.0.0" - } - }, - "node_modules/git-log-parser/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.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/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "peer": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hook-std": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hook-std/-/hook-std-2.0.0.tgz", - "integrity": "sha512-zZ6T5WcuBMIUVh49iPQS9t977t7C0l7OtHrpeMb5uk48JdflRX0NSFvCekfYNmGQETnLq9W/isMyHl69kxGi8g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", - "dev": true, - "peer": true, - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", - "dev": true, - "peer": true, - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "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, - "peer": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "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-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-from/-/import-from-4.0.0.tgz", - "integrity": "sha512-P9J71vT5nLlDeV8FHs5nNxaLbrpfAV5cF5srvbZfpwpcJoM/xZR3hiv+q+SAnuSmuGbXMWud063iIMx/V/EWZQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "peer": true - }, - "node_modules/into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", - "dev": true, - "peer": true, - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "peer": true, - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/issue-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", - "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", - "dev": true, - "peer": true, - "dependencies": { - "lodash.capitalize": "^4.2.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.uniqby": "^4.7.0" - }, - "engines": { - "node": ">=10.13" - } - }, - "node_modules/java-properties": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", - "integrity": "sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "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/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true, - "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-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "peer": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "peer": true - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "peer": true, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.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/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "peer": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "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, - "peer": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.capitalize": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", - "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "dev": true, - "peer": true - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true, - "peer": true - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true, - "peer": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "peer": true - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true, - "peer": true - }, - "node_modules/lodash.uniqby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", - "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", - "dev": true, - "peer": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, - "peer": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/marked-terminal": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.2.0.tgz", - "integrity": "sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-escapes": "^6.2.0", - "cardinal": "^2.1.1", - "chalk": "^5.2.0", - "cli-table3": "^0.6.3", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.3.0" - }, - "engines": { - "node": ">=14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "peer": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "peer": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "peer": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.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==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "peer": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "peer": true - }, - "node_modules/nerf-dart": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nerf-dart/-/nerf-dart-1.0.0.tgz", - "integrity": "sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==", - "dev": true, - "peer": true - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "peer": true, - "dependencies": { - "lodash": "^4.17.21" - } - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "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==", - "dev": true, - "peer": true, - "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/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm": { - "version": "8.19.4", - "resolved": "https://registry.npmjs.org/npm/-/npm-8.19.4.tgz", - "integrity": "sha512-3HANl8i9DKnUA89P4KEgVNN28EjSeDCmvEqbzOAuxCFDzdBZzjUl99zgnGpOUumvW5lvJo2HKcjrsc+tfyv1Hw==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/ci-detect", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/run-script", - "abbrev", - "archy", - "cacache", - "chalk", - "chownr", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "mkdirp", - "mkdirp-infer-owner", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "opener", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "read-package-json", - "read-package-json-fast", - "readdir-scoped-modules", - "rimraf", - "semver", - "ssri", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dev": true, - "peer": true, - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/config": "^4.2.1", - "@npmcli/fs": "^2.1.0", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/package-json": "^2.0.0", - "@npmcli/run-script": "^4.2.1", - "abbrev": "~1.1.1", - "archy": "~1.0.0", - "cacache": "^16.1.3", - "chalk": "^4.1.2", - "chownr": "^2.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.2", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.12", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "graceful-fs": "^4.2.10", - "hosted-git-info": "^5.2.1", - "ini": "^3.0.1", - "init-package-json": "^3.0.2", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^2.3.1", - "libnpmaccess": "^6.0.4", - "libnpmdiff": "^4.0.5", - "libnpmexec": "^4.0.14", - "libnpmfund": "^3.0.5", - "libnpmhook": "^8.0.4", - "libnpmorg": "^4.0.4", - "libnpmpack": "^4.1.3", - "libnpmpublish": "^6.0.5", - "libnpmsearch": "^5.0.4", - "libnpmteam": "^4.0.4", - "libnpmversion": "^3.0.7", - "make-fetch-happen": "^10.2.0", - "minimatch": "^5.1.0", - "minipass": "^3.1.6", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "ms": "^2.1.2", - "node-gyp": "^9.1.0", - "nopt": "^6.0.0", - "npm-audit-report": "^3.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.1.0", - "npm-pick-manifest": "^7.0.2", - "npm-profile": "^6.2.0", - "npm-registry-fetch": "^13.3.1", - "npm-user-validate": "^1.0.1", - "npmlog": "^6.0.2", - "opener": "^1.5.2", - "p-map": "^4.0.0", - "pacote": "^13.6.2", - "parse-conflict-json": "^2.0.2", - "proc-log": "^2.0.1", - "qrcode-terminal": "^0.12.0", - "read": "~1.0.7", - "read-package-json": "^5.0.2", - "read-package-json-fast": "^2.0.3", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.1", - "tar": "^6.1.11", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^2.0.0", - "validate-npm-package-name": "^4.0.0", - "which": "^2.0.2", - "write-file-atomic": "^4.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.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, - "peer": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "5.6.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/metavuln-calculator": "^3.0.1", - "@npmcli/move-file": "^2.0.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/package-json": "^2.0.0", - "@npmcli/query": "^1.2.0", - "@npmcli/run-script": "^4.1.3", - "bin-links": "^3.0.3", - "cacache": "^16.1.3", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^5.2.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "minimatch": "^5.1.0", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.0.0", - "npm-pick-manifest": "^7.0.2", - "npm-registry-fetch": "^13.0.0", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.0", - "treeverse": "^2.0.0", - "walk-up-path": "^1.0.0" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/ci-detect": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "4.2.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/map-workspaces": "^2.0.2", - "ini": "^3.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^6.0.0", - "proc-log": "^2.0.0", - "read-package-json-fast": "^2.0.3", - "semver": "^7.3.5", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "2.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^8.0.1", - "minimatch": "^5.0.1", - "read-package-json-fast": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "cacache": "^16.0.0", - "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "infer-owner": "^1.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "1.2.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-package-arg": "^9.1.0", - "postcss-selector-parser": "^6.0.10", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "4.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@tootallnate/once": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/agent-base": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/npm/node_modules/agentkeepalive": { - "version": "4.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/asap": { - "version": "2.0.6", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/bin-links": { - "version": "3.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "cmd-shim": "^5.0.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0", - "read-cmd-shim": "^3.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/bin-links/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/builtins": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "16.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "ip-regex": "^4.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "mkdirp-infer-owner": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/debuglog": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/depd": { - "version": "1.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/dezalgo": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/diff": { - "version": "5.1.0", - "dev": true, - "inBundle": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.12", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/gauge": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "8.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "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/npm/node_modules/graceful-fs": { - "version": "4.2.10", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/has": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/npm/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "5.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "5.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minimatch": "^5.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/ini": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-package-arg": "^9.0.1", - "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/ip": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "cidr-regex": "^3.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.10.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/just-diff": { - "version": "5.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.4.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "6.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "4.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/disparity-colors": "^2.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^5.0.1", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1", - "tar": "^6.1.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "4.0.14", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/arborist": "^5.6.3", - "@npmcli/ci-detect": "^2.0.0", - "@npmcli/fs": "^2.1.1", - "@npmcli/run-script": "^4.2.0", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^9.0.1", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "proc-log": "^2.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", - "semver": "^7.3.7", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "3.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/arborist": "^5.6.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "8.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "4.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/run-script": "^4.1.3", - "npm-package-arg": "^9.0.1", - "pacote": "^13.6.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "6.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "normalize-package-data": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0", - "semver": "^7.3.7", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "5.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "4.0.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "3.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/run-script": "^4.1.3", - "json-parse-even-better-errors": "^2.3.1", - "proc-log": "^2.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "7.13.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "10.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "5.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/minipass": { - "version": "3.3.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "2.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/mkdirp-infer-owner": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "0.0.8", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "9.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.22 || ^14.13 || >=16" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "4.0.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-normalize-package-bin": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-bundled/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "9.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "5.1.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "7.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^2.0.0", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "6.2.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "13.3.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "BSD-2-Clause", - "peer": true - }, - "node_modules/npm/node_modules/npmlog": { - "version": "6.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/once": { - "version": "1.4.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/opener": { - "version": "1.5.2", - "dev": true, - "inBundle": true, - "license": "(WTFPL OR MIT)", - "peer": true, - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/pacote": { - "version": "13.6.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.1", - "just-diff": "^5.0.1", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.10", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/proc-log": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "0.3.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "read": "1" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "peer": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/read": { - "version": "1.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json": { - "version": "5.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "2.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/read-package-json/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/readable-stream": { - "version": "3.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/readdir-scoped-modules": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.3.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.7.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "dev": true, - "inBundle": true, - "license": "CC-BY-3.0", - "peer": true - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.11", - "dev": true, - "inBundle": true, - "license": "CC0-1.0", - "peer": true - }, - "node_modules/npm/node_modules/ssri": { - "version": "9.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "6.1.11", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/treeverse": { - "version": "2.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/unique-filename": { - "version": "2.0.1", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "3.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "inBundle": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "1.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "peer": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/npm/node_modules/which": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "4.0.2", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "peer": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "peer": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "peer": true, - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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, - "peer": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "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, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "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/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", - "integrity": "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==", - "dev": true, - "peer": true, - "dependencies": { - "find-up": "^2.0.0", - "load-json-file": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "peer": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==", - "dev": true, - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true, - "peer": true - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ramda": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.25.0.tgz", - "integrity": "sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ==", - "dev": true - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "peer": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "peer": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/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==", - "dev": true - }, - "node_modules/read-pkg/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==", - "dev": true, - "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-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "peer": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "dev": true, - "peer": true, - "dependencies": { - "esprima": "~4.0.0" - } - }, - "node_modules/registry-auth-token": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", - "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", - "dev": true, - "peer": true, - "dependencies": { - "@pnpm/npm-conf": "^2.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/semantic-release": { - "version": "19.0.5", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-19.0.5.tgz", - "integrity": "sha512-NMPKdfpXTnPn49FDogMBi36SiBfXkSOJqCkk0E4iWOY1tusvvgBwqUmxTX1kmlT6kIYed9YwNKD1sfPpqa5yaA==", - "dev": true, - "peer": true, - "dependencies": { - "@semantic-release/commit-analyzer": "^9.0.2", - "@semantic-release/error": "^3.0.0", - "@semantic-release/github": "^8.0.0", - "@semantic-release/npm": "^9.0.0", - "@semantic-release/release-notes-generator": "^10.0.0", - "aggregate-error": "^3.0.0", - "cosmiconfig": "^7.0.0", - "debug": "^4.0.0", - "env-ci": "^5.0.0", - "execa": "^5.0.0", - "figures": "^3.0.0", - "find-versions": "^4.0.0", - "get-stream": "^6.0.0", - "git-log-parser": "^1.2.0", - "hook-std": "^2.0.0", - "hosted-git-info": "^4.0.0", - "lodash": "^4.17.21", - "marked": "^4.0.10", - "marked-terminal": "^5.0.0", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "p-reduce": "^2.0.0", - "read-pkg-up": "^7.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.3.2", - "semver-diff": "^3.1.1", - "signale": "^1.2.1", - "yargs": "^16.2.0" - }, - "bin": { - "semantic-release": "bin/semantic-release.js" - }, - "engines": { - "node": ">=16 || ^14.17" - } - }, - "node_modules/semantic-release-export-data": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semantic-release-export-data/-/semantic-release-export-data-1.0.1.tgz", - "integrity": "sha512-6vlgrrzzcMi/REhQd65Bh4dfSKmgwXOJ/Q2RVlT9WsU4Ya1T2qGpkSrMfG/n6oFRrqBdbDlyZgxNd94ziW+vSg==", - "dev": true, - "dependencies": { - "@actions/core": "^1.10.0" - }, - "peerDependencies": { - "semantic-release": ">=18" - } - }, - "node_modules/semantic-release-monorepo": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/semantic-release-monorepo/-/semantic-release-monorepo-7.0.8.tgz", - "integrity": "sha512-L2n7FZEYvjxXop6C7svk8xZH1/2N58CV1dN+veeAGZ8363FG+AKNKLN1r4wAL86e5xIu1HiOOASm10X+rN6XWg==", - "dev": true, - "dependencies": { - "debug": "^3.1.0", - "execa": "^0.8.0", - "file-url": "^3.0.0", - "fs-extra": "^10.0.1", - "get-stream": "^6.0.1", - "git-log-parser": "^1.2.0", - "p-each-series": "^2.1.0", - "p-limit": "^1.2.0", - "pkg-up": "^2.0.0", - "ramda": "^0.25.0", - "read-pkg": "^5.0.0", - "semantic-release-plugin-decorators": "^3.0.0", - "tempy": "1.0.1" - }, - "peerDependencies": { - "semantic-release": ">=15.11.x < 20" - } - }, - "node_modules/semantic-release-monorepo/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/semantic-release-monorepo/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/semantic-release-monorepo/node_modules/execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==", - "dev": true, - "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/execa/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/semantic-release-monorepo/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/semantic-release-monorepo/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/semantic-release-monorepo/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/semantic-release-monorepo/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/semantic-release-monorepo/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/semantic-release-monorepo/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/semantic-release-monorepo/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - }, - "node_modules/semantic-release-plugin-decorators": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/semantic-release-plugin-decorators/-/semantic-release-plugin-decorators-3.0.3.tgz", - "integrity": "sha512-YTB2z64yyqEzABJ3yFesV9s5izZ4oKdbYDTu/2whVdlGQYCwsWkw9XYRCnvXzPdWPSWYmCPdJwMJ5w433rncig==", - "dev": true, - "peerDependencies": { - "semantic-release": ">=11 < 20" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "peer": true, - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/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, - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-regex": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.4.tgz", - "integrity": "sha512-6IiqeZNgq01qGf0TId0t3NvKzSvUsjcpdEO3AQNeIjR6A2+ckTnQlDpl4qu1bjRv0RzN3FP9hzFmws3lKqRWkA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "peer": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/signale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz", - "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^2.3.2", - "figures": "^2.0.0", - "pkg-conf": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/signale/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, - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/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, - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/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, - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/signale/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, - "peer": true - }, - "node_modules/signale/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "dev": true, - "peer": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/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, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/signale/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, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "peer": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "peer": true, - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/split2/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==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "dev": true, - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "peer": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "peer": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", - "dev": true, - "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "peer": true - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "peer": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/through2/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==", - "dev": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "peer": true - }, - "node_modules/traverse": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", - "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, - "node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undici": { - "version": "5.28.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", - "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", - "dev": true, - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", - "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", - "dev": true, - "peer": true - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "dev": true, - "peer": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "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==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "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==", - "dev": true, - "peer": true - }, - "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==", - "dev": true, - "peer": true, - "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==", - "dev": true, - "peer": true, - "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==", - "dev": true, - "peer": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "peer": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "peer": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10" - } - } - } -} diff --git a/diode-server/cmd/distributor/package.json b/diode-server/cmd/distributor/package.json deleted file mode 100644 index 587b04ba..00000000 --- a/diode-server/cmd/distributor/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "diode-distributor", - "version": "0.1.0", - "extends": "semantic-release-monorepo", - "devDependencies": { - "semantic-release-monorepo": "^7.0.0", - "semantic-release-export-data": "^1.0.1", - "@semantic-release/changelog": "^6.0.3" - } -} diff --git a/diode-server/cmd/ingester/main.go b/diode-server/cmd/ingester/main.go index f26ec4b9..7c8e8087 100644 --- a/diode-server/cmd/ingester/main.go +++ b/diode-server/cmd/ingester/main.go @@ -4,6 +4,8 @@ import ( "context" "os" + "github.com/getsentry/sentry-go" + "github.com/netboxlabs/diode/diode-server/ingester" "github.com/netboxlabs/diode/diode-server/server" ) @@ -12,6 +14,8 @@ func main() { ctx := context.Background() s := server.New(ctx, "diode-ingester") + defer s.Recover(sentry.CurrentHub()) + ingesterComponent, err := ingester.New(ctx, s.Logger()) if err != nil { s.Logger().Error("failed to instantiate ingester component", "error", err) @@ -23,6 +27,8 @@ func main() { os.Exit(1) } + //TODO: instantiate prometheus server + if err := s.Run(); err != nil { s.Logger().Error("server failure", "serverName", s.Name(), "error", err) os.Exit(1) diff --git a/diode-server/cmd/ingester/package-lock.json b/diode-server/cmd/ingester/package-lock.json index f935c5cb..2735790c 100644 --- a/diode-server/cmd/ingester/package-lock.json +++ b/diode-server/cmd/ingester/package-lock.json @@ -6697,9 +6697,9 @@ } }, "node_modules/undici": { - "version": "5.28.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", - "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", "dev": true, "dependencies": { "@fastify/busboy": "^2.0.0" diff --git a/diode-server/cmd/ingester/package.json b/diode-server/cmd/ingester/package.json index 38782845..7005118c 100644 --- a/diode-server/cmd/ingester/package.json +++ b/diode-server/cmd/ingester/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "extends": "semantic-release-monorepo", "devDependencies": { - "semantic-release-monorepo": "^7.0.0", + "semantic-release-monorepo": "^7.0.8", "semantic-release-export-data": "^1.0.1", "@semantic-release/changelog": "^6.0.3" } diff --git a/diode-server/cmd/reconciler/main.go b/diode-server/cmd/reconciler/main.go index 377cb79c..57fe5ab2 100644 --- a/diode-server/cmd/reconciler/main.go +++ b/diode-server/cmd/reconciler/main.go @@ -4,6 +4,8 @@ import ( "context" "os" + "github.com/getsentry/sentry-go" + "github.com/netboxlabs/diode/diode-server/reconciler" "github.com/netboxlabs/diode/diode-server/server" ) @@ -12,19 +14,31 @@ func main() { ctx := context.Background() s := server.New(ctx, "diode-reconciler") - reconcilerComponent, err := reconciler.New(s.Logger()) + defer s.Recover(sentry.CurrentHub()) + + ingestionProcessor, err := reconciler.NewIngestionProcessor(ctx, s.Logger()) + if err != nil { + s.Logger().Error("failed to instantiate ingestion processor", "error", err) + os.Exit(1) + } + + if err := s.RegisterComponent(ingestionProcessor); err != nil { + s.Logger().Error("failed to register ingestion processor", "error", err) + os.Exit(1) + } + + gRPCServer, err := reconciler.NewServer(ctx, s.Logger()) if err != nil { - s.Logger().Error("failed to instantiate reconciler component", "error", err) + s.Logger().Error("failed to instantiate gRPC server", "error", err) os.Exit(1) } - if err := s.RegisterComponent(reconcilerComponent); err != nil { - s.Logger().Error("failed to register reconciler component", "error", err) + if err := s.RegisterComponent(gRPCServer); err != nil { + s.Logger().Error("failed to register gRPC server", "error", err) os.Exit(1) } - // instantiate a prom service for /metrics - // prometheusSvc, err := prometheus.New() + //TODO: instantiate prometheus server if err := s.Run(); err != nil { s.Logger().Error("server failure", "serverName", s.Name(), "error", err) diff --git a/diode-server/cmd/reconciler/package-lock.json b/diode-server/cmd/reconciler/package-lock.json index 449d71ca..284eaf3c 100644 --- a/diode-server/cmd/reconciler/package-lock.json +++ b/diode-server/cmd/reconciler/package-lock.json @@ -6697,9 +6697,9 @@ } }, "node_modules/undici": { - "version": "5.28.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", - "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", "dev": true, "dependencies": { "@fastify/busboy": "^2.0.0" diff --git a/diode-server/cmd/reconciler/package.json b/diode-server/cmd/reconciler/package.json index d68adfed..43ee83db 100644 --- a/diode-server/cmd/reconciler/package.json +++ b/diode-server/cmd/reconciler/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "extends": "semantic-release-monorepo", "devDependencies": { - "semantic-release-monorepo": "^7.0.0", + "semantic-release-monorepo": "^7.0.8", "semantic-release-export-data": "^1.0.1", "@semantic-release/changelog": "^6.0.3" } diff --git a/diode-server/distributor/component.go b/diode-server/distributor/component.go deleted file mode 100644 index e293b82b..00000000 --- a/diode-server/distributor/component.go +++ /dev/null @@ -1,151 +0,0 @@ -package distributor - -import ( - "context" - "fmt" - "log/slog" - "net" - "time" - - "github.com/kelseyhightower/envconfig" - pb "github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb" - "github.com/redis/go-redis/v9" - "google.golang.org/grpc" - "google.golang.org/grpc/reflection" - "google.golang.org/protobuf/proto" -) - -const ( - // DefaultRequestStream is the default stream to use when none is provided - DefaultRequestStream = "latest" - - streamID = "diode.v1.ingest-stream" -) - -// Component is a gRPC server that handles data ingestion requests -type Component struct { - pb.UnimplementedDistributorServiceServer - - ctx context.Context - config Config - logger *slog.Logger - grpcListener net.Listener - grpcServer *grpc.Server - redisClient *redis.Client -} - -// New creates a new distributor component -func New(ctx context.Context, logger *slog.Logger) (*Component, error) { - var cfg Config - envconfig.MustProcess("", &cfg) - - grpcListener, err := net.Listen("tcp", fmt.Sprintf(":%d", cfg.GRPCPort)) - if err != nil { - return nil, fmt.Errorf("failed to listen on port %d: %v", cfg.GRPCPort, err) - } - - redisClient := redis.NewClient(&redis.Options{ - Addr: fmt.Sprintf("%s:%s", cfg.RedisHost, cfg.RedisPort), - Password: cfg.RedisPassword, - DB: cfg.RedisStreamDB, - }) - - if _, err := redisClient.Ping(ctx).Result(); err != nil { - return nil, fmt.Errorf("failed connection to %s: %v", redisClient.String(), err) - } - - grpcServer := grpc.NewServer() - component := &Component{ - ctx: ctx, - config: cfg, - logger: logger, - grpcListener: grpcListener, - grpcServer: grpcServer, - redisClient: redisClient, - } - pb.RegisterDistributorServiceServer(grpcServer, component) - reflection.Register(grpcServer) - - return component, nil -} - -// Name returns the name of the component -func (c *Component) Name() string { - return "distributor" -} - -// Start starts the component -func (c *Component) Start(_ context.Context) error { - c.logger.Info("starting component", "name", c.Name(), "port", c.config.GRPCPort) - return c.grpcServer.Serve(c.grpcListener) -} - -// Stop stops the component -func (c *Component) Stop() error { - c.logger.Info("stopping component", "name", c.Name()) - c.grpcServer.GracefulStop() - return c.redisClient.Close() -} - -// Push handles a push request -func (c *Component) Push(ctx context.Context, in *pb.PushRequest) (*pb.PushResponse, error) { - if err := validatePushRequest(in); err != nil { - return nil, err - } - - errs := make([]string, 0) - - encodedRequest, err := proto.Marshal(in) - if err != nil { - c.logger.Error("failed to marshal request", "error", err, "request", in) - } - - for i, v := range in.GetData() { - if v.GetData() == nil { - errs = append(errs, fmt.Sprintf("data for index %d is nil", i)) - continue - } - } - - msg := map[string]interface{}{ - "request": encodedRequest, - "ingestion_ts": time.Now().UnixNano(), - } - - if err := c.redisClient.XAdd(ctx, &redis.XAddArgs{ - Stream: streamID, - Values: msg, - }).Err(); err != nil { - c.logger.Error("failed to add element to the stream", "error", err, "streamID", streamID, "value", msg) - } - - return &pb.PushResponse{Errors: errs}, nil -} - -func validatePushRequest(in *pb.PushRequest) error { - if in.GetId() == "" { - return fmt.Errorf("id is empty") - } - - if in.GetProducerAppName() == "" { - return fmt.Errorf("producer app name is empty") - } - - if in.GetProducerAppVersion() == "" { - return fmt.Errorf("producer app version is empty") - } - - if in.GetSdkName() == "" { - return fmt.Errorf("sdk name is empty") - } - - if in.GetSdkVersion() == "" { - return fmt.Errorf("sdk version is empty") - } - - if len(in.GetData()) < 1 { - return fmt.Errorf("data is empty") - } - - return nil -} diff --git a/diode-server/distributor/config.go b/diode-server/distributor/config.go deleted file mode 100644 index ddb04beb..00000000 --- a/diode-server/distributor/config.go +++ /dev/null @@ -1,10 +0,0 @@ -package distributor - -// Config is the configuration for the distributor service -type Config struct { - GRPCPort int `envconfig:"GRPC_PORT" default:"8081"` - RedisHost string `envconfig:"REDIS_HOST" default:"127.0.0.1"` - RedisPort string `envconfig:"REDIS_PORT" default:"6379"` - RedisPassword string `envconfig:"REDIS_PASSWORD" required:"true"` - RedisStreamDB int `envconfig:"REDIS_STREAM_DB" default:"0"` -} diff --git a/diode-server/docker/Dockerfile b/diode-server/docker/Dockerfile index 783aa076..b9194772 100644 --- a/diode-server/docker/Dockerfile +++ b/diode-server/docker/Dockerfile @@ -11,6 +11,7 @@ LABEL org.opencontainers.image.documentation="https://github.com/netboxlabs/diod LABEL org.opencontainers.image.description="NetBox Labs diode $SVC image" LABEL org.opencontainers.image.vendor="NetBox Labs, Inc" LABEL org.opencontainers.image.authors="techops@netboxlabs.com" +LABEL org.opencontainers.image.licenses="PolyForm Shield License 1.0.0" COPY build/$SVC /usr/local/bin/diode-server diff --git a/diode-server/docker/Dockerfile-build b/diode-server/docker/Dockerfile-build new file mode 100644 index 00000000..ab8e2f09 --- /dev/null +++ b/diode-server/docker/Dockerfile-build @@ -0,0 +1,33 @@ +ARG GO_VERSION=1.22 + +FROM --platform=$BUILDPLATFORM golang:${GO_VERSION}-alpine AS build + +WORKDIR /diode-server + +COPY . . + +ARG TARGETOS TARGETARCH SVC + +RUN --mount=target=. \ + --mount=type=cache,target=/root/.cache/go-build \ + --mount=type=cache,target=/go/pkg \ + GOOS=$TARGETOS GOARCH=$TARGETARCH go build -o /build/$SVC ./cmd/$SVC + +FROM gcr.io/distroless/base:latest + +USER nonroot + +ARG SVC + +COPY --from=build /build/$SVC /usr/local/bin/diode-server + +LABEL maintainer="techops@netboxlabs.com" +LABEL org.opencontainers.image.title="Diode $SVC" +LABEL org.opencontainers.image.url="https://github.com/netboxlabs/diode" +LABEL org.opencontainers.image.documentation="https://github.com/netboxlabs/diode" +LABEL org.opencontainers.image.description="NetBox Labs diode $SVC image" +LABEL org.opencontainers.image.vendor="NetBox Labs, Inc" +LABEL org.opencontainers.image.authors="techops@netboxlabs.com" +LABEL org.opencontainers.image.licenses="PolyForm Shield License 1.0.0" + +CMD ["/usr/local/bin/diode-server"] diff --git a/diode-server/docker/diode/env/distributor.env b/diode-server/docker/diode/env/distributor.env deleted file mode 100644 index a89183c6..00000000 --- a/diode-server/docker/diode/env/distributor.env +++ /dev/null @@ -1,4 +0,0 @@ -API_KEY=CHANGE_.ME -REDIS_PASSWORD=@FmnLoA*VnebyVnZoL.!-.6z -REDIS_HOST=diode-redis -REDIS_PORT=6379 diff --git a/diode-server/docker/diode/env/ingester.env b/diode-server/docker/diode/env/ingester.env deleted file mode 100644 index b60c344a..00000000 --- a/diode-server/docker/diode/env/ingester.env +++ /dev/null @@ -1,3 +0,0 @@ -REDIS_PASSWORD=@FmnLoA*VnebyVnZoL.!-.6z -REDIS_HOST=diode-redis -REDIS_PORT=6379 diff --git a/diode-server/docker/diode/env/reconciler.env b/diode-server/docker/diode/env/reconciler.env deleted file mode 100644 index a89183c6..00000000 --- a/diode-server/docker/diode/env/reconciler.env +++ /dev/null @@ -1,4 +0,0 @@ -API_KEY=CHANGE_.ME -REDIS_PASSWORD=@FmnLoA*VnebyVnZoL.!-.6z -REDIS_HOST=diode-redis -REDIS_PORT=6379 diff --git a/diode-server/docker/diode/env/redis.env b/diode-server/docker/diode/env/redis.env deleted file mode 100644 index 3f94e0b5..00000000 --- a/diode-server/docker/diode/env/redis.env +++ /dev/null @@ -1 +0,0 @@ -REDIS_PASSWORD=@FmnLoA*VnebyVnZoL.!-.6z diff --git a/diode-server/docker/diode/redis/bootstrap.sh b/diode-server/docker/diode/redis/bootstrap.sh deleted file mode 100755 index 75fe23e7..00000000 --- a/diode-server/docker/diode/redis/bootstrap.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -redis-cli -h diode-redis -p 6379 -a "$REDIS_PASSWORD" FT.CREATE ingest-entity ON JSON PREFIX 1 "ingest-entity:" SCHEMA $.data_type AS data_type TEXT $.state AS state NUMERIC diff --git a/diode-server/docker/docker-compose.netbox.override.yml b/diode-server/docker/docker-compose.netbox.override.yml deleted file mode 100644 index 16c41695..00000000 --- a/diode-server/docker/docker-compose.netbox.override.yml +++ /dev/null @@ -1,9 +0,0 @@ -version: '3.8' -services: - netbox: - environment: - SKIP_SUPERUSER: "false" - SUPERUSER_API_TOKEN: "" - SUPERUSER_EMAIL: "" - SUPERUSER_NAME: "admin" - SUPERUSER_PASSWORD: "admin" diff --git a/diode-server/docker/docker-compose.netbox.yaml b/diode-server/docker/docker-compose.netbox.yaml index 187de0b4..33bf3610 100644 --- a/diode-server/docker/docker-compose.netbox.yaml +++ b/diode-server/docker/docker-compose.netbox.yaml @@ -1,7 +1,10 @@ -version: '3.8' services: netbox: &netbox - image: docker.io/netboxcommunity/netbox:${VERSION-v3.7-2.8.0} + image: netboxcommunity/netbox:v4.0-2.9.1-diode + build: + context: . + dockerfile: netbox/Dockerfile-diode + pull: true depends_on: - netbox-postgres - netbox-redis @@ -12,37 +15,23 @@ services: start_period: 60s timeout: 3s interval: 15s - test: "curl -f http://localhost:8080/api/ || exit 1" + test: "curl -f http://localhost:8080/netbox/api/ || exit 1" volumes: - - ./netbox/configuration:/etc/netbox/config:z,ro + - ./netbox/docker-entrypoint.sh:/opt/netbox/docker-entrypoint.sh:z,ro + - ./netbox/nginx-unit.json:/opt/netbox/nginx-unit.json:z,ro + - ./netbox/launch-netbox.sh:/opt/netbox/launch-netbox.sh:z,ro + - ./netbox/configure-diode-plugin.sh:/opt/netbox/configure-diode-plugin.sh:z,ro - netbox-media-files:/opt/netbox/netbox/media:rw - netbox-reports-files:/opt/netbox/netbox/reports:rw - netbox-scripts-files:/opt/netbox/netbox/scripts:rw ports: - "8000:8080" - netbox-worker: - <<: *netbox - depends_on: - netbox: - condition: service_healthy - ports: [ ] - command: - - /opt/netbox/venv/bin/python - - /opt/netbox/netbox/manage.py - - rqworker - healthcheck: - start_period: 20s - timeout: 3s - interval: 15s - test: "ps -aux | grep -v grep | grep -q rqworker || exit 1" - # postgres netbox-postgres: image: docker.io/postgres:16-alpine env_file: netbox/env/postgres.env volumes: - netbox-postgres-data:/var/lib/postgresql/data - # redis netbox-redis: image: docker.io/redis:7-alpine diff --git a/diode-server/docker/docker-compose.yaml b/diode-server/docker/docker-compose.yaml index bb29ae0e..967d7203 100644 --- a/diode-server/docker/docker-compose.yaml +++ b/diode-server/docker/docker-compose.yaml @@ -1,21 +1,73 @@ -version: '3.8' name: diode services: - diode-distributor: - image: netboxlabs/diode-distributor:${DIODE_VERSION}-${COMMIT_SHA} - env_file: diode/env/distributor.env + ingress-nginx: + image: nginx:latest + command: > + /bin/sh -c "echo 'upstream diode { + server diode-ingester:8081; + } + + upstream netbox { + server netbox:8080; + } + + server { + listen 80; + http2 on; + server_name localhost; + location /diode { + rewrite /diode/(.*) /$1 break; + grpc_pass grpc://diode; + } + location /netbox/static/ { + proxy_pass http://netbox/static/; + } + location /netbox/ { + proxy_pass http://netbox; + proxy_set_header X-Forwarded-Host $$http_host; + proxy_set_header X-Real-IP $$remote_addr; + proxy_set_header X-Forwarded-Proto $$scheme; + } + }' + > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'" + restart: always ports: - - "8081:8081" + - "80:80" depends_on: - - diode-redis + - diode-ingester + - diode-reconciler + diode-ingester: image: netboxlabs/diode-ingester:${DIODE_VERSION}-${COMMIT_SHA} - env_file: diode/env/ingester.env + environment: + - API_KEY=${RECONCILER_API_KEY} + - REDIS_PASSWORD=${REDIS_PASSWORD} + - REDIS_HOST=${REDIS_HOST} + - REDIS_PORT=${REDIS_PORT} + - RECONCILER_GRPC_HOST=${RECONCILER_GRPC_HOST} + - RECONCILER_GRPC_PORT=${RECONCILER_GRPC_PORT} + - SENTRY_DSN=${SENTRY_DSN} + restart: always + ports: + - "8081:8081" depends_on: - diode-redis + - diode-reconciler + diode-reconciler: image: netboxlabs/diode-reconciler:${DIODE_VERSION}-${COMMIT_SHA} - env_file: diode/env/reconciler.env + environment: + - REDIS_PASSWORD=${REDIS_PASSWORD} + - REDIS_HOST=${REDIS_HOST} + - REDIS_PORT=${REDIS_PORT} + - NETBOX_DIODE_PLUGIN_API_BASE_URL=${NETBOX_DIODE_PLUGIN_API_BASE_URL} + - DIODE_TO_NETBOX_API_KEY=${DIODE_TO_NETBOX_API_KEY} + - NETBOX_TO_DIODE_API_KEY=${NETBOX_TO_DIODE_API_KEY} + - INGESTION_API_KEY=${INGESTION_API_KEY} + - NETBOX_API_URL=${NETBOX_API_URL} + - LOGGING_LEVEL=${LOGGING_LEVEL} + - SENTRY_DSN=${SENTRY_DSN} + restart: always ports: - "8082:8081" depends_on: @@ -26,7 +78,8 @@ services: - sh - -c - redis-server --appendonly yes --requirepass $$REDIS_PASSWORD --loadmodule /opt/redis-stack/lib/rejson.so --loadmodule /opt/redis-stack/lib/redisearch.so - env_file: diode/env/redis.env + environment: + - REDIS_PASSWORD=${REDIS_PASSWORD} ports: - "6379:6379" volumes: @@ -35,10 +88,12 @@ services: image: redis/redis-stack-server:latest links: - diode-redis - command: ./home/redis/bootstrap.sh - env_file: diode/env/redis.env + command: redis-cli -h "$REDIS_HOST" -p 6379 -a "$REDIS_PASSWORD" FT.CREATE ingest-entity ON JSON PREFIX 1 "ingest-entity:" SCHEMA $.data_type AS data_type TEXT $.state AS state NUMERIC + environment: + - REDIS_HOST=${REDIS_HOST} + - REDIS_PASSWORD=${REDIS_PASSWORD} volumes: - ./diode/redis:/home/redis volumes: diode-redis-data: - driver: local + driver: local \ No newline at end of file diff --git a/diode-server/docker/netbox/Dockerfile-diode b/diode-server/docker/netbox/Dockerfile-diode new file mode 100644 index 00000000..ed42dd00 --- /dev/null +++ b/diode-server/docker/netbox/Dockerfile-diode @@ -0,0 +1,10 @@ +FROM netboxcommunity/netbox:v4.0-2.9.1 + +COPY ./netbox/configuration/ /etc/netbox/config/ +RUN chmod 755 /etc/netbox/config/* && \ + chown unit:root /etc/netbox/config/* + +COPY ./netbox/configure-diode-plugin.sh /opt/netbox/configure-diode-plugin.sh + +COPY ./netbox/requirements-plugins.txt /opt/netbox/ +RUN /opt/netbox/venv/bin/pip install --no-warn-script-location -r /opt/netbox/requirements-plugins.txt diff --git a/diode-server/docker/netbox/configuration/configuration.py b/diode-server/docker/netbox/configuration/configuration.py index 641a5e53..69317144 100644 --- a/diode-server/docker/netbox/configuration/configuration.py +++ b/diode-server/docker/netbox/configuration/configuration.py @@ -322,3 +322,4 @@ def _environ_get_and_map(variable_name: str, default: str | None = None, SHORT_TIME_FORMAT = environ.get('SHORT_TIME_FORMAT', 'H:i:s') DATETIME_FORMAT = environ.get('DATETIME_FORMAT', 'N j, Y g:i a') SHORT_DATETIME_FORMAT = environ.get('SHORT_DATETIME_FORMAT', 'Y-m-d H:i') +BASE_PATH = environ.get('BASE_PATH', '') diff --git a/diode-server/docker/netbox/configuration/plugins.py b/diode-server/docker/netbox/configuration/plugins.py index c0b1a1fb..16b015ab 100644 --- a/diode-server/docker/netbox/configuration/plugins.py +++ b/diode-server/docker/netbox/configuration/plugins.py @@ -4,10 +4,10 @@ # To learn how to build images with your required plugins # See https://github.com/netbox-community/netbox-docker/wiki/Using-Netbox-Plugins -# PLUGINS = ["netbox_bgp"] +# PLUGINS = ["netbox_diode_plugin"] # PLUGINS_CONFIG = { -# "netbox_bgp": { -# ADD YOUR SETTINGS HERE -# } +# "netbox_diode_plugin": { +# +# } # } diff --git a/diode-server/docker/netbox/configure-diode-plugin.sh b/diode-server/docker/netbox/configure-diode-plugin.sh new file mode 100755 index 00000000..716152c1 --- /dev/null +++ b/diode-server/docker/netbox/configure-diode-plugin.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +echo "🎛️ Configuring diode-netbox-plugin" + +echo "PLUGINS = [\"netbox_diode_plugin\"]" > /etc/netbox/config/plugins.py + +./manage.py configurediodeplugin || { echo "❌ enabling diode-netbox-plugin failed"; exit 1; } + +echo "✅ diode-netbox-plugin configured successfully!" diff --git a/diode-server/docker/netbox/docker-entrypoint.sh b/diode-server/docker/netbox/docker-entrypoint.sh new file mode 100755 index 00000000..fb25e67d --- /dev/null +++ b/diode-server/docker/netbox/docker-entrypoint.sh @@ -0,0 +1,100 @@ +#!/bin/bash +# Runs on every start of the NetBox Docker container + +# Stop when an error occures +set -e + +# Allows NetBox to be run as non-root users +umask 002 + +# Load correct Python3 env +# shellcheck disable=SC1091 +source /opt/netbox/venv/bin/activate + +# Try to connect to the DB +DB_WAIT_TIMEOUT=${DB_WAIT_TIMEOUT-3} +MAX_DB_WAIT_TIME=${MAX_DB_WAIT_TIME-30} +CUR_DB_WAIT_TIME=0 +while [ "${CUR_DB_WAIT_TIME}" -lt "${MAX_DB_WAIT_TIME}" ]; do + # Read and truncate connection error tracebacks to last line by default + exec {psfd}< <(./manage.py showmigrations 2>&1) + read -rd '' DB_ERR <&$psfd || : + exec {psfd}<&- + wait $! && break + if [ -n "$DB_WAIT_DEBUG" ]; then + echo "$DB_ERR" + else + readarray -tn 0 DB_ERR_LINES <<<"$DB_ERR" + echo "${DB_ERR_LINES[@]: -1}" + echo "[ Use DB_WAIT_DEBUG=1 in netbox.env to print full traceback for errors here ]" + fi + echo "⏳ Waiting on DB... (${CUR_DB_WAIT_TIME}s / ${MAX_DB_WAIT_TIME}s)" + sleep "${DB_WAIT_TIMEOUT}" + CUR_DB_WAIT_TIME=$((CUR_DB_WAIT_TIME + DB_WAIT_TIMEOUT)) +done +if [ "${CUR_DB_WAIT_TIME}" -ge "${MAX_DB_WAIT_TIME}" ]; then + echo "❌ Waited ${MAX_DB_WAIT_TIME}s or more for the DB to become ready." + exit 1 +fi +# Check if update is needed +if ! ./manage.py migrate --check >/dev/null 2>&1; then + echo "⚙️ Applying database migrations" + ./manage.py migrate --no-input + echo "⚙️ Running trace_paths" + ./manage.py trace_paths --no-input + echo "⚙️ Removing stale content types" + ./manage.py remove_stale_contenttypes --no-input + echo "⚙️ Removing expired user sessions" + ./manage.py clearsessions + echo "⚙️ Building search index (lazy)" + ./manage.py reindex --lazy +fi + +# Create Superuser if required +if [ "$SKIP_SUPERUSER" == "true" ]; then + echo "↩️ Skip creating the superuser" +else + if [ -z ${SUPERUSER_NAME+x} ]; then + SUPERUSER_NAME='admin' + fi + if [ -z ${SUPERUSER_EMAIL+x} ]; then + SUPERUSER_EMAIL='admin@example.com' + fi + if [ -f "/run/secrets/superuser_password" ]; then + SUPERUSER_PASSWORD="$( diode.v1.DeviceType + 7, // 1: diode.v1.Device.role:type_name -> diode.v1.Role + 5, // 2: diode.v1.Device.platform:type_name -> diode.v1.Platform + 8, // 3: diode.v1.Device.site:type_name -> diode.v1.Site + 9, // 4: diode.v1.Device.tags:type_name -> diode.v1.Tag + 2, // 5: diode.v1.Device.primary_ip4:type_name -> diode.v1.IPAddress + 2, // 6: diode.v1.Device.primary_ip6:type_name -> diode.v1.IPAddress + 0, // 7: diode.v1.Interface.device:type_name -> diode.v1.Device + 9, // 8: diode.v1.Interface.tags:type_name -> diode.v1.Tag + 1, // 9: diode.v1.IPAddress.interface:type_name -> diode.v1.Interface + 9, // 10: diode.v1.IPAddress.tags:type_name -> diode.v1.Tag + 4, // 11: diode.v1.DeviceType.manufacturer:type_name -> diode.v1.Manufacturer + 9, // 12: diode.v1.DeviceType.tags:type_name -> diode.v1.Tag + 9, // 13: diode.v1.Manufacturer.tags:type_name -> diode.v1.Tag + 4, // 14: diode.v1.Platform.manufacturer:type_name -> diode.v1.Manufacturer + 9, // 15: diode.v1.Platform.tags:type_name -> diode.v1.Tag + 8, // 16: diode.v1.Prefix.site:type_name -> diode.v1.Site + 9, // 17: diode.v1.Prefix.tags:type_name -> diode.v1.Tag + 9, // 18: diode.v1.Role.tags:type_name -> diode.v1.Tag + 9, // 19: diode.v1.Site.tags:type_name -> diode.v1.Tag + 8, // 20: diode.v1.Entity.site:type_name -> diode.v1.Site + 5, // 21: diode.v1.Entity.platform:type_name -> diode.v1.Platform + 4, // 22: diode.v1.Entity.manufacturer:type_name -> diode.v1.Manufacturer + 0, // 23: diode.v1.Entity.device:type_name -> diode.v1.Device + 7, // 24: diode.v1.Entity.device_role:type_name -> diode.v1.Role + 3, // 25: diode.v1.Entity.device_type:type_name -> diode.v1.DeviceType + 1, // 26: diode.v1.Entity.interface:type_name -> diode.v1.Interface + 2, // 27: diode.v1.Entity.ip_address:type_name -> diode.v1.IPAddress + 6, // 28: diode.v1.Entity.prefix:type_name -> diode.v1.Prefix + 13, // 29: diode.v1.Entity.timestamp:type_name -> google.protobuf.Timestamp + 10, // 30: diode.v1.IngestRequest.entities:type_name -> diode.v1.Entity + 11, // 31: diode.v1.IngesterService.Ingest:input_type -> diode.v1.IngestRequest + 12, // 32: diode.v1.IngesterService.Ingest:output_type -> diode.v1.IngestResponse + 32, // [32:33] is the sub-list for method output_type + 31, // [31:32] is the sub-list for method input_type + 31, // [31:31] is the sub-list for extension type_name + 31, // [31:31] is the sub-list for extension extendee + 0, // [0:31] is the sub-list for field type_name +} + +func init() { file_diode_v1_ingester_proto_init() } +func file_diode_v1_ingester_proto_init() { + if File_diode_v1_ingester_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_diode_v1_ingester_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Device); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_diode_v1_ingester_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Interface); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_diode_v1_ingester_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IPAddress); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_diode_v1_ingester_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeviceType); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_diode_v1_ingester_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Manufacturer); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_diode_v1_ingester_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Platform); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_diode_v1_ingester_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Prefix); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_diode_v1_ingester_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Role); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_diode_v1_ingester_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Site); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_diode_v1_ingester_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Tag); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_diode_v1_ingester_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Entity); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_diode_v1_ingester_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IngestRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_diode_v1_ingester_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IngestResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_diode_v1_ingester_proto_msgTypes[2].OneofWrappers = []interface{}{ + (*IPAddress_Interface)(nil), + } + file_diode_v1_ingester_proto_msgTypes[10].OneofWrappers = []interface{}{ + (*Entity_Site)(nil), + (*Entity_Platform)(nil), + (*Entity_Manufacturer)(nil), + (*Entity_Device)(nil), + (*Entity_DeviceRole)(nil), + (*Entity_DeviceType)(nil), + (*Entity_Interface)(nil), + (*Entity_IpAddress)(nil), + (*Entity_Prefix)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_diode_v1_ingester_proto_rawDesc, + NumEnums: 0, + NumMessages: 13, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_diode_v1_ingester_proto_goTypes, + DependencyIndexes: file_diode_v1_ingester_proto_depIdxs, + MessageInfos: file_diode_v1_ingester_proto_msgTypes, + }.Build() + File_diode_v1_ingester_proto = out.File + file_diode_v1_ingester_proto_rawDesc = nil + file_diode_v1_ingester_proto_goTypes = nil + file_diode_v1_ingester_proto_depIdxs = nil +} diff --git a/diode-server/gen/diode/v1/diodepb/ingester.pb.validate.go b/diode-server/gen/diode/v1/diodepb/ingester.pb.validate.go new file mode 100644 index 00000000..21e50c4c --- /dev/null +++ b/diode-server/gen/diode/v1/diodepb/ingester.pb.validate.go @@ -0,0 +1,3273 @@ +// Code generated by protoc-gen-validate. DO NOT EDIT. +// source: diode/v1/ingester.proto + +package diodepb + +import ( + "bytes" + "errors" + "fmt" + "net" + "net/mail" + "net/url" + "regexp" + "sort" + "strings" + "time" + "unicode/utf8" + + "google.golang.org/protobuf/types/known/anypb" +) + +// ensure the imports are used +var ( + _ = bytes.MinRead + _ = errors.New("") + _ = fmt.Print + _ = utf8.UTFMax + _ = (*regexp.Regexp)(nil) + _ = (*strings.Reader)(nil) + _ = net.IPv4len + _ = time.Duration(0) + _ = (*url.URL)(nil) + _ = (*mail.Address)(nil) + _ = anypb.Any{} + _ = sort.Sort +) + +// define the regex for a UUID once up-front +var _ingester_uuidPattern = regexp.MustCompile("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$") + +// Validate checks the field values on Device with the rules defined in the +// proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *Device) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on Device with the rules defined in the +// proto definition for this message. If any rules are violated, the result is +// a list of violation errors wrapped in DeviceMultiError, or nil if none found. +func (m *Device) ValidateAll() error { + return m.validate(true) +} + +func (m *Device) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if utf8.RuneCountInString(m.GetName()) > 64 { + err := DeviceValidationError{ + field: "Name", + reason: "value length must be at most 64 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + if l := utf8.RuneCountInString(m.GetDeviceFqdn()); l < 1 || l > 255 { + err := DeviceValidationError{ + field: "DeviceFqdn", + reason: "value length must be between 1 and 255 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetDeviceType()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, DeviceValidationError{ + field: "DeviceType", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, DeviceValidationError{ + field: "DeviceType", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetDeviceType()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DeviceValidationError{ + field: "DeviceType", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetRole()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, DeviceValidationError{ + field: "Role", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, DeviceValidationError{ + field: "Role", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetRole()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DeviceValidationError{ + field: "Role", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetPlatform()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, DeviceValidationError{ + field: "Platform", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, DeviceValidationError{ + field: "Platform", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetPlatform()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DeviceValidationError{ + field: "Platform", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if utf8.RuneCountInString(m.GetSerial()) > 50 { + err := DeviceValidationError{ + field: "Serial", + reason: "value length must be at most 50 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetSite()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, DeviceValidationError{ + field: "Site", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, DeviceValidationError{ + field: "Site", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetSite()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DeviceValidationError{ + field: "Site", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if utf8.RuneCountInString(m.GetAssetTag()) > 200 { + err := DeviceValidationError{ + field: "AssetTag", + reason: "value length must be at most 200 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + if _, ok := _Device_Status_InLookup[m.GetStatus()]; !ok { + err := DeviceValidationError{ + field: "Status", + reason: "value must be in list [offline active planned staged failed inventory decommissioning]", + } + if !all { + return err + } + errors = append(errors, err) + } + + if utf8.RuneCountInString(m.GetDescription()) > 200 { + err := DeviceValidationError{ + field: "Description", + reason: "value length must be at most 200 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + // no validation rules for Comments + + for idx, item := range m.GetTags() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, DeviceValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, DeviceValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DeviceValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if all { + switch v := interface{}(m.GetPrimaryIp4()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, DeviceValidationError{ + field: "PrimaryIp4", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, DeviceValidationError{ + field: "PrimaryIp4", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetPrimaryIp4()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DeviceValidationError{ + field: "PrimaryIp4", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetPrimaryIp6()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, DeviceValidationError{ + field: "PrimaryIp6", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, DeviceValidationError{ + field: "PrimaryIp6", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetPrimaryIp6()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DeviceValidationError{ + field: "PrimaryIp6", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return DeviceMultiError(errors) + } + + return nil +} + +// DeviceMultiError is an error wrapping multiple validation errors returned by +// Device.ValidateAll() if the designated constraints aren't met. +type DeviceMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m DeviceMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m DeviceMultiError) AllErrors() []error { return m } + +// DeviceValidationError is the validation error returned by Device.Validate if +// the designated constraints aren't met. +type DeviceValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DeviceValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DeviceValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DeviceValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DeviceValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DeviceValidationError) ErrorName() string { return "DeviceValidationError" } + +// Error satisfies the builtin error interface +func (e DeviceValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDevice.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DeviceValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DeviceValidationError{} + +var _Device_Status_InLookup = map[string]struct{}{ + "offline": {}, + "active": {}, + "planned": {}, + "staged": {}, + "failed": {}, + "inventory": {}, + "decommissioning": {}, +} + +// Validate checks the field values on Interface with the rules defined in the +// proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *Interface) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on Interface with the rules defined in +// the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in InterfaceMultiError, or nil +// if none found. +func (m *Interface) ValidateAll() error { + return m.validate(true) +} + +func (m *Interface) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if m.GetDevice() == nil { + err := InterfaceValidationError{ + field: "Device", + reason: "value is required", + } + if !all { + return err + } + errors = append(errors, err) + } + + if a := m.GetDevice(); a != nil { + + } + + if l := utf8.RuneCountInString(m.GetName()); l < 1 || l > 64 { + err := InterfaceValidationError{ + field: "Name", + reason: "value length must be between 1 and 64 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if l := utf8.RuneCountInString(m.GetLabel()); l < 1 || l > 64 { + err := InterfaceValidationError{ + field: "Label", + reason: "value length must be between 1 and 64 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if _, ok := _Interface_Type_InLookup[m.GetType()]; !ok { + err := InterfaceValidationError{ + field: "Type", + reason: "value must be in list [virtual bridge lag 100base-fx 100base-lfx 100base-tx 100base-t1 1000base-t 1000base-x-gbic 1000base-x-sfp 2.5gbase-t 5gbase-t 10gbase-t 10gbase-cx4 10gbase-x-sfpp 10gbase-x-xfp 10gbase-x-xenpak 10gbase-x-x2 25gbase-x-sfp28 50gbase-x-sfp56 40gbase-x-qsfpp 50gbase-x-sfp28 100gbase-x-cfp 100gbase-x-cfp2 100gbase-x-cfp4 100gbase-x-cxp 100gbase-x-cpak 100gbase-x-dsfp 100gbase-x-sfpdd 100gbase-x-qsfp28 100gbase-x-qsfpdd 200gbase-x-cfp2 200gbase-x-qsfp56 200gbase-x-qsfpdd 400gbase-x-cfp2 400gbase-x-qsfp112 400gbase-x-qsfpdd 400gbase-x-osfp 400gbase-x-osfp-rhs 400gbase-x-cdfp 400gbase-x-cfp8 800gbase-x-qsfpdd 800gbase-x-osfp 1000base-kx 10gbase-kr 10gbase-kx4 25gbase-kr 40gbase-kr4 50gbase-kr 100gbase-kp4 100gbase-kr2 100gbase-kr4 ieee802.11a ieee802.11g ieee802.11n ieee802.11ac ieee802.11ad ieee802.11ax ieee802.11ay ieee802.15.1 other-wireless gsm cdma lte sonet-oc3 sonet-oc12 sonet-oc48 sonet-oc192 sonet-oc768 sonet-oc1920 sonet-oc3840 1gfc-sfp 2gfc-sfp 4gfc-sfp 8gfc-sfpp 16gfc-sfpp 32gfc-sfp28 64gfc-qsfpp 128gfc-qsfp28 infiniband-sdr infiniband-ddr infiniband-qdr infiniband-fdr10 infiniband-fdr infiniband-edr infiniband-hdr infiniband-ndr infiniband-xdr t1 e1 t3 e3 xdsl docsis gpon xg-pon xgs-pon ng-pon2 epon 10g-epon cisco-stackwise cisco-stackwise-plus cisco-flexstack cisco-flexstack-plus cisco-stackwise-80 cisco-stackwise-160 cisco-stackwise-320 cisco-stackwise-480 cisco-stackwise-1t juniper-vcp extreme-summitstack extreme-summitstack-128 extreme-summitstack-256 extreme-summitstack-512 other]", + } + if !all { + return err + } + errors = append(errors, err) + } + + // no validation rules for Enabled + + if val := m.GetMtu(); val < 1 || val > 65536 { + err := InterfaceValidationError{ + field: "Mtu", + reason: "value must be inside range [1, 65536]", + } + if !all { + return err + } + errors = append(errors, err) + } + + // no validation rules for MacAddress + + if m.GetSpeed() < 0 { + err := InterfaceValidationError{ + field: "Speed", + reason: "value must be greater than or equal to 0", + } + if !all { + return err + } + errors = append(errors, err) + } + + // no validation rules for Wwn + + // no validation rules for MgmtOnly + + if utf8.RuneCountInString(m.GetDescription()) > 200 { + err := InterfaceValidationError{ + field: "Description", + reason: "value length must be at most 200 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + // no validation rules for MarkConnected + + if _, ok := _Interface_Mode_InLookup[m.GetMode()]; !ok { + err := InterfaceValidationError{ + field: "Mode", + reason: "value must be in list [access tagged tagged-all]", + } + if !all { + return err + } + errors = append(errors, err) + } + + for idx, item := range m.GetTags() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, InterfaceValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, InterfaceValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return InterfaceValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return InterfaceMultiError(errors) + } + + return nil +} + +// InterfaceMultiError is an error wrapping multiple validation errors returned +// by Interface.ValidateAll() if the designated constraints aren't met. +type InterfaceMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m InterfaceMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m InterfaceMultiError) AllErrors() []error { return m } + +// InterfaceValidationError is the validation error returned by +// Interface.Validate if the designated constraints aren't met. +type InterfaceValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e InterfaceValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e InterfaceValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e InterfaceValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e InterfaceValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e InterfaceValidationError) ErrorName() string { return "InterfaceValidationError" } + +// Error satisfies the builtin error interface +func (e InterfaceValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sInterface.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = InterfaceValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = InterfaceValidationError{} + +var _Interface_Type_InLookup = map[string]struct{}{ + "virtual": {}, + "bridge": {}, + "lag": {}, + "100base-fx": {}, + "100base-lfx": {}, + "100base-tx": {}, + "100base-t1": {}, + "1000base-t": {}, + "1000base-x-gbic": {}, + "1000base-x-sfp": {}, + "2.5gbase-t": {}, + "5gbase-t": {}, + "10gbase-t": {}, + "10gbase-cx4": {}, + "10gbase-x-sfpp": {}, + "10gbase-x-xfp": {}, + "10gbase-x-xenpak": {}, + "10gbase-x-x2": {}, + "25gbase-x-sfp28": {}, + "50gbase-x-sfp56": {}, + "40gbase-x-qsfpp": {}, + "50gbase-x-sfp28": {}, + "100gbase-x-cfp": {}, + "100gbase-x-cfp2": {}, + "100gbase-x-cfp4": {}, + "100gbase-x-cxp": {}, + "100gbase-x-cpak": {}, + "100gbase-x-dsfp": {}, + "100gbase-x-sfpdd": {}, + "100gbase-x-qsfp28": {}, + "100gbase-x-qsfpdd": {}, + "200gbase-x-cfp2": {}, + "200gbase-x-qsfp56": {}, + "200gbase-x-qsfpdd": {}, + "400gbase-x-cfp2": {}, + "400gbase-x-qsfp112": {}, + "400gbase-x-qsfpdd": {}, + "400gbase-x-osfp": {}, + "400gbase-x-osfp-rhs": {}, + "400gbase-x-cdfp": {}, + "400gbase-x-cfp8": {}, + "800gbase-x-qsfpdd": {}, + "800gbase-x-osfp": {}, + "1000base-kx": {}, + "10gbase-kr": {}, + "10gbase-kx4": {}, + "25gbase-kr": {}, + "40gbase-kr4": {}, + "50gbase-kr": {}, + "100gbase-kp4": {}, + "100gbase-kr2": {}, + "100gbase-kr4": {}, + "ieee802.11a": {}, + "ieee802.11g": {}, + "ieee802.11n": {}, + "ieee802.11ac": {}, + "ieee802.11ad": {}, + "ieee802.11ax": {}, + "ieee802.11ay": {}, + "ieee802.15.1": {}, + "other-wireless": {}, + "gsm": {}, + "cdma": {}, + "lte": {}, + "sonet-oc3": {}, + "sonet-oc12": {}, + "sonet-oc48": {}, + "sonet-oc192": {}, + "sonet-oc768": {}, + "sonet-oc1920": {}, + "sonet-oc3840": {}, + "1gfc-sfp": {}, + "2gfc-sfp": {}, + "4gfc-sfp": {}, + "8gfc-sfpp": {}, + "16gfc-sfpp": {}, + "32gfc-sfp28": {}, + "64gfc-qsfpp": {}, + "128gfc-qsfp28": {}, + "infiniband-sdr": {}, + "infiniband-ddr": {}, + "infiniband-qdr": {}, + "infiniband-fdr10": {}, + "infiniband-fdr": {}, + "infiniband-edr": {}, + "infiniband-hdr": {}, + "infiniband-ndr": {}, + "infiniband-xdr": {}, + "t1": {}, + "e1": {}, + "t3": {}, + "e3": {}, + "xdsl": {}, + "docsis": {}, + "gpon": {}, + "xg-pon": {}, + "xgs-pon": {}, + "ng-pon2": {}, + "epon": {}, + "10g-epon": {}, + "cisco-stackwise": {}, + "cisco-stackwise-plus": {}, + "cisco-flexstack": {}, + "cisco-flexstack-plus": {}, + "cisco-stackwise-80": {}, + "cisco-stackwise-160": {}, + "cisco-stackwise-320": {}, + "cisco-stackwise-480": {}, + "cisco-stackwise-1t": {}, + "juniper-vcp": {}, + "extreme-summitstack": {}, + "extreme-summitstack-128": {}, + "extreme-summitstack-256": {}, + "extreme-summitstack-512": {}, + "other": {}, +} + +var _Interface_Mode_InLookup = map[string]struct{}{ + "access": {}, + "tagged": {}, + "tagged-all": {}, +} + +// Validate checks the field values on IPAddress with the rules defined in the +// proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *IPAddress) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on IPAddress with the rules defined in +// the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in IPAddressMultiError, or nil +// if none found. +func (m *IPAddress) ValidateAll() error { + return m.validate(true) +} + +func (m *IPAddress) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if ip := net.ParseIP(m.GetAddress()); ip == nil { + err := IPAddressValidationError{ + field: "Address", + reason: "value must be a valid IP address", + } + if !all { + return err + } + errors = append(errors, err) + } + + if _, ok := _IPAddress_Status_InLookup[m.GetStatus()]; !ok { + err := IPAddressValidationError{ + field: "Status", + reason: "value must be in list [active reserved deprecated dhcp slaac]", + } + if !all { + return err + } + errors = append(errors, err) + } + + if _, ok := _IPAddress_Role_InLookup[m.GetRole()]; !ok { + err := IPAddressValidationError{ + field: "Role", + reason: "value must be in list [loopback secondary anycast vip vrrp hsrp glbp carp]", + } + if !all { + return err + } + errors = append(errors, err) + } + + if utf8.RuneCountInString(m.GetDnsName()) > 255 { + err := IPAddressValidationError{ + field: "DnsName", + reason: "value length must be at most 255 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + if !_IPAddress_DnsName_Pattern.MatchString(m.GetDnsName()) { + err := IPAddressValidationError{ + field: "DnsName", + reason: "value does not match regex pattern \"^([0-9A-Za-z_-]+|\\\\*)(\\\\.[0-9A-Za-z_-]+)*\\\\.?$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + if utf8.RuneCountInString(m.GetDescription()) > 200 { + err := IPAddressValidationError{ + field: "Description", + reason: "value length must be at most 200 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + // no validation rules for Comments + + for idx, item := range m.GetTags() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, IPAddressValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, IPAddressValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return IPAddressValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + switch v := m.AssignedObject.(type) { + case *IPAddress_Interface: + if v == nil { + err := IPAddressValidationError{ + field: "AssignedObject", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetInterface()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, IPAddressValidationError{ + field: "Interface", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, IPAddressValidationError{ + field: "Interface", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetInterface()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return IPAddressValidationError{ + field: "Interface", + reason: "embedded message failed validation", + cause: err, + } + } + } + + default: + _ = v // ensures v is used + } + + if len(errors) > 0 { + return IPAddressMultiError(errors) + } + + return nil +} + +// IPAddressMultiError is an error wrapping multiple validation errors returned +// by IPAddress.ValidateAll() if the designated constraints aren't met. +type IPAddressMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m IPAddressMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m IPAddressMultiError) AllErrors() []error { return m } + +// IPAddressValidationError is the validation error returned by +// IPAddress.Validate if the designated constraints aren't met. +type IPAddressValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e IPAddressValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e IPAddressValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e IPAddressValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e IPAddressValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e IPAddressValidationError) ErrorName() string { return "IPAddressValidationError" } + +// Error satisfies the builtin error interface +func (e IPAddressValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sIPAddress.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = IPAddressValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = IPAddressValidationError{} + +var _IPAddress_Status_InLookup = map[string]struct{}{ + "active": {}, + "reserved": {}, + "deprecated": {}, + "dhcp": {}, + "slaac": {}, +} + +var _IPAddress_Role_InLookup = map[string]struct{}{ + "loopback": {}, + "secondary": {}, + "anycast": {}, + "vip": {}, + "vrrp": {}, + "hsrp": {}, + "glbp": {}, + "carp": {}, +} + +var _IPAddress_DnsName_Pattern = regexp.MustCompile("^([0-9A-Za-z_-]+|\\*)(\\.[0-9A-Za-z_-]+)*\\.?$") + +// Validate checks the field values on DeviceType with the rules defined in the +// proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *DeviceType) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on DeviceType with the rules defined in +// the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in DeviceTypeMultiError, or +// nil if none found. +func (m *DeviceType) ValidateAll() error { + return m.validate(true) +} + +func (m *DeviceType) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if l := utf8.RuneCountInString(m.GetModel()); l < 1 || l > 100 { + err := DeviceTypeValidationError{ + field: "Model", + reason: "value length must be between 1 and 100 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if l := utf8.RuneCountInString(m.GetSlug()); l < 1 || l > 100 { + err := DeviceTypeValidationError{ + field: "Slug", + reason: "value length must be between 1 and 100 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if !_DeviceType_Slug_Pattern.MatchString(m.GetSlug()) { + err := DeviceTypeValidationError{ + field: "Slug", + reason: "value does not match regex pattern \"^[-a-zA-Z0-9_]+$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetManufacturer()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, DeviceTypeValidationError{ + field: "Manufacturer", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, DeviceTypeValidationError{ + field: "Manufacturer", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetManufacturer()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DeviceTypeValidationError{ + field: "Manufacturer", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if utf8.RuneCountInString(m.GetDescription()) > 200 { + err := DeviceTypeValidationError{ + field: "Description", + reason: "value length must be at most 200 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + // no validation rules for Comments + + if utf8.RuneCountInString(m.GetPartNumber()) > 50 { + err := DeviceTypeValidationError{ + field: "PartNumber", + reason: "value length must be at most 50 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + for idx, item := range m.GetTags() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, DeviceTypeValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, DeviceTypeValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return DeviceTypeValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return DeviceTypeMultiError(errors) + } + + return nil +} + +// DeviceTypeMultiError is an error wrapping multiple validation errors +// returned by DeviceType.ValidateAll() if the designated constraints aren't met. +type DeviceTypeMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m DeviceTypeMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m DeviceTypeMultiError) AllErrors() []error { return m } + +// DeviceTypeValidationError is the validation error returned by +// DeviceType.Validate if the designated constraints aren't met. +type DeviceTypeValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e DeviceTypeValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e DeviceTypeValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e DeviceTypeValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e DeviceTypeValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e DeviceTypeValidationError) ErrorName() string { return "DeviceTypeValidationError" } + +// Error satisfies the builtin error interface +func (e DeviceTypeValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sDeviceType.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = DeviceTypeValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = DeviceTypeValidationError{} + +var _DeviceType_Slug_Pattern = regexp.MustCompile("^[-a-zA-Z0-9_]+$") + +// Validate checks the field values on Manufacturer with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *Manufacturer) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on Manufacturer with the rules defined +// in the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in ManufacturerMultiError, or +// nil if none found. +func (m *Manufacturer) ValidateAll() error { + return m.validate(true) +} + +func (m *Manufacturer) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if l := utf8.RuneCountInString(m.GetName()); l < 1 || l > 100 { + err := ManufacturerValidationError{ + field: "Name", + reason: "value length must be between 1 and 100 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if l := utf8.RuneCountInString(m.GetSlug()); l < 1 || l > 100 { + err := ManufacturerValidationError{ + field: "Slug", + reason: "value length must be between 1 and 100 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if !_Manufacturer_Slug_Pattern.MatchString(m.GetSlug()) { + err := ManufacturerValidationError{ + field: "Slug", + reason: "value does not match regex pattern \"^[-a-zA-Z0-9_]+$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + if utf8.RuneCountInString(m.GetDescription()) > 200 { + err := ManufacturerValidationError{ + field: "Description", + reason: "value length must be at most 200 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + for idx, item := range m.GetTags() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ManufacturerValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ManufacturerValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ManufacturerValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return ManufacturerMultiError(errors) + } + + return nil +} + +// ManufacturerMultiError is an error wrapping multiple validation errors +// returned by Manufacturer.ValidateAll() if the designated constraints aren't met. +type ManufacturerMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ManufacturerMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m ManufacturerMultiError) AllErrors() []error { return m } + +// ManufacturerValidationError is the validation error returned by +// Manufacturer.Validate if the designated constraints aren't met. +type ManufacturerValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ManufacturerValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ManufacturerValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ManufacturerValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ManufacturerValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ManufacturerValidationError) ErrorName() string { return "ManufacturerValidationError" } + +// Error satisfies the builtin error interface +func (e ManufacturerValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sManufacturer.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ManufacturerValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ManufacturerValidationError{} + +var _Manufacturer_Slug_Pattern = regexp.MustCompile("^[-a-zA-Z0-9_]+$") + +// Validate checks the field values on Platform with the rules defined in the +// proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *Platform) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on Platform with the rules defined in +// the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in PlatformMultiError, or nil +// if none found. +func (m *Platform) ValidateAll() error { + return m.validate(true) +} + +func (m *Platform) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if l := utf8.RuneCountInString(m.GetName()); l < 1 || l > 100 { + err := PlatformValidationError{ + field: "Name", + reason: "value length must be between 1 and 100 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if l := utf8.RuneCountInString(m.GetSlug()); l < 1 || l > 100 { + err := PlatformValidationError{ + field: "Slug", + reason: "value length must be between 1 and 100 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if !_Platform_Slug_Pattern.MatchString(m.GetSlug()) { + err := PlatformValidationError{ + field: "Slug", + reason: "value does not match regex pattern \"^[-a-zA-Z0-9_]+$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetManufacturer()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, PlatformValidationError{ + field: "Manufacturer", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, PlatformValidationError{ + field: "Manufacturer", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetManufacturer()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PlatformValidationError{ + field: "Manufacturer", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if utf8.RuneCountInString(m.GetDescription()) > 200 { + err := PlatformValidationError{ + field: "Description", + reason: "value length must be at most 200 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + for idx, item := range m.GetTags() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, PlatformValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, PlatformValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PlatformValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return PlatformMultiError(errors) + } + + return nil +} + +// PlatformMultiError is an error wrapping multiple validation errors returned +// by Platform.ValidateAll() if the designated constraints aren't met. +type PlatformMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m PlatformMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m PlatformMultiError) AllErrors() []error { return m } + +// PlatformValidationError is the validation error returned by +// Platform.Validate if the designated constraints aren't met. +type PlatformValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e PlatformValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e PlatformValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e PlatformValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e PlatformValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e PlatformValidationError) ErrorName() string { return "PlatformValidationError" } + +// Error satisfies the builtin error interface +func (e PlatformValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sPlatform.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = PlatformValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = PlatformValidationError{} + +var _Platform_Slug_Pattern = regexp.MustCompile("^[-a-zA-Z0-9_]+$") + +// Validate checks the field values on Prefix with the rules defined in the +// proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *Prefix) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on Prefix with the rules defined in the +// proto definition for this message. If any rules are violated, the result is +// a list of violation errors wrapped in PrefixMultiError, or nil if none found. +func (m *Prefix) ValidateAll() error { + return m.validate(true) +} + +func (m *Prefix) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if ip := net.ParseIP(m.GetPrefix()); ip == nil { + err := PrefixValidationError{ + field: "Prefix", + reason: "value must be a valid IP address", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetSite()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, PrefixValidationError{ + field: "Site", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, PrefixValidationError{ + field: "Site", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetSite()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PrefixValidationError{ + field: "Site", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if _, ok := _Prefix_Status_InLookup[m.GetStatus()]; !ok { + err := PrefixValidationError{ + field: "Status", + reason: "value must be in list [active container reserved deprecated]", + } + if !all { + return err + } + errors = append(errors, err) + } + + // no validation rules for IsPool + + // no validation rules for MarkUtilized + + if utf8.RuneCountInString(m.GetDescription()) > 200 { + err := PrefixValidationError{ + field: "Description", + reason: "value length must be at most 200 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + // no validation rules for Comments + + for idx, item := range m.GetTags() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, PrefixValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, PrefixValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PrefixValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return PrefixMultiError(errors) + } + + return nil +} + +// PrefixMultiError is an error wrapping multiple validation errors returned by +// Prefix.ValidateAll() if the designated constraints aren't met. +type PrefixMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m PrefixMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m PrefixMultiError) AllErrors() []error { return m } + +// PrefixValidationError is the validation error returned by Prefix.Validate if +// the designated constraints aren't met. +type PrefixValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e PrefixValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e PrefixValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e PrefixValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e PrefixValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e PrefixValidationError) ErrorName() string { return "PrefixValidationError" } + +// Error satisfies the builtin error interface +func (e PrefixValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sPrefix.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = PrefixValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = PrefixValidationError{} + +var _Prefix_Status_InLookup = map[string]struct{}{ + "active": {}, + "container": {}, + "reserved": {}, + "deprecated": {}, +} + +// Validate checks the field values on Role with the rules defined in the proto +// definition for this message. If any rules are violated, the first error +// encountered is returned, or nil if there are no violations. +func (m *Role) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on Role with the rules defined in the +// proto definition for this message. If any rules are violated, the result is +// a list of violation errors wrapped in RoleMultiError, or nil if none found. +func (m *Role) ValidateAll() error { + return m.validate(true) +} + +func (m *Role) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if l := utf8.RuneCountInString(m.GetName()); l < 1 || l > 100 { + err := RoleValidationError{ + field: "Name", + reason: "value length must be between 1 and 100 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if l := utf8.RuneCountInString(m.GetSlug()); l < 1 || l > 100 { + err := RoleValidationError{ + field: "Slug", + reason: "value length must be between 1 and 100 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if !_Role_Slug_Pattern.MatchString(m.GetSlug()) { + err := RoleValidationError{ + field: "Slug", + reason: "value does not match regex pattern \"^[-a-zA-Z0-9_]+$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + if utf8.RuneCountInString(m.GetColor()) != 6 { + err := RoleValidationError{ + field: "Color", + reason: "value length must be 6 runes", + } + if !all { + return err + } + errors = append(errors, err) + + } + + if !_Role_Color_Pattern.MatchString(m.GetColor()) { + err := RoleValidationError{ + field: "Color", + reason: "value does not match regex pattern \"^[0-9a-f]{6}$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + if utf8.RuneCountInString(m.GetDescription()) > 200 { + err := RoleValidationError{ + field: "Description", + reason: "value length must be at most 200 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + for idx, item := range m.GetTags() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RoleValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RoleValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RoleValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return RoleMultiError(errors) + } + + return nil +} + +// RoleMultiError is an error wrapping multiple validation errors returned by +// Role.ValidateAll() if the designated constraints aren't met. +type RoleMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m RoleMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m RoleMultiError) AllErrors() []error { return m } + +// RoleValidationError is the validation error returned by Role.Validate if the +// designated constraints aren't met. +type RoleValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RoleValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RoleValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RoleValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RoleValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RoleValidationError) ErrorName() string { return "RoleValidationError" } + +// Error satisfies the builtin error interface +func (e RoleValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRole.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RoleValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RoleValidationError{} + +var _Role_Slug_Pattern = regexp.MustCompile("^[-a-zA-Z0-9_]+$") + +var _Role_Color_Pattern = regexp.MustCompile("^[0-9a-f]{6}$") + +// Validate checks the field values on Site with the rules defined in the proto +// definition for this message. If any rules are violated, the first error +// encountered is returned, or nil if there are no violations. +func (m *Site) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on Site with the rules defined in the +// proto definition for this message. If any rules are violated, the result is +// a list of violation errors wrapped in SiteMultiError, or nil if none found. +func (m *Site) ValidateAll() error { + return m.validate(true) +} + +func (m *Site) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if l := utf8.RuneCountInString(m.GetName()); l < 1 || l > 100 { + err := SiteValidationError{ + field: "Name", + reason: "value length must be between 1 and 100 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if l := utf8.RuneCountInString(m.GetSlug()); l < 1 || l > 100 { + err := SiteValidationError{ + field: "Slug", + reason: "value length must be between 1 and 100 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if !_Site_Slug_Pattern.MatchString(m.GetSlug()) { + err := SiteValidationError{ + field: "Slug", + reason: "value does not match regex pattern \"^[-a-zA-Z0-9_]+$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + if _, ok := _Site_Status_InLookup[m.GetStatus()]; !ok { + err := SiteValidationError{ + field: "Status", + reason: "value must be in list [planned staging active decommissioning retired]", + } + if !all { + return err + } + errors = append(errors, err) + } + + if utf8.RuneCountInString(m.GetFacility()) > 50 { + err := SiteValidationError{ + field: "Facility", + reason: "value length must be at most 50 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + // no validation rules for TimeZone + + if utf8.RuneCountInString(m.GetDescription()) > 200 { + err := SiteValidationError{ + field: "Description", + reason: "value length must be at most 200 runes", + } + if !all { + return err + } + errors = append(errors, err) + } + + // no validation rules for Comments + + for idx, item := range m.GetTags() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, SiteValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, SiteValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return SiteValidationError{ + field: fmt.Sprintf("Tags[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return SiteMultiError(errors) + } + + return nil +} + +// SiteMultiError is an error wrapping multiple validation errors returned by +// Site.ValidateAll() if the designated constraints aren't met. +type SiteMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m SiteMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m SiteMultiError) AllErrors() []error { return m } + +// SiteValidationError is the validation error returned by Site.Validate if the +// designated constraints aren't met. +type SiteValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e SiteValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e SiteValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e SiteValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e SiteValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e SiteValidationError) ErrorName() string { return "SiteValidationError" } + +// Error satisfies the builtin error interface +func (e SiteValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sSite.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = SiteValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = SiteValidationError{} + +var _Site_Slug_Pattern = regexp.MustCompile("^[-a-zA-Z0-9_]+$") + +var _Site_Status_InLookup = map[string]struct{}{ + "planned": {}, + "staging": {}, + "active": {}, + "decommissioning": {}, + "retired": {}, +} + +// Validate checks the field values on Tag with the rules defined in the proto +// definition for this message. If any rules are violated, the first error +// encountered is returned, or nil if there are no violations. +func (m *Tag) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on Tag with the rules defined in the +// proto definition for this message. If any rules are violated, the result is +// a list of violation errors wrapped in TagMultiError, or nil if none found. +func (m *Tag) ValidateAll() error { + return m.validate(true) +} + +func (m *Tag) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if l := utf8.RuneCountInString(m.GetName()); l < 1 || l > 100 { + err := TagValidationError{ + field: "Name", + reason: "value length must be between 1 and 100 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if l := utf8.RuneCountInString(m.GetSlug()); l < 1 || l > 100 { + err := TagValidationError{ + field: "Slug", + reason: "value length must be between 1 and 100 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if !_Tag_Slug_Pattern.MatchString(m.GetSlug()) { + err := TagValidationError{ + field: "Slug", + reason: "value does not match regex pattern \"^[-a-zA-Z0-9_]+$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + if utf8.RuneCountInString(m.GetColor()) != 6 { + err := TagValidationError{ + field: "Color", + reason: "value length must be 6 runes", + } + if !all { + return err + } + errors = append(errors, err) + + } + + if !_Tag_Color_Pattern.MatchString(m.GetColor()) { + err := TagValidationError{ + field: "Color", + reason: "value does not match regex pattern \"^[0-9a-f]{6}$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + if len(errors) > 0 { + return TagMultiError(errors) + } + + return nil +} + +// TagMultiError is an error wrapping multiple validation errors returned by +// Tag.ValidateAll() if the designated constraints aren't met. +type TagMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m TagMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m TagMultiError) AllErrors() []error { return m } + +// TagValidationError is the validation error returned by Tag.Validate if the +// designated constraints aren't met. +type TagValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e TagValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e TagValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e TagValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e TagValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e TagValidationError) ErrorName() string { return "TagValidationError" } + +// Error satisfies the builtin error interface +func (e TagValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sTag.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = TagValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = TagValidationError{} + +var _Tag_Slug_Pattern = regexp.MustCompile("^[-a-zA-Z0-9_]+$") + +var _Tag_Color_Pattern = regexp.MustCompile("^[0-9a-f]{6}$") + +// Validate checks the field values on Entity with the rules defined in the +// proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *Entity) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on Entity with the rules defined in the +// proto definition for this message. If any rules are violated, the result is +// a list of violation errors wrapped in EntityMultiError, or nil if none found. +func (m *Entity) ValidateAll() error { + return m.validate(true) +} + +func (m *Entity) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if m.GetTimestamp() == nil { + err := EntityValidationError{ + field: "Timestamp", + reason: "value is required", + } + if !all { + return err + } + errors = append(errors, err) + } + + if t := m.GetTimestamp(); t != nil { + ts, err := t.AsTime(), t.CheckValid() + if err != nil { + err = EntityValidationError{ + field: "Timestamp", + reason: "value is not a valid timestamp", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } else { + + now := time.Now() + + if ts.Sub(now) >= 0 { + err := EntityValidationError{ + field: "Timestamp", + reason: "value must be less than now", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + } + + switch v := m.Entity.(type) { + case *Entity_Site: + if v == nil { + err := EntityValidationError{ + field: "Entity", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetSite()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, EntityValidationError{ + field: "Site", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, EntityValidationError{ + field: "Site", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetSite()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return EntityValidationError{ + field: "Site", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case *Entity_Platform: + if v == nil { + err := EntityValidationError{ + field: "Entity", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetPlatform()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, EntityValidationError{ + field: "Platform", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, EntityValidationError{ + field: "Platform", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetPlatform()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return EntityValidationError{ + field: "Platform", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case *Entity_Manufacturer: + if v == nil { + err := EntityValidationError{ + field: "Entity", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetManufacturer()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, EntityValidationError{ + field: "Manufacturer", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, EntityValidationError{ + field: "Manufacturer", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetManufacturer()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return EntityValidationError{ + field: "Manufacturer", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case *Entity_Device: + if v == nil { + err := EntityValidationError{ + field: "Entity", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetDevice()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, EntityValidationError{ + field: "Device", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, EntityValidationError{ + field: "Device", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetDevice()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return EntityValidationError{ + field: "Device", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case *Entity_DeviceRole: + if v == nil { + err := EntityValidationError{ + field: "Entity", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetDeviceRole()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, EntityValidationError{ + field: "DeviceRole", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, EntityValidationError{ + field: "DeviceRole", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetDeviceRole()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return EntityValidationError{ + field: "DeviceRole", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case *Entity_DeviceType: + if v == nil { + err := EntityValidationError{ + field: "Entity", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetDeviceType()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, EntityValidationError{ + field: "DeviceType", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, EntityValidationError{ + field: "DeviceType", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetDeviceType()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return EntityValidationError{ + field: "DeviceType", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case *Entity_Interface: + if v == nil { + err := EntityValidationError{ + field: "Entity", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetInterface()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, EntityValidationError{ + field: "Interface", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, EntityValidationError{ + field: "Interface", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetInterface()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return EntityValidationError{ + field: "Interface", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case *Entity_IpAddress: + if v == nil { + err := EntityValidationError{ + field: "Entity", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetIpAddress()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, EntityValidationError{ + field: "IpAddress", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, EntityValidationError{ + field: "IpAddress", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetIpAddress()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return EntityValidationError{ + field: "IpAddress", + reason: "embedded message failed validation", + cause: err, + } + } + } + + case *Entity_Prefix: + if v == nil { + err := EntityValidationError{ + field: "Entity", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetPrefix()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, EntityValidationError{ + field: "Prefix", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, EntityValidationError{ + field: "Prefix", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetPrefix()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return EntityValidationError{ + field: "Prefix", + reason: "embedded message failed validation", + cause: err, + } + } + } + + default: + _ = v // ensures v is used + } + + if len(errors) > 0 { + return EntityMultiError(errors) + } + + return nil +} + +// EntityMultiError is an error wrapping multiple validation errors returned by +// Entity.ValidateAll() if the designated constraints aren't met. +type EntityMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m EntityMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m EntityMultiError) AllErrors() []error { return m } + +// EntityValidationError is the validation error returned by Entity.Validate if +// the designated constraints aren't met. +type EntityValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e EntityValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e EntityValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e EntityValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e EntityValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e EntityValidationError) ErrorName() string { return "EntityValidationError" } + +// Error satisfies the builtin error interface +func (e EntityValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sEntity.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = EntityValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = EntityValidationError{} + +// Validate checks the field values on IngestRequest with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *IngestRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on IngestRequest with the rules defined +// in the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in IngestRequestMultiError, or +// nil if none found. +func (m *IngestRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *IngestRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if l := utf8.RuneCountInString(m.GetStream()); l < 1 || l > 255 { + err := IngestRequestValidationError{ + field: "Stream", + reason: "value length must be between 1 and 255 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if l := len(m.GetEntities()); l < 1 || l > 1000 { + err := IngestRequestValidationError{ + field: "Entities", + reason: "value must contain between 1 and 1000 items, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + for idx, item := range m.GetEntities() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, IngestRequestValidationError{ + field: fmt.Sprintf("Entities[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, IngestRequestValidationError{ + field: fmt.Sprintf("Entities[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return IngestRequestValidationError{ + field: fmt.Sprintf("Entities[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if err := m._validateUuid(m.GetId()); err != nil { + err = IngestRequestValidationError{ + field: "Id", + reason: "value must be a valid UUID", + cause: err, + } + if !all { + return err + } + errors = append(errors, err) + } + + if l := utf8.RuneCountInString(m.GetProducerAppName()); l < 1 || l > 255 { + err := IngestRequestValidationError{ + field: "ProducerAppName", + reason: "value length must be between 1 and 255 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if l := utf8.RuneCountInString(m.GetProducerAppVersion()); l < 1 || l > 255 { + err := IngestRequestValidationError{ + field: "ProducerAppVersion", + reason: "value length must be between 1 and 255 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if l := utf8.RuneCountInString(m.GetSdkName()); l < 1 || l > 255 { + err := IngestRequestValidationError{ + field: "SdkName", + reason: "value length must be between 1 and 255 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if !_IngestRequest_SdkVersion_Pattern.MatchString(m.GetSdkVersion()) { + err := IngestRequestValidationError{ + field: "SdkVersion", + reason: "value does not match regex pattern \"^(\\\\d)+\\\\.(\\\\d)+\\\\.(\\\\d)+$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + if len(errors) > 0 { + return IngestRequestMultiError(errors) + } + + return nil +} + +func (m *IngestRequest) _validateUuid(uuid string) error { + if matched := _ingester_uuidPattern.MatchString(uuid); !matched { + return errors.New("invalid uuid format") + } + + return nil +} + +// IngestRequestMultiError is an error wrapping multiple validation errors +// returned by IngestRequest.ValidateAll() if the designated constraints +// aren't met. +type IngestRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m IngestRequestMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m IngestRequestMultiError) AllErrors() []error { return m } + +// IngestRequestValidationError is the validation error returned by +// IngestRequest.Validate if the designated constraints aren't met. +type IngestRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e IngestRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e IngestRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e IngestRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e IngestRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e IngestRequestValidationError) ErrorName() string { return "IngestRequestValidationError" } + +// Error satisfies the builtin error interface +func (e IngestRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sIngestRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = IngestRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = IngestRequestValidationError{} + +var _IngestRequest_SdkVersion_Pattern = regexp.MustCompile("^(\\d)+\\.(\\d)+\\.(\\d)+$") + +// Validate checks the field values on IngestResponse with the rules defined in +// the proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *IngestResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on IngestResponse with the rules defined +// in the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in IngestResponseMultiError, +// or nil if none found. +func (m *IngestResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *IngestResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if len(errors) > 0 { + return IngestResponseMultiError(errors) + } + + return nil +} + +// IngestResponseMultiError is an error wrapping multiple validation errors +// returned by IngestResponse.ValidateAll() if the designated constraints +// aren't met. +type IngestResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m IngestResponseMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m IngestResponseMultiError) AllErrors() []error { return m } + +// IngestResponseValidationError is the validation error returned by +// IngestResponse.Validate if the designated constraints aren't met. +type IngestResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e IngestResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e IngestResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e IngestResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e IngestResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e IngestResponseValidationError) ErrorName() string { return "IngestResponseValidationError" } + +// Error satisfies the builtin error interface +func (e IngestResponseValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sIngestResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = IngestResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = IngestResponseValidationError{} diff --git a/diode-server/gen/diode/v1/diodepb/ingester_grpc.pb.go b/diode-server/gen/diode/v1/diodepb/ingester_grpc.pb.go new file mode 100644 index 00000000..c13f0354 --- /dev/null +++ b/diode-server/gen/diode/v1/diodepb/ingester_grpc.pb.go @@ -0,0 +1,111 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc (unknown) +// source: diode/v1/ingester.proto + +package diodepb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + IngesterService_Ingest_FullMethodName = "/diode.v1.IngesterService/Ingest" +) + +// IngesterServiceClient is the client API for IngesterService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type IngesterServiceClient interface { + // Ingests data into the system + Ingest(ctx context.Context, in *IngestRequest, opts ...grpc.CallOption) (*IngestResponse, error) +} + +type ingesterServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewIngesterServiceClient(cc grpc.ClientConnInterface) IngesterServiceClient { + return &ingesterServiceClient{cc} +} + +func (c *ingesterServiceClient) Ingest(ctx context.Context, in *IngestRequest, opts ...grpc.CallOption) (*IngestResponse, error) { + out := new(IngestResponse) + err := c.cc.Invoke(ctx, IngesterService_Ingest_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// IngesterServiceServer is the server API for IngesterService service. +// All implementations must embed UnimplementedIngesterServiceServer +// for forward compatibility +type IngesterServiceServer interface { + // Ingests data into the system + Ingest(context.Context, *IngestRequest) (*IngestResponse, error) + mustEmbedUnimplementedIngesterServiceServer() +} + +// UnimplementedIngesterServiceServer must be embedded to have forward compatible implementations. +type UnimplementedIngesterServiceServer struct { +} + +func (UnimplementedIngesterServiceServer) Ingest(context.Context, *IngestRequest) (*IngestResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Ingest not implemented") +} +func (UnimplementedIngesterServiceServer) mustEmbedUnimplementedIngesterServiceServer() {} + +// UnsafeIngesterServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to IngesterServiceServer will +// result in compilation errors. +type UnsafeIngesterServiceServer interface { + mustEmbedUnimplementedIngesterServiceServer() +} + +func RegisterIngesterServiceServer(s grpc.ServiceRegistrar, srv IngesterServiceServer) { + s.RegisterService(&IngesterService_ServiceDesc, srv) +} + +func _IngesterService_Ingest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(IngestRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(IngesterServiceServer).Ingest(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: IngesterService_Ingest_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(IngesterServiceServer).Ingest(ctx, req.(*IngestRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// IngesterService_ServiceDesc is the grpc.ServiceDesc for IngesterService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var IngesterService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "diode.v1.IngesterService", + HandlerType: (*IngesterServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Ingest", + Handler: _IngesterService_Ingest_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "diode/v1/ingester.proto", +} diff --git a/diode-server/go.mod b/diode-server/go.mod index 1c8a9cdd..49d33e7a 100644 --- a/diode-server/go.mod +++ b/diode-server/go.mod @@ -1,29 +1,34 @@ module github.com/netboxlabs/diode/diode-server -go 1.21 +go 1.22 require ( + github.com/envoyproxy/protoc-gen-validate v1.0.4 + github.com/getsentry/sentry-go v0.27.0 + github.com/google/uuid v1.6.0 + github.com/gosimple/slug v1.14.0 + github.com/iancoleman/strcase v0.3.0 + github.com/jinzhu/copier v0.4.0 github.com/kelseyhightower/envconfig v1.4.0 - github.com/netboxlabs/diode/diode-sdk-go v0.0.0 + github.com/mitchellh/hashstructure/v2 v2.0.2 + github.com/mitchellh/mapstructure v1.5.0 github.com/oklog/run v1.1.0 - github.com/redis/go-redis/v9 v9.4.0 - github.com/stretchr/testify v1.8.4 - google.golang.org/grpc v1.61.0 - google.golang.org/protobuf v1.32.0 + github.com/redis/go-redis/v9 v9.5.1 + github.com/stretchr/testify v1.9.0 + google.golang.org/grpc v1.63.2 + google.golang.org/protobuf v1.33.0 ) require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/gosimple/unidecode v1.0.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - golang.org/x/net v0.20.0 // indirect - golang.org/x/sys v0.16.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect + golang.org/x/net v0.24.0 // indirect + golang.org/x/sys v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) - -replace github.com/netboxlabs/diode/diode-sdk-go v0.0.0 => ../diode-sdk-go diff --git a/diode-server/go.sum b/diode-server/go.sum index 4e4903cb..47b530a7 100644 --- a/diode-server/go.sum +++ b/diode-server/go.sum @@ -10,37 +10,56 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/r github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= -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/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gosimple/slug v1.14.0 h1:RtTL/71mJNDfpUbCOmnf/XFkzKRtD6wL6Uy+3akm4Es= +github.com/gosimple/slug v1.14.0/go.mod h1:UiRaFH+GEilHstLUmcBgWcI42viBN7mAb818JrYOeFQ= +github.com/gosimple/unidecode v1.0.1 h1:hZzFTMMqSswvf0LBJZCZgThIZrpDHFXux9KeGmn6T/o= +github.com/gosimple/unidecode v1.0.1/go.mod h1:CP0Cr1Y1kogOtx0bJblKzsVWrqYaqfNOnHzpgWw4Awc= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= +github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kelseyhightower/envconfig v1.4.0/go.mod h1:cccZRl6mQpaq41TPp5QxidR+Sa3axMbJDNb//FQX6Gg= +github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= +github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +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/redis/go-redis/v9 v9.4.0 h1:Yzoz33UZw9I/mFhx4MNrB6Fk+XHO1VukNcCa1+lwyKk= -github.com/redis/go-redis/v9 v9.4.0/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= -golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +github.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8= +github.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= -google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= -google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= -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.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I= -google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= +google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/diode-server/ingester/component.go b/diode-server/ingester/component.go index 8a93c459..f3bdc360 100644 --- a/diode-server/ingester/component.go +++ b/diode-server/ingester/component.go @@ -2,42 +2,50 @@ package ingester import ( "context" - "encoding/json" "errors" "fmt" "log/slog" + "net" "os" - "strings" + "time" "github.com/kelseyhightower/envconfig" - pb "github.com/netboxlabs/diode/diode-sdk-go/diode/v1/diodepb" "github.com/redis/go-redis/v9" + "google.golang.org/grpc" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/reflection" "google.golang.org/protobuf/proto" -) -// IngestEntityState represents the state of an ingested entity -type IngestEntityState int + "github.com/netboxlabs/diode/diode-server/gen/diode/v1/diodepb" + "github.com/netboxlabs/diode/diode-server/reconciler" + "github.com/netboxlabs/diode/diode-server/reconciler/v1/reconcilerpb" + "github.com/netboxlabs/diode/diode-server/sentry" +) const ( streamID = "diode.v1.ingest-stream" +) - consumerGroup = "diode-ingester" - - // RedisConsumerGroupExistsErrMsg is the error message returned by the redis client when the consumer group already exists - RedisConsumerGroupExistsErrMsg = "BUSYGROUP Consumer Group name already exists" +var ( + errMetadataNotFound = errors.New("no request metadata found") - // IngestEntityStateNew is the state of an entity after it has been ingested - IngestEntityStateNew IngestEntityState = iota + // ErrUnauthorized is an error for unauthorized requests + ErrUnauthorized = errors.New("missing or invalid authorization header") ) // Component asynchronously ingests data from the distributor type Component struct { - ctx context.Context - config Config - logger *slog.Logger - hostname string - redisStreamClient *redis.Client - redisClient *redis.Client + diodepb.UnimplementedIngesterServiceServer + + ctx context.Context + config Config + logger *slog.Logger + hostname string + grpcListener net.Listener + grpcServer *grpc.Server + redisStreamClient *redis.Client + reconcilerClient reconciler.Client + ingestionDataSources []*reconcilerpb.IngestionDataSource } // New creates a new ingester component @@ -45,6 +53,11 @@ func New(ctx context.Context, logger *slog.Logger) (*Component, error) { var cfg Config envconfig.MustProcess("", &cfg) + grpcListener, err := net.Listen("tcp", fmt.Sprintf(":%d", cfg.GRPCPort)) + if err != nil { + return nil, fmt.Errorf("failed to listen on port %d: %v", cfg.GRPCPort, err) + } + redisStreamClient := redis.NewClient(&redis.Options{ Addr: fmt.Sprintf("%s:%s", cfg.RedisHost, cfg.RedisPort), Password: cfg.RedisPassword, @@ -55,29 +68,54 @@ func New(ctx context.Context, logger *slog.Logger) (*Component, error) { return nil, fmt.Errorf("failed connection to %s: %v", redisStreamClient.String(), err) } - redisClient := redis.NewClient(&redis.Options{ - Addr: fmt.Sprintf("%s:%s", cfg.RedisHost, cfg.RedisPort), - Password: cfg.RedisPassword, - DB: cfg.RedisDB, - }) + hostname, err := os.Hostname() + if err != nil { + return nil, fmt.Errorf("failed to get hostname: %v", err) + } - if _, err := redisClient.Ping(ctx).Result(); err != nil { - return nil, fmt.Errorf("failed connection to %s: %v", redisClient.String(), err) + reconcilerClient, err := reconciler.NewClient() + if err != nil { + return nil, fmt.Errorf("failed to create reconciler client: %v", err) } - hostname, err := os.Hostname() + dataSources, err := reconcilerClient.RetrieveIngestionDataSources(ctx, &reconcilerpb.RetrieveIngestionDataSourcesRequest{}) if err != nil { - return nil, fmt.Errorf("failed to get hostname: %v", err) + return nil, fmt.Errorf("failed to retrieve ingestion data sources: %v", err) + } + + ingestionDataSources := dataSources.GetIngestionDataSources() + auth := newAuthUnaryInterceptor(ingestionDataSources) + grpcServer := grpc.NewServer(grpc.ChainUnaryInterceptor(auth)) + + component := &Component{ + ctx: ctx, + config: cfg, + logger: logger, + hostname: hostname, + grpcListener: grpcListener, + grpcServer: grpcServer, + redisStreamClient: redisStreamClient, + reconcilerClient: reconcilerClient, + ingestionDataSources: ingestionDataSources, } - return &Component{ - ctx: ctx, - config: cfg, - logger: logger, - hostname: hostname, - redisStreamClient: redisStreamClient, - redisClient: redisClient, - }, nil + diodepb.RegisterIngesterServiceServer(grpcServer, component) + reflection.Register(grpcServer) + + return component, nil +} + +func newAuthUnaryInterceptor(dataSources []*reconcilerpb.IngestionDataSource) grpc.UnaryServerInterceptor { + return func(ctx context.Context, req interface{}, _ *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + md, ok := metadata.FromIncomingContext(ctx) + if !ok { + return nil, errMetadataNotFound + } + if !authorized(dataSources, md["diode-api-key"]) { + return nil, ErrUnauthorized + } + return handler(ctx, req) + } } // Name returns the name of the component @@ -86,103 +124,104 @@ func (c *Component) Name() string { } // Start starts the component -func (c *Component) Start(ctx context.Context) error { - c.logger.Info("starting component", "name", c.Name()) +func (c *Component) Start(_ context.Context) error { + c.logger.Info("starting component", "name", c.Name(), "port", c.config.GRPCPort) + return c.grpcServer.Serve(c.grpcListener) +} - return c.consumeStream(ctx, streamID, consumerGroup, fmt.Sprintf("%s-%s", consumerGroup, c.hostname)) +// Stop stops the component +func (c *Component) Stop() error { + c.logger.Info("stopping component", "name", c.Name()) + c.grpcServer.GracefulStop() + return c.redisStreamClient.Close() } -func (c *Component) consumeStream(ctx context.Context, stream, group, consumer string) error { - err := c.redisStreamClient.XGroupCreateMkStream(ctx, stream, group, "$").Err() - if err != nil && err.Error() != RedisConsumerGroupExistsErrMsg { - return err +// Ingest handles the ingest request +func (c *Component) Ingest(ctx context.Context, in *diodepb.IngestRequest) (*diodepb.IngestResponse, error) { + if err := validateRequest(in); err != nil { + tags := map[string]string{ + "hostname": c.hostname, + "sdk_name": in.SdkName, + "sdk_version": in.SdkVersion, + } + contextMap := map[string]any{ + "request_id": in.Id, + "producer_app_name": in.ProducerAppName, + "producer_app_version": in.ProducerAppVersion, + "sdk_name": in.SdkName, + "sdk_version": in.SdkVersion, + "stream": in.Stream, + } + sentry.CaptureError(err, tags, "Ingest Request", contextMap) + return nil, err } - for { - streams, err := c.redisStreamClient.XReadGroup(ctx, &redis.XReadGroupArgs{ - Group: group, - Consumer: consumer, - Streams: []string{stream, ">"}, - Count: 100, - }).Result() - if err != nil || len(streams) == 0 { + errs := make([]string, 0) + + encodedRequest, err := proto.Marshal(in) + if err != nil { + c.logger.Error("failed to marshal request", "error", err, "request", in) + } + + for i, v := range in.GetEntities() { + if v.GetEntity() == nil { + errs = append(errs, fmt.Sprintf("entity at index %d is nil", i)) continue } - for _, msg := range streams[0].Messages { - if err := c.handleStreamMessage(ctx, msg); err != nil { - c.logger.Error("failed to handle stream message", "error", err, "message", msg) - } - } } -} -func (c *Component) handleStreamMessage(ctx context.Context, msg redis.XMessage) error { - c.logger.Info("received stream message", "message", msg.Values, "id", msg.ID) + msg := map[string]interface{}{ + "request": encodedRequest, + "ingestion_ts": time.Now().UnixNano(), + } - pushReq := &pb.PushRequest{} - if err := proto.Unmarshal([]byte(msg.Values["request"].(string)), pushReq); err != nil { - return err + if err := c.redisStreamClient.XAdd(ctx, &redis.XAddArgs{ + Stream: streamID, + Values: msg, + }).Err(); err != nil { + c.logger.Error("failed to add element to the stream", "error", err, "streamID", streamID, "value", msg) } - errs := make([]string, 0) + return &diodepb.IngestResponse{Errors: errs}, nil +} - ingestionTs := msg.Values["ingestion_ts"] +func validateRequest(in *diodepb.IngestRequest) error { + if in.GetId() == "" { + return fmt.Errorf("id is empty") + } - c.logger.Info("handling push request", "request", pushReq) + if in.GetProducerAppName() == "" { + return fmt.Errorf("producer app name is empty") + } - for i, v := range pushReq.GetData() { - if v.GetData() == nil { - errs = append(errs, fmt.Sprintf("data for index %d is nil", i)) - continue - } + if in.GetProducerAppVersion() == "" { + return fmt.Errorf("producer app version is empty") + } - var ingestDataType string - switch v.GetData().(type) { - case *pb.IngestEntity_Device: - ingestDataType = "device" - default: - errs = append(errs, fmt.Sprintf("unknown data type for index %d", i)) - continue - } + if in.GetSdkName() == "" { + return fmt.Errorf("sdk name is empty") + } - key := fmt.Sprintf("ingest-entity:%s-%s", ingestDataType, ingestionTs) - val := map[string]interface{}{ - "request_id": pushReq.GetId(), - "producer_app_name": pushReq.GetProducerAppName(), - "producer_app_version": pushReq.GetProducerAppVersion(), - "sdk_name": pushReq.GetSdkName(), - "sdk_version": pushReq.GetSdkVersion(), - "data_type": ingestDataType, - "data": v.GetData(), - "ingestion_ts": ingestionTs, - "state": IngestEntityStateNew, - } - encodedValue, err := json.Marshal(val) - if err != nil { - c.logger.Error("failed to marshal JSON", "value", val, "error", err) - continue - } - if _, err = c.redisClient.Do(ctx, "JSON.SET", key, "$", encodedValue).Result(); err != nil { - c.logger.Error("failed to set JSON redis key", "key", key, "value", encodedValue, "error", err) - continue - } + if in.GetSdkVersion() == "" { + return fmt.Errorf("sdk version is empty") } - if len(errs) > 0 { - c.logger.Error("failed to handle push request", "errors", strings.Join(errs, ", ")) + if len(in.GetEntities()) < 1 { + return fmt.Errorf("entities is empty") } - c.redisStreamClient.XAck(ctx, streamID, consumerGroup, msg.ID) - c.redisStreamClient.XDel(ctx, streamID, msg.ID) return nil } -// Stop stops the component -func (c *Component) Stop() error { - c.logger.Info("stopping component", "name", c.Name()) - - redisStreamErr := c.redisStreamClient.Close() - redisClientErr := c.redisClient.Close() +func authorized(dataSources []*reconcilerpb.IngestionDataSource, authorization []string) bool { + if len(dataSources) < 1 || len(authorization) != 1 { + return false + } - return errors.Join(redisStreamErr, redisClientErr) + for _, v := range dataSources { + if v.GetApiKey() == authorization[0] { + return true + } + } + return false } diff --git a/diode-server/ingester/config.go b/diode-server/ingester/config.go index dabf34c4..14c0b7ac 100644 --- a/diode-server/ingester/config.go +++ b/diode-server/ingester/config.go @@ -2,9 +2,9 @@ package ingester // Config is the configuration for the ingester service type Config struct { + GRPCPort int `envconfig:"GRPC_PORT" default:"8081"` RedisHost string `envconfig:"REDIS_HOST" default:"127.0.0.1"` RedisPort string `envconfig:"REDIS_PORT" default:"6379"` RedisPassword string `envconfig:"REDIS_PASSWORD" required:"true"` - RedisStreamDB int `envconfig:"REDIS_STREAM_DB" default:"0"` - RedisDB int `envconfig:"REDIS_DB" default:"0"` + RedisStreamDB int `envconfig:"REDIS_STREAM_DB" default:"1"` } diff --git a/diode-server/netbox/dcim.go b/diode-server/netbox/dcim.go new file mode 100644 index 00000000..b5c2ba09 --- /dev/null +++ b/diode-server/netbox/dcim.go @@ -0,0 +1,200 @@ +package netbox + +const ( + // DcimDeviceObjectType represents the DCIM device object type + DcimDeviceObjectType = "dcim.device" + + // DcimDeviceRoleObjectType represents the DCIM device role object type + DcimDeviceRoleObjectType = "dcim.devicerole" + + // DcimDeviceTypeObjectType represents the DCIM device type object type + DcimDeviceTypeObjectType = "dcim.devicetype" + + // DcimInterfaceObjectType represents the DCIM interface object type + DcimInterfaceObjectType = "dcim.interface" + + // DcimManufacturerObjectType represents the DCIM manufacturer object type + DcimManufacturerObjectType = "dcim.manufacturer" + + // DcimPlatformObjectType represents the DCIM platform object type + DcimPlatformObjectType = "dcim.platform" + + // DcimSiteObjectType represents the DCIM site object type + DcimSiteObjectType = "dcim.site" +) + +// DcimDevice represents a DCIM device +type DcimDevice struct { + ID int `json:"id,omitempty"` + Name string `json:"name,omitempty"` + Site *DcimSite `json:"site,omitempty"` + Role *DcimDeviceRole `json:"role,omitempty" mapstructure:"role"` + DeviceType *DcimDeviceType `json:"device_type,omitempty" mapstructure:"device_type"` + Platform *DcimPlatform `json:"platform,omitempty"` + Serial *string `json:"serial,omitempty"` + Description *string `json:"description,omitempty"` + Status *DcimDeviceStatus `json:"status,omitempty"` + AssetTag *string `json:"asset_tag,omitempty" mapstructure:"asset_tag"` + PrimaryIPv4 *IpamIPAddress `json:"primary_ip4,omitempty" mapstructure:"primary_ip4"` + PrimaryIPv6 *IpamIPAddress `json:"primary_ip6,omitempty" mapstructure:"primary_ip6"` + Comments *string `json:"comments,omitempty"` + Tags []*Tag `json:"tags,omitempty"` +} + +// DcimDeviceStatus represents a DCIM device status +type DcimDeviceStatus string + +const ( + // DcimDeviceStatusOffline represents the offline DCIM device status + DcimDeviceStatusOffline DcimDeviceStatus = "offline" + + // DcimDeviceStatusActive represents the active DCIM device status + DcimDeviceStatusActive DcimDeviceStatus = "active" + + // DcimDeviceStatusPlanned represents the planned DCIM device status + DcimDeviceStatusPlanned DcimDeviceStatus = "planned" + + // DcimDeviceStatusStaged represents the staged DCIM device status + DcimDeviceStatusStaged DcimDeviceStatus = "staged" + + // DcimDeviceStatusFailed represents the failed DCIM device status + DcimDeviceStatusFailed DcimDeviceStatus = "failed" + + // DcimDeviceStatusInventory represents the inventory DCIM device status + DcimDeviceStatusInventory DcimDeviceStatus = "inventory" + + // DcimDeviceStatusDecommissioning represents the decommissioning DCIM device status + DcimDeviceStatusDecommissioning DcimDeviceStatus = "decommissioning" +) + +// DcimDeviceRole represents a DCIM device role +type DcimDeviceRole struct { + ID int `json:"id,omitempty"` + Name string `json:"name,omitempty"` + Slug string `json:"slug,omitempty"` + Color *string `json:"color,omitempty"` + Description *string `json:"description,omitempty"` + Tags []*Tag `json:"tags,omitempty"` +} + +// DcimDeviceType represents a DCIM device type +type DcimDeviceType struct { + ID int `json:"id,omitempty"` + Model string `json:"model,omitempty"` + Slug string `json:"slug,omitempty"` + Manufacturer *DcimManufacturer `json:"manufacturer,omitempty"` + Description *string `json:"description,omitempty"` + Comments *string `json:"comments,omitempty"` + PartNumber *string `json:"part_number,omitempty" mapstructure:"part_number"` + Tags []*Tag `json:"tags,omitempty"` +} + +// DcimManufacturer represents a DCIM manufacturer +type DcimManufacturer struct { + ID int `json:"id,omitempty"` + Name string `json:"name,omitempty"` + Slug string `json:"slug,omitempty"` + Description *string `json:"description,omitempty"` + Tags []*Tag `json:"tags,omitempty"` +} + +// DcimPlatform represents a DCIM platform +type DcimPlatform struct { + ID int `json:"id,omitempty"` + Name string `json:"name,omitempty"` + Slug string `json:"slug,omitempty"` + Manufacturer *DcimManufacturer `json:"manufacturer,omitempty"` + Description *string `json:"description,omitempty"` + Tags []*Tag `json:"tags,omitempty"` +} + +// DcimSite represents a DCIM site +type DcimSite struct { + ID int `json:"id,omitempty"` + Name string `json:"name,omitempty"` + Slug string `json:"slug,omitempty"` + Status *DcimSiteStatus `json:"status,omitempty"` + Facility *string `json:"facility,omitempty"` + TimeZone *string `json:"time_zone,omitempty" mapstructure:"time_zone"` + Description *string `json:"description,omitempty"` + Comments *string `json:"comments,omitempty"` + Tags []*Tag `json:"tags,omitempty"` +} + +// DcimSiteStatus represents a DCIM site status +type DcimSiteStatus string + +const ( + // DcimSiteStatusPlanned represents the planned DCIM site status + DcimSiteStatusPlanned DcimSiteStatus = "planned" + + // DcimSiteStatusStaging represents the staging DCIM site status + DcimSiteStatusStaging DcimSiteStatus = "staging" + + // DcimSiteStatusActive represents the active DCIM site status + DcimSiteStatusActive DcimSiteStatus = "active" + + // DcimSiteStatusDecommissioning represents the decommissioning DCIM site status + DcimSiteStatusDecommissioning DcimSiteStatus = "decommissioning" + + // DcimSiteStatusRetired represents the retired DCIM site status + DcimSiteStatusRetired DcimSiteStatus = "retired" +) + +// NewDcimSite creates a new DCIM site placeholder +func NewDcimSite() *DcimSite { + status := DcimSiteStatusActive + return &DcimSite{ + Name: "undefined", + Slug: "undefined", + Status: &status, + } +} + +// NewDcimPlatform creates a new DCIM platform placeholder +func NewDcimPlatform() *DcimPlatform { + return &DcimPlatform{ + Name: "undefined", + Slug: "undefined", + } +} + +// NewDcimManufacturer creates a new DCIM manufacturer placeholder +func NewDcimManufacturer() *DcimManufacturer { + return &DcimManufacturer{ + Name: "undefined", + Slug: "undefined", + } +} + +// NewDcimDeviceType creates a new DCIM device type placeholder +func NewDcimDeviceType() *DcimDeviceType { + return &DcimDeviceType{ + Model: "undefined", + Slug: "undefined", + Manufacturer: NewDcimManufacturer(), + } +} + +// NewDcimDeviceRole creates a new DCIM device role placeholder +func NewDcimDeviceRole() *DcimDeviceRole { + color := "000000" + return &DcimDeviceRole{ + Name: "undefined", + Slug: "undefined", + Color: &color, + } +} + +// NewDcimDevice creates a new DCIM device placeholder +func NewDcimDevice() *DcimDevice { + status := DcimDeviceStatusActive + return &DcimDevice{ + Name: "undefined", + Site: NewDcimSite(), + Role: NewDcimDeviceRole(), + DeviceType: NewDcimDeviceType(), + Platform: NewDcimPlatform(), + Status: &status, + } +} diff --git a/diode-server/netbox/dcim_interface.go b/diode-server/netbox/dcim_interface.go new file mode 100644 index 00000000..f0322531 --- /dev/null +++ b/diode-server/netbox/dcim_interface.go @@ -0,0 +1,189 @@ +package netbox + +import "errors" + +var ( + // ErrInvalidInterfaceType is returned when the interface type is invalid + ErrInvalidInterfaceType = errors.New("invalid interface type") + + // ErrInvalidInterfaceMode is returned when the interface mode is invalid + ErrInvalidInterfaceMode = errors.New("invalid interface mode") + + // DefaultInterfaceType is the default interface type + DefaultInterfaceType = "other" +) + +var interfaceTypesMap = map[string]struct{}{ + "virtual": {}, + "bridge": {}, + "lag": {}, + "100base-fx": {}, + "100base-lfx": {}, + "100base-tx": {}, + "100base-t1": {}, + "1000base-t": {}, + "1000base-x-gbic": {}, + "1000base-x-sfp": {}, + "2.5gbase-t": {}, + "5gbase-t": {}, + "10gbase-t": {}, + "10gbase-cx4": {}, + "10gbase-x-sfpp": {}, + "10gbase-x-xfp": {}, + "10gbase-x-xenpak": {}, + "10gbase-x-x2": {}, + "25gbase-x-sfp28": {}, + "50gbase-x-sfp56": {}, + "40gbase-x-qsfpp": {}, + "50gbase-x-sfp28": {}, + "100gbase-x-cfp": {}, + "100gbase-x-cfp2": {}, + "100gbase-x-cfp4": {}, + "100gbase-x-cxp": {}, + "100gbase-x-cpak": {}, + "100gbase-x-dsfp": {}, + "100gbase-x-sfpdd": {}, + "100gbase-x-qsfp28": {}, + "100gbase-x-qsfpdd": {}, + "200gbase-x-cfp2": {}, + "200gbase-x-qsfp56": {}, + "200gbase-x-qsfpdd": {}, + "400gbase-x-cfp2": {}, + "400gbase-x-qsfp112": {}, + "400gbase-x-qsfpdd": {}, + "400gbase-x-osfp": {}, + "400gbase-x-osfp-rhs": {}, + "400gbase-x-cdfp": {}, + "400gbase-x-cfp8": {}, + "800gbase-x-qsfpdd": {}, + "800gbase-x-osfp": {}, + "1000base-kx": {}, + "10gbase-kr": {}, + "10gbase-kx4": {}, + "25gbase-kr": {}, + "40gbase-kr4": {}, + "50gbase-kr": {}, + "100gbase-kp4": {}, + "100gbase-kr2": {}, + "100gbase-kr4": {}, + "ieee802.11a": {}, + "ieee802.11g": {}, + "ieee802.11n": {}, + "ieee802.11ac": {}, + "ieee802.11ad": {}, + "ieee802.11ax": {}, + "ieee802.11ay": {}, + "ieee802.15.1": {}, + "other-wireless": {}, + "gsm": {}, + "cdma": {}, + "lte": {}, + "sonet-oc3": {}, + "sonet-oc12": {}, + "sonet-oc48": {}, + "sonet-oc192": {}, + "sonet-oc768": {}, + "sonet-oc1920": {}, + "sonet-oc3840": {}, + "1gfc-sfp": {}, + "2gfc-sfp": {}, + "4gfc-sfp": {}, + "8gfc-sfpp": {}, + "16gfc-sfpp": {}, + "32gfc-sfp28": {}, + "64gfc-qsfpp": {}, + "128gfc-qsfp28": {}, + "infiniband-sdr": {}, + "infiniband-ddr": {}, + "infiniband-qdr": {}, + "infiniband-fdr10": {}, + "infiniband-fdr": {}, + "infiniband-edr": {}, + "infiniband-hdr": {}, + "infiniband-ndr": {}, + "infiniband-xdr": {}, + "t1": {}, + "e1": {}, + "t3": {}, + "e3": {}, + "xdsl": {}, + "docsis": {}, + "gpon": {}, + "xg-pon": {}, + "xgs-pon": {}, + "ng-pon2": {}, + "epon": {}, + "10g-epon": {}, + "cisco-stackwise": {}, + "cisco-stackwise-plus": {}, + "cisco-flexstack": {}, + "cisco-flexstack-plus": {}, + "cisco-stackwise-80": {}, + "cisco-stackwise-160": {}, + "cisco-stackwise-320": {}, + "cisco-stackwise-480": {}, + "cisco-stackwise-1t": {}, + "juniper-vcp": {}, + "extreme-summitstack": {}, + "extreme-summitstack-128": {}, + "extreme-summitstack-256": {}, + "extreme-summitstack-512": {}, + "other": {}, +} + +var interfaceModesMap = map[string]struct{}{ + "access": {}, + "tagged": {}, + "tagged-all": {}, +} + +// DcimInterface represents a DCIM interface +type DcimInterface struct { + ID int `json:"id,omitempty"` + Device *DcimDevice `json:"device,omitempty"` + Name string `json:"name,omitempty"` + Label *string `json:"label,omitempty"` + Type *string `json:"type,omitempty"` + Enabled *bool `json:"enabled,omitempty"` + MTU *int `json:"mtu,omitempty"` + MACAddress *string `json:"mac_address,omitempty" mapstructure:"mac_address,omitempty"` + Speed *int `json:"speed,omitempty"` + WWN *string `json:"wwn,omitempty"` + MgmtOnly *bool `json:"mgmt_only,omitempty" mapstructure:"mgmt_only,omitempty"` + Description *string `json:"description,omitempty"` + MarkConnected *bool `json:"mark_connected,omitempty" mapstructure:"mark_connected,omitempty"` + Mode *string `json:"mode,omitempty"` + Tags []*Tag `json:"tags,omitempty"` +} + +func validateInterfaceType(t string) bool { + _, ok := interfaceTypesMap[t] + return ok +} + +func validateInterfaceMode(m string) bool { + if m == "" { + return true + } + _, ok := interfaceModesMap[m] + return ok +} + +// Validate checks if the DCIM interface is valid +func (i *DcimInterface) Validate() error { + if i.Type != nil && !validateInterfaceType(*i.Type) { + return ErrInvalidInterfaceType + } + if i.Mode != nil && !validateInterfaceMode(*i.Mode) { + return ErrInvalidInterfaceMode + } + return nil +} + +// NewDcimInterface creates a new DCIM interface placeholder +func NewDcimInterface() *DcimInterface { + return &DcimInterface{ + Device: NewDcimDevice(), + Name: "undefined", + } +} diff --git a/diode-server/netbox/extras.go b/diode-server/netbox/extras.go new file mode 100644 index 00000000..dea849ed --- /dev/null +++ b/diode-server/netbox/extras.go @@ -0,0 +1,14 @@ +package netbox + +const ( + // ExtrasTagObjectType represents the tag object type + ExtrasTagObjectType = "extras.tag" +) + +// Tag represents a tag +type Tag struct { + ID int `json:"id,omitempty"` + Name string `json:"name,omitempty"` + Slug string `json:"slug,omitempty"` + Color string `json:"color,omitempty"` +} diff --git a/diode-server/netbox/ipam.go b/diode-server/netbox/ipam.go new file mode 100644 index 00000000..67db19ee --- /dev/null +++ b/diode-server/netbox/ipam.go @@ -0,0 +1,163 @@ +package netbox + +import ( + "errors" + "fmt" + "reflect" + "strings" + + "github.com/iancoleman/strcase" + "github.com/mitchellh/mapstructure" +) + +const ( + // IpamIPAddressObjectType represents the IPAM IP address object type + IpamIPAddressObjectType = "ipam.ipaddress" + + // IpamPrefixObjectType represents the IPAM Prefix object type + IpamPrefixObjectType = "ipam.prefix" +) + +var ( + // ErrInvalidIPAddressStatus is returned when the IP address status is invalid + ErrInvalidIPAddressStatus = errors.New("invalid IP address status") + + // ErrInvalidIPAddressRole is returned when the IP address role is invalid + ErrInvalidIPAddressRole = errors.New("invalid IP address role") + + // DefaultIPAddressStatus is the default status for an IP address + DefaultIPAddressStatus = "active" + + // ErrInvalidIPrefixStatus is returned when the IPAM Prefix status is invalid + ErrInvalidIPrefixStatus = errors.New("invalid prefix status") + + // DefaultPrefixStatus is the default status for the IpamPrefix + DefaultPrefixStatus = "active" +) + +// IPAddressAssignedObject represents an assigned object for an IP address +type IPAddressAssignedObject interface { + ipAddressAssignedObject() +} + +// IPAddressInterface represents an assigned interface for an IP address +type IPAddressInterface struct { + Interface *DcimInterface `json:"interface,omitempty" mapstructure:"Interface"` +} + +func (*IPAddressInterface) ipAddressAssignedObject() {} + +// IpamIPAddress represents an IPAM IP address +type IpamIPAddress struct { + ID int `json:"id,omitempty"` + Address string `json:"address,omitempty"` + AssignedObject IPAddressAssignedObject `json:"assigned_object,omitempty" mapstructure:"AssignedObject"` + Status *string `json:"status,omitempty"` + Role *string `json:"role,omitempty"` + DNSName *string `json:"dns_name,omitempty" mapstructure:"dns_name"` + Description *string `json:"description,omitempty"` + Comments *string `json:"comments,omitempty"` + Tags []*Tag `json:"tags,omitempty"` +} + +var ipAddressStatusMap = map[string]struct{}{ + "active": {}, + "reserved": {}, + "deprecated": {}, + "dhcp": {}, + "slaac": {}, +} + +var ipAddressRoleMap = map[string]struct{}{ + "loopback": {}, + "secondary": {}, + "anycast": {}, + "vip": {}, + "vrrp": {}, + "hsrp": {}, + "glbp": {}, + "carp": {}, +} + +func validateIPAddressStatus(s string) bool { + _, ok := ipAddressStatusMap[s] + return ok +} + +func validateIPAddressRole(r string) bool { + _, ok := ipAddressRoleMap[r] + return ok +} + +// Validate checks if the IPAM IP address is valid +func (ip *IpamIPAddress) Validate() error { + if ip.Status != nil && !validateIPAddressStatus(*ip.Status) { + return ErrInvalidIPAddressStatus + } + if ip.Role != nil && !validateIPAddressRole(*ip.Role) { + return ErrInvalidIPAddressRole + } + return nil +} + +// IpamIPAddressAssignedObjectMatchName returns true if the mapstructure key matches the field name +func IpamIPAddressAssignedObjectMatchName(mapKey, fieldName string) bool { + return mapKey == fieldName || strcase.ToSnake(mapKey) == strcase.ToSnake(fieldName) +} + +// IpamIPAddressAssignedObjectHookFunc returns a mapstructure decode hook function +// for IPAM IP address assigned objects. +func IpamIPAddressAssignedObjectHookFunc() mapstructure.DecodeHookFunc { + return func(f reflect.Type, t reflect.Type, data interface{}) (interface{}, error) { + if f.Kind() != reflect.Map { + return data, nil + } + + if t.Implements(reflect.TypeOf((*IPAddressAssignedObject)(nil)).Elem()) { + for k := range data.(map[string]any) { + if strings.ToLower(k) == "interface" { + var ipInterface IPAddressInterface + if err := mapstructure.Decode(data, &ipInterface); err != nil { + return nil, fmt.Errorf("failed to decode ingest entity %w", err) + } + return &ipInterface, nil + } + } + } + + return data, nil + } +} + +// IpamPrefix represents an IPAM Prefix +type IpamPrefix struct { + ID int `json:"id,omitempty"` + Prefix string `json:"prefix,omitempty"` + Site *DcimSite `json:"site,omitempty"` + Status *string `json:"status,omitempty"` + IsPool *bool `json:"is_pool,omitempty"` + MarkUtilized *bool `json:"mark_utilized,omitempty" mapstructure:"mark_utilized"` + Description *string `json:"description,omitempty"` + Comments *string `json:"comments,omitempty"` + Tags []*Tag `json:"tags,omitempty"` +} + +var prefixStatusMap = map[string]struct{}{ + "active": {}, + "container": {}, + "reserved": {}, + "deprecated": {}, +} + +func validatePrefixStatus(r string) bool { + _, ok := prefixStatusMap[r] + return ok +} + +// Validate checks if the IPAM prefix is valid +func (p *IpamPrefix) Validate() error { + if p.Status != nil && !validatePrefixStatus(*p.Status) { + return ErrInvalidIPrefixStatus + } + return nil +} diff --git a/diode-server/netbox/ipam_wrappers.go b/diode-server/netbox/ipam_wrappers.go new file mode 100644 index 00000000..3d0ea936 --- /dev/null +++ b/diode-server/netbox/ipam_wrappers.go @@ -0,0 +1,618 @@ +package netbox + +import ( + "errors" + "fmt" + + "github.com/gosimple/slug" + "github.com/mitchellh/hashstructure/v2" +) + +// IpamIPAddressDataWrapper represents the IPAM IP address data wrapper +type IpamIPAddressDataWrapper struct { + IPAddress *IpamIPAddress + + placeholder bool + hasParent bool + intended bool + hasChanged bool + nestedObjects []ComparableData + objectsToReconcile []ComparableData +} + +func (*IpamIPAddressDataWrapper) comparableData() {} + +// Data returns the IP address +func (dw *IpamIPAddressDataWrapper) Data() any { + return dw.IPAddress +} + +// IsValid returns true if the IPAddress is not nil +func (dw *IpamIPAddressDataWrapper) IsValid() bool { + if dw.IPAddress != nil && !dw.hasParent && dw.IPAddress.Address == "" { + dw.IPAddress = nil + } + + if dw.IPAddress != nil { + if err := dw.IPAddress.Validate(); err != nil { + return false + } + } + + return dw.IPAddress != nil +} + +// Normalise normalises the data +func (dw *IpamIPAddressDataWrapper) Normalise() { + if dw.IsValid() && dw.IPAddress.Tags != nil && len(dw.IPAddress.Tags) == 0 { + dw.IPAddress.Tags = nil + } + dw.intended = true +} + +// NestedObjects returns all nested objects +func (dw *IpamIPAddressDataWrapper) NestedObjects() ([]ComparableData, error) { + if len(dw.nestedObjects) > 0 { + return dw.nestedObjects, nil + } + + if dw.IPAddress != nil && dw.hasParent && dw.IPAddress.Address == "" { + dw.IPAddress = nil + } + + objects := make([]ComparableData, 0) + + if dw.IPAddress == nil && dw.intended { + return objects, nil + } + + if dw.IPAddress == nil && dw.hasParent { + dw.placeholder = true + } + + var assignedObject ComparableData + if dw.IPAddress.AssignedObject != nil { + switch dw.IPAddress.AssignedObject.(type) { + case *IPAddressInterface: + assignedObject = &DcimInterfaceDataWrapper{Interface: dw.IPAddress.AssignedObject.(*IPAddressInterface).Interface, placeholder: dw.placeholder, hasParent: true, intended: dw.intended} + } + } + + if assignedObject != nil { + do, err := assignedObject.NestedObjects() + if err != nil { + return nil, err + } + + objects = append(objects, do...) + + switch dw.IPAddress.AssignedObject.(type) { + case *IPAddressInterface: + dw.IPAddress.AssignedObject.(*IPAddressInterface).Interface = assignedObject.Data().(*DcimInterface) + } + } + + if dw.IPAddress.Tags != nil { + for _, t := range dw.IPAddress.Tags { + if t.Slug == "" { + t.Slug = slug.Make(t.Name) + } + objects = append(objects, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + dw.nestedObjects = objects + + objects = append(objects, dw) + + return objects, nil +} + +// DataType returns the data type +func (dw *IpamIPAddressDataWrapper) DataType() string { + return IpamIPAddressObjectType +} + +// ObjectStateQueryParams returns the query parameters needed to retrieve its object state +func (dw *IpamIPAddressDataWrapper) ObjectStateQueryParams() map[string]string { + params := map[string]string{ + "q": dw.IPAddress.Address, + } + switch dw.IPAddress.AssignedObject.(type) { + case *IPAddressInterface: + ao := dw.IPAddress.AssignedObject.(*IPAddressInterface).Interface + if ao != nil { + params["interface__name"] = ao.Name + if ao.Device != nil { + params["interface__device__name"] = ao.Device.Name + if ao.Device.Site != nil { + params["interface__device__site__name"] = ao.Device.Site.Name + } + } + } + } + return params +} + +// ID returns the ID of the data +func (dw *IpamIPAddressDataWrapper) ID() int { + return dw.IPAddress.ID +} + +// HasChanged returns true if the data has changed +func (dw *IpamIPAddressDataWrapper) HasChanged() bool { + return dw.hasChanged +} + +// IsPlaceholder returns true if the data is a placeholder +func (dw *IpamIPAddressDataWrapper) IsPlaceholder() bool { + return dw.placeholder +} + +func (dw *IpamIPAddressDataWrapper) hash() string { + var interfaceName, deviceName, siteName string + if dw.IPAddress.AssignedObject != nil { + switch dw.IPAddress.AssignedObject.(type) { + case *IPAddressInterface: + ao := dw.IPAddress.AssignedObject.(*IPAddressInterface).Interface + if ao != nil { + interfaceName = ao.Name + if ao.Device != nil { + deviceName = ao.Device.Name + if ao.Device.Site != nil { + siteName = ao.Device.Site.Name + } + } + } + } + } + return slug.Make(fmt.Sprintf("%s-%s-%s-%s", dw.IPAddress.Address, interfaceName, deviceName, siteName)) +} + +// Patch creates patches between the actual, intended and current data +func (dw *IpamIPAddressDataWrapper) Patch(cmp ComparableData, intendedNestedObjects map[string]ComparableData) ([]ComparableData, error) { + intended, ok := cmp.(*IpamIPAddressDataWrapper) + if !ok && intended != nil { + return nil, errors.New("invalid data type") + } + + actualNestedObjectsMap := make(map[string]ComparableData) + for _, obj := range dw.nestedObjects { + actualNestedObjectsMap[fmt.Sprintf("%p", obj.Data())] = obj + } + + var actualAssignedObject ComparableData + var intendedAssignedObject ComparableData + + if dw.IPAddress.AssignedObject != nil { + switch dw.IPAddress.AssignedObject.(type) { + case *IPAddressInterface: + assignedObject := &DcimInterfaceDataWrapper{Interface: dw.IPAddress.AssignedObject.(*IPAddressInterface).Interface, placeholder: dw.placeholder, hasParent: true, intended: dw.intended} + actualAssignedObject = extractFromObjectsMap(actualNestedObjectsMap, fmt.Sprintf("%p", assignedObject.Data())) + intendedAssignedObject = extractFromObjectsMap(intendedNestedObjects, fmt.Sprintf("%p", assignedObject.Data())) + } + } + + reconciliationRequired := true + + if intended != nil && dw.hash() == intended.hash() { + currentNestedObjectsMap := make(map[string]ComparableData) + currentNestedObjects, err := intended.NestedObjects() + if err != nil { + return nil, err + } + for _, obj := range currentNestedObjects { + currentNestedObjectsMap[fmt.Sprintf("%p", obj.Data())] = obj + } + + dw.IPAddress.ID = intended.IPAddress.ID + dw.IPAddress.Address = intended.IPAddress.Address + + if actualAssignedObject != nil { + assignedObjectsToReconcile, aoErr := actualAssignedObject.Patch(intendedAssignedObject, intendedNestedObjects) + if aoErr != nil { + return nil, aoErr + } + + switch dw.IPAddress.AssignedObject.(type) { + case *IPAddressInterface: + assignedInterface, err := copyData(actualAssignedObject.Data().(*DcimInterface)) + if err != nil { + return nil, err + } + assignedInterface.Tags = nil + + if !actualAssignedObject.HasChanged() { + assignedInterface = &DcimInterface{ + ID: actualAssignedObject.ID(), + Device: &DcimDevice{ + ID: actualAssignedObject.Data().(*DcimInterface).Device.ID, + }, + } + + intendedAssignedInterfaceID := intendedAssignedObject.ID() + intendedAssignedInterfaceDeviceID := intendedAssignedObject.Data().(*DcimInterface).Device.ID + if intended.IPAddress.AssignedObject != nil { + intendedAssignedInterfaceID = intended.IPAddress.AssignedObject.(*IPAddressInterface).Interface.ID + intendedAssignedInterfaceDeviceID = intended.IPAddress.AssignedObject.(*IPAddressInterface).Interface.Device.ID + } + + intended.IPAddress.AssignedObject = &IPAddressInterface{ + Interface: &DcimInterface{ + ID: intendedAssignedInterfaceID, + Device: &DcimDevice{ + ID: intendedAssignedInterfaceDeviceID, + }, + }, + } + } + + dw.IPAddress.AssignedObject.(*IPAddressInterface).Interface = assignedInterface + } + + dw.objectsToReconcile = append(dw.objectsToReconcile, assignedObjectsToReconcile...) + } + + if dw.IPAddress.AssignedObject == nil { + dw.IPAddress.AssignedObject = intended.IPAddress.AssignedObject + } + + if dw.IPAddress.Status == nil { + dw.IPAddress.Status = intended.IPAddress.Status + } + + if dw.IPAddress.Role == nil { + dw.IPAddress.Role = intended.IPAddress.Role + } + + if dw.IPAddress.DNSName == nil { + dw.IPAddress.DNSName = intended.IPAddress.DNSName + } + + if dw.IPAddress.Description == nil { + dw.IPAddress.Description = intended.IPAddress.Description + } + + if dw.IPAddress.Comments == nil { + dw.IPAddress.Comments = intended.IPAddress.Comments + } + + tagsToMerge := mergeTags(dw.IPAddress.Tags, intended.IPAddress.Tags, intendedNestedObjects) + + if len(tagsToMerge) > 0 { + dw.IPAddress.Tags = tagsToMerge + } + + for _, t := range dw.IPAddress.Tags { + if t.ID == 0 { + dw.objectsToReconcile = append(dw.objectsToReconcile, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + actualHash, _ := hashstructure.Hash(dw.Data(), hashstructure.FormatV2, nil) + intendedHash, _ := hashstructure.Hash(intended.Data(), hashstructure.FormatV2, nil) + + reconciliationRequired = actualHash != intendedHash + } else { + dw.SetDefaults() + + var objectsToReconcile []ComparableData + if actualAssignedObject != nil { + assignedObjectsToReconcile, aoErr := actualAssignedObject.Patch(intendedAssignedObject, intendedNestedObjects) + if aoErr != nil { + return nil, aoErr + } + + switch dw.IPAddress.AssignedObject.(type) { + case *IPAddressInterface: + assignedInterface, err := copyData(actualAssignedObject.Data().(*DcimInterface)) + if err != nil { + return nil, err + } + assignedInterface.Tags = nil + + if !actualAssignedObject.HasChanged() { + assignedInterface = &DcimInterface{ + ID: actualAssignedObject.Data().(*DcimInterface).ID, + Device: &DcimDevice{ + ID: actualAssignedObject.Data().(*DcimInterface).Device.ID, + }, + } + } + + dw.IPAddress.AssignedObject.(*IPAddressInterface).Interface = assignedInterface + } + + objectsToReconcile = append(objectsToReconcile, assignedObjectsToReconcile...) + } + + tagsToMerge := mergeTags(dw.IPAddress.Tags, nil, intendedNestedObjects) + + if len(tagsToMerge) > 0 { + dw.IPAddress.Tags = tagsToMerge + } + + for _, t := range dw.IPAddress.Tags { + if t.ID == 0 { + dw.objectsToReconcile = append(dw.objectsToReconcile, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + if objectsToReconcile != nil { + dw.objectsToReconcile = append(dw.objectsToReconcile, objectsToReconcile...) + } + } + + if reconciliationRequired { + dw.hasChanged = true + dw.objectsToReconcile = append(dw.objectsToReconcile, dw) + } + + return dw.objectsToReconcile, nil +} + +// SetDefaults sets the default values for the IP address +func (dw *IpamIPAddressDataWrapper) SetDefaults() { + if dw.IPAddress.Status == nil { + dw.IPAddress.Status = &DefaultIPAddressStatus + } +} + +// IpamPrefixDataWrapper represents the IPAM Prefix data wrapper +type IpamPrefixDataWrapper struct { + Prefix *IpamPrefix + + placeholder bool + hasParent bool + intended bool + hasChanged bool + nestedObjects []ComparableData + objectsToReconcile []ComparableData +} + +func (*IpamPrefixDataWrapper) comparableData() {} + +// Data returns the Prefix +func (dw *IpamPrefixDataWrapper) Data() any { + return dw.Prefix +} + +// IsValid returns true if the IpamPrefix is not nil +func (dw *IpamPrefixDataWrapper) IsValid() bool { + if dw.Prefix != nil && !dw.hasParent && dw.Prefix.Prefix == "" { + dw.Prefix = nil + } + + if dw.Prefix != nil { + if err := dw.Prefix.Validate(); err != nil { + return false + } + } + + return dw.Prefix != nil +} + +// Normalise normalises the data +func (dw *IpamPrefixDataWrapper) Normalise() { + if dw.IsValid() && dw.Prefix.Tags != nil && len(dw.Prefix.Tags) == 0 { + dw.Prefix.Tags = nil + } + dw.intended = true +} + +// NestedObjects returns all nested objects +func (dw *IpamPrefixDataWrapper) NestedObjects() ([]ComparableData, error) { + if len(dw.nestedObjects) > 0 { + return dw.nestedObjects, nil + } + + if dw.Prefix != nil && dw.hasParent && dw.Prefix.Prefix == "" { + dw.Prefix = nil + } + + objects := make([]ComparableData, 0) + + if dw.Prefix == nil && dw.intended { + return objects, nil + } + + if dw.Prefix == nil && dw.hasParent { + dw.placeholder = true + } + + site := DcimSiteDataWrapper{Site: dw.Prefix.Site, placeholder: dw.placeholder, hasParent: true, intended: dw.intended} + + so, err := site.NestedObjects() + if err != nil { + return nil, err + } + + objects = append(objects, so...) + + dw.Prefix.Site = site.Site + + if dw.Prefix.Tags != nil { + for _, t := range dw.Prefix.Tags { + if t.Slug == "" { + t.Slug = slug.Make(t.Name) + } + objects = append(objects, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + dw.nestedObjects = objects + + objects = append(objects, dw) + + return objects, nil +} + +// DataType returns the data type +func (dw *IpamPrefixDataWrapper) DataType() string { + return IpamPrefixObjectType +} + +// ObjectStateQueryParams returns the query parameters needed to retrieve its object state +func (dw *IpamPrefixDataWrapper) ObjectStateQueryParams() map[string]string { + return map[string]string{ + "q": dw.Prefix.Prefix, + } +} + +// ID returns the ID of the data +func (dw *IpamPrefixDataWrapper) ID() int { + return dw.Prefix.ID +} + +// HasChanged returns true if the data has changed +func (dw *IpamPrefixDataWrapper) HasChanged() bool { + return dw.hasChanged +} + +// IsPlaceholder returns true if the data is a placeholder +func (dw *IpamPrefixDataWrapper) IsPlaceholder() bool { + return dw.placeholder +} + +// Patch creates patches between the actual, intended and current data +func (dw *IpamPrefixDataWrapper) Patch(cmp ComparableData, intendedNestedObjects map[string]ComparableData) ([]ComparableData, error) { + intended, ok := cmp.(*IpamPrefixDataWrapper) + if !ok && intended != nil { + return nil, errors.New("invalid data type") + } + + actualNestedObjectsMap := make(map[string]ComparableData) + for _, obj := range dw.nestedObjects { + actualNestedObjectsMap[fmt.Sprintf("%p", obj.Data())] = obj + } + + actualSite := extractFromObjectsMap(actualNestedObjectsMap, fmt.Sprintf("%p", dw.Prefix.Site)) + intendedSite := extractFromObjectsMap(intendedNestedObjects, fmt.Sprintf("%p", dw.Prefix.Site)) + + reconciliationRequired := true + + if intended != nil { + currentNestedObjectsMap := make(map[string]ComparableData) + currentNestedObjects, err := intended.NestedObjects() + if err != nil { + return nil, err + } + for _, obj := range currentNestedObjects { + currentNestedObjectsMap[fmt.Sprintf("%p", obj.Data())] = obj + } + + dw.Prefix.ID = intended.Prefix.ID + dw.Prefix.Prefix = intended.Prefix.Prefix + + if actualSite.IsPlaceholder() && intended.Prefix.Site != nil { + intendedSite = extractFromObjectsMap(currentNestedObjectsMap, fmt.Sprintf("%p", intended.Prefix.Site)) + } + + siteObjectsToReconcile, siteErr := actualSite.Patch(intendedSite, intendedNestedObjects) + if siteErr != nil { + return nil, siteErr + } + + site, err := copyData(actualSite.Data().(*DcimSite)) + if err != nil { + return nil, err + } + site.Tags = nil + + if !actualSite.HasChanged() { + site = &DcimSite{ + ID: actualSite.ID(), + } + + intendedSiteID := intendedSite.ID() + if intended.Prefix.Site != nil { + intendedSiteID = intended.Prefix.Site.ID + } + + intended.Prefix.Site = &DcimSite{ + ID: intendedSiteID, + } + } + + dw.Prefix.Site = site + + dw.objectsToReconcile = append(dw.objectsToReconcile, siteObjectsToReconcile...) + + if dw.Prefix.Status == nil { + dw.Prefix.Status = intended.Prefix.Status + } + + if dw.Prefix.Description == nil { + dw.Prefix.Description = intended.Prefix.Description + } + + if dw.Prefix.Comments == nil { + dw.Prefix.Comments = intended.Prefix.Comments + } + + tagsToMerge := mergeTags(dw.Prefix.Tags, intended.Prefix.Tags, intendedNestedObjects) + + if len(tagsToMerge) > 0 { + dw.Prefix.Tags = tagsToMerge + } + + for _, t := range dw.Prefix.Tags { + if t.ID == 0 { + dw.objectsToReconcile = append(dw.objectsToReconcile, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + actualHash, _ := hashstructure.Hash(dw.Data(), hashstructure.FormatV2, nil) + intendedHash, _ := hashstructure.Hash(intended.Data(), hashstructure.FormatV2, nil) + + reconciliationRequired = actualHash != intendedHash + } else { + dw.SetDefaults() + + siteObjectsToReconcile, siteErr := actualSite.Patch(intendedSite, intendedNestedObjects) + if siteErr != nil { + return nil, siteErr + } + + site, err := copyData(actualSite.Data().(*DcimSite)) + if err != nil { + return nil, err + } + site.Tags = nil + + if !actualSite.HasChanged() { + site = &DcimSite{ + ID: actualSite.ID(), + } + } + dw.Prefix.Site = site + + dw.objectsToReconcile = append(dw.objectsToReconcile, siteObjectsToReconcile...) + + tagsToMerge := mergeTags(dw.Prefix.Tags, nil, intendedNestedObjects) + + if len(tagsToMerge) > 0 { + dw.Prefix.Tags = tagsToMerge + } + + for _, t := range dw.Prefix.Tags { + if t.ID == 0 { + dw.objectsToReconcile = append(dw.objectsToReconcile, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + } + + if reconciliationRequired { + dw.hasChanged = true + dw.objectsToReconcile = append(dw.objectsToReconcile, dw) + } + + return dw.objectsToReconcile, nil +} + +// SetDefaults sets the default values for the IPAM Prefix +func (dw *IpamPrefixDataWrapper) SetDefaults() { + if dw.Prefix.Status == nil { + dw.Prefix.Status = &DefaultPrefixStatus + } +} diff --git a/diode-server/netbox/wrappers.go b/diode-server/netbox/wrappers.go new file mode 100644 index 00000000..4c3e93e8 --- /dev/null +++ b/diode-server/netbox/wrappers.go @@ -0,0 +1,2072 @@ +package netbox + +import ( + "errors" + "fmt" + "slices" + + "github.com/gosimple/slug" + "github.com/jinzhu/copier" + "github.com/mitchellh/hashstructure/v2" +) + +// ComparableData is an interface for NetBox comparable data +type ComparableData interface { + comparableData() + + // Data returns the data + Data() any + + // IsValid checks if the data is not nil + IsValid() bool + + // Normalise normalises the data + Normalise() + + // NestedObjects returns all nested objects + NestedObjects() ([]ComparableData, error) + + // DataType returns the data type + DataType() string + + // ObjectStateQueryParams returns the query parameters needed to retrieve its object state + ObjectStateQueryParams() map[string]string + + // ID returns the ID of the data + ID() int + + // IsPlaceholder returns true if the data is a placeholder + IsPlaceholder() bool + + // SetDefaults sets the default values for the data + SetDefaults() + + // Patch creates patches between the actual, intended and current data + Patch(ComparableData, map[string]ComparableData) ([]ComparableData, error) + + // HasChanged returns true if the data has changed + HasChanged() bool +} + +func copyData[T any](srcData *T) (*T, error) { + var dstData T + if err := copier.Copy(&dstData, srcData); err != nil { + return nil, err + } + return &dstData, nil +} + +// DcimDeviceDataWrapper represents a DCIM device data wrapper +type DcimDeviceDataWrapper struct { + Device *DcimDevice + + placeholder bool + hasParent bool + intended bool + hasChanged bool + nestedObjects []ComparableData + objectsToReconcile []ComparableData +} + +func (*DcimDeviceDataWrapper) comparableData() {} + +// Data returns the Device +func (dw *DcimDeviceDataWrapper) Data() any { + return dw.Device +} + +// IsValid returns true if the Device is not nil +func (dw *DcimDeviceDataWrapper) IsValid() bool { + if dw.Device != nil && !dw.hasParent && dw.Device.Name == "" { + dw.Device = nil + } + return dw.Device != nil +} + +// Normalise normalises the data +func (dw *DcimDeviceDataWrapper) Normalise() { + if dw.IsValid() && dw.Device.Tags != nil && len(dw.Device.Tags) == 0 { + dw.Device.Tags = nil + } + dw.intended = true +} + +// NestedObjects returns all nested objects +func (dw *DcimDeviceDataWrapper) NestedObjects() ([]ComparableData, error) { + if len(dw.nestedObjects) > 0 { + return dw.nestedObjects, nil + } + + if dw.Device != nil && dw.hasParent && dw.Device.Name == "" { + dw.Device = nil + } + + objects := make([]ComparableData, 0) + + if dw.Device == nil && dw.intended { + return objects, nil + } + + if dw.Device == nil && dw.hasParent { + dw.Device = NewDcimDevice() + dw.placeholder = true + } + + // Ignore primary IP addresses for time being + dw.Device.PrimaryIPv4 = nil + dw.Device.PrimaryIPv6 = nil + + site := DcimSiteDataWrapper{Site: dw.Device.Site, placeholder: dw.placeholder, hasParent: true, intended: dw.intended} + + so, err := site.NestedObjects() + if err != nil { + return nil, err + } + + objects = append(objects, so...) + + dw.Device.Site = site.Site + + if dw.Device.Platform != nil { + platform := DcimPlatformDataWrapper{Platform: dw.Device.Platform, placeholder: dw.placeholder, hasParent: true, intended: dw.intended} + + po, err := platform.NestedObjects() + if err != nil { + return nil, err + } + + objects = append(objects, po...) + + dw.Device.Platform = platform.Platform + } + + deviceType := DcimDeviceTypeDataWrapper{DeviceType: dw.Device.DeviceType, placeholder: dw.placeholder, hasParent: true, intended: dw.intended} + + dto, err := deviceType.NestedObjects() + if err != nil { + return nil, err + } + + objects = append(objects, dto...) + + dw.Device.DeviceType = deviceType.DeviceType + + deviceRole := DcimDeviceRoleDataWrapper{DeviceRole: dw.Device.Role, placeholder: dw.placeholder, hasParent: true, intended: dw.intended} + + dro, err := deviceRole.NestedObjects() + if err != nil { + return nil, err + } + + objects = append(objects, dro...) + + dw.Device.Role = deviceRole.DeviceRole + + if dw.Device.Tags != nil { + for _, t := range dw.Device.Tags { + if t.Slug == "" { + t.Slug = slug.Make(t.Name) + } + objects = append(objects, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + dw.nestedObjects = objects + + objects = append(objects, dw) + + return objects, nil +} + +// DataType returns the data type +func (dw *DcimDeviceDataWrapper) DataType() string { + return DcimDeviceObjectType +} + +// ObjectStateQueryParams returns the query parameters needed to retrieve its object state +func (dw *DcimDeviceDataWrapper) ObjectStateQueryParams() map[string]string { + params := map[string]string{ + "q": dw.Device.Name, + } + if dw.Device.Site != nil { + params["site__name"] = dw.Device.Site.Name + } + return params +} + +// ID returns the ID of the data +func (dw *DcimDeviceDataWrapper) ID() int { + return dw.Device.ID +} + +// HasChanged returns true if the data has changed +func (dw *DcimDeviceDataWrapper) HasChanged() bool { + return dw.hasChanged +} + +// IsPlaceholder returns true if the data is a placeholder +func (dw *DcimDeviceDataWrapper) IsPlaceholder() bool { + return dw.placeholder +} + +// Patch creates patches between the actual, intended and current data +func (dw *DcimDeviceDataWrapper) Patch(cmp ComparableData, intendedNestedObjects map[string]ComparableData) ([]ComparableData, error) { + intended, ok := cmp.(*DcimDeviceDataWrapper) + if !ok && intended != nil { + return nil, errors.New("invalid data type") + } + + actualNestedObjectsMap := make(map[string]ComparableData) + for _, obj := range dw.nestedObjects { + actualNestedObjectsMap[fmt.Sprintf("%p", obj.Data())] = obj + } + + actualSite := extractFromObjectsMap(actualNestedObjectsMap, fmt.Sprintf("%p", dw.Device.Site)) + intendedSite := extractFromObjectsMap(intendedNestedObjects, fmt.Sprintf("%p", dw.Device.Site)) + + actualPlatform := extractFromObjectsMap(actualNestedObjectsMap, fmt.Sprintf("%p", dw.Device.Platform)) + intendedPlatform := extractFromObjectsMap(intendedNestedObjects, fmt.Sprintf("%p", dw.Device.Platform)) + + actualDeviceType := extractFromObjectsMap(actualNestedObjectsMap, fmt.Sprintf("%p", dw.Device.DeviceType)) + intendedDeviceType := extractFromObjectsMap(intendedNestedObjects, fmt.Sprintf("%p", dw.Device.DeviceType)) + + actualRole := extractFromObjectsMap(actualNestedObjectsMap, fmt.Sprintf("%p", dw.Device.Role)) + intendedRole := extractFromObjectsMap(intendedNestedObjects, fmt.Sprintf("%p", dw.Device.Role)) + + reconciliationRequired := true + + if intended != nil { + currentNestedObjectsMap := make(map[string]ComparableData) + currentNestedObjects, err := intended.NestedObjects() + if err != nil { + return nil, err + } + for _, obj := range currentNestedObjects { + currentNestedObjectsMap[fmt.Sprintf("%p", obj.Data())] = obj + } + + dw.Device.ID = intended.Device.ID + dw.Device.Name = intended.Device.Name + + if dw.Device.Status == nil { + dw.Device.Status = intended.Device.Status + } + + if dw.Device.Description == nil { + dw.Device.Description = intended.Device.Description + } + + if dw.Device.Comments == nil { + dw.Device.Comments = intended.Device.Comments + } + + if dw.Device.AssetTag == nil { + dw.Device.AssetTag = intended.Device.AssetTag + } + + if dw.Device.Serial == nil { + dw.Device.Serial = intended.Device.Serial + } + + if actualSite.IsPlaceholder() && intended.Device.Site != nil { + intendedSite = extractFromObjectsMap(currentNestedObjectsMap, fmt.Sprintf("%p", intended.Device.Site)) + } + + siteObjectsToReconcile, siteErr := actualSite.Patch(intendedSite, intendedNestedObjects) + if siteErr != nil { + return nil, siteErr + } + + site, err := copyData(actualSite.Data().(*DcimSite)) + if err != nil { + return nil, err + } + site.Tags = nil + + if !actualSite.HasChanged() { + site = &DcimSite{ + ID: actualSite.ID(), + } + + intendedSiteID := intendedSite.ID() + if intended.Device.Site != nil { + intendedSiteID = intended.Device.Site.ID + } + + intended.Device.Site = &DcimSite{ + ID: intendedSiteID, + } + } + + dw.Device.Site = site + + dw.objectsToReconcile = append(dw.objectsToReconcile, siteObjectsToReconcile...) + + if actualPlatform != nil { + if actualPlatform.IsPlaceholder() && intended.Device.Platform != nil { + intendedPlatform = extractFromObjectsMap(currentNestedObjectsMap, fmt.Sprintf("%p", intended.Device.Platform)) + } + + platformObjectsToReconcile, platformErr := actualPlatform.Patch(intendedPlatform, intendedNestedObjects) + if platformErr != nil { + return nil, platformErr + } + + platform, err := copyData(actualPlatform.Data().(*DcimPlatform)) + if err != nil { + return nil, err + } + platform.Tags = nil + + if !actualPlatform.HasChanged() { + platform = &DcimPlatform{ + ID: actualPlatform.ID(), + } + + intendedPlatformID := intendedPlatform.ID() + if intended.Device.Platform != nil { + intendedPlatformID = intended.Device.Platform.ID + } + + intended.Device.Platform = &DcimPlatform{ + ID: intendedPlatformID, + } + } + + dw.Device.Platform = platform + + dw.objectsToReconcile = append(dw.objectsToReconcile, platformObjectsToReconcile...) + } else { + if intended.Device.Platform != nil { + platformID := intended.Device.Platform.ID + dw.Device.Platform = &DcimPlatform{ + ID: platformID, + } + intended.Device.Platform = &DcimPlatform{ + ID: platformID, + } + } + } + + if actualDeviceType.IsPlaceholder() && intended.Device.DeviceType != nil { + intendedDeviceType = extractFromObjectsMap(currentNestedObjectsMap, fmt.Sprintf("%p", intended.Device.DeviceType)) + } + + deviceTypeObjectsToReconcile, deviceTypeErr := actualDeviceType.Patch(intendedDeviceType, intendedNestedObjects) + if deviceTypeErr != nil { + return nil, deviceTypeErr + } + + deviceType, err := copyData(actualDeviceType.Data().(*DcimDeviceType)) + if err != nil { + return nil, err + } + deviceType.Tags = nil + + if !actualDeviceType.HasChanged() { + deviceType = &DcimDeviceType{ + ID: actualDeviceType.ID(), + } + + intendedDeviceTypeID := intendedDeviceType.ID() + if intended.Device.DeviceType != nil { + intendedDeviceTypeID = intended.Device.DeviceType.ID + } + + intended.Device.DeviceType = &DcimDeviceType{ + ID: intendedDeviceTypeID, + } + } + + dw.Device.DeviceType = deviceType + + dw.objectsToReconcile = append(dw.objectsToReconcile, deviceTypeObjectsToReconcile...) + + if actualRole.IsPlaceholder() && intended.Device.Role != nil { + intendedRole = extractFromObjectsMap(currentNestedObjectsMap, fmt.Sprintf("%p", intended.Device.Role)) + } + + roleObjectsToReconcile, roleErr := actualRole.Patch(intendedRole, intendedNestedObjects) + if roleErr != nil { + return nil, roleErr + } + + role, err := copyData(actualRole.Data().(*DcimDeviceRole)) + if err != nil { + return nil, err + } + role.Tags = nil + + if !actualRole.HasChanged() { + role = &DcimDeviceRole{ + ID: actualRole.ID(), + } + + intendedRoleID := intendedRole.ID() + if intended.Device.Role != nil { + intendedRoleID = intended.Device.Role.ID + } + + intended.Device.Role = &DcimDeviceRole{ + ID: intendedRoleID, + } + } + + dw.Device.Role = role + + dw.objectsToReconcile = append(dw.objectsToReconcile, roleObjectsToReconcile...) + + tagsToMerge := mergeTags(dw.Device.Tags, intended.Device.Tags, intendedNestedObjects) + + if len(tagsToMerge) > 0 { + dw.Device.Tags = tagsToMerge + } + + for _, t := range dw.Device.Tags { + if t.ID == 0 { + dw.objectsToReconcile = append(dw.objectsToReconcile, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + actualHash, _ := hashstructure.Hash(dw.Data(), hashstructure.FormatV2, nil) + intendedHash, _ := hashstructure.Hash(intended.Data(), hashstructure.FormatV2, nil) + + reconciliationRequired = actualHash != intendedHash + } else { + dw.SetDefaults() + + siteObjectsToReconcile, siteErr := actualSite.Patch(intendedSite, intendedNestedObjects) + if siteErr != nil { + return nil, siteErr + } + + site, err := copyData(actualSite.Data().(*DcimSite)) + if err != nil { + return nil, err + } + site.Tags = nil + + if !actualSite.HasChanged() { + site = &DcimSite{ + ID: actualSite.ID(), + } + } + dw.Device.Site = site + + dw.objectsToReconcile = append(dw.objectsToReconcile, siteObjectsToReconcile...) + + if actualPlatform != nil { + platformObjectsToReconcile, platformErr := actualPlatform.Patch(intendedPlatform, intendedNestedObjects) + if platformErr != nil { + return nil, platformErr + } + + platform, err := copyData(actualPlatform.Data().(*DcimPlatform)) + if err != nil { + return nil, err + } + platform.Tags = nil + + if !actualPlatform.HasChanged() { + platform = &DcimPlatform{ + ID: actualPlatform.ID(), + } + } + dw.Device.Platform = platform + + dw.objectsToReconcile = append(dw.objectsToReconcile, platformObjectsToReconcile...) + } + + deviceTypeObjectsToReconcile, deviceTypeErr := actualDeviceType.Patch(intendedDeviceType, intendedNestedObjects) + if deviceTypeErr != nil { + return nil, deviceTypeErr + } + + deviceType, err := copyData(actualDeviceType.Data().(*DcimDeviceType)) + if err != nil { + return nil, err + } + deviceType.Tags = nil + + if !actualDeviceType.HasChanged() { + deviceType = &DcimDeviceType{ + ID: actualDeviceType.ID(), + } + } + dw.Device.DeviceType = deviceType + + dw.objectsToReconcile = append(dw.objectsToReconcile, deviceTypeObjectsToReconcile...) + + roleObjectsToReconcile, roleErr := actualRole.Patch(intendedRole, intendedNestedObjects) + if roleErr != nil { + return nil, roleErr + } + + role, err := copyData(actualRole.Data().(*DcimDeviceRole)) + if err != nil { + return nil, err + } + role.Tags = nil + + if !actualRole.HasChanged() { + role = &DcimDeviceRole{ + ID: actualRole.ID(), + } + } + dw.Device.Role = role + + dw.objectsToReconcile = append(dw.objectsToReconcile, roleObjectsToReconcile...) + + tagsToMerge := mergeTags(dw.Device.Tags, nil, intendedNestedObjects) + + if len(tagsToMerge) > 0 { + dw.Device.Tags = tagsToMerge + } + + for _, t := range dw.Device.Tags { + if t.ID == 0 { + dw.objectsToReconcile = append(dw.objectsToReconcile, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + } + + if reconciliationRequired { + dw.hasChanged = true + dw.objectsToReconcile = append(dw.objectsToReconcile, dw) + } + + dedupObjectsToReconcile, err := dedupObjectsToReconcile(dw.objectsToReconcile) + if err != nil { + return nil, err + } + dw.objectsToReconcile = dedupObjectsToReconcile + + return dw.objectsToReconcile, nil +} + +// SetDefaults sets the default values for the device +func (dw *DcimDeviceDataWrapper) SetDefaults() { + if dw.Device.Status == nil { + status := DcimDeviceStatusActive + dw.Device.Status = &status + } +} + +// DcimDeviceRoleDataWrapper represents a DCIM device role data wrapper +type DcimDeviceRoleDataWrapper struct { + DeviceRole *DcimDeviceRole + + placeholder bool + hasParent bool + intended bool + hasChanged bool + nestedObjects []ComparableData + objectsToReconcile []ComparableData +} + +func (*DcimDeviceRoleDataWrapper) comparableData() {} + +// Data returns the DeviceRole +func (dw *DcimDeviceRoleDataWrapper) Data() any { + return dw.DeviceRole +} + +// IsValid returns true if the DeviceRole is not nil +func (dw *DcimDeviceRoleDataWrapper) IsValid() bool { + if dw.DeviceRole != nil && !dw.hasParent && dw.DeviceRole.Name == "" { + dw.DeviceRole = nil + } + return dw.DeviceRole != nil +} + +// Normalise normalises the data +func (dw *DcimDeviceRoleDataWrapper) Normalise() { + if dw.IsValid() && dw.DeviceRole.Tags != nil && len(dw.DeviceRole.Tags) == 0 { + dw.DeviceRole.Tags = nil + } + dw.intended = true +} + +// NestedObjects returns all nested objects +func (dw *DcimDeviceRoleDataWrapper) NestedObjects() ([]ComparableData, error) { + if len(dw.nestedObjects) > 0 { + return dw.nestedObjects, nil + } + + if dw.DeviceRole != nil && dw.hasParent && dw.DeviceRole.Name == "" { + dw.DeviceRole = nil + } + + objects := make([]ComparableData, 0) + + if dw.DeviceRole == nil && dw.intended { + return objects, nil + } + + if dw.DeviceRole == nil && dw.hasParent { + dw.DeviceRole = NewDcimDeviceRole() + dw.placeholder = true + } + + if dw.DeviceRole.Slug == "" { + dw.DeviceRole.Slug = slug.Make(dw.DeviceRole.Name) + } + + if dw.DeviceRole.Tags != nil { + for _, t := range dw.DeviceRole.Tags { + if t.Slug == "" { + t.Slug = slug.Make(t.Name) + } + objects = append(objects, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + dw.nestedObjects = objects + + objects = append(objects, dw) + + return objects, nil +} + +// DataType returns the data type +func (dw *DcimDeviceRoleDataWrapper) DataType() string { + return DcimDeviceRoleObjectType +} + +// ObjectStateQueryParams returns the query parameters needed to retrieve its object state +func (dw *DcimDeviceRoleDataWrapper) ObjectStateQueryParams() map[string]string { + return map[string]string{ + "q": dw.DeviceRole.Name, + } +} + +// ID returns the ID of the data +func (dw *DcimDeviceRoleDataWrapper) ID() int { + return dw.DeviceRole.ID +} + +// HasChanged returns true if the data has changed +func (dw *DcimDeviceRoleDataWrapper) HasChanged() bool { + return dw.hasChanged +} + +// IsPlaceholder returns true if the data is a placeholder +func (dw *DcimDeviceRoleDataWrapper) IsPlaceholder() bool { + return dw.placeholder +} + +// Patch creates patches between the actual, intended and current data +func (dw *DcimDeviceRoleDataWrapper) Patch(cmp ComparableData, intendedNestedObjects map[string]ComparableData) ([]ComparableData, error) { + intended, ok := cmp.(*DcimDeviceRoleDataWrapper) + if !ok && intended != nil { + return nil, errors.New("invalid data type") + } + + actualNestedObjectsMap := make(map[string]ComparableData) + for _, obj := range dw.nestedObjects { + actualNestedObjectsMap[fmt.Sprintf("%p", obj.Data())] = obj + } + + reconciliationRequired := true + + if intended != nil { + dw.DeviceRole.ID = intended.DeviceRole.ID + dw.DeviceRole.Name = intended.DeviceRole.Name + dw.DeviceRole.Slug = intended.DeviceRole.Slug + + if dw.IsPlaceholder() || dw.DeviceRole.Color == nil { + dw.DeviceRole.Color = intended.DeviceRole.Color + } + + if dw.DeviceRole.Description == nil { + dw.DeviceRole.Description = intended.DeviceRole.Description + } + + tagsToMerge := mergeTags(dw.DeviceRole.Tags, intended.DeviceRole.Tags, intendedNestedObjects) + + if len(tagsToMerge) > 0 { + dw.DeviceRole.Tags = tagsToMerge + } + + for _, t := range dw.DeviceRole.Tags { + if t.ID == 0 { + dw.objectsToReconcile = append(dw.objectsToReconcile, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + actualHash, _ := hashstructure.Hash(dw.Data(), hashstructure.FormatV2, nil) + intendedHash, _ := hashstructure.Hash(intended.Data(), hashstructure.FormatV2, nil) + + reconciliationRequired = actualHash != intendedHash + } else { + dw.SetDefaults() + + tagsToMerge := mergeTags(dw.DeviceRole.Tags, nil, intendedNestedObjects) + + if len(tagsToMerge) > 0 { + dw.DeviceRole.Tags = tagsToMerge + } + + for _, t := range dw.DeviceRole.Tags { + if t.ID == 0 { + dw.objectsToReconcile = append(dw.objectsToReconcile, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + } + + if reconciliationRequired { + dw.hasChanged = true + dw.objectsToReconcile = append(dw.objectsToReconcile, dw) + } + + return dw.objectsToReconcile, nil +} + +// SetDefaults sets the default values for the device role +func (dw *DcimDeviceRoleDataWrapper) SetDefaults() { + if dw.DeviceRole.Color == nil { + color := "000000" + dw.DeviceRole.Color = &color + } +} + +// DcimDeviceTypeDataWrapper represents a DCIM device type data wrapper +type DcimDeviceTypeDataWrapper struct { + DeviceType *DcimDeviceType + + placeholder bool + hasParent bool + intended bool + hasChanged bool + nestedObjects []ComparableData + objectsToReconcile []ComparableData +} + +func (*DcimDeviceTypeDataWrapper) comparableData() {} + +// Data returns the DeviceType +func (dw *DcimDeviceTypeDataWrapper) Data() any { + return dw.DeviceType +} + +// IsValid returns true if the DeviceType is not nil +func (dw *DcimDeviceTypeDataWrapper) IsValid() bool { + if dw.DeviceType != nil && !dw.hasParent && dw.DeviceType.Model == "" { + dw.DeviceType = nil + } + return dw.DeviceType != nil +} + +// Normalise normalises the data +func (dw *DcimDeviceTypeDataWrapper) Normalise() { + if dw.IsValid() && dw.DeviceType.Tags != nil && len(dw.DeviceType.Tags) == 0 { + dw.DeviceType.Tags = nil + } + dw.intended = true +} + +// DataType returns the data type +func (dw *DcimDeviceTypeDataWrapper) DataType() string { + return DcimDeviceTypeObjectType +} + +// ObjectStateQueryParams returns the query parameters needed to retrieve its object state +func (dw *DcimDeviceTypeDataWrapper) ObjectStateQueryParams() map[string]string { + params := map[string]string{ + "q": dw.DeviceType.Model, + } + if dw.DeviceType.Manufacturer != nil { + params["manufacturer__name"] = dw.DeviceType.Manufacturer.Name + } + return params +} + +// ID returns the ID of the data +func (dw *DcimDeviceTypeDataWrapper) ID() int { + return dw.DeviceType.ID +} + +// HasChanged returns true if the data has changed +func (dw *DcimDeviceTypeDataWrapper) HasChanged() bool { + return dw.hasChanged +} + +// IsPlaceholder returns true if the data is a placeholder +func (dw *DcimDeviceTypeDataWrapper) IsPlaceholder() bool { + return dw.placeholder +} + +// NestedObjects returns all nested objects +func (dw *DcimDeviceTypeDataWrapper) NestedObjects() ([]ComparableData, error) { + if len(dw.nestedObjects) > 0 { + return dw.nestedObjects, nil + } + + if dw.DeviceType != nil && dw.hasParent && dw.DeviceType.Model == "" { + dw.DeviceType = nil + } + + objects := make([]ComparableData, 0) + + if dw.DeviceType == nil && dw.intended { + return objects, nil + } + + if dw.DeviceType == nil && dw.hasParent { + dw.DeviceType = NewDcimDeviceType() + dw.placeholder = true + } + + if dw.DeviceType.Slug == "" { + dw.DeviceType.Slug = slug.Make(dw.DeviceType.Model) + } + + manufacturer := DcimManufacturerDataWrapper{Manufacturer: dw.DeviceType.Manufacturer, placeholder: dw.placeholder, hasParent: true, intended: dw.intended} + + mo, err := manufacturer.NestedObjects() + if err != nil { + return nil, err + } + + objects = append(objects, mo...) + + dw.DeviceType.Manufacturer = manufacturer.Manufacturer + + if dw.DeviceType.Tags != nil && len(dw.DeviceType.Tags) == 0 { + dw.DeviceType.Tags = nil + } + + if dw.DeviceType.Tags != nil { + for _, t := range dw.DeviceType.Tags { + if t.Slug == "" { + t.Slug = slug.Make(t.Name) + } + objects = append(objects, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + dw.nestedObjects = objects + + objects = append(objects, dw) + + return objects, nil +} + +// Patch creates patches between the actual, intended and current data +func (dw *DcimDeviceTypeDataWrapper) Patch(cmp ComparableData, intendedNestedObjects map[string]ComparableData) ([]ComparableData, error) { + intended, ok := cmp.(*DcimDeviceTypeDataWrapper) + if !ok && intended != nil { + return nil, errors.New("invalid data type") + } + + actualNestedObjectsMap := make(map[string]ComparableData) + for _, obj := range dw.nestedObjects { + actualNestedObjectsMap[fmt.Sprintf("%p", obj.Data())] = obj + } + + actualManufacturerKey := fmt.Sprintf("%p", dw.DeviceType.Manufacturer) + actualManufacturer := extractFromObjectsMap(actualNestedObjectsMap, actualManufacturerKey) + intendedManufacturer := extractFromObjectsMap(intendedNestedObjects, actualManufacturerKey) + + reconciliationRequired := true + + if intended != nil { + currentNestedObjectsMap := make(map[string]ComparableData) + currentNestedObjects, err := intended.NestedObjects() + if err != nil { + return nil, err + } + for _, obj := range currentNestedObjects { + currentNestedObjectsMap[fmt.Sprintf("%p", obj.Data())] = obj + } + + dw.DeviceType.ID = intended.DeviceType.ID + dw.DeviceType.Model = intended.DeviceType.Model + dw.DeviceType.Slug = intended.DeviceType.Slug + + if dw.DeviceType.Description == nil { + dw.DeviceType.Description = intended.DeviceType.Description + } + + if dw.DeviceType.Comments == nil { + dw.DeviceType.Comments = intended.DeviceType.Comments + } + + if dw.DeviceType.PartNumber == nil { + dw.DeviceType.PartNumber = intended.DeviceType.PartNumber + } + + if actualManufacturer.IsPlaceholder() && intended.DeviceType.Manufacturer != nil { + intendedManufacturer = extractFromObjectsMap(currentNestedObjectsMap, fmt.Sprintf("%p", intended.DeviceType.Manufacturer)) + } + + manufacturerObjectsToReconcile, manufacturerErr := actualManufacturer.Patch(intendedManufacturer, intendedNestedObjects) + if manufacturerErr != nil { + return nil, manufacturerErr + } + + manufacturer, err := copyData(actualManufacturer.Data().(*DcimManufacturer)) + if err != nil { + return nil, err + } + manufacturer.Tags = nil + + if !actualManufacturer.HasChanged() { + manufacturer = &DcimManufacturer{ + ID: actualManufacturer.ID(), + } + + intendedManufacturerID := intendedManufacturer.ID() + if intended.DeviceType.Manufacturer != nil { + intendedManufacturerID = intended.DeviceType.Manufacturer.ID + } + + intended.DeviceType.Manufacturer = &DcimManufacturer{ + ID: intendedManufacturerID, + } + } + + dw.DeviceType.Manufacturer = manufacturer + + tagsToMerge := mergeTags(dw.DeviceType.Tags, intended.DeviceType.Tags, intendedNestedObjects) + + if len(tagsToMerge) > 0 { + dw.DeviceType.Tags = tagsToMerge + } + + for _, t := range dw.DeviceType.Tags { + if t.ID == 0 { + dw.objectsToReconcile = append(dw.objectsToReconcile, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + dw.objectsToReconcile = append(dw.objectsToReconcile, manufacturerObjectsToReconcile...) + + actualHash, _ := hashstructure.Hash(dw.Data(), hashstructure.FormatV2, nil) + intendedHash, _ := hashstructure.Hash(intended.Data(), hashstructure.FormatV2, nil) + + reconciliationRequired = actualHash != intendedHash + } else { + manufacturerObjectsToReconcile, manufacturerErr := actualManufacturer.Patch(intendedManufacturer, intendedNestedObjects) + if manufacturerErr != nil { + return nil, manufacturerErr + } + + manufacturer, err := copyData(actualManufacturer.Data().(*DcimManufacturer)) + if err != nil { + return nil, err + } + manufacturer.Tags = nil + + if !actualManufacturer.HasChanged() { + manufacturer = &DcimManufacturer{ + ID: actualManufacturer.ID(), + } + } + dw.DeviceType.Manufacturer = manufacturer + + tagsToMerge := mergeTags(dw.DeviceType.Tags, nil, intendedNestedObjects) + + if len(tagsToMerge) > 0 { + dw.DeviceType.Tags = tagsToMerge + } + + for _, t := range dw.DeviceType.Tags { + if t.ID == 0 { + dw.objectsToReconcile = append(dw.objectsToReconcile, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + dw.objectsToReconcile = append(dw.objectsToReconcile, manufacturerObjectsToReconcile...) + } + + if reconciliationRequired { + dw.hasChanged = true + dw.objectsToReconcile = append(dw.objectsToReconcile, dw) + } + + return dw.objectsToReconcile, nil +} + +// SetDefaults sets the default values for the device type +func (dw *DcimDeviceTypeDataWrapper) SetDefaults() {} + +// DcimInterfaceDataWrapper represents a DCIM interface data wrapper +type DcimInterfaceDataWrapper struct { + Interface *DcimInterface + + placeholder bool + hasParent bool + intended bool + hasChanged bool + nestedObjects []ComparableData + objectsToReconcile []ComparableData +} + +func (*DcimInterfaceDataWrapper) comparableData() {} + +// Data returns the Interface +func (dw *DcimInterfaceDataWrapper) Data() any { + return dw.Interface +} + +// IsValid returns true if the Interface is not nil +func (dw *DcimInterfaceDataWrapper) IsValid() bool { + if dw.Interface != nil && !dw.hasParent && dw.Interface.Name == "" { + dw.Interface = nil + } + + if dw.Interface != nil { + if err := dw.Interface.Validate(); err != nil { + return false + } + } + + return dw.Interface != nil +} + +// Normalise normalises the data +func (dw *DcimInterfaceDataWrapper) Normalise() { + if dw.IsValid() && dw.Interface.Tags != nil && len(dw.Interface.Tags) == 0 { + dw.Interface.Tags = nil + } + dw.intended = true +} + +// NestedObjects returns all nested objects +func (dw *DcimInterfaceDataWrapper) NestedObjects() ([]ComparableData, error) { + if len(dw.nestedObjects) > 0 { + return dw.nestedObjects, nil + } + + if dw.Interface != nil && dw.hasParent && dw.Interface.Name == "" { + dw.Interface = nil + } + + objects := make([]ComparableData, 0) + + if dw.Interface == nil && dw.intended { + return objects, nil + } + + if dw.Interface == nil && dw.hasParent { + dw.Interface = NewDcimInterface() + dw.placeholder = true + } + + device := DcimDeviceDataWrapper{Device: dw.Interface.Device, placeholder: dw.placeholder, hasParent: true, intended: dw.intended} + + do, err := device.NestedObjects() + if err != nil { + return nil, err + } + + objects = append(objects, do...) + + dw.Interface.Device = device.Device + + if dw.Interface.Tags != nil { + for _, t := range dw.Interface.Tags { + if t.Slug == "" { + t.Slug = slug.Make(t.Name) + } + objects = append(objects, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + dw.nestedObjects = objects + + objects = append(objects, dw) + + return objects, nil +} + +// DataType returns the data type +func (dw *DcimInterfaceDataWrapper) DataType() string { + return DcimInterfaceObjectType +} + +// ObjectStateQueryParams returns the query parameters needed to retrieve its object state +func (dw *DcimInterfaceDataWrapper) ObjectStateQueryParams() map[string]string { + params := map[string]string{ + "q": dw.Interface.Name, + } + if dw.Interface.Device != nil { + params["device__name"] = dw.Interface.Device.Name + + if dw.Interface.Device.Site != nil { + params["device__site__name"] = dw.Interface.Device.Site.Name + } + } + return params +} + +// ID returns the ID of the data +func (dw *DcimInterfaceDataWrapper) ID() int { + return dw.Interface.ID +} + +// HasChanged returns true if the data has changed +func (dw *DcimInterfaceDataWrapper) HasChanged() bool { + return dw.hasChanged +} + +// IsPlaceholder returns true if the data is a placeholder +func (dw *DcimInterfaceDataWrapper) IsPlaceholder() bool { + return dw.placeholder +} + +func (dw *DcimInterfaceDataWrapper) hash() string { + var deviceName, siteName string + if dw.Interface.Device != nil { + deviceName = dw.Interface.Device.Name + if dw.Interface.Device.Site != nil { + siteName = dw.Interface.Device.Site.Name + } + } + return slug.Make(fmt.Sprintf("%s-%s-%s", dw.Interface.Name, deviceName, siteName)) +} + +// Patch creates patches between the actual, intended and current data +func (dw *DcimInterfaceDataWrapper) Patch(cmp ComparableData, intendedNestedObjects map[string]ComparableData) ([]ComparableData, error) { + intended, ok := cmp.(*DcimInterfaceDataWrapper) + if !ok && intended != nil { + return nil, errors.New("invalid data type") + } + + actualNestedObjectsMap := make(map[string]ComparableData) + for _, obj := range dw.nestedObjects { + actualNestedObjectsMap[fmt.Sprintf("%p", obj.Data())] = obj + } + + actualDevice := extractFromObjectsMap(actualNestedObjectsMap, fmt.Sprintf("%p", dw.Interface.Device)) + intendedDevice := extractFromObjectsMap(intendedNestedObjects, fmt.Sprintf("%p", dw.Interface.Device)) + + reconciliationRequired := true + + if intended != nil && dw.hash() == intended.hash() { + currentNestedObjectsMap := make(map[string]ComparableData) + currentNestedObjects, err := intended.NestedObjects() + if err != nil { + return nil, err + } + for _, obj := range currentNestedObjects { + currentNestedObjectsMap[fmt.Sprintf("%p", obj.Data())] = obj + } + + dw.Interface.ID = intended.Interface.ID + dw.Interface.Name = intended.Interface.Name + + if actualDevice.IsPlaceholder() && intended.Interface.Device != nil { + intendedDevice = extractFromObjectsMap(currentNestedObjectsMap, fmt.Sprintf("%p", intended.Interface.Device)) + } + + deviceObjectsToReconcile, deviceErr := actualDevice.Patch(intendedDevice, intendedNestedObjects) + if deviceErr != nil { + return nil, deviceErr + } + + device, err := copyData(actualDevice.Data().(*DcimDevice)) + if err != nil { + return nil, err + } + device.Tags = nil + + if !actualDevice.HasChanged() { + device = &DcimDevice{ + ID: actualDevice.ID(), + } + + intendedDeviceID := intendedDevice.ID() + if intended.Interface.Device != nil { + intendedDeviceID = intended.Interface.Device.ID + } + + intended.Interface.Device = &DcimDevice{ + ID: intendedDeviceID, + } + } + + dw.Interface.Device = device + + dw.objectsToReconcile = append(dw.objectsToReconcile, deviceObjectsToReconcile...) + + if dw.Interface.Label == nil { + dw.Interface.Label = intended.Interface.Label + } + + if dw.Interface.Type == nil { + dw.Interface.Type = intended.Interface.Type + } + + if dw.Interface.Enabled == nil { + dw.Interface.Enabled = intended.Interface.Enabled + } + + if dw.Interface.MTU == nil { + dw.Interface.MTU = intended.Interface.MTU + } + + if dw.Interface.MACAddress == nil { + dw.Interface.MACAddress = intended.Interface.MACAddress + } + + if dw.Interface.Speed == nil { + dw.Interface.Speed = intended.Interface.Speed + } + + if dw.Interface.WWN == nil { + dw.Interface.WWN = intended.Interface.WWN + } + + if dw.Interface.MgmtOnly == nil { + dw.Interface.MgmtOnly = intended.Interface.MgmtOnly + } + + if dw.Interface.Description == nil { + dw.Interface.Description = intended.Interface.Description + } + + if dw.Interface.MarkConnected == nil { + dw.Interface.MarkConnected = intended.Interface.MarkConnected + } + + if dw.Interface.Mode == nil { + dw.Interface.Mode = intended.Interface.Mode + } + + tagsToMerge := mergeTags(dw.Interface.Tags, intended.Interface.Tags, intendedNestedObjects) + + if len(tagsToMerge) > 0 { + dw.Interface.Tags = tagsToMerge + } + + for _, t := range dw.Interface.Tags { + if t.ID == 0 { + dw.objectsToReconcile = append(dw.objectsToReconcile, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + actualHash, _ := hashstructure.Hash(dw.Data(), hashstructure.FormatV2, nil) + intendedHash, _ := hashstructure.Hash(intended.Data(), hashstructure.FormatV2, nil) + + reconciliationRequired = actualHash != intendedHash + } else { + dw.SetDefaults() + + deviceObjectsToReconcile, deviceErr := actualDevice.Patch(intendedDevice, intendedNestedObjects) + if deviceErr != nil { + return nil, deviceErr + } + + device, err := copyData(actualDevice.Data().(*DcimDevice)) + if err != nil { + return nil, err + } + device.Tags = nil + + if !actualDevice.HasChanged() { + device = &DcimDevice{ + ID: actualDevice.ID(), + } + } + dw.Interface.Device = device + + tagsToMerge := mergeTags(dw.Interface.Tags, nil, intendedNestedObjects) + + if len(tagsToMerge) > 0 { + dw.Interface.Tags = tagsToMerge + } + + for _, t := range dw.Interface.Tags { + if t.ID == 0 { + dw.objectsToReconcile = append(dw.objectsToReconcile, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + dw.objectsToReconcile = append(dw.objectsToReconcile, deviceObjectsToReconcile...) + } + + if reconciliationRequired { + dw.hasChanged = true + dw.objectsToReconcile = append(dw.objectsToReconcile, dw) + } + + return dw.objectsToReconcile, nil +} + +// SetDefaults sets the default values for the interface +func (dw *DcimInterfaceDataWrapper) SetDefaults() { + if dw.Interface.Type == nil { + dw.Interface.Type = &DefaultInterfaceType + } +} + +// DcimManufacturerDataWrapper represents a DCIM manufacturer data wrapper +type DcimManufacturerDataWrapper struct { + Manufacturer *DcimManufacturer + + placeholder bool + hasParent bool + intended bool + hasChanged bool + nestedObjects []ComparableData + objectsToReconcile []ComparableData +} + +func (*DcimManufacturerDataWrapper) comparableData() {} + +// Data returns the Manufacturer +func (dw *DcimManufacturerDataWrapper) Data() any { + return dw.Manufacturer +} + +// IsValid returns true if the Manufacturer is not nil +func (dw *DcimManufacturerDataWrapper) IsValid() bool { + if dw.Manufacturer != nil && !dw.hasParent && dw.Manufacturer.Name == "" { + dw.Manufacturer = nil + } + return dw.Manufacturer != nil +} + +// Normalise normalises the data +func (dw *DcimManufacturerDataWrapper) Normalise() { + if dw.IsValid() && dw.Manufacturer.Tags != nil && len(dw.Manufacturer.Tags) == 0 { + dw.Manufacturer.Tags = nil + } + dw.intended = true +} + +// NestedObjects returns all nested objects +func (dw *DcimManufacturerDataWrapper) NestedObjects() ([]ComparableData, error) { + if len(dw.nestedObjects) > 0 { + return dw.nestedObjects, nil + } + + if dw.Manufacturer != nil && dw.hasParent && dw.Manufacturer.Name == "" { + dw.Manufacturer = nil + } + + objects := make([]ComparableData, 0) + + if dw.Manufacturer == nil && dw.intended { + return objects, nil + } + + if dw.Manufacturer == nil && dw.hasParent { + dw.Manufacturer = NewDcimManufacturer() + dw.placeholder = true + } + + if dw.Manufacturer.Slug == "" { + dw.Manufacturer.Slug = slug.Make(dw.Manufacturer.Name) + } + + if dw.Manufacturer.Tags != nil { + for _, t := range dw.Manufacturer.Tags { + if t.Slug == "" { + t.Slug = slug.Make(t.Name) + } + objects = append(objects, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + dw.nestedObjects = objects + + objects = append(objects, dw) + + return objects, nil +} + +// DataType returns the data type +func (dw *DcimManufacturerDataWrapper) DataType() string { + return DcimManufacturerObjectType +} + +// ObjectStateQueryParams returns the query parameters needed to retrieve its object state +func (dw *DcimManufacturerDataWrapper) ObjectStateQueryParams() map[string]string { + return map[string]string{ + "q": dw.Manufacturer.Name, + } +} + +// ID returns the ID of the data +func (dw *DcimManufacturerDataWrapper) ID() int { + return dw.Manufacturer.ID +} + +// HasChanged returns true if the data has changed +func (dw *DcimManufacturerDataWrapper) HasChanged() bool { + return dw.hasChanged +} + +// IsPlaceholder returns true if the data is a placeholder +func (dw *DcimManufacturerDataWrapper) IsPlaceholder() bool { + return dw.placeholder +} + +// Patch creates patches between the actual, intended and current data +func (dw *DcimManufacturerDataWrapper) Patch(cmp ComparableData, intendedNestedObjects map[string]ComparableData) ([]ComparableData, error) { + intended, ok := cmp.(*DcimManufacturerDataWrapper) + + if !ok && intended != nil { + return nil, errors.New("invalid data type") + } + + reconciliationRequired := true + + if intended != nil { + dw.Manufacturer.ID = intended.Manufacturer.ID + dw.Manufacturer.Name = intended.Manufacturer.Name + dw.Manufacturer.Slug = intended.Manufacturer.Slug + + if dw.Manufacturer.Description == nil { + dw.Manufacturer.Description = intended.Manufacturer.Description + } + + tagsToMerge := mergeTags(dw.Manufacturer.Tags, intended.Manufacturer.Tags, intendedNestedObjects) + + if len(tagsToMerge) > 0 { + dw.Manufacturer.Tags = tagsToMerge + } + + actualHash, _ := hashstructure.Hash(dw.Data(), hashstructure.FormatV2, nil) + intendedHash, _ := hashstructure.Hash(intended.Data(), hashstructure.FormatV2, nil) + + reconciliationRequired = actualHash != intendedHash + } else { + tagsToMerge := mergeTags(dw.Manufacturer.Tags, nil, intendedNestedObjects) + + if len(tagsToMerge) > 0 { + dw.Manufacturer.Tags = tagsToMerge + } + } + + for _, t := range dw.Manufacturer.Tags { + if t.ID == 0 { + dw.objectsToReconcile = append(dw.objectsToReconcile, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + if reconciliationRequired { + dw.hasChanged = true + dw.objectsToReconcile = append(dw.objectsToReconcile, dw) + } + + return dw.objectsToReconcile, nil +} + +func mergeTags(actualTags []*Tag, intendedTags []*Tag, intendedNestedObjects map[string]ComparableData) []*Tag { + tagsToMerge := make([]*Tag, 0) + tagsToCreate := make([]*Tag, 0) + + tagNamesToMerge := make([]string, 0) + tagNamesToCreate := make([]string, 0) + + for _, t := range intendedTags { + if !slices.Contains(tagNamesToMerge, t.Name) { + tagNamesToMerge = append(tagNamesToMerge, t.Name) + tagsToMerge = append(tagsToMerge, t) + } + } + + for _, t := range actualTags { + tagKey := fmt.Sprintf("%p", t) + tagWrapper := extractFromObjectsMap(intendedNestedObjects, tagKey) + + if !slices.Contains(tagNamesToMerge, t.Name) && tagWrapper != nil { + tagNamesToMerge = append(tagNamesToMerge, t.Name) + tagsToMerge = append(tagsToMerge, tagWrapper.Data().(*Tag)) + continue + } + + if tagWrapper == nil { + if !slices.Contains(tagNamesToCreate, t.Name) { + tagNamesToCreate = append(tagNamesToCreate, t.Name) + tagsToCreate = append(tagsToCreate, t) + } + } + } + + return append(tagsToMerge, tagsToCreate...) +} + +// SetDefaults sets the default values for the manufacturer +func (dw *DcimManufacturerDataWrapper) SetDefaults() {} + +// DcimPlatformDataWrapper represents a DCIM platform data wrapper +type DcimPlatformDataWrapper struct { + Platform *DcimPlatform + + placeholder bool + hasParent bool + intended bool + hasChanged bool + nestedObjects []ComparableData + objectsToReconcile []ComparableData +} + +func (*DcimPlatformDataWrapper) comparableData() {} + +// Data returns the Platform +func (dw *DcimPlatformDataWrapper) Data() any { + return dw.Platform +} + +// IsValid returns true if the Platform is not nil +func (dw *DcimPlatformDataWrapper) IsValid() bool { + if dw.Platform != nil && !dw.hasParent && dw.Platform.Name == "" { + dw.Platform = nil + } + return dw.Platform != nil +} + +// Normalise normalises the data +func (dw *DcimPlatformDataWrapper) Normalise() { + if dw.IsValid() && dw.Platform.Tags != nil && len(dw.Platform.Tags) == 0 { + dw.Platform.Tags = nil + } + dw.intended = true +} + +// NestedObjects returns all nested objects +func (dw *DcimPlatformDataWrapper) NestedObjects() ([]ComparableData, error) { + if len(dw.nestedObjects) > 0 { + return dw.nestedObjects, nil + } + + if dw.Platform != nil && dw.hasParent && dw.Platform.Name == "" { + dw.Platform = nil + } + + objects := make([]ComparableData, 0) + + if dw.Platform == nil && dw.intended { + return objects, nil + } + + if dw.Platform == nil && dw.hasParent { + dw.Platform = NewDcimPlatform() + dw.placeholder = true + } + + if dw.Platform.Slug == "" { + dw.Platform.Slug = slug.Make(dw.Platform.Name) + } + + if dw.Platform.Manufacturer != nil { + manufacturer := DcimManufacturerDataWrapper{Manufacturer: dw.Platform.Manufacturer, placeholder: dw.placeholder, hasParent: true, intended: dw.intended} + + mo, err := manufacturer.NestedObjects() + if err != nil { + return nil, err + } + + objects = append(objects, mo...) + + dw.Platform.Manufacturer = manufacturer.Manufacturer + } + + if dw.Platform.Tags != nil { + for _, t := range dw.Platform.Tags { + if t.Slug == "" { + t.Slug = slug.Make(t.Name) + } + objects = append(objects, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + dw.nestedObjects = objects + + objects = append(objects, dw) + + return objects, nil +} + +// DataType returns the data type +func (dw *DcimPlatformDataWrapper) DataType() string { + return DcimPlatformObjectType +} + +// ObjectStateQueryParams returns the query parameters needed to retrieve its object state +func (dw *DcimPlatformDataWrapper) ObjectStateQueryParams() map[string]string { + params := map[string]string{ + "q": dw.Platform.Name, + } + if dw.Platform.Manufacturer != nil { + params["manufacturer__name"] = dw.Platform.Manufacturer.Name + } + return params +} + +// ID returns the ID of the data +func (dw *DcimPlatformDataWrapper) ID() int { + return dw.Platform.ID +} + +// HasChanged returns true if the data has changed +func (dw *DcimPlatformDataWrapper) HasChanged() bool { + return dw.hasChanged +} + +// IsPlaceholder returns true if the data is a placeholder +func (dw *DcimPlatformDataWrapper) IsPlaceholder() bool { + return dw.placeholder +} + +// Patch creates patches between the actual, intended and current data +func (dw *DcimPlatformDataWrapper) Patch(cmp ComparableData, intendedNestedObjects map[string]ComparableData) ([]ComparableData, error) { + intended, ok := cmp.(*DcimPlatformDataWrapper) + if !ok && intended != nil { + return nil, errors.New("invalid data type") + } + + actualNestedObjectsMap := make(map[string]ComparableData) + for _, obj := range dw.nestedObjects { + actualNestedObjectsMap[fmt.Sprintf("%p", obj.Data())] = obj + } + + actualManufacturerKey := fmt.Sprintf("%p", dw.Platform.Manufacturer) + actualManufacturer := extractFromObjectsMap(actualNestedObjectsMap, actualManufacturerKey) + intendedManufacturer := extractFromObjectsMap(intendedNestedObjects, actualManufacturerKey) + + reconciliationRequired := true + + if intended != nil { + currentNestedObjectsMap := make(map[string]ComparableData) + currentNestedObjects, err := intended.NestedObjects() + if err != nil { + return nil, err + } + for _, obj := range currentNestedObjects { + currentNestedObjectsMap[fmt.Sprintf("%p", obj.Data())] = obj + } + + dw.Platform.ID = intended.Platform.ID + dw.Platform.Name = intended.Platform.Name + dw.Platform.Slug = intended.Platform.Slug + + if actualManufacturer != nil { + if actualManufacturer.IsPlaceholder() && intended.Platform.Manufacturer != nil { + intendedManufacturer = extractFromObjectsMap(currentNestedObjectsMap, fmt.Sprintf("%p", intended.Platform.Manufacturer)) + } + + manufacturerObjectsToReconcile, manufacturerErr := actualManufacturer.Patch(intendedManufacturer, intendedNestedObjects) + if manufacturerErr != nil { + return nil, manufacturerErr + } + + manufacturer, err := copyData(actualManufacturer.Data().(*DcimManufacturer)) + if err != nil { + return nil, err + } + manufacturer.Tags = nil + + if !actualManufacturer.HasChanged() { + manufacturer = &DcimManufacturer{ + ID: actualManufacturer.ID(), + } + + intendedManufacturerID := intendedManufacturer.ID() + if intended.Platform.Manufacturer != nil { + intendedManufacturerID = intended.Platform.Manufacturer.ID + } + + intended.Platform.Manufacturer = &DcimManufacturer{ + ID: intendedManufacturerID, + } + } + + dw.Platform.Manufacturer = manufacturer + + dw.objectsToReconcile = append(dw.objectsToReconcile, manufacturerObjectsToReconcile...) + } else { + if intended.Platform.Manufacturer != nil { + manufacturerID := intended.Platform.Manufacturer.ID + + dw.Platform.Manufacturer = &DcimManufacturer{ + ID: manufacturerID, + } + intended.Platform.Manufacturer = &DcimManufacturer{ + ID: manufacturerID, + } + } + } + + if dw.Platform.Description == nil { + dw.Platform.Description = intended.Platform.Description + } + + tagsToMerge := mergeTags(dw.Platform.Tags, intended.Platform.Tags, intendedNestedObjects) + + if len(tagsToMerge) > 0 { + dw.Platform.Tags = tagsToMerge + } + + for _, t := range dw.Platform.Tags { + if t.ID == 0 { + dw.objectsToReconcile = append(dw.objectsToReconcile, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + actualHash, _ := hashstructure.Hash(dw.Data(), hashstructure.FormatV2, nil) + intendedHash, _ := hashstructure.Hash(intended.Data(), hashstructure.FormatV2, nil) + + reconciliationRequired = actualHash != intendedHash + } else { + if actualManufacturer != nil { + manufacturerObjectsToReconcile, manufacturerErr := actualManufacturer.Patch(intendedManufacturer, intendedNestedObjects) + if manufacturerErr != nil { + return nil, manufacturerErr + } + + manufacturer, err := copyData(actualManufacturer.Data().(*DcimManufacturer)) + if err != nil { + return nil, err + } + manufacturer.Tags = nil + + if !actualManufacturer.HasChanged() { + manufacturer = &DcimManufacturer{ + ID: actualManufacturer.ID(), + } + } + dw.Platform.Manufacturer = manufacturer + + dw.objectsToReconcile = append(dw.objectsToReconcile, manufacturerObjectsToReconcile...) + } + + tagsToMerge := mergeTags(dw.Platform.Tags, nil, intendedNestedObjects) + + if len(tagsToMerge) > 0 { + dw.Platform.Tags = tagsToMerge + } + + for _, t := range dw.Platform.Tags { + if t.ID == 0 { + dw.objectsToReconcile = append(dw.objectsToReconcile, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + } + + if reconciliationRequired { + dw.hasChanged = true + dw.objectsToReconcile = append(dw.objectsToReconcile, dw) + } + + return dw.objectsToReconcile, nil +} + +// SetDefaults sets the default values for the platform +func (dw *DcimPlatformDataWrapper) SetDefaults() {} + +// DcimSiteDataWrapper represents a DCIM site data wrapper +type DcimSiteDataWrapper struct { + Site *DcimSite + + placeholder bool + hasParent bool + intended bool + hasChanged bool + nestedObjects []ComparableData + objectsToReconcile []ComparableData +} + +func (*DcimSiteDataWrapper) comparableData() {} + +// Data returns the Site +func (dw *DcimSiteDataWrapper) Data() any { + return dw.Site +} + +// IsValid returns true if the Site is not nil +func (dw *DcimSiteDataWrapper) IsValid() bool { + if dw.Site != nil && !dw.hasParent && dw.Site.Name == "" { + dw.Site = nil + } + return dw.Site != nil +} + +// Normalise normalises the data +func (dw *DcimSiteDataWrapper) Normalise() { + if dw.IsValid() && dw.Site.Tags != nil && len(dw.Site.Tags) == 0 { + dw.Site.Tags = nil + } + dw.intended = true +} + +// NestedObjects returns all nested objects +func (dw *DcimSiteDataWrapper) NestedObjects() ([]ComparableData, error) { + if len(dw.nestedObjects) > 0 { + return dw.nestedObjects, nil + } + + if dw.Site != nil && dw.hasParent && dw.Site.Name == "" { + dw.Site = nil + } + + objects := make([]ComparableData, 0) + + if dw.Site == nil && dw.intended { + return objects, nil + } + + if dw.Site == nil && dw.hasParent { + dw.Site = NewDcimSite() + dw.placeholder = true + } + + if dw.Site.Slug == "" { + dw.Site.Slug = slug.Make(dw.Site.Name) + } + + if dw.Site.Tags != nil { + for _, t := range dw.Site.Tags { + if t.Slug == "" { + t.Slug = slug.Make(t.Name) + } + objects = append(objects, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + dw.nestedObjects = objects + + objects = append(objects, dw) + + return objects, nil +} + +// DataType returns the data type +func (dw *DcimSiteDataWrapper) DataType() string { + return DcimSiteObjectType +} + +// ObjectStateQueryParams returns the query parameters needed to retrieve its object state +func (dw *DcimSiteDataWrapper) ObjectStateQueryParams() map[string]string { + return map[string]string{ + "q": dw.Site.Name, + } +} + +// ID returns the ID of the data +func (dw *DcimSiteDataWrapper) ID() int { + return dw.Site.ID +} + +// HasChanged returns true if the data has changed +func (dw *DcimSiteDataWrapper) HasChanged() bool { + return dw.hasChanged +} + +// IsPlaceholder returns true if the data is a placeholder +func (dw *DcimSiteDataWrapper) IsPlaceholder() bool { + return dw.placeholder +} + +// Patch creates patches between the actual, intended and current data +func (dw *DcimSiteDataWrapper) Patch(cmp ComparableData, intendedNestedObjects map[string]ComparableData) ([]ComparableData, error) { + intended, ok := cmp.(*DcimSiteDataWrapper) + if !ok && intended != nil { + return nil, errors.New("invalid data type") + } + + actualNestedObjectsMap := make(map[string]ComparableData) + for _, obj := range dw.nestedObjects { + actualNestedObjectsMap[fmt.Sprintf("%p", obj.Data())] = obj + } + + reconciliationRequired := true + + if intended != nil { + dw.Site.ID = intended.Site.ID + dw.Site.Name = intended.Site.Name + dw.Site.Slug = intended.Site.Slug + + if dw.Site.Status == nil { + dw.Site.Status = intended.Site.Status + } + + if dw.Site.Facility == nil { + dw.Site.Facility = intended.Site.Facility + } + + if dw.Site.TimeZone == nil { + dw.Site.TimeZone = intended.Site.TimeZone + } + + if dw.Site.Description == nil { + dw.Site.Description = intended.Site.Description + } + + if dw.Site.Comments == nil { + dw.Site.Comments = intended.Site.Comments + } + + tagsToMerge := mergeTags(dw.Site.Tags, intended.Site.Tags, intendedNestedObjects) + + if len(tagsToMerge) > 0 { + dw.Site.Tags = tagsToMerge + } + + for _, t := range dw.Site.Tags { + if t.ID == 0 { + dw.objectsToReconcile = append(dw.objectsToReconcile, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + + actualHash, _ := hashstructure.Hash(dw.Data(), hashstructure.FormatV2, nil) + intendedHash, _ := hashstructure.Hash(intended.Data(), hashstructure.FormatV2, nil) + + reconciliationRequired = actualHash != intendedHash + } else { + dw.SetDefaults() + + tagsToMerge := mergeTags(dw.Site.Tags, nil, intendedNestedObjects) + + if len(tagsToMerge) > 0 { + dw.Site.Tags = tagsToMerge + } + + for _, t := range dw.Site.Tags { + if t.ID == 0 { + dw.objectsToReconcile = append(dw.objectsToReconcile, &TagDataWrapper{Tag: t, hasParent: true}) + } + } + } + + if reconciliationRequired { + dw.hasChanged = true + dw.objectsToReconcile = append(dw.objectsToReconcile, dw) + } + + return dw.objectsToReconcile, nil +} + +// SetDefaults sets the default values for the site +func (dw *DcimSiteDataWrapper) SetDefaults() { + if dw.Site.Status == nil { + status := DcimSiteStatusActive + dw.Site.Status = &status + } +} + +// TagDataWrapper represents a tag data wrapper +type TagDataWrapper struct { + Tag *Tag + + placeholder bool + hasParent bool +} + +func (*TagDataWrapper) comparableData() {} + +// Data returns the Tag +func (dw *TagDataWrapper) Data() any { + return dw.Tag +} + +// IsValid returns true if the Tag is not nil +func (dw *TagDataWrapper) IsValid() bool { + return dw.Tag != nil +} + +// Normalise normalises the data +func (dw *TagDataWrapper) Normalise() {} + +// NestedObjects returns all nested objects +func (dw *TagDataWrapper) NestedObjects() ([]ComparableData, error) { + return nil, nil +} + +// DataType returns the data type +func (dw *TagDataWrapper) DataType() string { + return ExtrasTagObjectType +} + +// ObjectStateQueryParams returns the query parameters needed to retrieve its object state +func (dw *TagDataWrapper) ObjectStateQueryParams() map[string]string { + return map[string]string{ + "q": dw.Tag.Name, + } +} + +// ID returns the ID of the data +func (dw *TagDataWrapper) ID() int { + return dw.Tag.ID +} + +// HasChanged returns true if the data has changed +func (dw *TagDataWrapper) HasChanged() bool { + return false +} + +// IsPlaceholder returns true if the data is a placeholder +func (dw *TagDataWrapper) IsPlaceholder() bool { + return dw.placeholder +} + +// Patch creates patches between the actual, intended and current data +func (dw *TagDataWrapper) Patch(cmp ComparableData, _ map[string]ComparableData) ([]ComparableData, error) { + d2, ok := cmp.(*TagDataWrapper) + if !ok && d2 != nil { + return nil, errors.New("invalid data type") + } + + return nil, nil +} + +// SetDefaults sets the default values for the platform +func (dw *TagDataWrapper) SetDefaults() {} + +// NewDataWrapper creates a new data wrapper for the given data type +func NewDataWrapper(dataType string) (ComparableData, error) { + switch dataType { + case DcimDeviceObjectType: + return &DcimDeviceDataWrapper{}, nil + case DcimDeviceRoleObjectType: + return &DcimDeviceRoleDataWrapper{}, nil + case DcimDeviceTypeObjectType: + return &DcimDeviceTypeDataWrapper{}, nil + case DcimInterfaceObjectType: + return &DcimInterfaceDataWrapper{}, nil + case DcimManufacturerObjectType: + return &DcimManufacturerDataWrapper{}, nil + case DcimPlatformObjectType: + return &DcimPlatformDataWrapper{}, nil + case DcimSiteObjectType: + return &DcimSiteDataWrapper{}, nil + case ExtrasTagObjectType: + return &TagDataWrapper{}, nil + case IpamIPAddressObjectType: + return &IpamIPAddressDataWrapper{}, nil + case IpamPrefixObjectType: + return &IpamPrefixDataWrapper{}, nil + default: + return nil, fmt.Errorf("unsupported data type %s", dataType) + } +} + +func extractFromObjectsMap(objectsMap map[string]ComparableData, key string) ComparableData { + if obj, ok := objectsMap[key]; ok { + return obj + } + return nil +} + +func dedupObjectsToReconcile(objects []ComparableData) ([]ComparableData, error) { + hashes := make(map[uint64]struct{}) + dedupedObjectsToReconcile := make([]ComparableData, 0) + for _, o := range objects { + hash, err := hashstructure.Hash(o.Data(), hashstructure.FormatV2, nil) + if err != nil { + return nil, err + } + if _, ok := hashes[hash]; ok { + continue + } + hashes[hash] = struct{}{} + dedupedObjectsToReconcile = append(dedupedObjectsToReconcile, o) + } + + return dedupedObjectsToReconcile, nil +} diff --git a/diode-server/netboxdiodeplugin/client.go b/diode-server/netboxdiodeplugin/client.go new file mode 100644 index 00000000..697ed485 --- /dev/null +++ b/diode-server/netboxdiodeplugin/client.go @@ -0,0 +1,431 @@ +package netboxdiodeplugin + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "log/slog" + "net/http" + "net/url" + "os" + "reflect" + "strconv" + "time" + + "github.com/mitchellh/mapstructure" + + "github.com/netboxlabs/diode/diode-server/netbox" +) + +const ( + // SDKName is the name of the SDK + SDKName = "netbox-diode-plugin-sdk-go" + + // SDKVersion is the version of the SDK + SDKVersion = "0.1.0" + + // BaseURLEnvVarName is the environment variable name for the NetBox Diode plugin HTTP base URL + BaseURLEnvVarName = "NETBOX_DIODE_PLUGIN_API_BASE_URL" + + // TimeoutSecondsEnvVarName is the environment variable name for the NetBox Diode plugin HTTP timeout + TimeoutSecondsEnvVarName = "NETBOX_DIODE_PLUGIN_API_TIMEOUT_SECONDS" + + defaultBaseURL = "http://127.0.0.1:8080/api/plugins/diode" + + defaultHTTPTimeoutSeconds = 5 +) + +var ( + // ErrInvalidTimeout is an error for invalid timeout value + ErrInvalidTimeout = errors.New("invalid timeout value") +) + +type apiRoundTripper struct { + transport http.RoundTripper + apiKey string + userAgent string +} + +func newAPIRoundTripper(apiKey string, next http.RoundTripper) (http.RoundTripper, error) { + if len(apiKey) == 0 { + return nil, fmt.Errorf("API key not provided") + } + + return &apiRoundTripper{ + transport: next, + apiKey: apiKey, + userAgent: userAgent(), + }, nil +} + +// RoundTrip implements the RoundTripper interface +func (rt *apiRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + // Clone request to ensure thread safety + req2 := req.Clone(req.Context()) + + // Set authorization header + req2.Header.Set("Authorization", fmt.Sprintf("Token %s", rt.apiKey)) + + // Set user agent header + req2.Header.Set("User-Agent", rt.userAgent) + + // Set content type header + req2.Header.Set("Content-Type", "application/json") + + return rt.transport.RoundTrip(req2) +} + +// NetBoxAPI is the interface for the NetBox Diode plugin API +type NetBoxAPI interface { + // RetrieveObjectState retrieves the object state + RetrieveObjectState(context.Context, RetrieveObjectStateQueryParams) (*ObjectState, error) + + // ApplyChangeSet applies a change set + ApplyChangeSet(context.Context, ChangeSetRequest) (*ChangeSetResponse, error) +} + +// Client is a NetBox Diode plugin client +type Client struct { + logger *slog.Logger + httpClient *http.Client + baseURL *url.URL +} + +// NewClient creates a new NetBox Diode plugin client +func NewClient(logger *slog.Logger, apiKey string) (*Client, error) { + rt, err := newAPIRoundTripper(apiKey, http.DefaultTransport) + if err != nil { + return nil, err + } + + timeout, err := httpTimeout() + if err != nil { + return nil, err + } + + httpClient := &http.Client{ + Transport: rt, + Timeout: timeout, + } + + u, err := url.Parse(baseURL()) + if err != nil { + return nil, err + } + + client := &Client{ + logger: logger, + httpClient: httpClient, + baseURL: u, + } + + return client, nil +} + +func userAgent() string { + return fmt.Sprintf("%s/%s", SDKName, SDKVersion) +} + +func baseURL() string { + u, ok := os.LookupEnv(BaseURLEnvVarName) + if !ok { + u = defaultBaseURL + } + return u +} + +func httpTimeout() (time.Duration, error) { + timeoutSecondsStr, ok := os.LookupEnv(TimeoutSecondsEnvVarName) + if !ok || len(timeoutSecondsStr) == 0 { + return defaultHTTPTimeoutSeconds * time.Second, nil + } + + timeout, err := strconv.Atoi(timeoutSecondsStr) + if err != nil || timeout <= 0 { + return 0, ErrInvalidTimeout + } + return time.Duration(timeout) * time.Second, nil +} + +type objectStateRaw struct { + ObjectID int `json:"object_id"` + ObjectType string `json:"object_type"` + ObjectChangeID int `json:"object_change_id"` + Object any `json:"object"` +} + +// ObjectState represents the NetBox object state +type ObjectState struct { + ObjectID int `json:"object_id"` + ObjectType string `json:"object_type"` + ObjectChangeID int `json:"object_change_id"` + Object netbox.ComparableData `json:"object"` +} + +// RetrieveObjectStateQueryParams represents the query parameters for retrieving the object state +type RetrieveObjectStateQueryParams struct { + ObjectType string + ObjectID int + Params map[string]string +} + +// RetrieveObjectState retrieves the object state +func (c *Client) RetrieveObjectState(ctx context.Context, params RetrieveObjectStateQueryParams) (*ObjectState, error) { + endpointURL, err := url.Parse(fmt.Sprintf("%s/object-state/", c.baseURL.String())) + if err != nil { + return nil, err + } + queryParams := endpointURL.Query() + + queryParams.Set("object_type", params.ObjectType) + if params.ObjectID > 0 { + queryParams.Set("object_id", strconv.Itoa(params.ObjectID)) + } + for k, v := range params.Params { + queryParams.Set(k, v) + } + + endpointURL.RawQuery = queryParams.Encode() + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, endpointURL.String(), nil) + if err != nil { + return nil, err + } + + resp, err := c.httpClient.Do(req) + if err != nil { + return nil, err + } + defer func() { + if closeErr := resp.Body.Close(); closeErr != nil { + c.logger.Warn("failed to close response body", "error", closeErr) + } + }() + + respBodyBytes, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + var objStateRaw objectStateRaw + if err := json.Unmarshal(respBodyBytes, &objStateRaw); err != nil { + return nil, err + } + + objState, err := extractObjectState(&objStateRaw, params.ObjectType) + if err != nil { + return nil, err + } + + return &ObjectState{ + ObjectID: objStateRaw.ObjectID, + ObjectType: objStateRaw.ObjectType, + ObjectChangeID: objStateRaw.ObjectChangeID, + Object: objState, + }, nil +} + +func extractObjectState(objState *objectStateRaw, objectType string) (netbox.ComparableData, error) { + if objState == nil { + return nil, fmt.Errorf("raw object state response is nil") + } + + dw, err := netbox.NewDataWrapper(objectType) + if err != nil { + return nil, err + } + + wrappedData, err := wrapObjectState(objectType, objState.Object) + if err != nil { + return nil, err + } + + decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{ + Result: &dw, + MatchName: netbox.IpamIPAddressAssignedObjectMatchName, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + statusMapToStringHookFunc(), + netbox.IpamIPAddressAssignedObjectHookFunc(), + ), + }) + if err != nil { + return nil, err + } + + if err := decoder.Decode(wrappedData); err != nil { + return nil, fmt.Errorf("failed to decode ingest entity data %w", err) + } + + return dw, nil +} + +func statusMapToStringHookFunc() mapstructure.DecodeHookFunc { + return func( + f reflect.Kind, + t reflect.Kind, + data interface{}) (interface{}, error) { + + if f != reflect.Map { + return data, nil + } + + raw := data.(map[string]any) + + if len(raw) == 0 { + return data, nil + } + + if t == reflect.String && f == reflect.Map { + val, ok := raw["value"] + if !ok { + return data, nil + } + return val, nil + } + + return data, nil + } +} + +// ChangeSetRequest represents a apply change set request +// type ChangeSetRequest changeset.ChangeSet +type ChangeSetRequest struct { + ChangeSetID string `json:"change_set_id"` + ChangeSet []Change `json:"change_set"` +} + +// Change represents a change +type Change struct { + ChangeID string `json:"change_id"` + ChangeType string `json:"change_type"` + ObjectType string `json:"object_type"` + ObjectID *int `json:"object_id,omitempty"` + ObjectVersion *int `json:"object_version,omitempty"` + Data any `json:"data"` +} + +// ChangeSetResponse represents an apply change set response +type ChangeSetResponse struct { + ChangeSetID string `json:"change_set_id"` + Result string `json:"result"` + Errors any `json:"errors"` +} + +// ApplyChangeSet applies a change set +func (c *Client) ApplyChangeSet(ctx context.Context, payload ChangeSetRequest) (*ChangeSetResponse, error) { + endpointURL, err := url.Parse(fmt.Sprintf("%s/apply-change-set/", c.baseURL.String())) + if err != nil { + return nil, err + } + + reqBody, err := json.Marshal(payload) + if err != nil { + return nil, err + } + + c.logger.Info("apply change set", "payload", string(reqBody)) + + req, err := http.NewRequestWithContext(ctx, http.MethodPost, endpointURL.String(), bytes.NewBuffer(reqBody)) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/json") + + resp, err := c.httpClient.Do(req) + if err != nil { + return nil, err + } + defer func() { + if closeErr := resp.Body.Close(); closeErr != nil { + c.logger.Warn("failed to close response body", "error", closeErr) + } + }() + + respBytes, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("failed to read response body %w", err) + } + + c.logger.Info("apply change set", "response", string(respBytes)) + + var changeSetResponse ChangeSetResponse + if err = json.Unmarshal(respBytes, &changeSetResponse); err != nil { + return nil, fmt.Errorf("failed to unmarshal response body %w", err) + } + + if resp.StatusCode != http.StatusOK { + c.logger.Info(fmt.Sprintf("request POST %s failed", req.URL.String()), "statusCode", resp.StatusCode, "response", changeSetResponse) + return &changeSetResponse, fmt.Errorf("request POST %s failed - %q", req.URL.String(), resp.Status) + } + return &changeSetResponse, nil +} + +func wrapObjectState(dataType string, object any) (any, error) { + switch dataType { + case netbox.DcimDeviceObjectType: + return struct { + Device any + }{ + Device: object, + }, nil + case netbox.DcimDeviceRoleObjectType: + return struct { + DeviceRole any + }{ + DeviceRole: object, + }, nil + case netbox.DcimDeviceTypeObjectType: + return struct { + DeviceType any + }{ + DeviceType: object, + }, nil + case netbox.DcimInterfaceObjectType: + return struct { + Interface any + }{ + Interface: object, + }, nil + case netbox.DcimManufacturerObjectType: + return struct { + Manufacturer any + }{ + Manufacturer: object, + }, nil + case netbox.DcimPlatformObjectType: + return struct { + Platform any + }{ + Platform: object, + }, nil + case netbox.DcimSiteObjectType: + return struct { + Site any + }{ + Site: object, + }, nil + case netbox.ExtrasTagObjectType: + return struct { + Tag any + }{ + Tag: object, + }, nil + case netbox.IpamIPAddressObjectType: + return struct { + IPAddress any + }{ + IPAddress: object, + }, nil + case netbox.IpamPrefixObjectType: + return struct { + Prefix any + }{ + Prefix: object, + }, nil + default: + return nil, fmt.Errorf("unsupported data type %s", dataType) + } +} diff --git a/diode-server/netboxdiodeplugin/client_test.go b/diode-server/netboxdiodeplugin/client_test.go new file mode 100644 index 00000000..ffa876f1 --- /dev/null +++ b/diode-server/netboxdiodeplugin/client_test.go @@ -0,0 +1,354 @@ +package netboxdiodeplugin_test + +import ( + "context" + "fmt" + "log/slog" + "net/http" + "net/http/httptest" + "os" + "strconv" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/netboxlabs/diode/diode-server/netbox" + "github.com/netboxlabs/diode/diode-server/netboxdiodeplugin" +) + +func TestNewClient(t *testing.T) { + tests := []struct { + name string + apiKey string + baseURL string + timeout string + setBaseURLEnvVar bool + setTimeoutEnvVar bool + shouldError bool + }{ + { + name: "valid client", + apiKey: "test", + baseURL: "http://", + timeout: "5", + setBaseURLEnvVar: true, + setTimeoutEnvVar: true, + shouldError: false, + }, + { + name: "default base URL", + apiKey: "test", + baseURL: "", + timeout: "5", + setBaseURLEnvVar: false, + setTimeoutEnvVar: true, + shouldError: false, + }, + { + name: "invalid base URL", + apiKey: "test", + baseURL: "http://local\nhost", + timeout: "5", + setBaseURLEnvVar: true, + setTimeoutEnvVar: true, + shouldError: true, + }, + { + name: "default timeout", + apiKey: "test", + baseURL: "http://", + timeout: "", + setBaseURLEnvVar: true, + setTimeoutEnvVar: false, + shouldError: false, + }, + { + name: "invalid timeout", + apiKey: "test", + baseURL: "http://", + timeout: "-1", + setBaseURLEnvVar: true, + setTimeoutEnvVar: true, + shouldError: true, + }, + { + name: "API key not provided", + apiKey: "", + baseURL: "http://", + timeout: "5", + setBaseURLEnvVar: true, + setTimeoutEnvVar: true, + shouldError: true, + }, + } + + logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug, AddSource: false})) + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cleanUpEnvVars() + + if tt.setBaseURLEnvVar { + _ = os.Setenv(netboxdiodeplugin.BaseURLEnvVarName, tt.baseURL) + } + if tt.setTimeoutEnvVar { + _ = os.Setenv(netboxdiodeplugin.TimeoutSecondsEnvVarName, tt.timeout) + } + + client, err := netboxdiodeplugin.NewClient(logger, tt.apiKey) + if tt.shouldError { + require.Error(t, err) + return + } + + assert.NoError(t, err) + assert.NotNil(t, client) + }) + } +} + +func TestRetrieveObjectState(t *testing.T) { + tests := []struct { + name string + params netboxdiodeplugin.RetrieveObjectStateQueryParams + apiKey string + mockServerResponse string + response any + shouldError bool + }{ + { + name: "valid response for DCIM device", + params: netboxdiodeplugin.RetrieveObjectStateQueryParams{ObjectType: netbox.DcimDeviceObjectType, ObjectID: 1}, + mockServerResponse: `{"object_type":"dcim.device","object_change_id":1,"object":{"id":1,"name":"test"}}`, + apiKey: "foobar", + response: &netboxdiodeplugin.ObjectState{ + ObjectType: netbox.DcimDeviceObjectType, + ObjectChangeID: 1, + Object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 1, + Name: "test", + }, + }, + }, + shouldError: false, + }, + { + name: "valid response for DCIM site with query", + params: netboxdiodeplugin.RetrieveObjectStateQueryParams{ObjectType: netbox.DcimSiteObjectType, Params: map[string]string{"q": "site 01"}}, + mockServerResponse: `{"object_type":"dcim.site","object_change_id":1,"object":{"id":1,"name":"site 01", "slug": "site-01"}}`, + apiKey: "foobar", + response: &netboxdiodeplugin.ObjectState{ + ObjectType: netbox.DcimSiteObjectType, + ObjectChangeID: 1, + Object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "site 01", + Slug: "site-01", + }, + }, + }, + shouldError: false, + }, + { + name: "valid response for DCIM device with query and additional attributes", + params: netboxdiodeplugin.RetrieveObjectStateQueryParams{ + ObjectType: netbox.DcimDeviceObjectType, + ObjectID: 1, + Params: map[string]string{"q": "dev1", "attr_name": "site.id", "attr_value": "2"}}, + mockServerResponse: `{"object_type":"dcim.device","object_change_id":1,"object":{"id":1,"name":"dev1", "site": {"id": 2}}}`, + apiKey: "foobar", + response: &netboxdiodeplugin.ObjectState{ + ObjectType: netbox.DcimDeviceObjectType, + ObjectChangeID: 1, + Object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 1, + Name: "dev1", + Site: &netbox.DcimSite{ + ID: 2, + }, + }, + }, + }, + shouldError: false, + }, + { + name: "response for invalid object - empty object", + params: netboxdiodeplugin.RetrieveObjectStateQueryParams{ObjectType: netbox.DcimDeviceObjectType, ObjectID: 1}, + mockServerResponse: `{"object_type":"dcim.device","object_change_id":1,"object":{"InvalidObjectType": {"id":1,"name":"test"}}}`, + apiKey: "foobar", + response: &netboxdiodeplugin.ObjectState{ + ObjectType: netbox.DcimDeviceObjectType, + ObjectChangeID: 1, + Object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{}, + }, + }, + shouldError: false, + }, + { + name: "invalid server response", + params: netboxdiodeplugin.RetrieveObjectStateQueryParams{ObjectType: netbox.DcimDeviceObjectType, ObjectID: 1}, + apiKey: "barfoo", + mockServerResponse: ``, + shouldError: true, + }, + } + + logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug, AddSource: false})) + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cleanUpEnvVars() + + handler := func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, r.Method, http.MethodGet) + assert.Equal(t, r.URL.Path, "/api/diode/object-state/") + assert.Equal(t, r.URL.Query().Get("object_type"), tt.params.ObjectType) + var objectID string + if tt.params.ObjectID > 0 { + objectID = strconv.Itoa(tt.params.ObjectID) + } + for k, v := range tt.params.Params { + assert.Equal(t, r.URL.Query().Get(k), v) + } + assert.Equal(t, r.URL.Query().Get("object_id"), objectID) + assert.Equal(t, r.Header.Get("Authorization"), fmt.Sprintf("Token %s", tt.apiKey)) + assert.Equal(t, r.Header.Get("User-Agent"), fmt.Sprintf("%s/%s", netboxdiodeplugin.SDKName, netboxdiodeplugin.SDKVersion)) + _, _ = w.Write([]byte(tt.mockServerResponse)) + } + mux := http.NewServeMux() + mux.HandleFunc("/api/diode/object-state/", handler) + ts := httptest.NewServer(mux) + defer ts.Close() + + _ = os.Setenv(netboxdiodeplugin.BaseURLEnvVarName, fmt.Sprintf("%s/api/diode", ts.URL)) + + client, err := netboxdiodeplugin.NewClient(logger, tt.apiKey) + require.NoError(t, err) + resp, err := client.RetrieveObjectState(context.Background(), tt.params) + if tt.shouldError { + require.Error(t, err) + return + } + require.NoError(t, err) + assert.Equal(t, tt.response, resp) + }) + } +} + +func TestApplyChangeSet(t *testing.T) { + tests := []struct { + name string + apiKey string + changeSetRequest netboxdiodeplugin.ChangeSetRequest + mockServerResponse string + mockStatusCode int + response any + shouldError bool + }{ + { + name: "valid apply change set response", + apiKey: "foobar", + changeSetRequest: netboxdiodeplugin.ChangeSetRequest{ + ChangeSetID: "00000000-0000-0000-0000-000000000000", + ChangeSet: []netboxdiodeplugin.Change{ + { + ChangeID: "00000000-0000-0000-0000-000000000001", + ChangeType: "create", + ObjectType: "dcim.device", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDevice{ + Name: "test", + }, + }, + { + ChangeID: "00000000-0000-0000-0000-000000000002", + ChangeType: "update", + ObjectType: "dcim.device", + ObjectID: ptrInt(1), + ObjectVersion: ptrInt(2), + Data: &netbox.DcimDevice{ + Name: "test", + }, + }, + }, + }, + mockServerResponse: `{"change_set_id":"00000000-0000-0000-0000-000000000000","result":"success"}`, + mockStatusCode: http.StatusOK, + response: &netboxdiodeplugin.ChangeSetResponse{ + ChangeSetID: "00000000-0000-0000-0000-000000000000", + Result: "success", + }, + shouldError: false, + }, + { + name: "invalid request", + apiKey: "foobar", + changeSetRequest: netboxdiodeplugin.ChangeSetRequest{ + ChangeSetID: "00000000-0000-0000-0000-000000000000", + ChangeSet: []netboxdiodeplugin.Change{ + { + ChangeID: "00000000-0000-0000-0000-000000000001", + ChangeType: "create", + ObjectType: "", + ObjectID: nil, + ObjectVersion: nil, + Data: nil, + }, + }, + }, + mockServerResponse: `{"change_set_id":"00000000-0000-0000-0000-000000000000","result":"failure","errors":["invalid object type"]}`, + mockStatusCode: http.StatusBadRequest, + shouldError: true, + }, + } + + logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug, AddSource: false})) + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cleanUpEnvVars() + + handler := func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, r.Method, http.MethodPost) + assert.Equal(t, r.URL.Path, "/api/diode/apply-change-set/") + assert.Equal(t, r.Header.Get("Authorization"), fmt.Sprintf("Token %s", tt.apiKey)) + assert.Equal(t, r.Header.Get("User-Agent"), fmt.Sprintf("%s/%s", netboxdiodeplugin.SDKName, netboxdiodeplugin.SDKVersion)) + assert.Equal(t, r.Header.Get("Content-Type"), "application/json") + w.WriteHeader(tt.mockStatusCode) + _, _ = w.Write([]byte(tt.mockServerResponse)) + } + mux := http.NewServeMux() + mux.HandleFunc("/api/diode/apply-change-set/", handler) + ts := httptest.NewServer(mux) + defer ts.Close() + + _ = os.Setenv(netboxdiodeplugin.BaseURLEnvVarName, fmt.Sprintf("%s/api/diode", ts.URL)) + + client, err := netboxdiodeplugin.NewClient(logger, tt.apiKey) + require.NoError(t, err) + resp, err := client.ApplyChangeSet(context.Background(), tt.changeSetRequest) + if tt.shouldError { + require.Error(t, err) + return + } + require.NoError(t, err) + assert.Equal(t, tt.response, resp) + assert.Equal(t, tt.mockStatusCode, http.StatusOK) + }) + } +} + +func cleanUpEnvVars() { + _ = os.Unsetenv(netboxdiodeplugin.BaseURLEnvVarName) + _ = os.Unsetenv(netboxdiodeplugin.TimeoutSecondsEnvVarName) +} + +func ptrInt(i int) *int { + return &i +} diff --git a/diode-server/netboxdiodeplugin/mocks/netboxapi.go b/diode-server/netboxdiodeplugin/mocks/netboxapi.go new file mode 100644 index 00000000..c0eeedef --- /dev/null +++ b/diode-server/netboxdiodeplugin/mocks/netboxapi.go @@ -0,0 +1,155 @@ +// Code generated by mockery v2.42.1. DO NOT EDIT. + +package mocks + +import ( + context "context" + + netboxdiodeplugin "github.com/netboxlabs/diode/diode-server/netboxdiodeplugin" + mock "github.com/stretchr/testify/mock" +) + +// NetBoxAPI is an autogenerated mock type for the NetBoxAPI type +type NetBoxAPI struct { + mock.Mock +} + +type NetBoxAPI_Expecter struct { + mock *mock.Mock +} + +func (_m *NetBoxAPI) EXPECT() *NetBoxAPI_Expecter { + return &NetBoxAPI_Expecter{mock: &_m.Mock} +} + +// ApplyChangeSet provides a mock function with given fields: _a0, _a1 +func (_m *NetBoxAPI) ApplyChangeSet(_a0 context.Context, _a1 netboxdiodeplugin.ChangeSetRequest) (*netboxdiodeplugin.ChangeSetResponse, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for ApplyChangeSet") + } + + var r0 *netboxdiodeplugin.ChangeSetResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, netboxdiodeplugin.ChangeSetRequest) (*netboxdiodeplugin.ChangeSetResponse, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, netboxdiodeplugin.ChangeSetRequest) *netboxdiodeplugin.ChangeSetResponse); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*netboxdiodeplugin.ChangeSetResponse) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, netboxdiodeplugin.ChangeSetRequest) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NetBoxAPI_ApplyChangeSet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ApplyChangeSet' +type NetBoxAPI_ApplyChangeSet_Call struct { + *mock.Call +} + +// ApplyChangeSet is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 netboxdiodeplugin.ChangeSetRequest +func (_e *NetBoxAPI_Expecter) ApplyChangeSet(_a0 interface{}, _a1 interface{}) *NetBoxAPI_ApplyChangeSet_Call { + return &NetBoxAPI_ApplyChangeSet_Call{Call: _e.mock.On("ApplyChangeSet", _a0, _a1)} +} + +func (_c *NetBoxAPI_ApplyChangeSet_Call) Run(run func(_a0 context.Context, _a1 netboxdiodeplugin.ChangeSetRequest)) *NetBoxAPI_ApplyChangeSet_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(netboxdiodeplugin.ChangeSetRequest)) + }) + return _c +} + +func (_c *NetBoxAPI_ApplyChangeSet_Call) Return(_a0 *netboxdiodeplugin.ChangeSetResponse, _a1 error) *NetBoxAPI_ApplyChangeSet_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *NetBoxAPI_ApplyChangeSet_Call) RunAndReturn(run func(context.Context, netboxdiodeplugin.ChangeSetRequest) (*netboxdiodeplugin.ChangeSetResponse, error)) *NetBoxAPI_ApplyChangeSet_Call { + _c.Call.Return(run) + return _c +} + +// RetrieveObjectState provides a mock function with given fields: _a0, _a1 +func (_m *NetBoxAPI) RetrieveObjectState(_a0 context.Context, _a1 netboxdiodeplugin.RetrieveObjectStateQueryParams) (*netboxdiodeplugin.ObjectState, error) { + ret := _m.Called(_a0, _a1) + + if len(ret) == 0 { + panic("no return value specified for RetrieveObjectState") + } + + var r0 *netboxdiodeplugin.ObjectState + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, netboxdiodeplugin.RetrieveObjectStateQueryParams) (*netboxdiodeplugin.ObjectState, error)); ok { + return rf(_a0, _a1) + } + if rf, ok := ret.Get(0).(func(context.Context, netboxdiodeplugin.RetrieveObjectStateQueryParams) *netboxdiodeplugin.ObjectState); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*netboxdiodeplugin.ObjectState) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, netboxdiodeplugin.RetrieveObjectStateQueryParams) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// NetBoxAPI_RetrieveObjectState_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RetrieveObjectState' +type NetBoxAPI_RetrieveObjectState_Call struct { + *mock.Call +} + +// RetrieveObjectState is a helper method to define mock.On call +// - _a0 context.Context +// - _a1 netboxdiodeplugin.RetrieveObjectStateQueryParams +func (_e *NetBoxAPI_Expecter) RetrieveObjectState(_a0 interface{}, _a1 interface{}) *NetBoxAPI_RetrieveObjectState_Call { + return &NetBoxAPI_RetrieveObjectState_Call{Call: _e.mock.On("RetrieveObjectState", _a0, _a1)} +} + +func (_c *NetBoxAPI_RetrieveObjectState_Call) Run(run func(_a0 context.Context, _a1 netboxdiodeplugin.RetrieveObjectStateQueryParams)) *NetBoxAPI_RetrieveObjectState_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(netboxdiodeplugin.RetrieveObjectStateQueryParams)) + }) + return _c +} + +func (_c *NetBoxAPI_RetrieveObjectState_Call) Return(_a0 *netboxdiodeplugin.ObjectState, _a1 error) *NetBoxAPI_RetrieveObjectState_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *NetBoxAPI_RetrieveObjectState_Call) RunAndReturn(run func(context.Context, netboxdiodeplugin.RetrieveObjectStateQueryParams) (*netboxdiodeplugin.ObjectState, error)) *NetBoxAPI_RetrieveObjectState_Call { + _c.Call.Return(run) + return _c +} + +// NewNetBoxAPI creates a new instance of NetBoxAPI. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewNetBoxAPI(t interface { + mock.TestingT + Cleanup(func()) +}) *NetBoxAPI { + mock := &NetBoxAPI{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/diode-server/proto/buf.gen.yaml b/diode-server/proto/buf.gen.yaml new file mode 100644 index 00000000..e59915f0 --- /dev/null +++ b/diode-server/proto/buf.gen.yaml @@ -0,0 +1,11 @@ +version: v1 +plugins: + - plugin: go + out: ../ + opt: module=github.com/netboxlabs/diode/diode-server + - plugin: buf.build/grpc/go:v1.3.0 + out: ../ + opt: module=github.com/netboxlabs/diode/diode-server + - plugin: buf.build/bufbuild/validate-go:v1.0.4 + out: ../ + opt: module=github.com/netboxlabs/diode/diode-server diff --git a/diode-server/proto/buf.lock b/diode-server/proto/buf.lock new file mode 100644 index 00000000..fafef03e --- /dev/null +++ b/diode-server/proto/buf.lock @@ -0,0 +1,8 @@ +# Generated by buf. DO NOT EDIT. +version: v1 +deps: + - remote: buf.build + owner: envoyproxy + repository: protoc-gen-validate + commit: daf171c6cdb54629b5f51e345a79e4dd + digest: shake256:4ae167d7eed10da5f83a3f5df8c670d249170f11b1f2fd19afda06be2cff4d47dcc95e9e4a15151ecc8ce2d3d3614caf9a04d3ad82fb768a3870dedfa9455f36 diff --git a/diode-server/proto/buf.yaml b/diode-server/proto/buf.yaml new file mode 100644 index 00000000..b2fbd76e --- /dev/null +++ b/diode-server/proto/buf.yaml @@ -0,0 +1,12 @@ +version: v1 +deps: + - buf.build/envoyproxy/protoc-gen-validate +breaking: + use: + - FILE +lint: + use: + - DEFAULT + except: + - RPC_REQUEST_STANDARD_NAME + - RPC_RESPONSE_STANDARD_NAME diff --git a/diode-server/proto/reconciler/v1/reconciler.proto b/diode-server/proto/reconciler/v1/reconciler.proto new file mode 100644 index 00000000..e67d1f10 --- /dev/null +++ b/diode-server/proto/reconciler/v1/reconciler.proto @@ -0,0 +1,43 @@ +syntax = "proto3"; + +package reconciler.v1; + +import "validate/validate.proto"; + +option go_package = "github.com/netboxlabs/diode/diode-server/reconciler/v1/reconcilerpb"; + +// An ingestion data source +message IngestionDataSource { + string name = 1 [(validate.rules).string = { + min_len: 1 + max_len: 255 + }]; + string api_key = 2 [(validate.rules).string = { + min_len: 40 + max_len: 40 + }]; +} + +// The request to retrieve ingestion data sources +message RetrieveIngestionDataSourcesRequest { + string name = 1 [(validate.rules).string = { + min_len: 1 + max_len: 255 + }]; + string sdk_name = 2 [(validate.rules).string = { + min_len: 1 + max_len: 255 + }]; + string sdk_version = 3 [(validate.rules).string = {pattern: "^(\\d)+\\.(\\d)+\\.(\\d)+$"}]; +} + +// The response from the retrieve ingestion data sources request +message RetrieveIngestionDataSourcesResponse { + repeated IngestionDataSource ingestion_data_sources = 1; +} + +// Reconciler service API +service ReconcilerService { + // Retrieves ingestion data sources + rpc RetrieveIngestionDataSources(RetrieveIngestionDataSourcesRequest) returns (RetrieveIngestionDataSourcesResponse) {} +} diff --git a/diode-server/reconciler/api_keys.go b/diode-server/reconciler/api_keys.go new file mode 100644 index 00000000..a40bd2f0 --- /dev/null +++ b/diode-server/reconciler/api_keys.go @@ -0,0 +1,29 @@ +package reconciler + +import ( + "context" + "encoding/json" + "github.com/redis/go-redis/v9" +) + +// APIKeys is a map of API keys +type APIKeys map[string]string + +// MarshalBinary marshals APIKeys to JSON encoding +func (ak APIKeys) MarshalBinary() ([]byte, error) { + return json.Marshal(ak) +} + +func loadAPIKeys(ctx context.Context, cfg Config, rc *redis.Client) (APIKeys, error) { + apiKeys := map[string]string{ + "DIODE_TO_NETBOX": cfg.DiodeToNetBoxAPIKey, + "NETBOX_TO_DIODE": cfg.NetBoxToDiodeAPIKey, + "INGESTION": cfg.IngestionAPIKey, + } + + if err := rc.HSet(ctx, "diode.api_keys", apiKeys).Err(); err != nil { + return nil, err + } + + return apiKeys, nil +} diff --git a/diode-server/reconciler/changeset/changeset.go b/diode-server/reconciler/changeset/changeset.go new file mode 100644 index 00000000..16a51d71 --- /dev/null +++ b/diode-server/reconciler/changeset/changeset.go @@ -0,0 +1,212 @@ +package changeset + +import ( + "context" + "fmt" + + "github.com/google/uuid" + "github.com/mitchellh/mapstructure" + + "github.com/netboxlabs/diode/diode-server/netbox" + "github.com/netboxlabs/diode/diode-server/netboxdiodeplugin" +) + +const ( + // ChangeTypeCreate is the change type for a creation + ChangeTypeCreate = "create" + + // ChangeTypeUpdate is the change type for an update + ChangeTypeUpdate = "update" +) + +// IngestEntity represents an ingest entity +type IngestEntity struct { + RequestID string `json:"request_id"` + DataType string `json:"data_type"` + Entity any `json:"entity"` + State int `json:"state"` +} + +// ObjectState represents a object state +type ObjectState struct { + ObjectID int `json:"object_id"` + ObjectType string `json:"object_type"` + ObjectChangeID int `json:"object_change_id"` + Object any `json:"object"` +} + +// ChangeSet represents a change set +type ChangeSet struct { + ChangeSetID string `json:"change_set_id"` + ChangeSet []Change `json:"change_set"` +} + +// Change represents a change for the change set +type Change struct { + ChangeID string `json:"change_id"` + ChangeType string `json:"change_type"` + ObjectType string `json:"object_type"` + ObjectID *int `json:"object_id,omitempty"` + ObjectVersion *int `json:"object_version,omitempty"` + Data any `json:"data"` +} + +// Prepare prepares a change set +func Prepare(entity IngestEntity, netboxAPI netboxdiodeplugin.NetBoxAPI) (*ChangeSet, error) { + // extract ingested entity (actual) + actual, err := extractIngestEntityData(entity) + if err != nil { + return nil, err + } + + // get root object and all its nested objects (actual) + actualNestedObjects, err := actual.NestedObjects() + if err != nil { + return nil, err + } + + // map out root object and all its nested objects (actual) + actualNestedObjectsMap := make(map[string]netbox.ComparableData) + for _, obj := range actualNestedObjects { + actualNestedObjectsMap[fmt.Sprintf("%p", obj.Data())] = obj + } + + // retrieve root object all its nested objects from NetBox (intended) + intendedNestedObjectsMap := make(map[string]netbox.ComparableData) + for _, obj := range actualNestedObjects { + intended, err := retrieveObjectState(netboxAPI, obj) + if err != nil { + return nil, err + } + intendedNestedObjectsMap[fmt.Sprintf("%p", obj.Data())] = intended + } + + // map out retrieved root object and all its nested objects (current) + var current netbox.ComparableData + for _, obj := range actualNestedObjects { + if obj.DataType() == entity.DataType { + current = intendedNestedObjectsMap[fmt.Sprintf("%p", obj.Data())] + break + } + } + + objectsToReconcile, err := actual.Patch(current, intendedNestedObjectsMap) + if err != nil { + return nil, err + } + + // process objectsToReconcile and prepare changeset to return + changes := make([]Change, 0) + + for _, obj := range objectsToReconcile { + operation := ChangeTypeCreate + var objectID *int + + id := obj.ID() + if id > 0 { + objectID = &id + operation = ChangeTypeUpdate + } + + changes = append(changes, Change{ + ChangeID: uuid.NewString(), + ChangeType: operation, + ObjectType: obj.DataType(), + ObjectID: objectID, + ObjectVersion: nil, + Data: obj.Data(), + }) + } + + return &ChangeSet{ChangeSetID: uuid.NewString(), ChangeSet: changes}, nil +} + +func retrieveObjectState(netboxAPI netboxdiodeplugin.NetBoxAPI, change netbox.ComparableData) (netbox.ComparableData, error) { + params := netboxdiodeplugin.RetrieveObjectStateQueryParams{ + ObjectID: 0, + ObjectType: change.DataType(), + Params: change.ObjectStateQueryParams(), + } + resp, err := netboxAPI.RetrieveObjectState(context.Background(), params) + if err != nil { + return nil, err + } + + if resp.Object.IsValid() { + objectState := &ObjectState{ + ObjectID: resp.ObjectID, + ObjectType: change.DataType(), + ObjectChangeID: resp.ObjectChangeID, + Object: resp.Object, + } + + return extractNetBoxObjectStateData(*objectState) + } + + return nil, nil +} + +func extractIngestEntityData(ingestEntity IngestEntity) (netbox.ComparableData, error) { + if ingestEntity.Entity == nil { + return nil, fmt.Errorf("ingest entity is nil") + } + + dw, err := netbox.NewDataWrapper(ingestEntity.DataType) + if err != nil { + return nil, err + } + + decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{ + Result: &dw, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + netbox.IpamIPAddressAssignedObjectHookFunc(), + ), + }) + if err != nil { + return nil, err + } + + if err := decoder.Decode(ingestEntity.Entity); err != nil { + return nil, fmt.Errorf("failed to decode ingest entity %w", err) + } + + if !dw.IsValid() { + return nil, fmt.Errorf("invalid ingest entity") + } + + return dw, nil +} + +func extractNetBoxObjectStateData(obj ObjectState) (netbox.ComparableData, error) { + if obj.Object == nil { + return nil, fmt.Errorf("object state is nil") + } + + dw, err := netbox.NewDataWrapper(obj.ObjectType) + if err != nil { + return nil, err + } + + decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{ + Result: &dw, + MatchName: netbox.IpamIPAddressAssignedObjectMatchName, + DecodeHook: mapstructure.ComposeDecodeHookFunc( + netbox.IpamIPAddressAssignedObjectHookFunc(), + ), + }) + if err != nil { + return nil, err + } + + if err := decoder.Decode(obj.Object); err != nil { + return nil, fmt.Errorf("failed to decode object entity %w", err) + } + + if !dw.IsValid() { + return nil, fmt.Errorf("invalid object state") + } + + dw.Normalise() + + return dw, nil +} diff --git a/diode-server/reconciler/changeset/changeset_test.go b/diode-server/reconciler/changeset/changeset_test.go new file mode 100644 index 00000000..9ef7d7d1 --- /dev/null +++ b/diode-server/reconciler/changeset/changeset_test.go @@ -0,0 +1,6168 @@ +package changeset_test + +import ( + "context" + "encoding/json" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/netboxlabs/diode/diode-server/netbox" + "github.com/netboxlabs/diode/diode-server/netboxdiodeplugin" + "github.com/netboxlabs/diode/diode-server/netboxdiodeplugin/mocks" + "github.com/netboxlabs/diode/diode-server/reconciler/changeset" +) + +func TestPrepare(t *testing.T) { + type mockRetrieveObjectState struct { + objectType string + objectID int + queryParams map[string]string + objectChangeID int + object netbox.ComparableData + } + tests := []struct { + name string + rawIngestEntity []byte + retrieveObjectStates []mockRetrieveObjectState + wantChangeSet changeset.ChangeSet + wantErr bool + }{ + { + name: "[P1] ingest dcim.site with name only - existing object not found - create", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.site", + "entity": { + "Site": { + "name": "Site A" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "Site A"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: nil, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.site", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimSite{ + Name: "Site A", + Slug: "site-a", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P1] ingest dcim.site with name only - existing object found - do nothing", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.site", + "entity": { + "Site": { + "name": "Site A" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "Site A"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "Site A", + Slug: "site-a", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: false, + }, + { + name: "[P1] ingest dcim.site with tags - existing object found - update with new tags", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.site", + "entity": { + "Site": { + "name": "Site A", + "tags": [ + { + "name": "tag 1" + }, + { + "name": "tag 2" + } + ] + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "Site A"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "Site A", + Slug: "site-a", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + Tags: []*netbox.Tag{ + { + ID: 1, + Name: "tag 1", + Slug: "tag-1", + }, + { + ID: 3, + Name: "tag 3", + Slug: "tag-3", + }, + }, + }, + }, + }, + { + objectType: "extras.tag", + objectID: 0, + queryParams: map[string]string{"q": "tag 1"}, + objectChangeID: 0, + object: &netbox.TagDataWrapper{ + Tag: &netbox.Tag{ + ID: 1, + Name: "tag 1", + Slug: "tag-1", + }, + }, + }, + { + objectType: "extras.tag", + objectID: 0, + queryParams: map[string]string{"q": "tag 2"}, + objectChangeID: 0, + object: &netbox.TagDataWrapper{ + Tag: nil, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b6", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "extras.tag", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.Tag{ + Name: "tag 2", + Slug: "tag-2", + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeUpdate, + ObjectType: "dcim.site", + ObjectID: intPtr(1), + ObjectVersion: nil, + Data: &netbox.DcimSite{ + ID: 1, + Name: "Site A", + Slug: "site-a", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + Tags: []*netbox.Tag{ + { + ID: 1, + Name: "tag 1", + Slug: "tag-1", + }, + { + ID: 3, + Name: "tag 3", + Slug: "tag-3", + }, + { + Name: "tag 2", + Slug: "tag-2", + }, + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P1] ingest empty dcim.site - error", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.site", + "entity": { + "Site": {} + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{}, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: true, + }, + { + name: "[P2] ingest dcim.devicerole with name only - existing object not found - create", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.devicerole", + "entity": { + "DeviceRole": { + "name": "WAN Router" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "WAN Router"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: nil, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.devicerole", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDeviceRole{ + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("000000"), + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P2] ingest dcim.devicerole with name only - existing object found - do nothing", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.devicerole", + "entity": { + "DeviceRole": { + "name": "WAN Router" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "WAN Router"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 1, + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("000000"), + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: false, + }, + { + name: "[P2] ingest dcim.devicerole with name and new description - existing object found - update", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.devicerole", + "entity": { + "DeviceRole": { + "name": "WAN Router", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "WAN Router"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 1, + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("111222"), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sed molestie felis."), + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeUpdate, + ObjectType: "dcim.devicerole", + ObjectID: intPtr(1), + ObjectVersion: nil, + Data: &netbox.DcimDeviceRole{ + ID: 1, + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("111222"), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P2] ingest dcim.devicerole with same color - existing object found - nothing to update", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.devicerole", + "entity": { + "DeviceRole": { + "name": "WAN Router", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "color": "111222" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "WAN Router"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 1, + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("111222"), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: false, + }, + { + name: "[P2] ingest empty dcim.devicerole - error", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.devicerole", + "entity": { + "DeviceRole": {} + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{}, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: true, + }, + { + name: "[P3] ingest dcim.manufacturer with name only - existing object not found - create", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.manufacturer", + "entity": { + "Manufacturer": { + "name": "Cisco" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "Cisco"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: nil, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.manufacturer", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimManufacturer{ + Name: "Cisco", + Slug: "cisco", + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P3] ingest dcim.manufacturer with name only - existing object found - do nothing", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.manufacturer", + "entity": { + "Manufacturer": { + "name": "Cisco" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "Cisco"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "Cisco", + Slug: "cisco", + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: false, + }, + { + name: "[P3] ingest empty dcim.manufacturer - error", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.manufacturer", + "entity": { + "Manufacturer": {} + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{}, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: true, + }, + { + name: "[P4] ingest dcim.devicetype with model only - existing object not found - create", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.devicetype", + "entity": { + "DeviceType": { + "model": "ISR4321" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: nil, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "ISR4321", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: nil, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.manufacturer", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimManufacturer{ + Name: "undefined", + Slug: "undefined", + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.devicetype", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDeviceType{ + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P4] ingest dcim.devicetype with model only - existing object found - do nothing", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.devicetype", + "entity": { + "DeviceType": { + "model": "ISR4321" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "ISR4321", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + Tags: []*netbox.Tag{}, + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: false, + }, + { + name: "[P4] ingest empty dcim.devicetype - error", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.devicetype", + "entity": { + "DeviceType": {} + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{}, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: true, + }, + { + name: "[P5] ingest dcim.devicetype with manufacturer - existing object not found - create manufacturer and devicetype", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.devicetype", + "entity": { + "DeviceType": { + "model": "ISR4321", + "manufacturer": { + "name": "Cisco" + }, + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "part_number": "xyz123" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "Cisco"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: nil, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "ISR4321", "manufacturer__name": "Cisco"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: nil, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.manufacturer", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimManufacturer{ + Name: "Cisco", + Slug: "cisco", + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.devicetype", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDeviceType{ + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + Name: "Cisco", + Slug: "cisco", + }, + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + PartNumber: strPtr("xyz123"), + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P5] ingest dcim.devicetype with new manufacturer - existing object found - create manufacturer and update devicetype", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.devicetype", + "entity": { + "DeviceType": { + "model": "ISR4321", + "manufacturer": { + "name": "Cisco", + "tags": [ + { + "name": "tag 1" + }, + { + "name": "tag 10" + }, + { + "name": "tag 11" + } + ] + }, + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "part_number": "xyz123", + "tags": [ + { + "name": "tag 3" + } + ] + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "Cisco"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 2, + Name: "Cisco", + Slug: "cisco", + Tags: []*netbox.Tag{ + { + ID: 1, + Name: "tag 1", + Slug: "tag-1", + }, + { + ID: 5, + Name: "tag 5", + Slug: "tag-5", + }, + }, + }, + }, + }, + { + objectType: "extras.tag", + objectID: 0, + queryParams: map[string]string{"q": "tag 1"}, + objectChangeID: 0, + object: &netbox.TagDataWrapper{ + Tag: &netbox.Tag{ + ID: 1, + Name: "tag 1", + Slug: "tag-1", + }, + }, + }, + { + objectType: "extras.tag", + objectID: 0, + queryParams: map[string]string{"q": "tag 10"}, + objectChangeID: 0, + object: &netbox.TagDataWrapper{ + Tag: &netbox.Tag{ + ID: 10, + Name: "tag 10", + Slug: "tag-10", + }, + }, + }, + { + objectType: "extras.tag", + objectID: 0, + queryParams: map[string]string{"q": "tag 11"}, + objectChangeID: 0, + object: &netbox.TagDataWrapper{ + Tag: nil, + }, + }, + { + objectType: "extras.tag", + objectID: 0, + queryParams: map[string]string{"q": "tag 3"}, + objectChangeID: 0, + object: &netbox.TagDataWrapper{ + Tag: nil, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "ISR4321", "manufacturer__name": "Cisco"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Tags: []*netbox.Tag{ + { + ID: 4, + Name: "tag 4", + Slug: "tag-4", + }, + }, + }, + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + PartNumber: strPtr("xyz123"), + Tags: []*netbox.Tag{ + { + ID: 2, + Name: "tag 2", + Slug: "tag-2", + }, + }, + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b6", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "extras.tag", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.Tag{ + Name: "tag 3", + Slug: "tag-3", + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b6", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "extras.tag", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.Tag{ + Name: "tag 11", + Slug: "tag-11", + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeUpdate, + ObjectType: "dcim.manufacturer", + ObjectID: intPtr(2), + ObjectVersion: nil, + Data: &netbox.DcimManufacturer{ + ID: 2, + Name: "Cisco", + Slug: "cisco", + Tags: []*netbox.Tag{ + { + ID: 1, + Name: "tag 1", + Slug: "tag-1", + }, + { + ID: 5, + Name: "tag 5", + Slug: "tag-5", + }, + { + ID: 10, + Name: "tag 10", + Slug: "tag-10", + }, + { + Name: "tag 11", + Slug: "tag-11", + }, + }, + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeUpdate, + ObjectType: "dcim.devicetype", + ObjectID: intPtr(1), + ObjectVersion: nil, + Data: &netbox.DcimDeviceType{ + ID: 1, + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + ID: 2, + Name: "Cisco", + Slug: "cisco", + }, + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + PartNumber: strPtr("xyz123"), + Tags: []*netbox.Tag{ + { + ID: 2, + Name: "tag 2", + Slug: "tag-2", + }, + { + Name: "tag 3", + Slug: "tag-3", + }, + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P5.2] ingest dcim.devicetype with new manufacturer - existing object found - create manufacturer and update devicetype", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.devicetype", + "entity": { + "DeviceType": { + "model": "ISR4321", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "part_number": "xyz123", + "tags": [ + { + "name": "tag 3" + } + ] + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Tags: []*netbox.Tag{ + { + ID: 4, + Name: "tag 4", + Slug: "tag-4", + }, + }, + }, + }, + }, + { + objectType: "extras.tag", + objectID: 0, + queryParams: map[string]string{"q": "tag 3"}, + objectChangeID: 0, + object: &netbox.TagDataWrapper{ + Tag: nil, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "ISR4321", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Tags: []*netbox.Tag{ + { + ID: 4, + Name: "tag 4", + Slug: "tag-4", + }, + }, + }, + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + PartNumber: strPtr("xyz123"), + Tags: []*netbox.Tag{ + { + ID: 2, + Name: "tag 2", + Slug: "tag-2", + }, + }, + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "extras.tag", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.Tag{ + Name: "tag 3", + Slug: "tag-3", + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeUpdate, + ObjectType: "dcim.devicetype", + ObjectID: intPtr(1), + ObjectVersion: nil, + Data: &netbox.DcimDeviceType{ + ID: 1, + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + }, + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + PartNumber: strPtr("xyz123"), + Tags: []*netbox.Tag{ + { + ID: 2, + Name: "tag 2", + Slug: "tag-2", + }, + { + Name: "tag 3", + Slug: "tag-3", + }, + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P5.3] ingest dcim.devicetype with new manufacturer - existing object found - update devicetype with new existing manufacturer", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.devicetype", + "entity": { + "DeviceType": { + "model": "ISR4321", + "manufacturer": { + "name": "Cisco" + }, + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "part_number": "xyz123", + "tags": [ + { + "name": "tag 3" + } + ] + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "Cisco"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "Cisco", + Slug: "cisco", + Tags: []*netbox.Tag{ + { + ID: 4, + Name: "tag 4", + Slug: "tag-4", + }, + }, + }, + }, + }, + { + objectType: "extras.tag", + objectID: 0, + queryParams: map[string]string{"q": "tag 3"}, + objectChangeID: 0, + object: &netbox.TagDataWrapper{ + Tag: nil, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "ISR4321", "manufacturer__name": "Cisco"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Tags: []*netbox.Tag{ + { + ID: 4, + Name: "tag 4", + Slug: "tag-4", + }, + }, + }, + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + PartNumber: strPtr("xyz123"), + Tags: []*netbox.Tag{ + { + ID: 2, + Name: "tag 2", + Slug: "tag-2", + }, + }, + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "extras.tag", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.Tag{ + Name: "tag 3", + Slug: "tag-3", + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeUpdate, + ObjectType: "dcim.devicetype", + ObjectID: intPtr(1), + ObjectVersion: nil, + Data: &netbox.DcimDeviceType{ + ID: 1, + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + }, + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + PartNumber: strPtr("xyz123"), + Tags: []*netbox.Tag{ + { + ID: 2, + Name: "tag 2", + Slug: "tag-2", + }, + { + Name: "tag 3", + Slug: "tag-3", + }, + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P6] ingest dcim.device with name only - existing object not found - create device and all related objects (using placeholders)", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.device", + "entity": { + "Device": { + "name": "router01" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: nil, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: nil, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: nil, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: nil, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "router01", "site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: nil, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.site", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimSite{ + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.manufacturer", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimManufacturer{ + Name: "undefined", + Slug: "undefined", + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.devicetype", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDeviceType{ + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.devicerole", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDeviceRole{ + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.device", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDevice{ + Name: "router01", + Site: &netbox.DcimSite{ + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P6] ingest dcim.device with name only - existing object and its related objects found - do nothing", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.device", + "entity": { + "Device": { + "name": "router01" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "router01", "site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 1, + Name: "router01", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: false, + }, + { + name: "[P6] ingest dcim.device with empty site", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.device", + "entity": { + "Device": { + "name": "router01", + "site": {} + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "router01", "site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 1, + Name: "router01", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: false, + }, + { + name: "[P7] ingest dcim.device - existing object not found - create device and all related objects", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.device", + "entity": { + "Device": { + "name": "router01", + "device_type": { + "model": "ISR4321" + }, + "role": { + "name": "WAN Router" + }, + "site": { + "name": "Site A" + }, + "status": "active", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "serial": "123456", + "tags": [ + { + "name": "tag 1" + } + ] + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "Site A"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: nil, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: nil, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "ISR4321", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: nil, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "WAN Router"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: nil, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "router01", "site__name": "Site A"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: nil, + }, + }, + { + objectType: "extras.tag", + objectID: 0, + queryParams: map[string]string{"q": "tag 1"}, + objectChangeID: 0, + object: &netbox.TagDataWrapper{ + Tag: &netbox.Tag{ + ID: 1, + Name: "tag 1", + Slug: "tag-1", + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.site", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimSite{ + Name: "Site A", + Slug: "site-a", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.manufacturer", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimManufacturer{ + Name: "undefined", + Slug: "undefined", + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.devicetype", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDeviceType{ + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.devicerole", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDeviceRole{ + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("000000"), + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.device", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDevice{ + Name: "router01", + Site: &netbox.DcimSite{ + Name: "Site A", + Slug: "site-a", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("000000"), + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + Serial: strPtr("123456"), + Tags: []*netbox.Tag{ + { + ID: 1, + Name: "tag 1", + Slug: "tag-1", + }, + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P7] ingest dcim.device with device type having manufacturer defined - existing object not found - create device and all related objects", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.device", + "entity": { + "Device": { + "name": "router01", + "device_type": { + "model": "ISR4321", + "manufacturer": { + "name": "Cisco" + } + }, + "role": { + "name": "WAN Router" + }, + "site": { + "name": "Site A" + }, + "status": "active", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "serial": "123456", + "tags": [ + { + "name": "tag 1" + } + ] + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "Site A"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: nil, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "Cisco"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: nil, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "ISR4321", "manufacturer__name": "Cisco"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: nil, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "WAN Router"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: nil, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "router01", "site__name": "Site A"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: nil, + }, + }, + { + objectType: "extras.tag", + objectID: 0, + queryParams: map[string]string{"q": "tag 1"}, + objectChangeID: 0, + object: &netbox.TagDataWrapper{ + Tag: &netbox.Tag{ + ID: 1, + Name: "tag 1", + Slug: "tag-1", + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.site", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimSite{ + Name: "Site A", + Slug: "site-a", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.manufacturer", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimManufacturer{ + Name: "Cisco", + Slug: "cisco", + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.devicetype", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDeviceType{ + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + Name: "Cisco", + Slug: "cisco", + }, + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.devicerole", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDeviceRole{ + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("000000"), + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.device", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDevice{ + Name: "router01", + Site: &netbox.DcimSite{ + Name: "Site A", + Slug: "site-a", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + Name: "Cisco", + Slug: "cisco", + }, + }, + Role: &netbox.DcimDeviceRole{ + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("000000"), + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + Serial: strPtr("123456"), + Tags: []*netbox.Tag{ + { + ID: 1, + Name: "tag 1", + Slug: "tag-1", + }, + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P6] ingest empty dcim.device - error", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.device", + "entity": { + "Device": {} + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{}, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: true, + }, + { + name: "[P7] ingest dcim.device - existing object found - create missing related objects and update device", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.device", + "entity": { + "Device": { + "name": "router01", + "device_type": { + "model": "ISR4321" + }, + "role": { + "name": "WAN Router" + }, + "site": { + "name": "Site A" + }, + "status": "active", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "serial": "123456", + "tags": [ + { + "name": "tag 1" + } + ] + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "Site A"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: nil, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "ISR4321", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: nil, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "WAN Router"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: nil, + }, + }, + { + objectType: "extras.tag", + objectID: 0, + queryParams: map[string]string{"q": "tag 1"}, + objectChangeID: 0, + object: &netbox.TagDataWrapper{ + Tag: &netbox.Tag{ + ID: 1, + Name: "tag 1", + Slug: "tag-1", + }, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "router01", "site__name": "Site A"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 1, + Name: "router01", + Site: &netbox.DcimSite{ + ID: 1, + Name: "Site B", + Slug: "site-b", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "ISR4322", + Slug: "isr4322", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + Serial: strPtr("123456"), + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.site", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimSite{ + Name: "Site A", + Slug: "site-a", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.devicetype", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDeviceType{ + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + }, + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.devicerole", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDeviceRole{ + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("000000"), + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeUpdate, + ObjectType: "dcim.device", + ObjectID: intPtr(1), + ObjectVersion: nil, + Data: &netbox.DcimDevice{ + ID: 1, + Name: "router01", + Site: &netbox.DcimSite{ + Name: "Site A", + Slug: "site-a", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + }, + }, + Role: &netbox.DcimDeviceRole{ + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + Serial: strPtr("123456"), + Tags: []*netbox.Tag{ + { + ID: 1, + Name: "tag 1", + Slug: "tag-1", + }, + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P8] ingest dcim.device - existing object not found - create device and all related objects", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.device", + "entity": { + "Device": { + "name": "router01", + "device_type": { + "model": "ISR4321" + }, + "role": { + "name": "WAN Router" + }, + "site": { + "name": "Site A" + }, + "platform": { + "name": "Cisco IOS 15.6" + }, + "status": "active", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "serial": "123456" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "Site A"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: nil, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: nil, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "ISR4321", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: nil, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "WAN Router"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: nil, + }, + }, + { + objectType: "dcim.platform", + objectID: 0, + queryParams: map[string]string{"q": "Cisco IOS 15.6"}, + objectChangeID: 0, + object: &netbox.DcimPlatformDataWrapper{ + Platform: nil, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "router01", "site__name": "Site A"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: nil, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.site", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimSite{ + Name: "Site A", + Slug: "site-a", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.platform", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimPlatform{ + Name: "Cisco IOS 15.6", + Slug: "cisco-ios-15-6", + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.manufacturer", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimManufacturer{ + Name: "undefined", + Slug: "undefined", + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.devicetype", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDeviceType{ + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.devicerole", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDeviceRole{ + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("000000"), + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.device", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDevice{ + Name: "router01", + Site: &netbox.DcimSite{ + Name: "Site A", + Slug: "site-a", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + Name: "Cisco IOS 15.6", + Slug: "cisco-ios-15-6", + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + Serial: strPtr("123456"), + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P8] ingest dcim.device - existing object found - create missing related objects and update device", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.device", + "entity": { + "Device": { + "name": "router01", + "device_type": { + "model": "ISR4321" + }, + "role": { + "name": "WAN Router" + }, + "site": { + "name": "Site A" + }, + "platform": { + "name": "Cisco IOS 15.6" + }, + "status": "active", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "serial": "123456" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "Site A"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: nil, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "ISR4321", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: nil, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "WAN Router"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: nil, + }, + }, + { + objectType: "dcim.platform", + objectID: 0, + queryParams: map[string]string{"q": "Cisco IOS 15.6"}, + objectChangeID: 0, + object: &netbox.DcimPlatformDataWrapper{ + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "Cisco IOS 15.6", + Slug: "cisco-ios-15-6", + }, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "router01", "site__name": "Site A"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 1, + Name: "router01", + Site: &netbox.DcimSite{ + ID: 1, + Name: "Site B", + Slug: "site-b", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "ISR4322", + Slug: "isr4322", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + Serial: strPtr("123456"), + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.site", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimSite{ + Name: "Site A", + Slug: "site-a", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.devicetype", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDeviceType{ + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + }, + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.devicerole", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDeviceRole{ + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("000000"), + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeUpdate, + ObjectType: "dcim.device", + ObjectID: intPtr(1), + ObjectVersion: nil, + Data: &netbox.DcimDevice{ + ID: 1, + Name: "router01", + Site: &netbox.DcimSite{ + Name: "Site A", + Slug: "site-a", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + }, + }, + Role: &netbox.DcimDeviceRole{ + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + Serial: strPtr("123456"), + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P8] ingest dcim.device - existing object found - create some missing related objects, use other existing one and update device", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.device", + "entity": { + "Device": { + "name": "router01", + "device_type": { + "model": "ISR4321" + }, + "role": { + "name": "WAN Router" + }, + "site": { + "name": "Site A" + }, + "platform": { + "name": "Cisco IOS 15.6" + }, + "status": "active", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "serial": "123456-2" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "Site A"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "Site A", + Slug: "site-a", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "ISR4321", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "WAN Router"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 1, + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("111111"), + }, + }, + }, + { + objectType: "dcim.platform", + objectID: 0, + queryParams: map[string]string{"q": "Cisco IOS 15.6"}, + objectChangeID: 0, + object: &netbox.DcimPlatformDataWrapper{ + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "Cisco IOS 15.6", + Slug: "cisco-ios-15-6", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "router01", "site__name": "Site A"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 1, + Name: "router01", + Site: &netbox.DcimSite{ + ID: 1, + Name: "Site B", + Slug: "site-b", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "ISR4322", + Slug: "isr4322", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("111111"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "Cisco IOS 15.6", + Slug: "cisco-ios-15-6", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + Serial: strPtr("123456"), + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeUpdate, + ObjectType: "dcim.device", + ObjectID: intPtr(1), + ObjectVersion: nil, + Data: &netbox.DcimDevice{ + ID: 1, + Name: "router01", + Site: &netbox.DcimSite{ + ID: 1, + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + Serial: strPtr("123456-2"), + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P8.1] ingest dcim.device with partial data - existing object found - create missing related objects and update device", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.device", + "entity": { + "Device": { + "name": "router01", + "device_type": { + "model": "ISR4321" + }, + "role": { + "name": "WAN Router" + }, + "platform": { + "name": "Cisco IOS 15.6" + }, + "status": "active", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "serial": "123456" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "ISR4321", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: nil, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "WAN Router"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: nil, + }, + }, + { + objectType: "dcim.platform", + objectID: 0, + queryParams: map[string]string{"q": "Cisco IOS 15.6"}, + objectChangeID: 0, + object: &netbox.DcimPlatformDataWrapper{ + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "Cisco IOS 15.6", + Slug: "cisco-ios-15-6", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "router01", "site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 1, + Name: "router01", + Site: &netbox.DcimSite{ + ID: 2, + Name: "Site B", + Slug: "site-b", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "ISR4322", + Slug: "isr4322", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "Cisco IOS 15.6", + Slug: "cisco-ios-15-6", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + Serial: strPtr("123456"), + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.devicetype", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDeviceType{ + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + }, + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.devicerole", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDeviceRole{ + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("000000"), + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeUpdate, + ObjectType: "dcim.device", + ObjectID: intPtr(1), + ObjectVersion: nil, + Data: &netbox.DcimDevice{ + ID: 1, + Name: "router01", + Site: &netbox.DcimSite{ + ID: 2, + }, + DeviceType: &netbox.DcimDeviceType{ + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + }, + }, + Role: &netbox.DcimDeviceRole{ + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + Serial: strPtr("123456"), + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P8.2] ingest dcim.device - existing object found - no changes to apply", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.device", + "entity": { + "Device": { + "name": "router01", + "device_type": { + "model": "ISR4321" + }, + "role": { + "name": "WAN Router" + }, + "site": { + "name": "Site B" + }, + "platform": { + "name": "Cisco IOS 15.6" + }, + "status": "active", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", + "serial": "123456" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "Site B"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "Site B", + Slug: "site-b", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "ISR4321", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "WAN Router"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 1, + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("111111"), + }, + }, + }, + { + objectType: "dcim.platform", + objectID: 0, + queryParams: map[string]string{"q": "Cisco IOS 15.6"}, + objectChangeID: 0, + object: &netbox.DcimPlatformDataWrapper{ + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "Cisco IOS 15.6", + Slug: "cisco-ios-15-6", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "router01", "site__name": "Site B"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 1, + Name: "router01", + Site: &netbox.DcimSite{ + ID: 1, + Name: "Site B", + Slug: "site-b", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "ISR4321", + Slug: "isr4321", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("111111"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "Cisco IOS 15.6", + Slug: "cisco-ios-15-6", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + Serial: strPtr("123456"), + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: false, + }, + { + name: "[P9] ingest dcim.site with name, status and description - existing object not found - create", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.site", + "entity": { + "Site": { + "name": "Site A", + "status": "active", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "Site A"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: nil, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.site", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimSite{ + Name: "Site A", + Slug: "site-a", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P9] ingest dcim.site with name, status and new description - existing object found - update", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.site", + "entity": { + "Site": { + "name": "Site A", + "status": "active", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sed molestie felis." + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "Site A"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "Site A", + Slug: "site-a", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeUpdate, + ObjectType: "dcim.site", + ObjectID: intPtr(1), + ObjectVersion: nil, + Data: &netbox.DcimSite{ + ID: 1, + Name: "Site A", + Slug: "site-a", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sed molestie felis."), + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P10] ingest dcim.manufacturer with name and description - existing object not found - create", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.manufacturer", + "entity": { + "Manufacturer": { + "name": "Cisco", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "Cisco"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: nil, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.manufacturer", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimManufacturer{ + Name: "Cisco", + Slug: "cisco", + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P10] ingest dcim.manufacturer with name and new description - existing object found - update", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.manufacturer", + "entity": { + "Manufacturer": { + "name": "Cisco", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sed molestie felis." + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "Cisco"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "Cisco", + Slug: "cisco", + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeUpdate, + ObjectType: "dcim.manufacturer", + ObjectID: intPtr(1), + ObjectVersion: nil, + Data: &netbox.DcimManufacturer{ + ID: 1, + Name: "Cisco", + Slug: "cisco", + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sed molestie felis."), + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P11] ingest dcim.devicerole with name and additional attributes - existing object not found - create", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.devicerole", + "entity": { + "DeviceRole": { + "name": "WAN Router", + "color": "509415", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit." + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "WAN Router"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: nil, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.devicerole", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDeviceRole{ + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("509415"), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P11] ingest dcim.devicerole with name and new additional attributes - existing object found - update", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.devicerole", + "entity": { + "DeviceRole": { + "name": "WAN Router", + "color": "ffffff", + "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sed molestie felis." + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "WAN Router"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 1, + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("509415"), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit."), + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeUpdate, + ObjectType: "dcim.devicerole", + ObjectID: intPtr(1), + ObjectVersion: nil, + Data: &netbox.DcimDeviceRole{ + ID: 1, + Name: "WAN Router", + Slug: "wan-router", + Color: strPtr("ffffff"), + Description: strPtr("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sed molestie felis."), + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P12] ingest empty dcim.platform - error", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.platform", + "entity": { + "Platform": {} + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{}, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: true, + }, + { + name: "[P13] ingest dcim.interface with name only - existing object not found - create", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.interface", + "entity": { + "Interface": { + "name": "GigabitEthernet0/0/0" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.interface", + objectID: 0, + queryParams: map[string]string{"q": "GigabitEthernet0/0/0", "device__name": "undefined", "device__site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimInterfaceDataWrapper{ + Interface: nil, + }, + }, + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + objectType: "dcim.platform", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimPlatformDataWrapper{ + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: nil, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.device", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimDevice{ + Name: "undefined", + Site: &netbox.DcimSite{ + ID: 1, + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.interface", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimInterface{ + Name: "GigabitEthernet0/0/0", + Device: &netbox.DcimDevice{ + Name: "undefined", + Site: &netbox.DcimSite{ + ID: 1, + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + Type: strPtr(netbox.DefaultInterfaceType), + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P13] ingest dcim.interface with name and device - existing object found - do nothing", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.interface", + "entity": { + "Interface": { + "name": "GigabitEthernet0/0/0", + "device": { + "name": "router01" + } + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.interface", + objectID: 0, + queryParams: map[string]string{"q": "GigabitEthernet0/0/0", "device__name": "router01", "device__site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimInterfaceDataWrapper{ + Interface: &netbox.DcimInterface{ + ID: 1, + Name: "GigabitEthernet0/0/0", + Device: &netbox.DcimDevice{ + ID: 1, + Name: "router01", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + Type: strPtr(netbox.DefaultInterfaceType), + }, + }, + }, + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "router01", "site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 1, + Name: "router01", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: false, + }, + { + name: "[P13] ingest dcim.interface with name, device and new label - existing object found - update with new label", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.interface", + "entity": { + "Interface": { + "name": "GigabitEthernet0/0/0", + "device": { + "name": "router01" + }, + "label": "WAN" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.interface", + objectID: 0, + queryParams: map[string]string{"q": "GigabitEthernet0/0/0", "device__name": "router01", "device__site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimInterfaceDataWrapper{ + Interface: &netbox.DcimInterface{ + ID: 1, + Name: "GigabitEthernet0/0/0", + Device: &netbox.DcimDevice{ + ID: 1, + Name: "router01", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + Type: strPtr(netbox.DefaultInterfaceType), + }, + }, + }, + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "router01", "site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 1, + Name: "router01", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeUpdate, + ObjectType: "dcim.interface", + ObjectID: intPtr(1), + ObjectVersion: nil, + Data: &netbox.DcimInterface{ + ID: 1, + Name: "GigabitEthernet0/0/0", + Device: &netbox.DcimDevice{ + ID: 1, + }, + Type: strPtr(netbox.DefaultInterfaceType), + Label: strPtr("WAN"), + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P13] ingest empty dcim.interface - error", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.interface", + "entity": { + "Interface": {} + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{}, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: true, + }, + { + name: "[P14] ingest ipam.ipaddress with address only - existing object not found - create", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "ipam.ipaddress", + "entity": { + "IpAddress": { + "address": "192.168.0.1/22" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "ipam.ipaddress", + objectID: 0, + queryParams: map[string]string{"q": "192.168.0.1/22"}, + objectChangeID: 0, + object: &netbox.IpamIPAddressDataWrapper{ + IPAddress: nil, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "ipam.ipaddress", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.IpamIPAddress{ + Address: "192.168.0.1/22", + Status: &netbox.DefaultIPAddressStatus, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P14] ingest ipam.ipaddress with address and interface - existing object not found - create", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "ipam.ipaddress", + "entity": { + "IpAddress": { + "address": "192.168.0.1/22", + "AssignedObject": { + "Interface": { + "name": "GigabitEthernet0/0/0" + } + } + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + objectType: "dcim.platform", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimPlatformDataWrapper{ + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 1, + Name: "undefined", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + { + objectType: "dcim.interface", + objectID: 0, + queryParams: map[string]string{"q": "GigabitEthernet0/0/0", "device__name": "undefined", "device__site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimInterfaceDataWrapper{ + Interface: &netbox.DcimInterface{ + ID: 1, + Name: "GigabitEthernet0/0/0", + Type: strPtr(netbox.DefaultInterfaceType), + Device: &netbox.DcimDevice{ + ID: 1, + Name: "undefined", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + }, + { + objectType: "ipam.ipaddress", + objectID: 0, + queryParams: map[string]string{"q": "192.168.0.1/22", "interface__name": "GigabitEthernet0/0/0", "interface__device__name": "undefined", "interface__device__site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.IpamIPAddressDataWrapper{ + IPAddress: nil, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "ipam.ipaddress", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.IpamIPAddress{ + Address: "192.168.0.1/22", + Status: &netbox.DefaultIPAddressStatus, + AssignedObject: &netbox.IPAddressInterface{ + Interface: &netbox.DcimInterface{ + ID: 1, + Device: &netbox.DcimDevice{ + ID: 1, + }, + }, + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P14] ingest ipam.ipaddress with address and a new interface - existing IP address and interface not found - create an interface and IP address", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "ipam.ipaddress", + "entity": { + "IpAddress": { + "address": "192.168.0.1/22", + "AssignedObject": { + "Interface": { + "name": "GigabitEthernet0/0/0" + } + } + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + objectType: "dcim.platform", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimPlatformDataWrapper{ + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 1, + Name: "undefined", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + { + objectType: "dcim.interface", + objectID: 0, + queryParams: map[string]string{"q": "GigabitEthernet0/0/0", "device__name": "undefined", "device__site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimInterfaceDataWrapper{ + Interface: nil, + }, + }, + { + objectType: "ipam.ipaddress", + objectID: 0, + queryParams: map[string]string{"q": "192.168.0.1/22", "interface__name": "GigabitEthernet0/0/0", "interface__device__name": "undefined", "interface__device__site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.IpamIPAddressDataWrapper{ + IPAddress: nil, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.interface", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimInterface{ + Name: "GigabitEthernet0/0/0", + Type: strPtr(netbox.DefaultInterfaceType), + Device: &netbox.DcimDevice{ + ID: 1, + }, + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "ipam.ipaddress", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.IpamIPAddress{ + Address: "192.168.0.1/22", + Status: &netbox.DefaultIPAddressStatus, + AssignedObject: &netbox.IPAddressInterface{ + Interface: &netbox.DcimInterface{ + Name: "GigabitEthernet0/0/0", + Type: strPtr(netbox.DefaultInterfaceType), + Device: &netbox.DcimDevice{ + ID: 1, + }, + }, + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P14] ingest ipam.ipaddress with address and a new interface - IP address found assigned to a different interface - create the interface and the IP address", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "ipam.ipaddress", + "entity": { + "IpAddress": { + "address": "192.168.0.1/22", + "AssignedObject": { + "Interface": { + "name": "GigabitEthernet1/0/1" + } + } + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + objectType: "dcim.platform", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimPlatformDataWrapper{ + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 1, + Name: "undefined", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + { + objectType: "dcim.interface", + objectID: 0, + queryParams: map[string]string{"q": "GigabitEthernet1/0/1", "device__name": "undefined", "device__site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimInterfaceDataWrapper{ + Interface: nil, + }, + }, + { + objectType: "ipam.ipaddress", + objectID: 0, + queryParams: map[string]string{"q": "192.168.0.1/22", "interface__name": "GigabitEthernet1/0/1", "interface__device__name": "undefined", "interface__device__site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.IpamIPAddressDataWrapper{ + IPAddress: &netbox.IpamIPAddress{ + ID: 1, + Address: "192.168.0.1/22", + Status: &netbox.DefaultIPAddressStatus, + AssignedObject: &netbox.IPAddressInterface{ + Interface: &netbox.DcimInterface{ + ID: 1, + Name: "GigabitEthernet0/0/0", + Type: strPtr(netbox.DefaultInterfaceType), + Device: &netbox.DcimDevice{ + ID: 1, + Name: "undefined", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.interface", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimInterface{ + Name: "GigabitEthernet1/0/1", + Type: strPtr(netbox.DefaultInterfaceType), + Device: &netbox.DcimDevice{ + ID: 1, + }, + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "ipam.ipaddress", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.IpamIPAddress{ + Address: "192.168.0.1/22", + Status: &netbox.DefaultIPAddressStatus, + AssignedObject: &netbox.IPAddressInterface{ + Interface: &netbox.DcimInterface{ + Name: "GigabitEthernet1/0/1", + Type: strPtr(netbox.DefaultInterfaceType), + Device: &netbox.DcimDevice{ + ID: 1, + }, + }, + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P14] ingest ipam.ipaddress with assigned interface - existing IP address found assigned a different device - create IP address with a new assigned object (interface)", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "ipam.ipaddress", + "entity": { + "IpAddress": { + "address": "192.168.0.1/22", + "AssignedObject": { + "Interface": { + "name": "GigabitEthernet1/0/1" + } + } + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + objectType: "dcim.platform", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimPlatformDataWrapper{ + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 1, + Name: "undefined", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + { + objectType: "dcim.interface", + objectID: 0, + queryParams: map[string]string{"q": "GigabitEthernet1/0/1", "device__name": "undefined", "device__site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimInterfaceDataWrapper{ + Interface: &netbox.DcimInterface{ + ID: 2, + Name: "GigabitEthernet1/0/1", + Type: strPtr(netbox.DefaultInterfaceType), + Device: &netbox.DcimDevice{ + ID: 1, + Name: "undefined", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + }, + { + objectType: "ipam.ipaddress", + objectID: 0, + queryParams: map[string]string{"q": "192.168.0.1/22", "interface__name": "GigabitEthernet1/0/1", "interface__device__name": "undefined", "interface__device__site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.IpamIPAddressDataWrapper{ + IPAddress: &netbox.IpamIPAddress{ + ID: 1, + Address: "192.168.0.1/22", + Status: &netbox.DefaultIPAddressStatus, + AssignedObject: &netbox.IPAddressInterface{ + Interface: &netbox.DcimInterface{ + ID: 1, + Name: "GigabitEthernet0/0/0", + Type: strPtr(netbox.DefaultInterfaceType), + Device: &netbox.DcimDevice{ + ID: 1, + Name: "undefined", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "ipam.ipaddress", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.IpamIPAddress{ + Address: "192.168.0.1/22", + Status: &netbox.DefaultIPAddressStatus, + AssignedObject: &netbox.IPAddressInterface{ + Interface: &netbox.DcimInterface{ + ID: 2, + Device: &netbox.DcimDevice{ + ID: 1, + }, + }, + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P14] ingest ipam.ipaddress with address and interface - existing IP address found with same interface assigned - no update needed", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "ipam.ipaddress", + "entity": { + "IpAddress": { + "address": "192.168.0.1/22", + "AssignedObject": { + "Interface": { + "name": "GigabitEthernet0/0/0" + } + } + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + objectType: "dcim.platform", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimPlatformDataWrapper{ + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 1, + Name: "undefined", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + { + objectType: "dcim.interface", + objectID: 0, + queryParams: map[string]string{"q": "GigabitEthernet0/0/0", "device__name": "undefined", "device__site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimInterfaceDataWrapper{ + Interface: &netbox.DcimInterface{ + ID: 1, + Name: "GigabitEthernet0/0/0", + Type: strPtr(netbox.DefaultInterfaceType), + Device: &netbox.DcimDevice{ + ID: 1, + Name: "undefined", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + }, + { + objectType: "ipam.ipaddress", + objectID: 0, + queryParams: map[string]string{"q": "192.168.0.1/22", "interface__name": "GigabitEthernet0/0/0", "interface__device__name": "undefined", "interface__device__site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.IpamIPAddressDataWrapper{ + IPAddress: &netbox.IpamIPAddress{ + ID: 1, + Address: "192.168.0.1/22", + Status: &netbox.DefaultIPAddressStatus, + AssignedObject: &netbox.IPAddressInterface{ + Interface: &netbox.DcimInterface{ + ID: 1, + Name: "GigabitEthernet0/0/0", + Type: strPtr(netbox.DefaultInterfaceType), + Device: &netbox.DcimDevice{ + ID: 1, + Name: "undefined", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: false, + }, + { + name: "[P14] ingest ipam.ipaddress with address only - existing IP address found without interface assigned - no update needed", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "ipam.ipaddress", + "entity": { + "IpAddress": { + "address": "192.168.0.1/22" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "ipam.ipaddress", + objectID: 0, + queryParams: map[string]string{"q": "192.168.0.1/22"}, + objectChangeID: 0, + object: &netbox.IpamIPAddressDataWrapper{ + IPAddress: &netbox.IpamIPAddress{ + ID: 1, + Address: "192.168.0.1/22", + Status: &netbox.DefaultIPAddressStatus, + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: false, + }, + { + name: "[P14] ingest ipam.ipaddress with address and new description - existing IP address found - update IP address with new description", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "ipam.ipaddress", + "entity": { + "IpAddress": { + "address": "192.168.0.1/22", + "description": "new description", + "AssignedObject": { + "Interface": { + "name": "GigabitEthernet0/0/0" + } + } + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + { + objectType: "dcim.platform", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimPlatformDataWrapper{ + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 1, + Name: "undefined", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + { + objectType: "dcim.interface", + objectID: 0, + queryParams: map[string]string{"q": "GigabitEthernet0/0/0", "device__name": "undefined", "device__site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimInterfaceDataWrapper{ + Interface: &netbox.DcimInterface{ + ID: 1, + Name: "GigabitEthernet0/0/0", + Type: strPtr(netbox.DefaultInterfaceType), + Device: &netbox.DcimDevice{ + ID: 1, + Name: "undefined", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + }, + { + objectType: "ipam.ipaddress", + objectID: 0, + queryParams: map[string]string{"q": "192.168.0.1/22", "interface__name": "GigabitEthernet0/0/0", "interface__device__name": "undefined", "interface__device__site__name": "undefined"}, + objectChangeID: 0, + object: &netbox.IpamIPAddressDataWrapper{ + IPAddress: &netbox.IpamIPAddress{ + ID: 1, + Address: "192.168.0.1/22", + Status: &netbox.DefaultIPAddressStatus, + AssignedObject: &netbox.IPAddressInterface{ + Interface: &netbox.DcimInterface{ + ID: 1, + Name: "GigabitEthernet0/0/0", + Type: strPtr(netbox.DefaultInterfaceType), + Device: &netbox.DcimDevice{ + ID: 1, + Name: "undefined", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "undefined", + Slug: "undefined", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeUpdate, + ObjectType: "ipam.ipaddress", + ObjectID: intPtr(1), + ObjectVersion: nil, + Data: &netbox.IpamIPAddress{ + ID: 1, + Address: "192.168.0.1/22", + Status: &netbox.DefaultIPAddressStatus, + Description: strPtr("new description"), + AssignedObject: &netbox.IPAddressInterface{ + Interface: &netbox.DcimInterface{ + ID: 1, + Device: &netbox.DcimDevice{ + ID: 1, + }, + }, + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P14] ingest empty ipam.ipaddress - error", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "ipam.ipaddress", + "entity": { + "IPAddress": {} + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{}, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: true, + }, + { + name: "[P15] ingest ipam.prefix with prefix only - existing object not found - create prefix and site (placeholder)", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "ipam.prefix", + "entity": { + "Prefix": { + "prefix": "192.168.0.0/32" + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: nil, + }, + }, + { + objectType: "ipam.prefix", + objectID: 0, + queryParams: map[string]string{"q": "192.168.0.0/32"}, + objectChangeID: 0, + object: &netbox.IpamPrefixDataWrapper{ + Prefix: nil, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.site", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimSite{ + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "ipam.prefix", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.IpamPrefix{ + Prefix: "192.168.0.0/32", + Site: &netbox.DcimSite{ + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + Status: &netbox.DefaultPrefixStatus, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P15] ingest ipam.prefix with prefix only - existing object and its related objects found - do nothing", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "ipam.prefix", + "entity": { + "Prefix": { + "prefix": "192.168.0.0/32", + "site": { + "name": "undefined" + } + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "ipam.prefix", + objectID: 0, + queryParams: map[string]string{"q": "192.168.0.0/32"}, + objectChangeID: 0, + object: &netbox.IpamPrefixDataWrapper{ + Prefix: &netbox.IpamPrefix{ + ID: 1, + Prefix: "192.168.0.0/32", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + Status: &netbox.DefaultPrefixStatus, + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: false, + }, + { + name: "[P15] ingest ipam.prefix with empty site", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "ipam.prefix", + "entity": { + "Prefix": { + "prefix": "192.168.0.0/32", + "site": {} + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "ipam.prefix", + objectID: 0, + queryParams: map[string]string{"q": "192.168.0.0/32"}, + objectChangeID: 0, + object: &netbox.IpamPrefixDataWrapper{ + Prefix: &netbox.IpamPrefix{ + ID: 1, + Prefix: "192.168.0.0/32", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + Status: &netbox.DefaultPrefixStatus, + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: false, + }, + { + name: "[P15] ingest ipam.prefix with prefix and a tag - existing object found - create tag and update prefix", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "ipam.prefix", + "entity": { + "Prefix": { + "prefix": "192.168.0.0/32", + "tags": [ + { + "name": "tag 100" + } + ] + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "extras.tag", + objectID: 0, + queryParams: map[string]string{"q": "tag 100"}, + objectChangeID: 0, + object: &netbox.TagDataWrapper{ + Tag: nil, + }, + }, + { + objectType: "ipam.prefix", + objectID: 0, + queryParams: map[string]string{"q": "192.168.0.0/32"}, + objectChangeID: 0, + object: &netbox.IpamPrefixDataWrapper{ + Prefix: &netbox.IpamPrefix{ + ID: 1, + Prefix: "192.168.0.0/32", + Site: &netbox.DcimSite{ + ID: 1, + Name: "undefined", + Slug: "undefined", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + Status: &netbox.DefaultPrefixStatus, + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b6", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "extras.tag", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.Tag{ + Name: "tag 100", + Slug: "tag-100", + }, + }, + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeUpdate, + ObjectType: "ipam.prefix", + ObjectID: intPtr(1), + ObjectVersion: nil, + Data: &netbox.IpamPrefix{ + ID: 1, + Prefix: "192.168.0.0/32", + Site: &netbox.DcimSite{ + ID: 1, + }, + Status: &netbox.DefaultPrefixStatus, + Tags: []*netbox.Tag{ + { + Name: "tag 100", + Slug: "tag-100", + }, + }, + }, + }, + }, + }, + wantErr: false, + }, + { + name: "[P16] ingest dcim.device with device type and manufacturer - device type and manufacturer objects found - create device with existing device type and manufacturer", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.device", + "entity": { + "Device": { + "name": "Device A", + "device_type": { + "model": "Device Type A", + "manufacturer": { + "name": "Manufacturer A" + } + }, + "role": { + "name": "Role ABC" + }, + "platform": { + "name": "Platform A", + "manufacturer": { + "name": "Manufacturer A" + } + }, + "serial": "123456", + "site": { + "name": "Site ABC" + } + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "Site ABC"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 1, + Name: "Site ABC", + Slug: "site-abc", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "Manufacturer A"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "Manufacturer A", + Slug: "manufacturer-a", + }, + }, + }, + { + objectType: "dcim.platform", + objectID: 0, + queryParams: map[string]string{"q": "Platform A", "manufacturer__name": "Manufacturer A"}, + objectChangeID: 0, + object: &netbox.DcimPlatformDataWrapper{ + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "Platform A", + Slug: "platform-a", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "Manufacturer A", + Slug: "manufacturer-a", + }, + }, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "Device Type A", "manufacturer__name": "Manufacturer A"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "Device Type A", + Slug: "device-type-a", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "Manufacturer A", + Slug: "manufacturer-a", + }, + }, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "Role ABC"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 1, + Name: "Role ABC", + Slug: "role-abc", + Color: strPtr("000000"), + }, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "Device A", "site__name": "Site ABC"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 1, + Name: "Device A", + Site: &netbox.DcimSite{ + ID: 1, + Name: "Site ABC", + Slug: "site-abc", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 1, + Model: "Device Type A", + Slug: "device-type-a", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "Manufacturer A", + Slug: "manufacturer-a", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 1, + Name: "Role ABC", + Slug: "role-abc", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 1, + Name: "Platform A", + Slug: "platform-a", + Manufacturer: &netbox.DcimManufacturer{ + ID: 1, + Name: "Manufacturer A", + Slug: "manufacturer-a", + }, + }, + Serial: strPtr("123456"), + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{}, + }, + wantErr: false, + }, + { + name: "[P17] ingest dcim.interface with name, mtu, device with site - device exists for platform Arista - create interface with existing device and platform", + rawIngestEntity: []byte(`{ + "request_id": "cfa0f129-125c-440d-9e41-e87583cd7d89", + "data_type": "dcim.interface", + "entity": { + "Interface": { + "name": "Ethernet2", + "device": { + "name": "CEOS1", + "site": { + "name": "default_namespace" + } + }, + "mtu": 1500 + } + }, + "state": 0 + }`), + retrieveObjectStates: []mockRetrieveObjectState{ + { + objectType: "dcim.interface", + objectID: 0, + queryParams: map[string]string{"q": "Ethernet2", "device__name": "CEOS1", "device__site__name": "default_namespace"}, + objectChangeID: 0, + object: &netbox.DcimInterfaceDataWrapper{ + Interface: nil, + }, + }, + { + objectType: "dcim.manufacturer", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimManufacturerDataWrapper{ + Manufacturer: nil, + }, + }, + { + objectType: "dcim.devicetype", + objectID: 0, + queryParams: map[string]string{"q": "undefined", "manufacturer__name": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceTypeDataWrapper{ + DeviceType: nil, + }, + }, + { + objectType: "dcim.devicerole", + objectID: 0, + queryParams: map[string]string{"q": "undefined"}, + objectChangeID: 0, + object: &netbox.DcimDeviceRoleDataWrapper{ + DeviceRole: &netbox.DcimDeviceRole{ + ID: 89, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + }, + }, + { + objectType: "dcim.site", + objectID: 0, + queryParams: map[string]string{"q": "default_namespace"}, + objectChangeID: 0, + object: &netbox.DcimSiteDataWrapper{ + Site: &netbox.DcimSite{ + ID: 21, + Name: "default_namespace", + Slug: "default_namespace", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + }, + }, + { + objectType: "dcim.device", + objectID: 0, + queryParams: map[string]string{"q": "CEOS1", "site__name": "default_namespace"}, + objectChangeID: 0, + object: &netbox.DcimDeviceDataWrapper{ + Device: &netbox.DcimDevice{ + ID: 111, + Name: "CEOS1", + Site: &netbox.DcimSite{ + ID: 21, + Name: "default_namespace", + Slug: "default_namespace", + Status: (*netbox.DcimSiteStatus)(strPtr(string(netbox.DcimSiteStatusActive))), + }, + DeviceType: &netbox.DcimDeviceType{ + ID: 10, + Model: "cEOSLab", + Slug: "ceoslab", + Manufacturer: &netbox.DcimManufacturer{ + ID: 15, + Name: "Arista", + Slug: "arista", + }, + }, + Role: &netbox.DcimDeviceRole{ + ID: 89, + Name: "undefined", + Slug: "undefined", + Color: strPtr("000000"), + }, + Platform: &netbox.DcimPlatform{ + ID: 68, + Name: "eos:4.29.0.2F-29226602.42902F (engineering build)", + Slug: "eos-4-29-0-2f-29226602-42902f-engineering-build", + Manufacturer: &netbox.DcimManufacturer{ + ID: 15, + Name: "Arista", + Slug: "arista", + }, + }, + Status: (*netbox.DcimDeviceStatus)(strPtr(string(netbox.DcimDeviceStatusActive))), + }, + }, + }, + }, + wantChangeSet: changeset.ChangeSet{ + ChangeSetID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeSet: []changeset.Change{ + { + ChangeID: "5663a77e-9bad-4981-afe9-77d8a9f2b8b5", + ChangeType: changeset.ChangeTypeCreate, + ObjectType: "dcim.interface", + ObjectID: nil, + ObjectVersion: nil, + Data: &netbox.DcimInterface{ + Name: "Ethernet2", + Device: &netbox.DcimDevice{ + ID: 111, + }, + MTU: intPtr(1500), + Type: strPtr(netbox.DefaultInterfaceType), + }, + }, + }, + }, + wantErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var ingestEntity changeset.IngestEntity + err := json.Unmarshal(tt.rawIngestEntity, &ingestEntity) + require.NoError(t, err) + + mockClient := mocks.NewNetBoxAPI(t) + + for _, m := range tt.retrieveObjectStates { + mockClient.EXPECT().RetrieveObjectState(context.Background(), netboxdiodeplugin.RetrieveObjectStateQueryParams{ + ObjectType: m.objectType, + ObjectID: m.objectID, + Params: m.queryParams, + }).Return(&netboxdiodeplugin.ObjectState{ + ObjectID: m.objectID, + ObjectType: m.objectType, + ObjectChangeID: m.objectChangeID, + Object: m.object, + }, nil) + } + + cs, err := changeset.Prepare(ingestEntity, mockClient) + if tt.wantErr { + require.Error(t, err) + return + } + + require.NoError(t, err) + + require.Equal(t, len(tt.wantChangeSet.ChangeSet), len(cs.ChangeSet)) + + for i := range tt.wantChangeSet.ChangeSet { + assert.Equal(t, tt.wantChangeSet.ChangeSet[i].ChangeType, cs.ChangeSet[i].ChangeType) + assert.Equal(t, tt.wantChangeSet.ChangeSet[i].ObjectType, cs.ChangeSet[i].ObjectType) + assert.Equal(t, tt.wantChangeSet.ChangeSet[i].Data, cs.ChangeSet[i].Data) + } + }) + } +} + +func strPtr(s string) *string { return &s } +func intPtr(d int) *int { return &d } diff --git a/diode-server/reconciler/client.go b/diode-server/reconciler/client.go new file mode 100644 index 00000000..0032fc90 --- /dev/null +++ b/diode-server/reconciler/client.go @@ -0,0 +1,103 @@ +package reconciler + +import ( + "context" + "fmt" + "os" + + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + + pb "github.com/netboxlabs/diode/diode-server/reconciler/v1/reconcilerpb" +) + +const ( + // SDKName is the name of the Diode SDK + SDKName = "reconciler-sdk-go" + + // SDKVersion is the version of the Diode SDK + SDKVersion = "0.1.0" + + // GRPCHostEnvVarName is the environment variable name for the reconciler gRPC host + GRPCHostEnvVarName = "RECONCILER_GRPC_HOST" + + // GRPCPortEnvVarName is the environment variable name for the reconciler gRPC port + GRPCPortEnvVarName = "RECONCILER_GRPC_PORT" + + defaultGRPCHost = "127.0.0.1" + + defaultGRPCPort = "8081" +) + +// Client is an interface that defines the methods available from reconciler API +type Client interface { + // Close closes the connection to the API service + Close() error + + // RetrieveIngestionDataSources retrieves ingestion data sources + RetrieveIngestionDataSources(context.Context, *pb.RetrieveIngestionDataSourcesRequest, ...grpc.CallOption) (*pb.RetrieveIngestionDataSourcesResponse, error) +} + +// GRPCClient is a gRPC implementation of the distributor service +type GRPCClient struct { + // gRPC virtual connection + conn *grpc.ClientConn + + // The gRPC API client + client pb.ReconcilerServiceClient +} + +// Close closes the connection to the API service +func (g *GRPCClient) Close() error { + if g.conn != nil { + return g.conn.Close() + } + return nil +} + +// RetrieveIngestionDataSources retrieves ingestion data sources +func (g *GRPCClient) RetrieveIngestionDataSources(ctx context.Context, req *pb.RetrieveIngestionDataSourcesRequest, opt ...grpc.CallOption) (*pb.RetrieveIngestionDataSourcesResponse, error) { + req.SdkName = SDKName + req.SdkVersion = SDKVersion + return g.client.RetrieveIngestionDataSources(ctx, req, opt...) +} + +// NewClient creates a new reconciler client based on gRPC +func NewClient() (Client, error) { + dialOpts := []grpc.DialOption{ + grpc.WithUserAgent(userAgent()), + grpc.WithTransportCredentials(insecure.NewCredentials()), + } + + target := grpcTarget() + + conn, err := grpc.NewClient(target, dialOpts...) + if err != nil { + return nil, err + } + + c := &GRPCClient{ + conn: conn, + client: pb.NewReconcilerServiceClient(conn), + } + + return c, nil +} + +func userAgent() string { + return fmt.Sprintf("%s/%s", SDKName, SDKVersion) +} + +func grpcTarget() string { + host, ok := os.LookupEnv(GRPCHostEnvVarName) + if !ok { + host = defaultGRPCHost + } + + port, ok := os.LookupEnv(GRPCPortEnvVarName) + if !ok { + port = defaultGRPCPort + } + + return fmt.Sprintf("%s:%s", host, port) +} diff --git a/diode-server/reconciler/client_test.go b/diode-server/reconciler/client_test.go new file mode 100644 index 00000000..ec4bf5a4 --- /dev/null +++ b/diode-server/reconciler/client_test.go @@ -0,0 +1,24 @@ +package reconciler_test + +import ( + "os" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/netboxlabs/diode/diode-server/reconciler" +) + +func TestNewClient(t *testing.T) { + cleanUpEnvVars() + + client, err := reconciler.NewClient() + require.NoError(t, err) + require.NotNil(t, client) + require.NoError(t, client.Close()) +} + +func cleanUpEnvVars() { + _ = os.Unsetenv(reconciler.GRPCHostEnvVarName) + _ = os.Unsetenv(reconciler.GRPCPortEnvVarName) +} diff --git a/diode-server/reconciler/component.go b/diode-server/reconciler/component.go deleted file mode 100644 index 2bc5cfdb..00000000 --- a/diode-server/reconciler/component.go +++ /dev/null @@ -1,60 +0,0 @@ -package reconciler - -import ( - "context" - "fmt" - "log/slog" - "net" - - "github.com/kelseyhightower/envconfig" - "google.golang.org/grpc" - "google.golang.org/grpc/reflection" -) - -// Component reconciles ingested data -type Component struct { - config Config - logger *slog.Logger - grpcListener net.Listener - grpcServer *grpc.Server -} - -// New creates a new reconciler component -func New(logger *slog.Logger) (*Component, error) { - var cfg Config - envconfig.MustProcess("", &cfg) - - grpcListener, err := net.Listen("tcp", fmt.Sprintf(":%d", cfg.GRPCPort)) - if err != nil { - return nil, fmt.Errorf("failed to listen on port %d: %v", cfg.GRPCPort, err) - } - - grpcServer := grpc.NewServer() - component := &Component{ - config: cfg, - logger: logger, - grpcListener: grpcListener, - grpcServer: grpcServer, - } - reflection.Register(grpcServer) - - return component, nil -} - -// Name returns the name of the component -func (c *Component) Name() string { - return "reconciler" -} - -// Start starts the component -func (c *Component) Start(_ context.Context) error { - c.logger.Info("starting component", "name", c.Name(), "port", c.config.GRPCPort) - return c.grpcServer.Serve(c.grpcListener) -} - -// Stop stops the component -func (c *Component) Stop() error { - c.logger.Info("stopping component", "name", c.Name()) - c.grpcServer.GracefulStop() - return nil -} diff --git a/diode-server/reconciler/config.go b/diode-server/reconciler/config.go index bc3d2643..7bac55b5 100644 --- a/diode-server/reconciler/config.go +++ b/diode-server/reconciler/config.go @@ -2,5 +2,16 @@ package reconciler // Config is the configuration for the reconciler service type Config struct { - GRPCPort int `envconfig:"GRPC_PORT" default:"8081"` + GRPCPort int `envconfig:"GRPC_PORT" default:"8081"` + RedisHost string `envconfig:"REDIS_HOST" default:"127.0.0.1"` + RedisPort string `envconfig:"REDIS_PORT" default:"6379"` + RedisPassword string `envconfig:"REDIS_PASSWORD" required:"true"` + RedisDB int `envconfig:"REDIS_DB" default:"0"` + RedisStreamDB int `envconfig:"REDIS_STREAM_DB" default:"1"` + NetBoxAPIURL string `envconfig:"NETBOX_API_URL" required:"true"` + + // API keys + DiodeToNetBoxAPIKey string `envconfig:"DIODE_TO_NETBOX_API_KEY" required:"true"` + NetBoxToDiodeAPIKey string `envconfig:"NETBOX_TO_DIODE_API_KEY" required:"true"` + IngestionAPIKey string `envconfig:"INGESTION_API_KEY" required:"true"` } diff --git a/diode-server/reconciler/ingestion_processor.go b/diode-server/reconciler/ingestion_processor.go new file mode 100644 index 00000000..9e024d57 --- /dev/null +++ b/diode-server/reconciler/ingestion_processor.go @@ -0,0 +1,327 @@ +package reconciler + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "log/slog" + "os" + "strings" + + "github.com/google/uuid" + "github.com/kelseyhightower/envconfig" + "github.com/redis/go-redis/v9" + "google.golang.org/protobuf/proto" + + "github.com/netboxlabs/diode/diode-server/gen/diode/v1/diodepb" + "github.com/netboxlabs/diode/diode-server/netbox" + "github.com/netboxlabs/diode/diode-server/netboxdiodeplugin" + "github.com/netboxlabs/diode/diode-server/reconciler/changeset" + "github.com/netboxlabs/diode/diode-server/sentry" +) + +const ( + redisStreamID = "diode.v1.ingest-stream" + + redisConsumerGroup = "diode-reconciler" + + // RedisConsumerGroupExistsErrMsg is the error message returned by the redis client when the consumer group already exists + RedisConsumerGroupExistsErrMsg = "BUSYGROUP Consumer Group name already exists" +) + +// IngestEntityState represents the state of an ingested entity +type IngestEntityState int + +const ( + // IngestEntityStateNew is the state of an entity after it has been ingested + IngestEntityStateNew IngestEntityState = iota + + // IngestEntityStateReconciled is the state of an entity after it has been reconciled + IngestEntityStateReconciled + + // IngestEntityStateReconciliationFailed is the state of an entity after it has failed to be reconciled + IngestEntityStateReconciliationFailed +) + +// IngestionProcessor processes ingested data +type IngestionProcessor struct { + config Config + logger *slog.Logger + hostname string + redisClient *redis.Client + redisStreamClient *redis.Client + nbClient *netboxdiodeplugin.Client +} + +// NewIngestionProcessor creates a new ingestion processor +func NewIngestionProcessor(ctx context.Context, logger *slog.Logger) (*IngestionProcessor, error) { + var cfg Config + envconfig.MustProcess("", &cfg) + + redisClient := redis.NewClient(&redis.Options{ + Addr: fmt.Sprintf("%s:%s", cfg.RedisHost, cfg.RedisPort), + Password: cfg.RedisPassword, + DB: cfg.RedisDB, + }) + + if _, err := redisClient.Ping(ctx).Result(); err != nil { + return nil, fmt.Errorf("failed connection to %s: %v", redisClient.String(), err) + } + + redisStreamClient := redis.NewClient(&redis.Options{ + Addr: fmt.Sprintf("%s:%s", cfg.RedisHost, cfg.RedisPort), + Password: cfg.RedisPassword, + DB: cfg.RedisStreamDB, + }) + + if _, err := redisStreamClient.Ping(ctx).Result(); err != nil { + return nil, fmt.Errorf("failed connection to %s: %v", redisStreamClient.String(), err) + } + + hostname, err := os.Hostname() + if err != nil { + return nil, fmt.Errorf("failed to get hostname: %v", err) + } + + nbClient, err := netboxdiodeplugin.NewClient(logger, cfg.DiodeToNetBoxAPIKey) + if err != nil { + return nil, fmt.Errorf("failed to create netbox diode plugin client: %v", err) + } + + component := &IngestionProcessor{ + config: cfg, + logger: logger, + hostname: hostname, + redisClient: redisClient, + redisStreamClient: redisStreamClient, + nbClient: nbClient, + } + + return component, nil +} + +// Name returns the name of the component +func (p *IngestionProcessor) Name() string { + return "reconciler-ingestion-processor" +} + +// Start starts the component +func (p *IngestionProcessor) Start(ctx context.Context) error { + p.logger.Info("starting component", "name", p.Name()) + return p.consumeIngestionStream(ctx, redisStreamID, redisConsumerGroup, fmt.Sprintf("%s-%s", redisConsumerGroup, p.hostname)) +} + +// Stop stops the component +func (p *IngestionProcessor) Stop() error { + p.logger.Info("stopping component", "name", p.Name()) + redisClientErr := p.redisClient.Close() + redisStreamErr := p.redisStreamClient.Close() + + return errors.Join(redisStreamErr, redisClientErr) +} + +func (p *IngestionProcessor) consumeIngestionStream(ctx context.Context, stream, group, consumer string) error { + err := p.redisStreamClient.XGroupCreateMkStream(ctx, stream, group, "$").Err() + if err != nil && err.Error() != RedisConsumerGroupExistsErrMsg { + return err + } + + for { + streams, err := p.redisStreamClient.XReadGroup(ctx, &redis.XReadGroupArgs{ + Group: group, + Consumer: consumer, + Streams: []string{stream, ">"}, + Count: 100, + }).Result() + if err != nil || len(streams) == 0 { + continue + } + for _, msg := range streams[0].Messages { + if err := p.handleStreamMessage(ctx, msg); err != nil { + p.logger.Error("failed to handle stream message", "error", err, "message", msg) + + contextMap := map[string]any{ + "redis_stream_msg_id": msg.ID, + "consumer": consumer, + "hostname": p.hostname, + } + sentry.CaptureError(fmt.Errorf("failed to handle stream message: %v", err), nil, "Ingestion stream", contextMap) + + return err + } + } + } +} + +func (p *IngestionProcessor) handleStreamMessage(ctx context.Context, msg redis.XMessage) error { + p.logger.Debug("received stream message", "message", msg.Values, "id", msg.ID) + + ingestReq := &diodepb.IngestRequest{} + if err := proto.Unmarshal([]byte(msg.Values["request"].(string)), ingestReq); err != nil { + return err + } + + errs := make([]string, 0) + + ingestionTs := msg.Values["ingestion_ts"] + + p.logger.Debug("handling ingest request", "request", ingestReq) + + for i, v := range ingestReq.GetEntities() { + if v.GetEntity() == nil { + errs = append(errs, fmt.Sprintf("entity at index %d is nil", i)) + continue + } + + objectType, err := extractObjectType(v) + if err != nil { + errs = append(errs, fmt.Sprintf("failed to extract data type for index %d: %v", i, err)) + continue + } + + key := fmt.Sprintf("ingest-entity:%s-%s-%s", objectType, ingestionTs, uuid.NewString()) + p.logger.Debug("ingest entity key", "key", key) + + val := map[string]any{ + "request_id": ingestReq.GetId(), + "producer_app_name": ingestReq.GetProducerAppName(), + "producer_app_version": ingestReq.GetProducerAppVersion(), + "sdk_name": ingestReq.GetSdkName(), + "sdk_version": ingestReq.GetSdkVersion(), + "data_type": objectType, + "entity": v.GetEntity(), + "ingestion_ts": ingestionTs, + "state": IngestEntityStateNew, + } + + encodedValue, err := p.writeJSON(ctx, key, val) + if err != nil { + errs = append(errs, fmt.Sprintf("failed to write JSON: %v", err)) + continue + } + + changeSet, err := p.reconcileEntity(ctx, encodedValue) + if err != nil { + errs = append(errs, fmt.Sprintf("failed to reconcile entity: %v", err)) + val["state"] = IngestEntityStateReconciliationFailed + _, err = p.writeJSON(ctx, key, val) + if err != nil { + errs = append(errs, fmt.Sprintf("failed to write JSON: %v", err)) + } + continue + } + + if changeSet != nil { + val["state"] = IngestEntityStateReconciled + val["change_set"] = changeSet + _, err = p.writeJSON(ctx, key, val) + if err != nil { + errs = append(errs, fmt.Sprintf("failed to write JSON: %v", err)) + continue + } + } + } + + p.redisStreamClient.XAck(ctx, redisStreamID, redisConsumerGroup, msg.ID) + + if len(errs) > 0 { + p.logger.Error("failed to handle ingest request", "errors", strings.Join(errs, ", ")) + contextMap := map[string]any{ + "redis_stream_msg_id": msg.ID, + "consumer": fmt.Sprintf("%s-%s", redisConsumerGroup, p.hostname), + "hostname": p.hostname, + } + sentry.CaptureError(fmt.Errorf("failed to handle ingest request: %v", errs), nil, "Ingestion request", contextMap) + } else { + p.redisStreamClient.XDel(ctx, redisStreamID, msg.ID) + } + + return nil +} + +func (p *IngestionProcessor) reconcileEntity(ctx context.Context, encodedValue []byte) (*changeset.ChangeSet, error) { + var ingestEntity changeset.IngestEntity + _ = json.Unmarshal(encodedValue, &ingestEntity) + + cs, err := changeset.Prepare(ingestEntity, p.nbClient) + if err != nil { + tags := map[string]string{ + "request_id": ingestEntity.RequestID, + } + contextMap := map[string]any{ + "request_id": ingestEntity.RequestID, + "data_type": ingestEntity.DataType, + } + sentry.CaptureError(err, tags, "Ingest Entity", contextMap) + return nil, fmt.Errorf("failed to prepare change set: %v", err) + } + + if len(cs.ChangeSet) == 0 { + p.logger.Info("no changes to apply") + return nil, nil + } + + changes := make([]netboxdiodeplugin.Change, 0) + for _, change := range cs.ChangeSet { + changes = append(changes, netboxdiodeplugin.Change{ + ChangeID: change.ChangeID, + ChangeType: change.ChangeType, + ObjectType: change.ObjectType, + ObjectID: change.ObjectID, + ObjectVersion: change.ObjectVersion, + Data: change.Data, + }) + } + + req := netboxdiodeplugin.ChangeSetRequest{ + ChangeSetID: cs.ChangeSetID, + ChangeSet: changes, + } + + resp, err := p.nbClient.ApplyChangeSet(ctx, req) + if err != nil { + return nil, fmt.Errorf("failed to apply change set: %v", err) + } + + p.logger.Debug("apply change set response", "response", resp) + return cs, nil +} + +func (p *IngestionProcessor) writeJSON(ctx context.Context, key string, value map[string]any) ([]byte, error) { + encodedValue, err := json.Marshal(value) + if err != nil { + return nil, fmt.Errorf("failed to marshal JSON: %v", err) + } + + if _, err = p.redisClient.Do(ctx, "JSON.SET", key, "$", encodedValue).Result(); err != nil { + return nil, fmt.Errorf("failed to set JSON redis key: %v", err) + } + + return encodedValue, nil +} + +func extractObjectType(in *diodepb.Entity) (string, error) { + switch in.GetEntity().(type) { + case *diodepb.Entity_Device: + return netbox.DcimDeviceObjectType, nil + case *diodepb.Entity_DeviceRole: + return netbox.DcimDeviceRoleObjectType, nil + case *diodepb.Entity_DeviceType: + return netbox.DcimDeviceTypeObjectType, nil + case *diodepb.Entity_Interface: + return netbox.DcimInterfaceObjectType, nil + case *diodepb.Entity_Manufacturer: + return netbox.DcimManufacturerObjectType, nil + case *diodepb.Entity_Platform: + return netbox.DcimPlatformObjectType, nil + case *diodepb.Entity_Site: + return netbox.DcimSiteObjectType, nil + case *diodepb.Entity_IpAddress: + return netbox.IpamIPAddressObjectType, nil + case *diodepb.Entity_Prefix: + return netbox.IpamPrefixObjectType, nil + default: + return "", fmt.Errorf("unknown data type") + } +} diff --git a/diode-server/reconciler/server.go b/diode-server/reconciler/server.go new file mode 100644 index 00000000..5cc7a19f --- /dev/null +++ b/diode-server/reconciler/server.go @@ -0,0 +1,121 @@ +package reconciler + +import ( + "context" + "fmt" + "log/slog" + "net" + "strings" + + "github.com/kelseyhightower/envconfig" + "github.com/redis/go-redis/v9" + "google.golang.org/grpc" + "google.golang.org/grpc/reflection" + + "github.com/netboxlabs/diode/diode-server/reconciler/v1/reconcilerpb" +) + +// Server is a reconciler Server +type Server struct { + reconcilerpb.UnimplementedReconcilerServiceServer + + config Config + logger *slog.Logger + grpcListener net.Listener + grpcServer *grpc.Server + redisClient *redis.Client + apiKeys map[string]string +} + +// NewServer creates a new reconciler server +func NewServer(ctx context.Context, logger *slog.Logger) (*Server, error) { + var cfg Config + envconfig.MustProcess("", &cfg) + + redisClient := redis.NewClient(&redis.Options{ + Addr: fmt.Sprintf("%s:%s", cfg.RedisHost, cfg.RedisPort), + Password: cfg.RedisPassword, + DB: cfg.RedisDB, + }) + + if _, err := redisClient.Ping(ctx).Result(); err != nil { + return nil, fmt.Errorf("failed connection to %s: %v", redisClient.String(), err) + } + + grpcListener, err := net.Listen("tcp", fmt.Sprintf(":%d", cfg.GRPCPort)) + if err != nil { + return nil, fmt.Errorf("failed to listen on port %d: %v", cfg.GRPCPort, err) + } + + apiKeys, err := loadAPIKeys(ctx, cfg, redisClient) + if err != nil { + return nil, fmt.Errorf("failed to configure data sources: %v", err) + } + + grpcServer := grpc.NewServer() + component := &Server{ + config: cfg, + logger: logger, + grpcListener: grpcListener, + grpcServer: grpcServer, + redisClient: redisClient, + apiKeys: apiKeys, + } + reconcilerpb.RegisterReconcilerServiceServer(grpcServer, component) + reflection.Register(grpcServer) + + return component, nil +} + +// Name returns the name of the server +func (s *Server) Name() string { + return "reconciler-grpc-server" +} + +// Start starts the server +func (s *Server) Start(_ context.Context) error { + s.logger.Info("starting component", "name", s.Name(), "port", s.config.GRPCPort) + return s.grpcServer.Serve(s.grpcListener) +} + +// Stop stops the server +func (s *Server) Stop() error { + s.logger.Info("stopping component", "name", s.Name()) + s.grpcServer.GracefulStop() + return s.redisClient.Close() +} + +// RetrieveIngestionDataSources retrieves ingestion data sources +func (s *Server) RetrieveIngestionDataSources(_ context.Context, in *reconcilerpb.RetrieveIngestionDataSourcesRequest) (*reconcilerpb.RetrieveIngestionDataSourcesResponse, error) { + if err := validateRetrieveIngestionDataSourcesRequest(in); err != nil { + return nil, err + } + + dataSources := make([]*reconcilerpb.IngestionDataSource, 0) + filterByName := in.Name != "" + + if filterByName { + if _, ok := s.apiKeys[in.Name]; !ok || !strings.HasPrefix(in.Name, "INGESTION") { + return nil, fmt.Errorf("data source %s not found", in.Name) + } + dataSources = append(dataSources, &reconcilerpb.IngestionDataSource{Name: in.Name, ApiKey: s.apiKeys[in.Name]}) + return &reconcilerpb.RetrieveIngestionDataSourcesResponse{IngestionDataSources: dataSources}, nil + } + + for name, key := range s.apiKeys { + if strings.HasPrefix(name, "INGESTION") { + dataSources = append(dataSources, &reconcilerpb.IngestionDataSource{Name: name, ApiKey: key}) + } + } + return &reconcilerpb.RetrieveIngestionDataSourcesResponse{IngestionDataSources: dataSources}, nil +} + +func validateRetrieveIngestionDataSourcesRequest(in *reconcilerpb.RetrieveIngestionDataSourcesRequest) error { + if in.GetSdkName() == "" { + return fmt.Errorf("sdk name is empty") + } + if in.GetSdkVersion() == "" { + return fmt.Errorf("sdk version is empty") + } + return nil +} diff --git a/diode-server/reconciler/v1/reconcilerpb/reconciler.pb.go b/diode-server/reconciler/v1/reconcilerpb/reconciler.pb.go new file mode 100644 index 00000000..cfd06338 --- /dev/null +++ b/diode-server/reconciler/v1/reconcilerpb/reconciler.pb.go @@ -0,0 +1,332 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.32.0 +// protoc (unknown) +// source: reconciler/v1/reconciler.proto + +package reconcilerpb + +import ( + _ "github.com/envoyproxy/protoc-gen-validate/validate" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// An ingestion data source +type IngestionDataSource struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ApiKey string `protobuf:"bytes,2,opt,name=api_key,json=apiKey,proto3" json:"api_key,omitempty"` +} + +func (x *IngestionDataSource) Reset() { + *x = IngestionDataSource{} + if protoimpl.UnsafeEnabled { + mi := &file_reconciler_v1_reconciler_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IngestionDataSource) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IngestionDataSource) ProtoMessage() {} + +func (x *IngestionDataSource) ProtoReflect() protoreflect.Message { + mi := &file_reconciler_v1_reconciler_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use IngestionDataSource.ProtoReflect.Descriptor instead. +func (*IngestionDataSource) Descriptor() ([]byte, []int) { + return file_reconciler_v1_reconciler_proto_rawDescGZIP(), []int{0} +} + +func (x *IngestionDataSource) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *IngestionDataSource) GetApiKey() string { + if x != nil { + return x.ApiKey + } + return "" +} + +// The request to retrieve ingestion data sources +type RetrieveIngestionDataSourcesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + SdkName string `protobuf:"bytes,2,opt,name=sdk_name,json=sdkName,proto3" json:"sdk_name,omitempty"` + SdkVersion string `protobuf:"bytes,3,opt,name=sdk_version,json=sdkVersion,proto3" json:"sdk_version,omitempty"` +} + +func (x *RetrieveIngestionDataSourcesRequest) Reset() { + *x = RetrieveIngestionDataSourcesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_reconciler_v1_reconciler_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RetrieveIngestionDataSourcesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RetrieveIngestionDataSourcesRequest) ProtoMessage() {} + +func (x *RetrieveIngestionDataSourcesRequest) ProtoReflect() protoreflect.Message { + mi := &file_reconciler_v1_reconciler_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RetrieveIngestionDataSourcesRequest.ProtoReflect.Descriptor instead. +func (*RetrieveIngestionDataSourcesRequest) Descriptor() ([]byte, []int) { + return file_reconciler_v1_reconciler_proto_rawDescGZIP(), []int{1} +} + +func (x *RetrieveIngestionDataSourcesRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RetrieveIngestionDataSourcesRequest) GetSdkName() string { + if x != nil { + return x.SdkName + } + return "" +} + +func (x *RetrieveIngestionDataSourcesRequest) GetSdkVersion() string { + if x != nil { + return x.SdkVersion + } + return "" +} + +// The response from the retrieve ingestion data sources request +type RetrieveIngestionDataSourcesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + IngestionDataSources []*IngestionDataSource `protobuf:"bytes,1,rep,name=ingestion_data_sources,json=ingestionDataSources,proto3" json:"ingestion_data_sources,omitempty"` +} + +func (x *RetrieveIngestionDataSourcesResponse) Reset() { + *x = RetrieveIngestionDataSourcesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_reconciler_v1_reconciler_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RetrieveIngestionDataSourcesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RetrieveIngestionDataSourcesResponse) ProtoMessage() {} + +func (x *RetrieveIngestionDataSourcesResponse) ProtoReflect() protoreflect.Message { + mi := &file_reconciler_v1_reconciler_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RetrieveIngestionDataSourcesResponse.ProtoReflect.Descriptor instead. +func (*RetrieveIngestionDataSourcesResponse) Descriptor() ([]byte, []int) { + return file_reconciler_v1_reconciler_proto_rawDescGZIP(), []int{2} +} + +func (x *RetrieveIngestionDataSourcesResponse) GetIngestionDataSources() []*IngestionDataSource { + if x != nil { + return x.IngestionDataSources + } + return nil +} + +var File_reconciler_v1_reconciler_proto protoreflect.FileDescriptor + +var file_reconciler_v1_reconciler_proto_rawDesc = []byte{ + 0x0a, 0x1e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, + 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x0d, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x1a, + 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x59, 0x0a, 0x13, 0x49, 0x6e, 0x67, 0x65, + 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, + 0x1e, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, + 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x22, 0x0a, 0x07, 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x09, 0xfa, 0x42, 0x06, 0x72, 0x04, 0x10, 0x28, 0x18, 0x28, 0x52, 0x06, 0x61, 0x70, 0x69, + 0x4b, 0x65, 0x79, 0x22, 0xab, 0x01, 0x0a, 0x23, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, + 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, 0x42, 0x07, 0x72, 0x05, + 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x08, 0x73, + 0x64, 0x6b, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0a, 0xfa, + 0x42, 0x07, 0x72, 0x05, 0x10, 0x01, 0x18, 0xff, 0x01, 0x52, 0x07, 0x73, 0x64, 0x6b, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x73, 0x64, 0x6b, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1c, 0xfa, 0x42, 0x19, 0x72, 0x17, 0x32, 0x15, + 0x5e, 0x28, 0x5c, 0x64, 0x29, 0x2b, 0x5c, 0x2e, 0x28, 0x5c, 0x64, 0x29, 0x2b, 0x5c, 0x2e, 0x28, + 0x5c, 0x64, 0x29, 0x2b, 0x24, 0x52, 0x0a, 0x73, 0x64, 0x6b, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x80, 0x01, 0x0a, 0x24, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x49, 0x6e, + 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x16, 0x69, 0x6e, + 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, 0x65, 0x63, + 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x67, 0x65, 0x73, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x14, + 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x32, 0x9f, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, + 0x6c, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x89, 0x01, 0x0a, 0x1c, 0x52, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x32, 0x2e, 0x72, 0x65, + 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, + 0x69, 0x65, 0x76, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, + 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x33, 0x2e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, + 0x6e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x45, 0x5a, 0x43, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6e, 0x65, 0x74, 0x62, 0x6f, 0x78, 0x6c, 0x61, 0x62, 0x73, 0x2f, + 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2f, 0x64, 0x69, 0x6f, 0x64, 0x65, 0x2d, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2f, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x72, 0x2f, 0x76, 0x31, + 0x2f, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x63, 0x69, 0x6c, 0x65, 0x72, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_reconciler_v1_reconciler_proto_rawDescOnce sync.Once + file_reconciler_v1_reconciler_proto_rawDescData = file_reconciler_v1_reconciler_proto_rawDesc +) + +func file_reconciler_v1_reconciler_proto_rawDescGZIP() []byte { + file_reconciler_v1_reconciler_proto_rawDescOnce.Do(func() { + file_reconciler_v1_reconciler_proto_rawDescData = protoimpl.X.CompressGZIP(file_reconciler_v1_reconciler_proto_rawDescData) + }) + return file_reconciler_v1_reconciler_proto_rawDescData +} + +var file_reconciler_v1_reconciler_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_reconciler_v1_reconciler_proto_goTypes = []interface{}{ + (*IngestionDataSource)(nil), // 0: reconciler.v1.IngestionDataSource + (*RetrieveIngestionDataSourcesRequest)(nil), // 1: reconciler.v1.RetrieveIngestionDataSourcesRequest + (*RetrieveIngestionDataSourcesResponse)(nil), // 2: reconciler.v1.RetrieveIngestionDataSourcesResponse +} +var file_reconciler_v1_reconciler_proto_depIdxs = []int32{ + 0, // 0: reconciler.v1.RetrieveIngestionDataSourcesResponse.ingestion_data_sources:type_name -> reconciler.v1.IngestionDataSource + 1, // 1: reconciler.v1.ReconcilerService.RetrieveIngestionDataSources:input_type -> reconciler.v1.RetrieveIngestionDataSourcesRequest + 2, // 2: reconciler.v1.ReconcilerService.RetrieveIngestionDataSources:output_type -> reconciler.v1.RetrieveIngestionDataSourcesResponse + 2, // [2:3] is the sub-list for method output_type + 1, // [1:2] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_reconciler_v1_reconciler_proto_init() } +func file_reconciler_v1_reconciler_proto_init() { + if File_reconciler_v1_reconciler_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_reconciler_v1_reconciler_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IngestionDataSource); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_reconciler_v1_reconciler_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RetrieveIngestionDataSourcesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_reconciler_v1_reconciler_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RetrieveIngestionDataSourcesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_reconciler_v1_reconciler_proto_rawDesc, + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_reconciler_v1_reconciler_proto_goTypes, + DependencyIndexes: file_reconciler_v1_reconciler_proto_depIdxs, + MessageInfos: file_reconciler_v1_reconciler_proto_msgTypes, + }.Build() + File_reconciler_v1_reconciler_proto = out.File + file_reconciler_v1_reconciler_proto_rawDesc = nil + file_reconciler_v1_reconciler_proto_goTypes = nil + file_reconciler_v1_reconciler_proto_depIdxs = nil +} diff --git a/diode-server/reconciler/v1/reconcilerpb/reconciler.pb.validate.go b/diode-server/reconciler/v1/reconcilerpb/reconciler.pb.validate.go new file mode 100644 index 00000000..f1d1add5 --- /dev/null +++ b/diode-server/reconciler/v1/reconcilerpb/reconciler.pb.validate.go @@ -0,0 +1,440 @@ +// Code generated by protoc-gen-validate. DO NOT EDIT. +// source: reconciler/v1/reconciler.proto + +package reconcilerpb + +import ( + "bytes" + "errors" + "fmt" + "net" + "net/mail" + "net/url" + "regexp" + "sort" + "strings" + "time" + "unicode/utf8" + + "google.golang.org/protobuf/types/known/anypb" +) + +// ensure the imports are used +var ( + _ = bytes.MinRead + _ = errors.New("") + _ = fmt.Print + _ = utf8.UTFMax + _ = (*regexp.Regexp)(nil) + _ = (*strings.Reader)(nil) + _ = net.IPv4len + _ = time.Duration(0) + _ = (*url.URL)(nil) + _ = (*mail.Address)(nil) + _ = anypb.Any{} + _ = sort.Sort +) + +// Validate checks the field values on IngestionDataSource with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *IngestionDataSource) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on IngestionDataSource with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// IngestionDataSourceMultiError, or nil if none found. +func (m *IngestionDataSource) ValidateAll() error { + return m.validate(true) +} + +func (m *IngestionDataSource) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if l := utf8.RuneCountInString(m.GetName()); l < 1 || l > 255 { + err := IngestionDataSourceValidationError{ + field: "Name", + reason: "value length must be between 1 and 255 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if utf8.RuneCountInString(m.GetApiKey()) != 40 { + err := IngestionDataSourceValidationError{ + field: "ApiKey", + reason: "value length must be 40 runes", + } + if !all { + return err + } + errors = append(errors, err) + + } + + if len(errors) > 0 { + return IngestionDataSourceMultiError(errors) + } + + return nil +} + +// IngestionDataSourceMultiError is an error wrapping multiple validation +// errors returned by IngestionDataSource.ValidateAll() if the designated +// constraints aren't met. +type IngestionDataSourceMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m IngestionDataSourceMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m IngestionDataSourceMultiError) AllErrors() []error { return m } + +// IngestionDataSourceValidationError is the validation error returned by +// IngestionDataSource.Validate if the designated constraints aren't met. +type IngestionDataSourceValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e IngestionDataSourceValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e IngestionDataSourceValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e IngestionDataSourceValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e IngestionDataSourceValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e IngestionDataSourceValidationError) ErrorName() string { + return "IngestionDataSourceValidationError" +} + +// Error satisfies the builtin error interface +func (e IngestionDataSourceValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sIngestionDataSource.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = IngestionDataSourceValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = IngestionDataSourceValidationError{} + +// Validate checks the field values on RetrieveIngestionDataSourcesRequest with +// the rules defined in the proto definition for this message. If any rules +// are violated, the first error encountered is returned, or nil if there are +// no violations. +func (m *RetrieveIngestionDataSourcesRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on RetrieveIngestionDataSourcesRequest +// with the rules defined in the proto definition for this message. If any +// rules are violated, the result is a list of violation errors wrapped in +// RetrieveIngestionDataSourcesRequestMultiError, or nil if none found. +func (m *RetrieveIngestionDataSourcesRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *RetrieveIngestionDataSourcesRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if l := utf8.RuneCountInString(m.GetName()); l < 1 || l > 255 { + err := RetrieveIngestionDataSourcesRequestValidationError{ + field: "Name", + reason: "value length must be between 1 and 255 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if l := utf8.RuneCountInString(m.GetSdkName()); l < 1 || l > 255 { + err := RetrieveIngestionDataSourcesRequestValidationError{ + field: "SdkName", + reason: "value length must be between 1 and 255 runes, inclusive", + } + if !all { + return err + } + errors = append(errors, err) + } + + if !_RetrieveIngestionDataSourcesRequest_SdkVersion_Pattern.MatchString(m.GetSdkVersion()) { + err := RetrieveIngestionDataSourcesRequestValidationError{ + field: "SdkVersion", + reason: "value does not match regex pattern \"^(\\\\d)+\\\\.(\\\\d)+\\\\.(\\\\d)+$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + if len(errors) > 0 { + return RetrieveIngestionDataSourcesRequestMultiError(errors) + } + + return nil +} + +// RetrieveIngestionDataSourcesRequestMultiError is an error wrapping multiple +// validation errors returned by +// RetrieveIngestionDataSourcesRequest.ValidateAll() if the designated +// constraints aren't met. +type RetrieveIngestionDataSourcesRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m RetrieveIngestionDataSourcesRequestMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m RetrieveIngestionDataSourcesRequestMultiError) AllErrors() []error { return m } + +// RetrieveIngestionDataSourcesRequestValidationError is the validation error +// returned by RetrieveIngestionDataSourcesRequest.Validate if the designated +// constraints aren't met. +type RetrieveIngestionDataSourcesRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RetrieveIngestionDataSourcesRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RetrieveIngestionDataSourcesRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RetrieveIngestionDataSourcesRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RetrieveIngestionDataSourcesRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RetrieveIngestionDataSourcesRequestValidationError) ErrorName() string { + return "RetrieveIngestionDataSourcesRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e RetrieveIngestionDataSourcesRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRetrieveIngestionDataSourcesRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RetrieveIngestionDataSourcesRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RetrieveIngestionDataSourcesRequestValidationError{} + +var _RetrieveIngestionDataSourcesRequest_SdkVersion_Pattern = regexp.MustCompile("^(\\d)+\\.(\\d)+\\.(\\d)+$") + +// Validate checks the field values on RetrieveIngestionDataSourcesResponse +// with the rules defined in the proto definition for this message. If any +// rules are violated, the first error encountered is returned, or nil if +// there are no violations. +func (m *RetrieveIngestionDataSourcesResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on RetrieveIngestionDataSourcesResponse +// with the rules defined in the proto definition for this message. If any +// rules are violated, the result is a list of violation errors wrapped in +// RetrieveIngestionDataSourcesResponseMultiError, or nil if none found. +func (m *RetrieveIngestionDataSourcesResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *RetrieveIngestionDataSourcesResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + for idx, item := range m.GetIngestionDataSources() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RetrieveIngestionDataSourcesResponseValidationError{ + field: fmt.Sprintf("IngestionDataSources[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RetrieveIngestionDataSourcesResponseValidationError{ + field: fmt.Sprintf("IngestionDataSources[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RetrieveIngestionDataSourcesResponseValidationError{ + field: fmt.Sprintf("IngestionDataSources[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return RetrieveIngestionDataSourcesResponseMultiError(errors) + } + + return nil +} + +// RetrieveIngestionDataSourcesResponseMultiError is an error wrapping multiple +// validation errors returned by +// RetrieveIngestionDataSourcesResponse.ValidateAll() if the designated +// constraints aren't met. +type RetrieveIngestionDataSourcesResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m RetrieveIngestionDataSourcesResponseMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m RetrieveIngestionDataSourcesResponseMultiError) AllErrors() []error { return m } + +// RetrieveIngestionDataSourcesResponseValidationError is the validation error +// returned by RetrieveIngestionDataSourcesResponse.Validate if the designated +// constraints aren't met. +type RetrieveIngestionDataSourcesResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RetrieveIngestionDataSourcesResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RetrieveIngestionDataSourcesResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RetrieveIngestionDataSourcesResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RetrieveIngestionDataSourcesResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RetrieveIngestionDataSourcesResponseValidationError) ErrorName() string { + return "RetrieveIngestionDataSourcesResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e RetrieveIngestionDataSourcesResponseValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRetrieveIngestionDataSourcesResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RetrieveIngestionDataSourcesResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RetrieveIngestionDataSourcesResponseValidationError{} diff --git a/diode-server/reconciler/v1/reconcilerpb/reconciler_grpc.pb.go b/diode-server/reconciler/v1/reconcilerpb/reconciler_grpc.pb.go new file mode 100644 index 00000000..aa50e76a --- /dev/null +++ b/diode-server/reconciler/v1/reconcilerpb/reconciler_grpc.pb.go @@ -0,0 +1,111 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc (unknown) +// source: reconciler/v1/reconciler.proto + +package reconcilerpb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + ReconcilerService_RetrieveIngestionDataSources_FullMethodName = "/reconciler.v1.ReconcilerService/RetrieveIngestionDataSources" +) + +// ReconcilerServiceClient is the client API for ReconcilerService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ReconcilerServiceClient interface { + // Retrieves ingestion data sources + RetrieveIngestionDataSources(ctx context.Context, in *RetrieveIngestionDataSourcesRequest, opts ...grpc.CallOption) (*RetrieveIngestionDataSourcesResponse, error) +} + +type reconcilerServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewReconcilerServiceClient(cc grpc.ClientConnInterface) ReconcilerServiceClient { + return &reconcilerServiceClient{cc} +} + +func (c *reconcilerServiceClient) RetrieveIngestionDataSources(ctx context.Context, in *RetrieveIngestionDataSourcesRequest, opts ...grpc.CallOption) (*RetrieveIngestionDataSourcesResponse, error) { + out := new(RetrieveIngestionDataSourcesResponse) + err := c.cc.Invoke(ctx, ReconcilerService_RetrieveIngestionDataSources_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ReconcilerServiceServer is the server API for ReconcilerService service. +// All implementations must embed UnimplementedReconcilerServiceServer +// for forward compatibility +type ReconcilerServiceServer interface { + // Retrieves ingestion data sources + RetrieveIngestionDataSources(context.Context, *RetrieveIngestionDataSourcesRequest) (*RetrieveIngestionDataSourcesResponse, error) + mustEmbedUnimplementedReconcilerServiceServer() +} + +// UnimplementedReconcilerServiceServer must be embedded to have forward compatible implementations. +type UnimplementedReconcilerServiceServer struct { +} + +func (UnimplementedReconcilerServiceServer) RetrieveIngestionDataSources(context.Context, *RetrieveIngestionDataSourcesRequest) (*RetrieveIngestionDataSourcesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RetrieveIngestionDataSources not implemented") +} +func (UnimplementedReconcilerServiceServer) mustEmbedUnimplementedReconcilerServiceServer() {} + +// UnsafeReconcilerServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ReconcilerServiceServer will +// result in compilation errors. +type UnsafeReconcilerServiceServer interface { + mustEmbedUnimplementedReconcilerServiceServer() +} + +func RegisterReconcilerServiceServer(s grpc.ServiceRegistrar, srv ReconcilerServiceServer) { + s.RegisterService(&ReconcilerService_ServiceDesc, srv) +} + +func _ReconcilerService_RetrieveIngestionDataSources_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RetrieveIngestionDataSourcesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ReconcilerServiceServer).RetrieveIngestionDataSources(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ReconcilerService_RetrieveIngestionDataSources_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ReconcilerServiceServer).RetrieveIngestionDataSources(ctx, req.(*RetrieveIngestionDataSourcesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// ReconcilerService_ServiceDesc is the grpc.ServiceDesc for ReconcilerService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ReconcilerService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "reconciler.v1.ReconcilerService", + HandlerType: (*ReconcilerServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "RetrieveIngestionDataSources", + Handler: _ReconcilerService_RetrieveIngestionDataSources_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "reconciler/v1/reconciler.proto", +} diff --git a/diode-server/sentry/sentry.go b/diode-server/sentry/sentry.go new file mode 100644 index 00000000..babf5c01 --- /dev/null +++ b/diode-server/sentry/sentry.go @@ -0,0 +1,20 @@ +package sentry + +import ( + "github.com/getsentry/sentry-go" +) + +// CaptureError captures an error and sends it to sentry with tags and context +func CaptureError(err error, tags map[string]string, contextKey string, context map[string]any) { + sentry.ConfigureScope(func(scope *sentry.Scope) { + for k, v := range tags { + scope.SetTag(k, v) + } + + if contextKey != "" && context != nil { + scope.SetContext(contextKey, context) + } + + sentry.CaptureException(err) + }) +} diff --git a/diode-server/server/config.go b/diode-server/server/config.go index baa562f5..f2707449 100644 --- a/diode-server/server/config.go +++ b/diode-server/server/config.go @@ -2,6 +2,13 @@ package server // Config is the configuration for the server type Config struct { - LoggingFormat string `envconfig:"LOGGING_FORMAT" default:"json"` - LoggingLevel string `envconfig:"LOGGING_LEVEL" default:"info"` + Environment string `envconfig:"ENVIRONMENT" default:"development"` + LoggingFormat string `envconfig:"LOGGING_FORMAT" default:"json"` + LoggingLevel string `envconfig:"LOGGING_LEVEL" default:"info"` + SentryDSN string `envconfig:"SENTRY_DSN"` + SentryDebug bool `envconfig:"SENTRY_DEBUG" default:"false"` + SentrySampleRate float64 `envconfig:"SENTRY_SAMPLE_RATE" default:"1.0"` + SentryEnableTracing bool `envconfig:"SENTRY_ENABLE_TRACING" default:"true"` + SentryTracesSampleRate float64 `envconfig:"SENTRY_TRACES_SAMPLE_RATE" default:"1.0"` + SentryAttachStacktrace bool `envconfig:"SENTRY_ATTACH_STACKTRACE" default:"true"` } diff --git a/diode-server/server/server.go b/diode-server/server/server.go index bbf3d16f..078143ba 100644 --- a/diode-server/server/server.go +++ b/diode-server/server/server.go @@ -7,16 +7,22 @@ import ( "os" "strings" "sync" + "time" + "github.com/getsentry/sentry-go" "github.com/kelseyhightower/envconfig" "github.com/oklog/run" + + "github.com/netboxlabs/diode/diode-server/version" ) // A Server is a diode Server type Server struct { - ctx context.Context - name string - logger *slog.Logger + ctx context.Context + name string + environment string + release string + logger *slog.Logger mu sync.Mutex components map[string]Component @@ -36,10 +42,31 @@ func New(ctx context.Context, name string) *Server { var cfg Config envconfig.MustProcess("", &cfg) + logger := newLogger(cfg) + + if cfg.SentryDSN != "" { + logger.Info("initializing sentry") + if err := sentry.Init(sentry.ClientOptions{ + Dsn: cfg.SentryDSN, + Environment: cfg.Environment, + Debug: cfg.SentryDebug, + SampleRate: cfg.SentrySampleRate, + EnableTracing: cfg.SentryEnableTracing, + TracesSampleRate: cfg.SentryTracesSampleRate, + AttachStacktrace: cfg.SentryAttachStacktrace, + ServerName: name, + Release: fmt.Sprintf("v%s", version.GetBuildVersion()), + }); err != nil { + logger.Error("failed to initialize sentry", "error", err) + } + } + return &Server{ ctx: ctx, name: name, - logger: newLogger(cfg), + environment: cfg.Environment, + release: fmt.Sprintf("v%s-%s", version.GetBuildVersion(), version.GetBuildCommit()), + logger: logger, components: make(map[string]Component), componentGroup: run.Group{}, } @@ -70,6 +97,11 @@ func (s *Server) RegisterComponent(c Component) error { s.componentGroup.Add( func() error { + componentHub := sentry.CurrentHub().Clone() + componentHub.Scope().SetTag("component", c.Name()) + + defer s.Recover(componentHub) + return c.Start(ctx) }, func(err error) { @@ -85,13 +117,25 @@ func (s *Server) RegisterComponent(c Component) error { // Run starts the diode Server func (s *Server) Run() error { - s.logger.Info("starting server", "serverName", s.name) - + s.logger.Info("starting server", "serverName", s.name, "environment", s.environment, "release", s.release) s.componentGroup.Add(run.SignalHandler(s.ctx, os.Interrupt, os.Kill)) return s.componentGroup.Run() } +// Recover recovers from a panic +func (s *Server) Recover(hub *sentry.Hub) { + if err := recover(); err != nil { + args := []any{"error", err} + if hub != nil && hub.Client() != nil { + eventID := hub.Recover(err) + args = append(args, "eventID", eventID) + sentry.Flush(2 * time.Second) + } + s.logger.Error("recovered from panic", args...) + } +} + func newLogger(cfg Config) *slog.Logger { var l slog.Level switch strings.ToUpper(cfg.LoggingLevel) { diff --git a/diode-server/server/server_test.go b/diode-server/server/server_test.go index ad01cd7c..f363b070 100644 --- a/diode-server/server/server_test.go +++ b/diode-server/server/server_test.go @@ -76,7 +76,6 @@ func TestNewServer(t *testing.T) { assert.Equal(t, tt.serverName, s.Name()) require.NotNil(t, s.Logger()) - //assert.True(t, s.Logger().Enabled(ctx, slog.LevelDebug)) handlerOK := false if tt.loggingFormat == "text" { diff --git a/diode-server/version/BUILD_COMMIT.txt b/diode-server/version/BUILD_COMMIT.txt new file mode 100644 index 00000000..87edf799 --- /dev/null +++ b/diode-server/version/BUILD_COMMIT.txt @@ -0,0 +1 @@ +unknown \ No newline at end of file diff --git a/diode-server/version/BUILD_VERSION.txt b/diode-server/version/BUILD_VERSION.txt new file mode 100644 index 00000000..bd52db81 --- /dev/null +++ b/diode-server/version/BUILD_VERSION.txt @@ -0,0 +1 @@ +0.0.0 \ No newline at end of file diff --git a/diode-server/version/VERSION.txt b/diode-server/version/VERSION.txt deleted file mode 100644 index 6e8bf73a..00000000 --- a/diode-server/version/VERSION.txt +++ /dev/null @@ -1 +0,0 @@ -0.1.0 diff --git a/diode-server/version/version.go b/diode-server/version/version.go index a1a1e151..4b05f0f7 100644 --- a/diode-server/version/version.go +++ b/diode-server/version/version.go @@ -1,8 +1,26 @@ package version -import _ "embed" +import ( + _ "embed" + "strings" +) // Version is the version of the diode-server // -//go:embed VERSION.txt -var Version string +//go:embed BUILD_VERSION.txt +var buildVersion string + +// Commit is the commit of the diode-server +// +//go:embed BUILD_COMMIT.txt +var buildCommit string + +// GetBuildVersion returns the build version of the diode-server +func GetBuildVersion() string { + return strings.TrimSpace(buildVersion) +} + +// GetBuildCommit returns the build commit of the diode-server +func GetBuildCommit() string { + return strings.TrimSpace(buildCommit) +} diff --git a/diode-server/version/version_test.go b/diode-server/version/version_test.go new file mode 100644 index 00000000..164cfe45 --- /dev/null +++ b/diode-server/version/version_test.go @@ -0,0 +1,17 @@ +package version_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/netboxlabs/diode/diode-server/version" +) + +func TestVersion(t *testing.T) { + v := version.GetBuildVersion() + assert.Equal(t, "0.0.0", v) + + c := version.GetBuildCommit() + assert.Equal(t, "unknown", c) +} diff --git a/docs/diode-proto.md b/docs/diode-proto.md index 9ddefaa5..7e084190 100644 --- a/docs/diode-proto.md +++ b/docs/diode-proto.md @@ -4,40 +4,29 @@ ## Table of Contents -- [diode/v1/device.proto](#diode_v1_device-proto) +- [diode/v1/ingester.proto](#diode_v1_ingester-proto) - [Device](#diode-v1-Device) - -- [diode/v1/device_role.proto](#diode_v1_device_role-proto) - - [DeviceRole](#diode-v1-DeviceRole) - -- [diode/v1/device_type.proto](#diode_v1_device_type-proto) - [DeviceType](#diode-v1-DeviceType) - -- [diode/v1/interface.proto](#diode_v1_interface-proto) + - [Entity](#diode-v1-Entity) + - [IPAddress](#diode-v1-IPAddress) + - [IngestRequest](#diode-v1-IngestRequest) + - [IngestResponse](#diode-v1-IngestResponse) - [Interface](#diode-v1-Interface) - -- [diode/v1/manufacturer.proto](#diode_v1_manufacturer-proto) - [Manufacturer](#diode-v1-Manufacturer) - -- [diode/v1/platform.proto](#diode_v1_platform-proto) - [Platform](#diode-v1-Platform) - -- [diode/v1/site.proto](#diode_v1_site-proto) + - [Prefix](#diode-v1-Prefix) + - [Role](#diode-v1-Role) - [Site](#diode-v1-Site) + - [Tag](#diode-v1-Tag) -- [diode/v1/distributor.proto](#diode_v1_distributor-proto) - - [IngestEntity](#diode-v1-IngestEntity) - - [PushRequest](#diode-v1-PushRequest) - - [PushResponse](#diode-v1-PushResponse) - - - [DistributorService](#diode-v1-DistributorService) + - [IngesterService](#diode-v1-IngesterService) - [Scalar Value Types](#scalar-value-types) - +

Top

-## diode/v1/device.proto +## diode/v1/ingester.proto @@ -45,55 +34,100 @@ A device -| Field | Type | Label | Description | -|-------------|---------------------------------------------|-------|-------------| -| name | [string](#string) | | | -| device_fqdn | [string](#string) | | | -| device_type | [google.protobuf.Any](#google-protobuf-Any) | | | -| role | [google.protobuf.Any](#google-protobuf-Any) | | | -| platform | [google.protobuf.Any](#google-protobuf-Any) | | | -| serial | [string](#string) | | | -| site | [google.protobuf.Any](#google-protobuf-Any) | | | -| vc_position | [int32](#int32) | | | - - -

Top

+| Field | Type | Label | Description | +|-------------|------------------------------------|----------|-------------| +| name | [string](#string) | | | +| device_fqdn | [string](#string) | | | +| device_type | [DeviceType](#diode-v1-DeviceType) | | | +| role | [Role](#diode-v1-Role) | | | +| platform | [Platform](#diode-v1-Platform) | | | +| serial | [string](#string) | | | +| site | [Site](#diode-v1-Site) | | | +| asset_tag | [string](#string) | | | +| status | [string](#string) | | | +| description | [string](#string) | | | +| comments | [string](#string) | | | +| tags | [Tag](#diode-v1-Tag) | repeated | | +| primary_ip4 | [IPAddress](#diode-v1-IPAddress) | | | +| primary_ip6 | [IPAddress](#diode-v1-IPAddress) | | | -## diode/v1/device_role.proto + - +### DeviceType -### DeviceRole +A device type -A device role +| Field | Type | Label | Description | +|--------------|----------------------------------------|----------|-------------| +| model | [string](#string) | | | +| slug | [string](#string) | | | +| manufacturer | [Manufacturer](#diode-v1-Manufacturer) | | | +| description | [string](#string) | | | +| comments | [string](#string) | | | +| part_number | [string](#string) | | | +| tags | [Tag](#diode-v1-Tag) | repeated | | -| Field | Type | Label | Description | -|---------|-------------------|-------|-------------| -| name | [string](#string) | | | -| slug | [string](#string) | | | -| vm_role | [bool](#bool) | | | + - -

Top

+### Entity -## diode/v1/device_type.proto +An ingest entity wrapper - +| Field | Type | Label | Description | +|--------------|---------------------------------------------------------|-------|-----------------------------------------------| +| site | [Site](#diode-v1-Site) | | | +| platform | [Platform](#diode-v1-Platform) | | | +| manufacturer | [Manufacturer](#diode-v1-Manufacturer) | | | +| device | [Device](#diode-v1-Device) | | | +| device_role | [Role](#diode-v1-Role) | | | +| device_type | [DeviceType](#diode-v1-DeviceType) | | | +| interface | [Interface](#diode-v1-Interface) | | | +| ip_address | [IPAddress](#diode-v1-IPAddress) | | | +| prefix | [Prefix](#diode-v1-Prefix) | | | +| timestamp | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | The timestamp of the data discovery at source | -### DeviceType + -A device type +### IPAddress -| Field | Type | Label | Description | -|--------------|---------------------------------------------|-------|-------------| -| manufacturer | [google.protobuf.Any](#google-protobuf-Any) | | | -| model | [string](#string) | | | -| slug | [string](#string) | | | +An IP address. - -

Top

+| Field | Type | Label | Description | +|-------------|----------------------------------|----------|-------------| +| address | [string](#string) | | | +| interface | [Interface](#diode-v1-Interface) | | | +| status | [string](#string) | | | +| role | [string](#string) | | | +| dns_name | [string](#string) | | | +| description | [string](#string) | | | +| comments | [string](#string) | | | +| tags | [Tag](#diode-v1-Tag) | repeated | | + + + +### IngestRequest + +The request to ingest the data + +| Field | Type | Label | Description | +|----------------------|----------------------------|----------|-------------| +| stream | [string](#string) | | | +| entities | [Entity](#diode-v1-Entity) | repeated | | +| id | [string](#string) | | | +| producer_app_name | [string](#string) | | | +| producer_app_version | [string](#string) | | | +| sdk_name | [string](#string) | | | +| sdk_version | [string](#string) | | | + + -## diode/v1/interface.proto +### IngestResponse + +The response from the ingest request + +| Field | Type | Label | Description | +|--------|-------------------|----------|-------------| +| errors | [string](#string) | repeated | | @@ -101,20 +135,22 @@ A device type An interface -| Field | Type | Label | Description | -|-------------|---------------------------------------------|-------|-------------| -| device | [google.protobuf.Any](#google-protobuf-Any) | | | -| name | [string](#string) | | | -| type | [string](#string) | | | -| enabled | [bool](#bool) | | | -| mtu | [int32](#int32) | | | -| mac_address | [string](#string) | | | -| mgmt_only | [bool](#bool) | | | - - -

Top

- -## diode/v1/manufacturer.proto +| Field | Type | Label | Description | +|----------------|----------------------------|----------|-------------| +| device | [Device](#diode-v1-Device) | | | +| name | [string](#string) | | | +| label | [string](#string) | | | +| type | [string](#string) | | | +| enabled | [bool](#bool) | | | +| mtu | [int32](#int32) | | | +| mac_address | [string](#string) | | | +| speed | [int32](#int32) | | | +| wwn | [string](#string) | | | +| mgmt_only | [bool](#bool) | | | +| description | [string](#string) | | | +| mark_connected | [bool](#bool) | | | +| mode | [string](#string) | | | +| tags | [Tag](#diode-v1-Tag) | repeated | | @@ -122,15 +158,12 @@ An interface A manufacturer -| Field | Type | Label | Description | -|-------|-------------------|-------|-------------| -| name | [string](#string) | | | -| slug | [string](#string) | | | - - -

Top

- -## diode/v1/platform.proto +| Field | Type | Label | Description | +|-------------|----------------------|----------|-------------| +| name | [string](#string) | | | +| slug | [string](#string) | | | +| description | [string](#string) | | | +| tags | [Tag](#diode-v1-Tag) | repeated | | @@ -138,84 +171,83 @@ A manufacturer A platform -| Field | Type | Label | Description | -|-------|-------------------|-------|-------------| -| name | [string](#string) | | | -| slug | [string](#string) | | | +| Field | Type | Label | Description | +|--------------|----------------------------------------|----------|-------------| +| name | [string](#string) | | | +| slug | [string](#string) | | | +| manufacturer | [Manufacturer](#diode-v1-Manufacturer) | | | +| description | [string](#string) | | | +| tags | [Tag](#diode-v1-Tag) | repeated | | - -

Top

+ -## diode/v1/site.proto +### Prefix - +An IPAM prefix. -### Site +| Field | Type | Label | Description | +|---------------|------------------------|----------|-------------| +| prefix | [string](#string) | | | +| site | [Site](#diode-v1-Site) | | | +| status | [string](#string) | | | +| is_pool | [bool](#bool) | | | +| mark_utilized | [bool](#bool) | | | +| description | [string](#string) | | | +| comments | [string](#string) | | | +| tags | [Tag](#diode-v1-Tag) | repeated | | -A site - -| Field | Type | Label | Description | -|-------|-------------------|-------|-------------| -| name | [string](#string) | | | -| slug | [string](#string) | | | - - -

Top

+ -## diode/v1/distributor.proto +### Role - +A role -### IngestEntity - -An ingest entity wrapper +| Field | Type | Label | Description | +|-------------|----------------------|----------|-------------| +| name | [string](#string) | | | +| slug | [string](#string) | | | +| color | [string](#string) | | | +| description | [string](#string) | | | +| tags | [Tag](#diode-v1-Tag) | repeated | | -| Field | Type | Label | Description | -|--------------|---------------------------------------------------------|-------|-----------------------------------------------| -| site | [Site](#diode-v1-Site) | | | -| platform | [Platform](#diode-v1-Platform) | | | -| manufacturer | [Manufacturer](#diode-v1-Manufacturer) | | | -| device | [Device](#diode-v1-Device) | | | -| device_role | [DeviceRole](#diode-v1-DeviceRole) | | | -| device_type | [DeviceType](#diode-v1-DeviceType) | | | -| interface | [Interface](#diode-v1-Interface) | | | -| timestamp | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | The timestamp of the data discovery at source | - - + -### PushRequest +### Site -The request to push data +A site -| Field | Type | Label | Description | -|----------------------|----------------------------------------|----------|-------------| -| stream | [string](#string) | | | -| data | [IngestEntity](#diode-v1-IngestEntity) | repeated | | -| id | [string](#string) | | | -| producer_app_name | [string](#string) | | | -| producer_app_version | [string](#string) | | | -| sdk_name | [string](#string) | | | -| sdk_version | [string](#string) | | | +| Field | Type | Label | Description | +|-------------|----------------------|----------|-------------| +| name | [string](#string) | | | +| slug | [string](#string) | | | +| status | [string](#string) | | | +| facility | [string](#string) | | | +| time_zone | [string](#string) | | | +| description | [string](#string) | | | +| comments | [string](#string) | | | +| tags | [Tag](#diode-v1-Tag) | repeated | | - + -### PushResponse +### Tag -The response from the push request +A tag -| Field | Type | Label | Description | -|--------|-------------------|----------|-------------| -| errors | [string](#string) | repeated | | +| Field | Type | Label | Description | +|-------|-------------------|-------|-------------| +| name | [string](#string) | | | +| slug | [string](#string) | | | +| color | [string](#string) | | | - + -### DistributorService +### IngesterService -Distributor API +Ingestion API -| Method Name | Request Type | Response Type | Description | -|-------------|--------------------------------------|----------------------------------------|------------------------------| -| Push | [PushRequest](#diode-v1-PushRequest) | [PushResponse](#diode-v1-PushResponse) | Ingests data into the system | +| Method Name | Request Type | Response Type | Description | +|-------------|------------------------------------------|--------------------------------------------|------------------------------| +| Ingest | [IngestRequest](#diode-v1-IngestRequest) | [IngestResponse](#diode-v1-IngestResponse) | Ingests data into the system | ## Scalar Value Types diff --git a/tests/.gitignore b/tests/.gitignore new file mode 100644 index 00000000..490c6056 --- /dev/null +++ b/tests/.gitignore @@ -0,0 +1,2 @@ +configs.ini +output \ No newline at end of file diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 00000000..1ee6d8fb --- /dev/null +++ b/tests/README.md @@ -0,0 +1,87 @@ +# Tests +This directory contains integrations tests that can be run against the Diode Plugin + + +Here's what you'll need to do in order to run these tests: +- Start docker containers stack (diode and NetBox) +- Check the users and their tokens +- Configure the test settings +- Run behave + + +## Start the Docker container for Netbox with Diode Plugin + +To run the tests, you must have the diode plugin directory, and execute the following commands in the **diode-server** folder. + +```bash +pip install netboxlabs-diode-netbox-plugin +``` + +After that, you can start the docker container by running the following command: + +```bash +make docker-compose-up +``` + +## Users and tokens + +The command above will create all users necessary to run the tests. + +Using the Admin user, you can access the Netbox at http://0.0.0.0:8000/. + +- username: admin +- password: admin + +To check the tokens of the users, navigate to the "Admin" menu and select "API Token". This will display a list of all the tokens associated with the users. + + +Please, pay attention to the token for user "INGESTION", it will be used in the next section. + +## Test settings +Create the test config file from the template: `cp config.ini.tpl config.ini`. + +Then fill in the correct values: + +- **user_token**: + - Mandatory! + - string + - **ADMIN** token created in the previous step + +- **api_root_path**: + - Mandatory! + - string + - netbox API URL, e.g. http://0.0.0.0:8000/api + +- **api_key**: + - Mandatory! + - string + - **INGESTION** user token created in the previous step + + +## Run behave using parallel process + +You can use [behavex](https://github.com/hrcorval/behavex) to run the scenarios using multiprocess by simply run: + +Examples: + +> behavex -t @\ --parallel-processes=2 --parallel-schema=feature + +> behavex -t @\ --parallel-processes=2 --parallel-schema=feature + +Running smoke tests: + +> behavex -t=@smoke --parallel-processes=2 --parallel-scheme=feature + + +## Test execution reports +[behavex](https://github.com/hrcorval/behavex) provides a friendly HTML test execution report that contains information related to test scenarios, execution status, execution evidence and metrics. A filters bar is also provided to filter scenarios by name, tag or status. + +It should be available at the following path: + +/report.html + +## Clean your environment + +After running the tests, clean up your environment by running the command: + +> behavex -t=@cleanup --parallel-processes=2 --parallel-scheme=feature \ No newline at end of file diff --git a/tests/features/cleanup.feature b/tests/features/cleanup.feature new file mode 100644 index 00000000..d5dc8463 --- /dev/null +++ b/tests/features/cleanup.feature @@ -0,0 +1,26 @@ +Feature: Cleanup tests + + +@cleanup +Scenario: Cleanup + Given the device "router01" is deleted + Given the site "Site A" is deleted + Given the site "Site B" is deleted + Given the device "router01" is deleted + Given the device type "ISR4321" is deleted + Given the device role "WAN Router" is deleted + Given the platform "Cisco IOS 15.6" is deleted + Given the manufacturer "Cisco" is deleted + + Given the site "undefined" is deleted + Given the device type "undefined" is deleted + Given the device role "undefined" is deleted + Given the site "undefined" is deleted + Given the platform "undefined" is deleted + Given the manufacturer "undefined" is deleted + + Given the interface "GigabitEthernet0/0/0" is deleted + Given the IP address "192.168.0.1/32" is deleted + + Given the prefix "192.168.0.0/32" is deleted + Given the tag "tag 100" is deleted diff --git a/tests/features/configs.ini.tpl b/tests/features/configs.ini.tpl new file mode 100644 index 00000000..f1762490 --- /dev/null +++ b/tests/features/configs.ini.tpl @@ -0,0 +1,4 @@ +[tests_config] +user_token = USER_TOKEN_CREATED_ON_NETBOX +api_root_path = NETBOX API URL (e.g. http://localhost/netbox/api) +api_key = INGESTION_API_KEY diff --git a/tests/features/create_object.feature b/tests/features/create_object.feature new file mode 100644 index 00000000..9f227bac --- /dev/null +++ b/tests/features/create_object.feature @@ -0,0 +1,16 @@ +@fixture.create.object +Feature: Create objects using Apply Change Set endpoint tests + Validate the behaviors expected for the endpoint apply-change-set to create objects + + @smoke + @create.object + Scenario: Correct payload to create a new site + Given I provide a correct payload to create a new site + When I send a POST request to the endpoint + Then I must get a response with status code 200 and a Json object with success message + + @smoke + Scenario: Incorrect payload sent to create a new site + Given I provide payload with object_type missing + When I send a POST request to the endpoint + Then I must get a response with status code 400 and a Json object with error message \ No newline at end of file diff --git a/tests/features/environment.py b/tests/features/environment.py new file mode 100644 index 00000000..7a343666 --- /dev/null +++ b/tests/features/environment.py @@ -0,0 +1,52 @@ +from steps.utils import send_get_request, send_delete_request, send_post_request + + +def setup_context_with_global_params_test(context): + context.sites_to_be_cleaned_up = [] + + +def create_site_entry(sites_names): + endpoint = "dcim/sites/" + for site in sites_names: + payload = { + "name": site, + "slug": site.lower().replace(" ", "-"), + "facility": "Omega", + "description": "", + "physical_address": "123 Fake St Lincoln NE 68588", + "shipping_address": "123 Fake St Lincoln NE 68588", + "comments": "Lorem ipsum etcetera", + } + send_post_request(payload, endpoint) + + +def remove_sites_entry(sites_names): + endpoint = "dcim/sites/" + for site in sites_names: + site_id = ( + send_get_request(endpoint, {"name__ic": site}) + .json() + .get("results")[0] + .get("id") + ) + send_delete_request(endpoint, site_id) + + +def before_all(context): + setup_context_with_global_params_test(context) + + +def before_tag(context, tag): + if tag == "update.object": + create_site_entry(["Site-Test-2"]) + if tag == "object.state": + create_site_entry(["Site Z", "Site X"]) + + +def after_tag(context, tag): + switcher = { + "create.object": ["Site-Test"], + "update.object": ["Site-Test-2"], + "object.state": ["Site Z", "Site X"], + } + remove_sites_entry(switcher.get(tag, [])) diff --git a/tests/features/ingestion_device_objects.feature b/tests/features/ingestion_device_objects.feature new file mode 100644 index 00000000..253b4c45 --- /dev/null +++ b/tests/features/ingestion_device_objects.feature @@ -0,0 +1,54 @@ +Feature: Tests for ingestion of device + Validate the behavior of the ingestion of device + +@smoke +@ingestion.device +Scenario: Ingestion of a new device (site not provided) + Given device "router01" with site not provided + And device "router01" with site "undefined" does not exist + When the device without site is ingested + Then the device is found + And device type is "undefined" + And role is "undefined" + +@smoke +@ingestion.device +Scenario: Ingestion of existing device (site not provided) + Given device "router01" with site not provided + And device "router01" with site "undefined" exists + When the device without site is ingested + Then the device is found + And device type is "undefined" + And role is "undefined" + +@smoke +@ingestion.device +Scenario: Ingestion of a new device (site provided) + Given a new device "router01" with site "Site B" + And device "router01" with site "Site B" does not exist + When the device with site is ingested + Then the device is found + And device type is "undefined" + And role is "undefined" + +@smoke +@ingestion.device +Scenario: Ingestion of existing device (site provided) with different device type and role + Given device "router01" with site "Site B", device type "ISR4321" and role "WAN Router" + And device "router01" with site "Site B" exists + When the device with site, device type and role is ingested + Then the device is found + And device type is "ISR4321" + And role is "WAN Router" + +@smoke +@ingestion.device +Scenario: Ingestion of a new device with tags + Given device "router01" with site not provided + And tags "tag1,tag2,tag3" are provided + And device "router01" with site "undefined" does not exist + When the device with site, device type, role and tags is ingested + Then the device is found + And device type is "undefined" + And role is "undefined" + And tags "tag1,tag2,tag3" are present diff --git a/tests/features/ingestion_device_type_objects.feature b/tests/features/ingestion_device_type_objects.feature new file mode 100644 index 00000000..3e755dad --- /dev/null +++ b/tests/features/ingestion_device_type_objects.feature @@ -0,0 +1,24 @@ +Feature: Tests for ingestion of device type + Validate the behavior of the ingestion of device type + +@smoke +@ingestion.device_type +Scenario: Ingestion of new device type + Given a new device type "ISR4321-1" + When the device type is ingested + Then the device type and "undefined" manufacturer are created in the database + +@smoke +@ingestion.device_type +Scenario: Ingestion of existing device type + Given device type "ISR4321-1" already exists in the database + When the device type is ingested + Then the device type remains the same + +@smoke +@ingestion.device_type +Scenario: Ingestion of device type object to update the manufacturer, description and part number + Given device type "ISR4321-1" with manufacturer "Cisco-1", description "some string" and part number "xyz123" + Then check if the manufacturer "Cisco" exists in the database and remove it + When the device type object is ingested with the updates + Then the manufacturer "Cisco-1" is created and the device updated diff --git a/tests/features/ingestion_interface_objects.feature b/tests/features/ingestion_interface_objects.feature new file mode 100644 index 00000000..8ca32aba --- /dev/null +++ b/tests/features/ingestion_interface_objects.feature @@ -0,0 +1,20 @@ +Feature: Tests for interface ingestion + Validate the behavior of the ingestion of an interface + +@smoke +@ingestion.interface +Scenario: Ingest a new interface + Given a new interface "GigabitEthernet0/0/0" + When the interface is ingested + Then the interface is found + And the interface is associated with the device "undefined" + And the interface is enabled + And the interface type is "other" + +@smoke +@ingestion.interface +Scenario: Ingest an interface with updates + Given an interface "GigabitEthernet0/0/0" with MTU "1500" + When the interface with MTU is ingested + Then the interface is found + And the interface MTU is updated diff --git a/tests/features/ingestion_ip_address_object.feature b/tests/features/ingestion_ip_address_object.feature new file mode 100644 index 00000000..2ada5f1d --- /dev/null +++ b/tests/features/ingestion_ip_address_object.feature @@ -0,0 +1,23 @@ +Feature: Tests for IP address ingestion + Validate the behavior of the ingestion of the IP address + +@smoke +@ingestion.ipaddress +Scenario: Ingest a new IP address + Given an IP address "192.168.0.1/32" + And interface "GigabitEthernet0/0/0" + When the IP address is ingested + Then the IP address is found + And the IP address is associated with the interface + And the IP address status is "active" + +@smoke +@ingestion.ipaddress +Scenario: Ingest an IP address with updates + Given an IP address "192.168.0.1/32" + And interface "GigabitEthernet0/0/0" + And description "lorem ipsum" + When the IP address with description is ingested + Then the IP address is found + And the IP address is associated with the interface + And the IP address description is updated diff --git a/tests/features/ingestion_manufacturer_objects.feature b/tests/features/ingestion_manufacturer_objects.feature new file mode 100644 index 00000000..d69ece6b --- /dev/null +++ b/tests/features/ingestion_manufacturer_objects.feature @@ -0,0 +1,24 @@ +Feature: Tests for ingestion of manufacturer + Validate the behavior of the ingestion of manufacturer + +@smoke +@ingestion.manufacturer +Scenario: Ingestion of new manufacturer + Given a new manufacturer "Cisco" + When the manufacturer is ingested + Then the manufacturer is created in the database + +@smoke +@ingestion.manufacturer +Scenario: Ingestion of existing manufacturer + Given manufacturer "Cisco" already exists in the database + When the manufacturer is ingested + Then the manufacturer remains the same + + +@smoke +@ingestion.manufacturer +Scenario: Ingestion of manufacturer to update its description + Given manufacturer "Cisco" with description "some string" + When the manufacturer is ingested with the updates + Then the manufacturer is updated in the database diff --git a/tests/features/ingestion_prefix_objects.feature b/tests/features/ingestion_prefix_objects.feature new file mode 100644 index 00000000..308646f6 --- /dev/null +++ b/tests/features/ingestion_prefix_objects.feature @@ -0,0 +1,19 @@ +Feature: Tests for prefixes ingestion + Validate the behavior of the ingestion of a prefix + +@smoke +@ingestion.prefix +Scenario: Ingest a new prefix + Given a new prefix "192.168.0.0/32" + When the prefix is ingested + Then the prefix is found + And the prefix is associated with the site "undefined" + And the prefix is active + +@smoke +@ingestion.prefix +Scenario: Ingest a prefix with updates + Given a prefix "192.168.0.0/32" with description "lorem ipsum" + When the prefix with description is ingested + Then the prefix is found + And the prefix description is updated diff --git a/tests/features/ingestion_role_objects.feature b/tests/features/ingestion_role_objects.feature new file mode 100644 index 00000000..65bdfe29 --- /dev/null +++ b/tests/features/ingestion_role_objects.feature @@ -0,0 +1,26 @@ +Feature: Tests for ingestion of device role objects + Validate the behavior of the ingestion of device role objects + +@smoke +@ingestion.device_role +Scenario: Ingestion of new device role + Given a new device role "WAN Router" + When the device role is ingested + Then the device role is created in the database + +@smoke +@ingestion.device_role +Scenario: Ingestion of existing device role + Given device role "WAN Router" exists in the database + When the device role is ingested + Then the device role remains the same + + +@smoke +@ingestion.device_role +Scenario: Ingestion of device role to update color and description + Given device role "WAN Router" with color "509415" and description "some string" + When the device role is ingested with the updates + Then the device role is updated in the database + + diff --git a/tests/features/ingestion_site_objects.feature b/tests/features/ingestion_site_objects.feature new file mode 100644 index 00000000..a5c20c39 --- /dev/null +++ b/tests/features/ingestion_site_objects.feature @@ -0,0 +1,35 @@ +Feature: Tests for ingestion of site + Validate the behavior of the ingestion of site + +@smoke +@ingestion.site +Scenario: Ingestion of a new site + Given a site "Site A" + And site "Site A" does not exist + When the site is ingested + Then the site is found + And the site status is "active" + And the site description is empty + +@smoke +@ingestion.site +Scenario: Ingestion of existing site - nothing to update + Given a site "Site A" + When the site is ingested + Then the site is found + And the site status is "active" + And the site description is empty + + +@smoke +@ingestion.site +Scenario: Ingestion of existing site with updated status and description + Given a site "Site A" + And the site status "planned" + And the site description "some string" + When the site with status and description is ingested + Then the site is found + And the site status is "planned" + And the site description is "some string" + + diff --git a/tests/features/object_state.feature b/tests/features/object_state.feature new file mode 100644 index 00000000..b0da3f44 --- /dev/null +++ b/tests/features/object_state.feature @@ -0,0 +1,26 @@ +Feature: Object State endpoint tests + Validate the behaviors expected for the endpoint object-state + + @smoke + @object.state + Scenario: Return object state using id + Given the site id "Site Z" and object_type "dcim.site" + Then the object state "Site Z" is returned successfully + + @smoke + @object.state + Scenario: Return object state using q parameter + Given the site name "Site X" and object_type "dcim.site" + Then the object state "Site X" is returned successfully + + @smoke + @object.state + Scenario: Return none object state using q parameter + Given the site name "Site Does Not Exist" and object_type "dcim.site" + Then endpoint return 200 and empty response + + @smoke + @object.state + Scenario: Return 400 when object type is not provided + Given the site name "Site X" and not object_type + Then endpoint return 400 diff --git a/tests/features/steps/cleanup.py b/tests/features/steps/cleanup.py new file mode 100644 index 00000000..d72a7ecd --- /dev/null +++ b/tests/features/steps/cleanup.py @@ -0,0 +1,93 @@ +from behave import given + +from steps.utils import get_object_by_name, send_delete_request, get_object_by_model + + +@given('the site "{site_name}" is deleted') +def delete_site(context, site_name): + """Delete the site with the given name.""" + endpoint = "dcim/sites/" + site = get_object_by_name(site_name, endpoint) + if site: + send_delete_request(endpoint, site.get("id")) + + +@given('the device role "{device_role_name}" is deleted') +def delete_device_role(context, device_role_name): + """Delete the device role with the given name.""" + endpoint = "dcim/device-roles/" + device_role = get_object_by_name(device_role_name, endpoint) + if device_role: + send_delete_request(endpoint, device_role.get("id")) + + +@given('the manufacturer "{manufacturer_name}" is deleted') +def delete_manufacturer(context, manufacturer_name): + """Delete the manufacturer with the given name.""" + endpoint = "dcim/manufacturers/" + manufacturer = get_object_by_name(manufacturer_name, endpoint) + if manufacturer: + send_delete_request(endpoint, manufacturer.get("id")) + + +@given('the device type "{device_type_model}" is deleted') +def delete_device_type(context, device_type_model): + """Delete the device type with the given model.""" + endpoint = "dcim/device-types/" + device_type = get_object_by_model(device_type_model, endpoint) + if device_type: + send_delete_request(endpoint, device_type.get("id")) + + +@given('the platform "{platform_name}" is deleted') +def delete_platform(context, platform_name): + """Delete the manufacturer with the given name.""" + endpoint = "dcim/platforms/" + platform = get_object_by_name(platform_name, endpoint) + if platform: + send_delete_request(endpoint, platform.get("id")) + + +@given('the device "{device_name}" is deleted') +def delete_device(context, device_name): + """Delete the device""" + endpoint = "dcim/devices/" + device = get_object_by_name(device_name, endpoint) + if device: + send_delete_request(endpoint, device.get("id")) + + +@given('the interface "{interface_name}" is deleted') +def delete_interface(context, interface_name): + """Delete the interface""" + endpoint = "dcim/interfaces/" + interface = get_object_by_name(interface_name, endpoint) + if interface: + send_delete_request(endpoint, interface.get("id")) + + +@given('the IP address "{ip_address}" is deleted') +def delete_ip_address(context, ip_address): + """Delete the IP address""" + endpoint = "ipam/ip-addresses/" + ip = get_object_by_name(ip_address, endpoint) + if ip: + send_delete_request(endpoint, ip.get("id")) + + +@given('the prefix "{prefix}" is deleted') +def delete_prefix(context, prefix): + """Delete the prefix""" + endpoint = "ipam/prefixes/" + ip = get_object_by_name(prefix, endpoint) + if ip: + send_delete_request(endpoint, ip.get("id")) + + +@given('the tag "{tag}" is deleted') +def delete_tag(context, tag): + """Delete the tag""" + endpoint = "extras/tags/" + ip = get_object_by_name(tag, endpoint) + if ip: + send_delete_request(endpoint, ip.get("id")) diff --git a/tests/features/steps/config.py b/tests/features/steps/config.py new file mode 100644 index 00000000..2bf83def --- /dev/null +++ b/tests/features/steps/config.py @@ -0,0 +1,34 @@ +import configparser + + +class TestConfig: + """A class to read the test configurations from the configs.ini file""" + + _configs = None + + def __init__(self): + raise RuntimeError("Call instance() instead") + + @classmethod + def configs(cls): + if cls._configs is None: + cls._configs = _read_configs() + return cls._configs + + +def _read_configs(): + """Read the test configurations from the configs.ini file""" + parser = configparser.ConfigParser() + parser.read("./features/configs.ini") + configs = parser["tests_config"] + + configs["api_root_path"] = configs.get("api_root_path", "http://0.0.0.0:8000/") + configs["user_token"] = configs.get( + "user_token", + ) + configs["api_key"] = configs.get("api_key") + + return configs + + +configs = TestConfig.configs() diff --git a/tests/features/steps/create_object.py b/tests/features/steps/create_object.py new file mode 100644 index 00000000..abdae128 --- /dev/null +++ b/tests/features/steps/create_object.py @@ -0,0 +1,83 @@ +import uuid + +from behave import given, when, then +from steps.utils import send_post_request + + +@given("I provide a correct payload to create a new site") +def step_set_correct_payload(context): + """Set the body of the request to create a new site. The site name is Site-Test. The site will be cleaned up after the test.""" + context.body = { + "change_set_id": str(uuid.uuid4()), + "change_set": [ + { + "change_id": str(uuid.uuid4()), + "change_type": "create", + "object_version": None, + "object_type": "dcim.site", + "object_id": None, + "data": { + "name": "Site-Test", + "slug": "site-test", + "facility": "Alpha", + "description": "", + "physical_address": "123 Fake St Lincoln NE 68588", + "shipping_address": "123 Fake St Lincoln NE 68588", + "comments": "Lorem ipsum etcetera", + }, + }, + ], + } + + +@when("I send a POST request to the endpoint") +def get_response(context): + """Send a POST request to the endpoint with the payload""" + context.response = send_post_request(context.body) + + +@then( + "I must get a response with status code 200 and a Json object with success message" +) +def check_response_for_correct_payload(context): + """Check if the response status code is 200 and the result is success""" + assert context.response.status_code == 200 + assert context.response.json()["result"] == "success" + + +@given("I provide payload with object_type missing") +def set_incorrect_payload(context): + """Set the body of the request to create a new site.""" + context.body = { + "change_set_id": str(uuid.uuid4()), + "change_set": [ + { + "change_id": str(uuid.uuid4()), + "change_type": "create", + "object_version": None, + "object_type": "", + "object_id": None, + "data": { + "name": "Site-Test", + "slug": "site-test", + "facility": "Alpha", + "description": "", + "physical_address": "123 Fake St Lincoln NE 68588", + "shipping_address": "123 Fake St Lincoln NE 68588", + "comments": "Lorem ipsum etcetera", + }, + }, + ], + } + + +@then("I must get a response with status code 400 and a Json object with error message") +def check_response_for_incorrect_payload(context): + """Check if the response status code is 400 and the change_id in error""" + change_id = context.body.get("change_set")[0]["change_id"] + assert context.response.status_code == 400 + assert context.response.json()["errors"][0].get("change_id") == change_id + assert ( + context.response.json()["errors"][0].get("object_type") + == "This field may not be blank." + ) diff --git a/tests/features/steps/ingestion_device_object.py b/tests/features/steps/ingestion_device_object.py new file mode 100644 index 00000000..18f6c439 --- /dev/null +++ b/tests/features/steps/ingestion_device_object.py @@ -0,0 +1,196 @@ +from behave import given, when, then +from netboxlabs.diode.sdk.ingester import ( + Device, + Entity, +) +from steps.utils import ( + get_object_state, + ingester, + send_delete_request, +) + + +endpoint = "dcim/devices/" + + +@given('device "{device_name}" with site not provided') +def set_device_without_site(context, device_name): + """Set the body of the request to ingest the device.""" + context.device_name = device_name + context.site_name = "undefined" + context.device_type_model = "undefined" + context.device_role_name = "undefined" + + +@given('tags "{tags}" are provided') +def set_tags(context, tags): + context.device_tags = tags.split(",") + + +@given('device "{device_name}" with site "{site_name}" does not exist') +def ensure_device_does_not_exists(context, device_name, site_name): + """Ensure that the device does not exist.""" + device = get_object_state( + { + "object_type": "dcim.device", + "q": device_name, + "site__name": site_name, + }, + ) + if device: + send_delete_request(endpoint, device.get("id")) + + +@when("the device without site is ingested") +def ingest_device_without_site(context): + """Ingest the device using the Diode SDK""" + + entities = [ + Entity(device=context.device_name), + ] + + response = ingester(entities) + assert response.errors == [] + + context.response = response + return response + + +@then("the device is found") +def assert_device_exists(context): + """Assert that the device was created.""" + assert context.response is not None + + params = { + "object_type": "dcim.device", + "q": context.device_name, + "site__name": context.site_name, + } + + if hasattr(context, "device_type_model"): + params["device_type__model"] = context.device_type_model + if hasattr(context, "device_role_name"): + params["role__name"] = context.device_role_name + + device = get_object_state(params) + + assert device.get("name") == context.device_name + assert device.get("site").get("name") == context.site_name + context.existing_device = device + + +@then('device type is "{device_type_model}"') +def assert_device_type(context, device_type_model): + """Assert that the device type is correct.""" + assert context.existing_device is not None + assert context.existing_device.get("device_type").get("model") == device_type_model + + +@then('role is "{device_role_name}"') +def assert_device_role(context, device_role_name): + """Assert that the device role is correct.""" + assert context.existing_device is not None + assert context.existing_device.get("device_role").get("name") == device_role_name + + +@then('tags "{tags}" are present') +def assert_tags(context, tags): + """Assert that the device role is correct.""" + assert context.existing_device is not None + device_tags = [tag.get("name") for tag in context.existing_device.get("tags")] + assert set(device_tags) == set(tags.split(",")) + + +@given('device "{device_name}" with site "{site_name}" exists') +def assert_device_exists_with_site(context, device_name, site_name): + """Assert that the device exists.""" + device = get_object_state( + { + "object_type": "dcim.device", + "q": device_name, + "site__name": site_name, + }, + ) + + assert device.get("name") == device_name + assert device.get("site").get("name") == site_name + context.existing_device = device + + +@given('a new device "{device_name}" with site "{site_name}"') +def create_new_device_with_site(context, device_name, site_name): + """Set the body of the request to create a new device with site.""" + context.device_name = device_name + context.site_name = site_name + context.device_type_model = "undefined" + context.device_role_name = "undefined" + + +@when("the device with site is ingested") +def ingest_device_with_site(context): + """Ingest the device using the Diode SDK""" + entities = [ + Entity( + device=Device( + name=context.device_name, + site=context.site_name, + ), + ), + ] + + context.response = ingester(entities) + assert context.response.errors == [] + + return context.response + + +@given( + 'device "{device_name}" with site "{site_name}", device type "{device_type_model}" and role "{device_role_name}"' +) +def update_device(context, device_name, site_name, device_type_model, device_role_name): + """Set the body of the request to update a device.""" + context.device_name = device_name + context.site_name = site_name + context.device_type_model = device_type_model + context.device_role_name = device_role_name + + +@when("the device with site, device type and role is ingested") +def ingest_device_with_site_device_type_and_role(context): + """Ingest the device using the Diode SDK""" + entities = [ + Entity( + device=Device( + name=context.device_name, + site=context.site_name, + device_type=context.device_type_model, + role=context.device_role_name, + ), + ), + ] + + context.response = ingester(entities) + assert context.response.errors == [] + + return context.response + + +@when("the device with site, device type, role and tags is ingested") +def ingest_device_with_site_device_type_role_and_tags(context): + """Ingest the device using the Diode SDK""" + entities = [ + Entity( + device=Device( + name=context.device_name, + site=context.site_name, + device_type=context.device_type_model, + role=context.device_role_name, + tags=context.device_tags, + ), + ), + ] + + context.response = ingester(entities) + assert context.response.errors == [] + + return context.response diff --git a/tests/features/steps/ingestion_device_type_object.py b/tests/features/steps/ingestion_device_type_object.py new file mode 100644 index 00000000..01b7e7bd --- /dev/null +++ b/tests/features/steps/ingestion_device_type_object.py @@ -0,0 +1,121 @@ +import time + +from behave import given, when, then +from netboxlabs.diode.sdk.ingester import DeviceType, Entity, Manufacturer +from steps.utils import ( + get_object_by_name, + send_delete_request, + get_object_by_model, + ingester, +) + +endpoint = "dcim/device-types/" + + +@given('a new device type "{device_type_model}"') +def step_create_new_manufacturer(context, device_type_model): + """Set the body of the request to create a new device type.""" + context.device_type_model = device_type_model + + +@when("the device type is ingested") +def ingest_device_type(context): + """Ingest the device type object using the Diode SDK""" + + entities = [ + Entity(device_type=DeviceType(model=context.device_type_model)), + ] + + context.response = ingester(entities) + return context.response + + +@then( + 'the device type and "{manufacturer_name}" manufacturer are created in the database' +) +def check_device_type_and_manufacturers(context, manufacturer_name): + """Check if the response is not None and the object is created in the database.""" + time.sleep(3) + assert context.response is not None + device_type = get_object_by_model(context.device_type_model, endpoint) + manufacturer = get_object_by_name(manufacturer_name, "dcim/manufacturers/") + assert device_type.get("model") == context.device_type_model + assert manufacturer.get("name") == manufacturer_name + + +@then("the device type remains the same") +def check_device_type_object(context): + """Check if the response is not None and the object is created in the database.""" + time.sleep(3) + assert context.response is not None + device_type = get_object_by_model(context.device_type_model, endpoint) + assert device_type.get("model") == context.device_type_model + + +@given('device type "{device_type_model}" already exists in the database') +def retrieve_existing_manufacturer(context, device_type_model): + """Retrieve the device type object from the database""" + time.sleep(3) + context.device_type_model = device_type_model + device_type = get_object_by_model(context.device_type_model, endpoint) + context.device_type_model = device_type.get("model") + + +@given( + 'device type "{device_type_model}" with manufacturer "{manufacturer_name}", description "{description}" ' + 'and part number "{part_number}"' +) +def create_device_type_to_update( + context, device_type_model, manufacturer_name, description, part_number +): + """Create a device type object with a description to update""" + context.device_type_model = device_type_model + context.manufacturer_name = manufacturer_name + context.description = description + context.part_number = part_number + + +@then( + 'check if the manufacturer "{manufacturer_name}" exists in the database and remove it' +) +def remove_manufacturer(context, manufacturer_name): + time.sleep(3) + manufacturer = get_object_by_name(manufacturer_name, "dcim/manufacturers/") + if manufacturer is not None: + assert manufacturer.get("name") == manufacturer_name + send_delete_request("dcim/manufacturers/", manufacturer.get("id")) + + +@when("the device type object is ingested with the updates") +def ingest_to_update_device_type(context): + """Update the object using the Diode SDK""" + + entities = [ + Entity( + device_type=DeviceType( + model=context.device_type_model, + manufacturer=Manufacturer(name=context.manufacturer_name), + description=context.description, + part_number=context.part_number, + ), + ), + ] + + context.response = ingester(entities) + return context.response + + +@then('the manufacturer "{manufacturer_name}" is created and the device updated') +def check_updated_device_type_object(context, manufacturer_name): + """Check if the response is not None and the object is updated in the database and manufacturer created.""" + time.sleep(3) + assert context.response is not None + + manufacturer = get_object_by_name(manufacturer_name, "dcim/manufacturers/") + assert manufacturer.get("name") == manufacturer_name + + device_type = get_object_by_model(context.device_type_model, endpoint) + assert device_type.get("model") == context.device_type_model + assert device_type.get("manufacturer").get("name") == manufacturer.get("name") + assert device_type.get("description") == context.description + assert device_type.get("part_number") == context.part_number diff --git a/tests/features/steps/ingestion_interface_object.py b/tests/features/steps/ingestion_interface_object.py new file mode 100644 index 00000000..63e8f9d6 --- /dev/null +++ b/tests/features/steps/ingestion_interface_object.py @@ -0,0 +1,136 @@ +import time + +from behave import given, when, then +from netboxlabs.diode.sdk.ingester import Entity, Interface +from steps.utils import ( + get_object_by_name, + ingester, +) + +endpoint = "dcim/interfaces/" + + +@given('a new interface "{interface_name}"') +def create_interface(context, interface_name): + """Set the body of the request to create an interface.""" + context.interface_name = interface_name + + +@when("the interface is ingested") +def ingest_interface(context): + """Ingest an interface using the Diode SDK""" + + entities = [ + Entity( + interface=Interface( + name=context.interface_name, + ), + ), + ] + + response = ingester(entities) + assert response.errors == [] + + context.response = response + return context.response + + +@then("the interface is found") +def assert_interface_exists(context): + """Assert that the interface exists.""" + assert context.response is not None + + attempt = 0 + max_attempts = 3 + + obj = None + + while obj is None and attempt < max_attempts: + obj = get_object_by_name(context.interface_name, endpoint) + if obj: + break + + time.sleep(1) + attempt += 1 + + assert obj.get("name") == context.interface_name + context.interface = obj + + +@then('the interface is associated with the device "{device_name}"') +def assert_interface_associated_with_device(context, device_name): + """Assert that the interface was associated with the device.""" + assert context.interface is not None + + interface = context.interface + + assert interface.get("name") == context.interface_name + assert interface.get("device").get("name") == device_name + + +@then("the interface is enabled") +def assert_interface_enabled(context): + """Assert that the interface was enabled.""" + assert context.interface is not None + + interface = context.interface + + assert interface.get("name") == context.interface_name + assert interface.get("enabled") is True + + +@then('the interface type is "{interface_type}"') +def assert_interface_type(context, interface_type): + """Assert that the interface type is correct.""" + assert context.interface is not None + + interface = context.interface + + assert interface.get("name") == context.interface_name + assert interface.get("type").get("value") == interface_type + + +@given('an interface "{interface_name}" with MTU "{mtu}"') +def update_interface_with_mtu(context, interface_name, mtu): + """Set the body of the request to update an interface with an MTU.""" + context.interface_name = interface_name + context.mtu = int(mtu) + + +@when("the interface with MTU is ingested") +def ingest_interface_with_mtu(context): + """Ingest an interface using the Diode SDK""" + + entities = [ + Entity( + interface=Interface( + name=context.interface_name, + mtu=context.mtu, + ), + ), + ] + + response = ingester(entities) + assert response.errors == [] + + context.response = response + return context.response + + +@then("the interface MTU is updated") +def assert_interface_mtu(context): + """Assert that the interface MTU is correct.""" + assert context.interface is not None + + interface = context.interface + + attempt = 0 + max_attempts = 3 + + while interface.get("mtu") != context.mtu and attempt < max_attempts: + interface = get_object_by_name(context.interface_name, endpoint) + time.sleep(1) + attempt += 1 + + assert interface.get("name") == context.interface_name + assert interface.get("mtu") == context.mtu diff --git a/tests/features/steps/ingestion_ip_address_object.py b/tests/features/steps/ingestion_ip_address_object.py new file mode 100644 index 00000000..ae6af335 --- /dev/null +++ b/tests/features/steps/ingestion_ip_address_object.py @@ -0,0 +1,134 @@ +from behave import given, when, then +from netboxlabs.diode.sdk.ingester import Entity, Interface, IPAddress +from steps.utils import ( + get_object_state, + ingester, +) + +endpoint = "ipam/ip-addresses/" + + +@given('an IP address "{ip_address}"') +def set_ip_address(context, ip_address): + """Set the body of the request to ingest the device.""" + context.ip_address = ip_address + context.site_name = "undefined" + context.device_name = "undefined" + + +@given('interface "{interface_name}"') +def set_interface_name(context, interface_name): + """Set the body of the request to ingest the device.""" + context.interface_name = interface_name + + +@given('description "{description}"') +def set_description(context, description): + """Set the body of the request to ingest the device.""" + context.description = description + + +@when("the IP address is ingested") +def ingest_ip_address(context): + """Ingest an IP address using the Diode SDK""" + + entities = [ + Entity( + ip_address=IPAddress( + address=context.ip_address, + interface=Interface( + name=context.interface_name, + ), + ), + ), + ] + + response = ingester(entities) + assert response.errors == [] + + context.response = response + return context.response + + +@then("the IP address is found") +def assert_ip_address_exists(context): + """Assert that the IP address exists.""" + assert context.response is not None + + params = { + "object_type": "ipam.ipaddress", + "q": context.ip_address, + "interface__name": context.interface_name, + "interface__device__name": context.device_name, + "interface__device__site__name": context.site_name, + } + + if hasattr(context, "description"): + params["description"] = context.description + + ip_address = get_object_state(params) + + assert ip_address.get("address") == context.ip_address + assigned_object = ip_address.get("assigned_object") + assert assigned_object.get("interface").get("name") == context.interface_name + assert ( + assigned_object.get("interface").get("device").get("name") + == context.device_name + ) + assert ( + assigned_object.get("interface").get("device").get("site").get("name") + == context.site_name + ) + context.existing_ip_address = ip_address + + +@then("the IP address is associated with the interface") +def assert_ip_address_associated_with_interface( + context, +): + """Assert that the IP address is associated with the interface.""" + assert context.existing_ip_address is not None + assert context.existing_ip_address.get("address") == context.ip_address + assert ( + context.existing_ip_address.get("assigned_object").get("interface").get("name") + == context.interface_name + ) + + +@then('the IP address status is "{status}"') +def assert_ip_address_status(context, status): + """Assert that the IP address status is correct.""" + assert context.existing_ip_address is not None + assert context.existing_ip_address.get("address") == context.ip_address + assert context.existing_ip_address.get("status").get("value") == status + + +@when("the IP address with description is ingested") +def ingest_ip_address_with_description(context): + """Ingest an IP address using the Diode SDK""" + + entities = [ + Entity( + ip_address=IPAddress( + address=context.ip_address, + interface=Interface( + name=context.interface_name, + ), + description=context.description, + ), + ), + ] + + response = ingester(entities) + assert response.errors == [] + + context.response = response + return context.response + + +@then("the IP address description is updated") +def assert_ip_address_description(context): + """Assert that the IP address description is correct.""" + assert context.existing_ip_address is not None + assert context.existing_ip_address.get("address") == context.ip_address + assert context.existing_ip_address.get("description") == context.description diff --git a/tests/features/steps/ingestion_manufacturer_object.py b/tests/features/steps/ingestion_manufacturer_object.py new file mode 100644 index 00000000..4fff5265 --- /dev/null +++ b/tests/features/steps/ingestion_manufacturer_object.py @@ -0,0 +1,78 @@ +import time + +from behave import given, when, then +from netboxlabs.diode.sdk.ingester import Entity, Manufacturer +from steps.utils import get_object_by_name, ingester + +endpoint = "dcim/manufacturers/" + + +@given('a new manufacturer "{manufacturer_name}"') +def step_create_new_manufacturer(context, manufacturer_name): + """Set the body of the request to create a new manufacturer.""" + context.manufacturer_name = manufacturer_name + + +@when("the manufacturer is ingested") +def ingest_manufacturer(context): + """Ingest the manufacturer using the Diode SDK""" + + entities = [ + Entity(manufacturer=Manufacturer(name=context.manufacturer_name)), + ] + + context.response = ingester(entities) + return context.response + + +@then("the manufacturer is created in the database") +@then("the manufacturer remains the same") +def check_manufacturer_(context): + """Check if the response is not None and the is created in the database.""" + time.sleep(3) + assert context.response is not None + manufacturer = get_object_by_name(context.manufacturer_name, endpoint) + assert manufacturer.get("name") == context.manufacturer_name + assert manufacturer.get("slug") == "cisco" + + +@given('manufacturer "{manufacturer_name}" already exists in the database') +def retrieve_existing_manufacturer(context, manufacturer_name): + """Retrieve the manufacturer from the database""" + context.manufacturer_name = manufacturer_name + manufacturer = get_object_by_name(context.manufacturer_name, endpoint) + context.manufacturer_name = manufacturer.get("name") + + +@given('manufacturer "{manufacturer_name}" with description "{description}"') +def create_manufacturer_to_update(context, manufacturer_name, description): + """Create a manufacturer with a description to update""" + context.manufacturer_name = manufacturer_name + context.description = description + + +@when("the manufacturer is ingested with the updates") +def ingest_to_update_manufacturer(context): + """Update the manufacturer using the Diode SDK""" + + entities = [ + Entity( + manufacturer=Manufacturer( + name=context.manufacturer_name, + description=context.description, + ) + ), + ] + + context.response = ingester(entities) + return context.response + + +@then("the manufacturer is updated in the database") +def check_manufacturer_updated(context): + """Check if the response is not None and the is updated in the database.""" + time.sleep(3) + assert context.response is not None + manufacturer = get_object_by_name(context.manufacturer_name, endpoint) + assert manufacturer.get("name") == context.manufacturer_name + assert manufacturer.get("description") == context.description diff --git a/tests/features/steps/ingestion_prefix_object.py b/tests/features/steps/ingestion_prefix_object.py new file mode 100644 index 00000000..bbe3b7c6 --- /dev/null +++ b/tests/features/steps/ingestion_prefix_object.py @@ -0,0 +1,123 @@ +import time + +from behave import given, when, then +from netboxlabs.diode.sdk.ingester import Entity, Prefix +from steps.utils import ( + get_object_by_name, + ingester, +) + +endpoint = "ipam/prefixes/" + + +@given('a new prefix "{prefix_prefix}"') +def create_prefix(context, prefix_prefix): + """Set the body of the request to create a prefix.""" + context.prefix_prefix = prefix_prefix + + +@when("the prefix is ingested") +def ingest_prefix(context): + """Ingest a prefix using the Diode SDK""" + + entities = [ + Entity( + prefix=Prefix( + prefix=context.prefix_prefix, + ), + ), + ] + + response = ingester(entities) + assert response.errors == [] + + context.response = response + return context.response + + +@then("the prefix is found") +def assert_prefix_exists(context): + """Assert that the prefix exists.""" + assert context.response is not None + + attempt = 0 + max_attempts = 3 + + obj = None + + while obj is None and attempt < max_attempts: + obj = get_object_by_name(context.prefix_prefix, endpoint) + if obj: + break + + time.sleep(1) + attempt += 1 + + assert obj.get("prefix") == context.prefix_prefix + context.prefix = obj + + +@then('the prefix is associated with the site "{site_name}"') +def assert_prefix_associated_with_site(context, site_name): + """Assert that the prefix was associated with the site.""" + assert context.prefix is not None + + prefix = context.prefix + + assert prefix.get("prefix") == context.prefix_prefix + assert prefix.get("site").get("name") == site_name + + +@then("the prefix is active") +def assert_prefix_active(context): + """Assert that the prefix is active.""" + assert context.prefix is not None + + assert context.prefix.get("prefix") == context.prefix_prefix + assert context.prefix.get("status").get("value") == "active" + + +@given('a prefix "{prefix_prefix}" with description "{description}"') +def update_prefix_with_description(context, prefix_prefix, description): + """Set the body of the request to update a prefix with description.""" + context.prefix_prefix = prefix_prefix + context.description = description + + +@when("the prefix with description is ingested") +def ingest_prefix_with_description(context): + """Ingest a prefix using the Diode SDK""" + + entities = [ + Entity( + prefix=Prefix( + prefix=context.prefix_prefix, + description=context.description, + ), + ), + ] + + response = ingester(entities) + assert response.errors == [] + + context.response = response + return context.response + + +@then("the prefix description is updated") +def assert_prefix_description(context): + """Assert that the prefix description is updated.""" + assert context.prefix is not None + + prefix = context.prefix + + attempt = 0 + max_attempts = 3 + + while prefix.get("description") != context.description and attempt < max_attempts: + prefix = get_object_by_name(context.prefix_prefix, endpoint) + time.sleep(1) + attempt += 1 + + assert prefix.get("prefix") == context.prefix_prefix + assert prefix.get("description") == context.description diff --git a/tests/features/steps/ingestion_role_object.py b/tests/features/steps/ingestion_role_object.py new file mode 100644 index 00000000..1f128075 --- /dev/null +++ b/tests/features/steps/ingestion_role_object.py @@ -0,0 +1,83 @@ +import time + +from behave import given, when, then +from netboxlabs.diode.sdk.ingester import Entity, Role +from steps.utils import get_object_by_name, ingester + +endpoint = "dcim/device-roles/" + + +@given('a new device role "{device_role_name}"') +def step_create_new_role(context, device_role_name): + """Set the body of the request to create a new device role.""" + context.device_role_name = device_role_name + + +@when("the device role is ingested") +def ingest_role(context): + """Ingest the device role using the Diode SDK""" + entities = [ + Entity(device_role=Role(name=context.device_role_name)), + ] + + context.response = ingester(entities) + return context.response + + +@then("the device role is created in the database") +@then("the device role remains the same") +def check_device_role(context): + """Check if the response is not None and the device role is created in the database.""" + # Wait for the device role to be added to the cache + time.sleep(3) + assert context.response is not None + device_role = get_object_by_name(context.device_role_name, endpoint) + assert device_role.get("name") == context.device_role_name + assert device_role.get("color") == "000000" + + +@given('device role "{device_role_name}" exists in the database') +def retrieve_existing_device_role(context, device_role_name): + """Retrieve the device role from the database""" + context.device_role_name = device_role_name + context.device_role = get_object_by_name(context.device_role_name, endpoint) + context.device_role_name = context.device_role.get("name") + + +@given( + 'device role "{device_role_name}" with color "{color}" and description "{description}"' +) +def create_role_to_update(context, device_role_name, color, description): + """Create a role with a status and description to update""" + context.device_role_name = device_role_name + context.color = color + context.description = description + + +@when("the device role is ingested with the updates") +def ingest_to_update_device_role(context): + """Update the role using the Diode SDK""" + + entities = [ + Entity( + device_role=Role( + name=context.device_role_name, + color=context.color, + description=context.description, + ) + ), + ] + + context.response = ingester(entities) + return context.response + + +@then("the device role is updated in the database") +def check_role_updated(context): + """Check if the role is updated in the database""" + time.sleep(3) + assert context.response is not None + role = get_object_by_name(context.device_role_name, endpoint) + assert role.get("name") == context.device_role_name + assert role.get("color") == context.color + assert role.get("description") == context.description diff --git a/tests/features/steps/ingestion_site_object.py b/tests/features/steps/ingestion_site_object.py new file mode 100644 index 00000000..1a548331 --- /dev/null +++ b/tests/features/steps/ingestion_site_object.py @@ -0,0 +1,116 @@ +from behave import given, when, then +from netboxlabs.diode.sdk.ingester import Entity, Site +from steps.utils import get_object_state, ingester, send_delete_request + +endpoint = "dcim/sites/" + + +@given('a site "{site_name}"') +def set_site(context, site_name): + """Set the site name.""" + context.site_name = site_name + + +@given('the site status "{status}"') +def set_status(context, status): + """Set the status of the site.""" + context.status = status + + +@given('the site description "{description}"') +def set_description(context, description): + """Set the description of the site.""" + context.description = description + + +@given('site "{site_name}" does not exist') +def ensure_site_does_not_exists(context, site_name): + """Ensure that the site does not exist.""" + site = get_object_state( + { + "object_type": "dcim.site", + "q": site_name, + }, + ) + if site: + send_delete_request(endpoint, site.get("id")) + + +@when("the site is ingested") +def ingest_site(context): + """Ingest the site using the Diode SDK""" + entities = [ + Entity(site=Site(name=context.site_name)), + ] + context.response = ingester(entities) + assert context.response.errors == [] + + return context.response + + +@then("the site is found") +def assert_site_exists(context): + """Assert that the site was created.""" + assert context.response is not None + + params = { + "object_type": "dcim.site", + "q": context.site_name, + } + if hasattr(context, "status"): + params["status"] = context.status + if hasattr(context, "description"): + params["description"] = context.description + + site = get_object_state(params) + assert site.get("name") == context.site_name + + context.existing_site = site + + +@when("the site with status and description is ingested") +def ingest_site_with_status_and_description(context): + """Ingest the site using the Diode SDK""" + entities = [ + Entity( + site=Site( + name=context.site_name, + status=context.status, + description=context.description, + ), + ), + ] + context.response = ingester(entities) + assert context.response.errors == [] + + return context.response + + +@then('the site status is "{status}"') +def assert_site_status(context, status): + """Assert that the site status is correct.""" + assert context.existing_site is not None + assert context.existing_site.get("status") == status + + +@then("the site description is empty") +def assert_site_description_empty(context): + """Assert that the site description is empty.""" + assert context.existing_site is not None + assert context.existing_site.get("description") == "" + + +@then('the site description is "{description}"') +def assert_site_description(context, description): + """Assert that the site description is correct.""" + assert context.existing_site is not None + assert context.existing_site.get("description") == description + + +@then("the site remains the same") +def assert_site_remains(context): + """Assert that the site remains the same.""" + assert context.existing_site is not None + assert context.existing_site.get("name") == context.site_name + assert context.existing_site.get("status") == context.status + assert context.existing_site.get("description") == context.description diff --git a/tests/features/steps/object_state.py b/tests/features/steps/object_state.py new file mode 100644 index 00000000..b51cae2a --- /dev/null +++ b/tests/features/steps/object_state.py @@ -0,0 +1,37 @@ +from behave import given, then +from steps.utils import send_get_request, get_site_id + + +@given('the site id "{site_name}" and object_type "{object_type}"') +def get_object_state_using_id(context, site_name, object_type): + site_id = get_site_id(site_name) + endpoint = "plugins/diode/object-state/" + params = {"id": site_id, "object_type": object_type} + response = send_get_request(endpoint, params) + context.response = response + + +@then('the object state "{site_name}" is returned successfully') +def check_object_state_response(context, site_name): + assert context.response.status_code == 200 + assert context.response.json().get("object").get("name") == site_name + + +@given('the site name "{site_name}" and object_type "{object_type}"') +@given('the site name "{site_name}" and not object_type') +def get_object_state_using_name(context, site_name, object_type=None): + endpoint = "plugins/diode/object-state/" + params = {"q": site_name, "object_type": object_type} + response = send_get_request(endpoint, params) + context.response = response + + +@then("endpoint return 200 and empty response") +def check_object_state_empty_response(context): + assert context.response.status_code == 200 + assert context.response.json() == {} + + +@then("endpoint return 400") +def check_object_state_response_400(context): + assert context.response.status_code == 400 diff --git a/tests/features/steps/update_object.py b/tests/features/steps/update_object.py new file mode 100644 index 00000000..c266cf30 --- /dev/null +++ b/tests/features/steps/update_object.py @@ -0,0 +1,65 @@ +import uuid + +from behave import given +from steps.utils import get_site_id + + +@given("I provide a correct payload to update the slug of the site") +def step_set_correct_update_payload(context): + """Set the body of the request to create a new site. The site name is Site-Test. The site will be cleaned up after the test.""" + + object_id = get_site_id("Site-Test-2") + + context.body = { + "change_set_id": str(uuid.uuid4()), + "change_set": [ + { + "change_id": str(uuid.uuid4()), + "change_type": "update", + "object_version": None, + "object_type": "dcim.site", + "object_id": object_id, + "data": { + "name": "Site-Test-2", + "slug": "slug-updated", + "facility": "Alpha", + "description": "", + "physical_address": "123 Fake St Lincoln NE 68588", + "shipping_address": "123 Fake St Lincoln NE 68588", + "comments": "Lorem ipsum etcetera", + }, + }, + ], + } + context.sites_to_be_cleaned_up = [ + "Site-Test-2", + ] + + +@given("I provide payload with object_type missing for update") +def set_incorrect_update_payload(context): + """Set the body of the request to create a new site.""" + + object_id = get_site_id("Site-Test-2") + + context.body = { + "change_set_id": str(uuid.uuid4()), + "change_set": [ + { + "change_id": str(uuid.uuid4()), + "change_type": "update", + "object_version": None, + "object_type": "", + "object_id": object_id, + "data": { + "name": "Site-Test-2", + "slug": "slug-updated", + "facility": "Alpha", + "description": "", + "physical_address": "123 Fake St Lincoln NE 68588", + "shipping_address": "123 Fake St Lincoln NE 68588", + "comments": "Lorem ipsum etcetera", + }, + }, + ], + } diff --git a/tests/features/steps/utils.py b/tests/features/steps/utils.py new file mode 100644 index 00000000..a5421a23 --- /dev/null +++ b/tests/features/steps/utils.py @@ -0,0 +1,109 @@ +import time +from typing import Optional, Dict, Any + +import requests +from netboxlabs.diode.sdk import DiodeClient +from steps.config import TestConfig + +configs = TestConfig.configs() +api_root_path = str(configs["api_root_path"]) +token = str(configs["user_token"]) + +headers = { + "Content-Type": "application/json", + "Authorization": f"Token {token}", +} + + +def send_post_request(payload, endpoint="plugins/diode/apply-change-set/"): + """Send a request to the API with the given payload and headers. Return the response.""" + try: + response = requests.post( + f"{api_root_path}/{endpoint}", json=payload, headers=headers + ) + except Exception as e: + print("Error:", str(e)) + return ValueError(e), None + return response + + +def send_get_request(endpoint, params=None): + """Send a request to the API with the given endpoint and headers. Return the response.""" + try: + if params: + response = requests.get( + f"{api_root_path}/{endpoint}", headers=headers, params=params + ) + else: + response = requests.get(f"{api_root_path}/{endpoint}", headers=headers) + except Exception as e: + print("Error:", str(e)) + return ValueError(e), None + return response + + +def send_delete_request(endpoint, id): + """Send a request to the API with the given endpoint and headers. Return the response.""" + try: + response = requests.delete(f"{api_root_path}/{endpoint}/{id}/", headers=headers) + except Exception as e: + print("Error:", str(e)) + return ValueError(e), None + return response + + +def get_site_id(site_name): + """Get the site ID by name.""" + endpoint = "dcim/sites/" + site_id = ( + send_get_request(endpoint, {"name__ic": site_name}) + .json() + .get("results")[0] + .get("id") + ) + return site_id + + +def get_object_by_name(name, endpoint): + """Get the object by name.""" + response = send_get_request(endpoint, {"name__ic": name}).json().get("results") + if response: + return response[0] + return None + + +def get_object_by_model(model, endpoint): + """Get the object by model.""" + response = send_get_request(endpoint, {"model__ic": model}).json().get("results") + if response: + return response[0] + return None + + +def get_object_state(params: dict, max_retries: int = 3) -> Optional[Dict[str, Any]]: + """Get object using given endpoint and params.""" + endpoint = "plugins/diode/object-state/" + + attempt = 0 + while attempt < max_retries: + response = send_get_request(endpoint, params).json().get("object") + if response: + return response + time.sleep(1) + attempt += 1 + + return None + + +def ingester(entities): + """Ingest the site object using the Diode SDK""" + api_key = str(configs["api_key"]) + with DiodeClient( + target="localhost:8081", + app_name="my-test-app", + app_version="0.0.1", + api_key=api_key, + ) as client: + entities = entities + response = client.ingest(entities=entities) + return response diff --git a/tests/features/update_object.feature b/tests/features/update_object.feature new file mode 100644 index 00000000..a1a47f32 --- /dev/null +++ b/tests/features/update_object.feature @@ -0,0 +1,16 @@ +Feature: Update objects using Apply Change Set endpoint tests + Validate the behaviors expected for the endpoint apply-change-set to update objects + + @smoke + @update.object + Scenario: Correct payload to update a site + Given I provide a correct payload to update the slug of the site + When I send a POST request to the endpoint + Then I must get a response with status code 200 and a Json object with success message + + @smoke + @update.object + Scenario: Incorrect payload to update a site + Given I provide payload with object_type missing for update + When I send a POST request to the endpoint + Then I must get a response with status code 400 and a Json object with error message \ No newline at end of file diff --git a/tests/requirements.txt b/tests/requirements.txt new file mode 100644 index 00000000..4e1aac2e --- /dev/null +++ b/tests/requirements.txt @@ -0,0 +1,4 @@ +behave==1.2.6 +behave-django==1.4.0 +PyHamcrest==2.1.0 +requests==2.32.0 \ No newline at end of file