diff --git a/.github/renovate.json b/.github/renovate.json index 8f2bf4424e..71e131e438 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -1,19 +1,33 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:base", "schedule:monthly", ":maintainLockFilesWeekly"], + "extends": [ + "config:base", + "schedule:weekends", + ":combinePatchMinorReleases", + ":dependencyDashboard", + ":maintainLockFilesWeekly", + ":prConcurrentLimit10", + ":rebaseStalePrs", + ":separateMajorReleases" + ], "separateMajorMinor": true, + "enabledManagers": ["cargo", "github-actions", "npm", "nuget"], "packageRules": [ { + "groupName": "npm minor", "matchManagers": ["npm"], - "matchPackagePatterns": ["*"], - "matchUpdateTypes": ["minor", "patch"], - "groupName": "node non-major" + "matchUpdateTypes": ["minor", "patch"] }, { "matchManagers": ["cargo"], - "matchPackagePatterns": ["*"], - "matchUpdateTypes": ["minor", "patch"], - "groupName": "rust non-major" + "matchUpdateTypes": ["patch"], + "enabled": false + }, + { + "matchManagers": ["cargo"], + "matchUpdateTypes": ["minor"], + "matchCurrentVersion": ">=1.0.0", + "enabled": false }, { "matchManagers": ["cargo"], @@ -22,15 +36,14 @@ "groupName": "pyo3 non-major" }, { + "groupName": "nuget minor", "matchManagers": ["nuget"], - "matchPackagePatterns": ["*"], - "matchUpdateTypes": ["minor", "patch"], - "groupName": "dotnet non-major" + "matchUpdateTypes": ["minor", "patch"] }, { + "groupName": "gh minor", "matchManagers": ["github-actions"], - "matchPackagePatterns": ["*"], - "groupName": "gh actions all" + "matchUpdateTypes": ["minor", "patch"] } ] } diff --git a/.github/workflows/build-cli.yml b/.github/workflows/build-cli.yml index 400714bebf..cb6868eafa 100644 --- a/.github/workflows/build-cli.yml +++ b/.github/workflows/build-cli.yml @@ -22,7 +22,7 @@ jobs: package_version: ${{ steps.retrieve-version.outputs.package_version }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Get Package Version id: retrieve-version @@ -57,7 +57,7 @@ jobs: # target: aarch64-unknown-linux-gnu steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Install rust uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af # v1.0.7 @@ -73,7 +73,7 @@ jobs: sudo apt-get install gcc-aarch64-linux-gnu - name: Cache cargo registry - uses: Swatinem/rust-cache@988c164c3d0e93c4dbab36aaf5bbeb77425b2894 # v2.4.0 + uses: Swatinem/rust-cache@dd05243424bd5c0e585e4b55eb2d7615cdd32f1f # v2.5.1 with: key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.os }} @@ -82,12 +82,6 @@ jobs: TARGET: ${{ matrix.settings.target }} run: cargo build ${{ matrix.features }} -p bws --release --target=${{ matrix.settings.target }} - - name: Test - uses: actions-rs/cargo@844f36862e911db73fe0815f00a4a2602c279505 # v1.0.3 - with: - command: test - args: -p bws -- --test-threads=1 - - name: Zip Windows shell: cmd if: runner.os == 'Windows' @@ -114,7 +108,7 @@ jobs: _PACKAGE_VERSION: ${{ needs.setup.outputs.package_version }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Download x86_64-apple-darwin artifact uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 diff --git a/.github/workflows/build-napi.yml b/.github/workflows/build-napi.yml index 36349a680d..daad93afe6 100644 --- a/.github/workflows/build-napi.yml +++ b/.github/workflows/build-napi.yml @@ -16,24 +16,13 @@ defaults: working-directory: crates/bitwarden-napi jobs: - cloc: - name: CLOC - runs-on: ubuntu-22.04 - steps: - - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - - - name: Set up cloc - run: | - sudo apt update - sudo apt -y install cloc - - - name: Print lines of code - run: cloc --vcs git + generate_schemas: + uses: ./.github/workflows/generate_schemas.yml build: name: Building @bitwarden/sdk-napi for - ${{ matrix.settings.os }} runs-on: ${{ matrix.settings.os || 'ubuntu-latest' }} + needs: generate_schemas strategy: fail-fast: false matrix: @@ -62,10 +51,10 @@ jobs: strip *.node steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Setup Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@e33196f7422957bea03ed53f6fbb155025ffc7b8 # v3.7.0 with: node-version: 18 cache: "npm" @@ -80,10 +69,16 @@ jobs: target: ${{ matrix.settings.target }} - name: Cache cargo registry - uses: Swatinem/rust-cache@988c164c3d0e93c4dbab36aaf5bbeb77425b2894 # v2.4.0 + uses: Swatinem/rust-cache@dd05243424bd5c0e585e4b55eb2d7615cdd32f1f # v2.5.1 with: key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.os }} + - name: Retrieve schemas + uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 + with: + name: schemas.ts + path: ${{ github.workspace }}/crates/bitwarden-napi/src-ts/bitwarden_client/ + - name: Install dependencies run: npm ci diff --git a/.github/workflows/build-rust-crates.yml b/.github/workflows/build-rust-crates.yml index 39baaae0e0..5eb0510e92 100644 --- a/.github/workflows/build-rust-crates.yml +++ b/.github/workflows/build-rust-crates.yml @@ -14,21 +14,6 @@ env: CARGO_TERM_COLOR: always jobs: - cloc: - name: CLOC - runs-on: ubuntu-20.04 - steps: - - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 - - - name: Set up cloc - run: | - sudo apt update - sudo apt -y install cloc - - - name: Print lines of code - run: cloc --vcs git - build: name: Building ${{matrix.package}} for - ${{ matrix.os }} @@ -49,7 +34,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Install rust uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af # v1.0.7 @@ -60,13 +45,15 @@ jobs: override: true - name: Cache cargo registry - uses: Swatinem/rust-cache@988c164c3d0e93c4dbab36aaf5bbeb77425b2894 # v2.4.0 + uses: Swatinem/rust-cache@dd05243424bd5c0e585e4b55eb2d7615cdd32f1f # v2.5.1 - name: Build uses: actions-rs/cargo@844f36862e911db73fe0815f00a4a2602c279505 # v1.0.3 with: command: build args: ${{ matrix.features }} -p ${{ matrix.package }} --release + env: + RUSTFLAGS: "-D warnings" - name: Build Internal if: ${{ matrix.package == 'bitwarden' }} @@ -74,12 +61,8 @@ jobs: with: command: build args: ${{ matrix.features }} -p ${{ matrix.package }} --features internal --release - - - name: Test - uses: actions-rs/cargo@844f36862e911db73fe0815f00a4a2602c279505 # v1.0.3 - with: - command: test - args: -p ${{ matrix.package }} -- --test-threads=1 + env: + RUSTFLAGS: "-D warnings" release-dry-run: name: Release dry-run @@ -89,7 +72,7 @@ jobs: - build steps: - name: Checkout - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Install rust uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af # v1.0.7 @@ -100,7 +83,7 @@ jobs: override: true - name: Cache cargo registry - uses: Swatinem/rust-cache@988c164c3d0e93c4dbab36aaf5bbeb77425b2894 # v2.4.0 + uses: Swatinem/rust-cache@dd05243424bd5c0e585e4b55eb2d7615cdd32f1f # v2.5.1 - name: Install cargo-release run: cargo install cargo-release diff --git a/.github/workflows/cloc.yml b/.github/workflows/cloc.yml new file mode 100644 index 0000000000..83f7aa3511 --- /dev/null +++ b/.github/workflows/cloc.yml @@ -0,0 +1,23 @@ +name: CLOC + +on: + workflow_dispatch: + push: + branches: ["master"] + pull_request: + +jobs: + cloc: + name: CLOC + runs-on: ubuntu-20.04 + steps: + - name: Checkout repo + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + + - name: Set up cloc + run: | + sudo apt update + sudo apt -y install cloc + + - name: Print lines of code + run: cloc --vcs git diff --git a/.github/workflows/direct-minimal-versions.yml b/.github/workflows/direct-minimal-versions.yml new file mode 100644 index 0000000000..ce0f67b6a1 --- /dev/null +++ b/.github/workflows/direct-minimal-versions.yml @@ -0,0 +1,57 @@ +--- +name: Direct Minimum Version + +on: + pull_request: + push: + branches: + - "master" + - "rc" + - "hotfix-rc" + workflow_dispatch: + +defaults: + run: + shell: bash + +jobs: + direct-minimal-versions: + name: Check dependencies minimal versions for - ${{ matrix.settings.os }} - ${{ matrix.settings.target }} + runs-on: ${{ matrix.settings.os || 'ubuntu-latest' }} + strategy: + fail-fast: false + matrix: + settings: + #- os: macos-12 + # target: x86_64-apple-darwin + + #- os: macos-12 + # target: aarch64-apple-darwin + + - os: windows-2022 + target: x86_64-pc-windows-msvc + + - os: ubuntu-22.04 + target: x86_64-unknown-linux-gnu + + steps: + - name: Checkout + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + + - name: Install rust + uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af # v1.0.7 + with: + toolchain: nightly + profile: minimal + override: true + + - name: Cache cargo registry + uses: Swatinem/rust-cache@dd05243424bd5c0e585e4b55eb2d7615cdd32f1f # v2.5.1 + with: + key: dmv-${{ matrix.settings.target }}-cargo-${{ matrix.settings.os }} + + - name: cargo check direct-minimal-versions + uses: actions-rs/cargo@844f36862e911db73fe0815f00a4a2602c279505 # v1.0.3 + with: + command: check + args: -Z direct-minimal-versions --all-features diff --git a/.github/workflows/enforce-labels.yml b/.github/workflows/enforce-labels.yml new file mode 100644 index 0000000000..73092bb2e0 --- /dev/null +++ b/.github/workflows/enforce-labels.yml @@ -0,0 +1,17 @@ +--- +name: Enforce PR labels + +on: + workflow_call: + pull_request: + types: [labeled, unlabeled, opened, edited, synchronize] +jobs: + enforce-label: + name: EnforceLabel + runs-on: ubuntu-20.04 + steps: + - name: Enforce Label + uses: yogevbd/enforce-label-action@a3c219da6b8fa73f6ba62b68ff09c469b3a1c024 # 2.2.2 + with: + BANNED_LABELS: "hold,needs-qa" + BANNED_LABELS_DESCRIPTION: "PRs with the hold or needs-qa labels cannot be merged" diff --git a/.github/workflows/generate_schemas.yml b/.github/workflows/generate_schemas.yml new file mode 100644 index 0000000000..b50d6e4843 --- /dev/null +++ b/.github/workflows/generate_schemas.yml @@ -0,0 +1,67 @@ +name: Generate schemas + +on: + workflow_call: + +env: + CARGO_TERM_COLOR: always + +jobs: + schemas: + name: Generate schemas + runs-on: ubuntu-22.04 + + steps: + - name: Checkout + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + + - name: Install rust + uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af # v1.0.7 + with: + toolchain: stable + profile: minimal + override: true + + - name: Set up Node + uses: actions/setup-node@e33196f7422957bea03ed53f6fbb155025ffc7b8 # v3.7.0 + with: + cache: "npm" + cache-dependency-path: "package-lock.json" + node-version: "16" + + - name: NPM setup + run: npm ci + + - name: Cache cargo registry + uses: Swatinem/rust-cache@dd05243424bd5c0e585e4b55eb2d7615cdd32f1f # v2.5.1 + + - name: NPM Schemas + run: npm run schemas + + - name: Upload ts schemas artifact + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + with: + name: schemas.ts + path: ${{ github.workspace }}/languages/js_webassembly/bitwarden_client/schemas.ts + if-no-files-found: error + + - name: Upload c# schemas artifact + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + with: + name: schemas.cs + path: ${{ github.workspace }}/languages/csharp/schemas.cs + if-no-files-found: error + + - name: Upload python schemas artifact + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + with: + name: schemas.py + path: ${{ github.workspace }}/languages/python/BitwardenClient/schemas.py + if-no-files-found: error + + - name: Upload json schemas artifact + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 + with: + name: sdk-schemas-json + path: ${{ github.workspace }}/support/schemas/* + if-no-files-found: error diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 582dc1aea4..9382dd38f9 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Install rust uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af # v1.0.7 @@ -34,7 +34,7 @@ jobs: args: -- --check - name: Set up Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@e33196f7422957bea03ed53f6fbb155025ffc7b8 # v3.7.0 with: cache: "npm" cache-dependency-path: "package-lock.json" @@ -46,12 +46,7 @@ jobs: - name: Node Lint run: npm run lint - - name: Verify Schemas are up to date - run: | - npm run schemas - git diff --exit-code HEAD - # Verify no untracked files - if [ ! -z "$(git status --porcelain)" ]; then - >&2 echo "Failed: Found untracked files!" - exit 1 - fi + - name: Verify rust documentation links + run: cargo doc --no-deps --features internal + env: + RUSTDOCFLAGS: "-D warnings" diff --git a/.github/workflows/publish-rust-crates.yml b/.github/workflows/publish-rust-crates.yml index e8e1fa6792..058dd13802 100644 --- a/.github/workflows/publish-rust-crates.yml +++ b/.github/workflows/publish-rust-crates.yml @@ -43,7 +43,7 @@ jobs: packages_command: ${{ steps.packages-list.outputs.packages_command }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Branch check if: ${{ github.event.inputs.release_type != 'Dry Run' }} @@ -100,18 +100,18 @@ jobs: - setup steps: - name: Checkout - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@12452ffcde72eca60a91abef555090ad17ba2108 with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "cratesio-api-token" - name: Install rust @@ -122,7 +122,7 @@ jobs: override: true - name: Cache cargo registry - uses: Swatinem/rust-cache@988c164c3d0e93c4dbab36aaf5bbeb77425b2894 # v2.4.0 + uses: Swatinem/rust-cache@dd05243424bd5c0e585e4b55eb2d7615cdd32f1f # v2.5.1 - name: Install cargo-release run: cargo install cargo-release diff --git a/.github/workflows/release-cli.yml b/.github/workflows/release-cli.yml index ce46223310..a108ad4018 100644 --- a/.github/workflows/release-cli.yml +++ b/.github/workflows/release-cli.yml @@ -27,7 +27,7 @@ jobs: release-version: ${{ steps.version.outputs.version }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Branch check if: ${{ github.event.inputs.release_type != 'Dry Run' }} @@ -58,7 +58,7 @@ jobs: - name: Download all Release artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@12452ffcde72eca60a91abef555090ad17ba2108 with: workflow: build-cli.yml path: packages @@ -67,7 +67,7 @@ jobs: - name: Dry Run - Download all artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@12452ffcde72eca60a91abef555090ad17ba2108 with: workflow: build-cli.yml path: packages @@ -75,7 +75,7 @@ jobs: branch: master - name: Get checksum files - uses: bitwarden/gh-actions/get-checksum@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-checksum@12452ffcde72eca60a91abef555090ad17ba2108 with: packages_dir: "packages" file_path: "packages/bws-sha256-checksums-${{ steps.version.outputs.version }}.txt" @@ -123,18 +123,18 @@ jobs: - setup steps: - name: Checkout - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Login to Azure uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@12452ffcde72eca60a91abef555090ad17ba2108 with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "cratesio-api-token" - name: Install rust @@ -145,7 +145,7 @@ jobs: override: true - name: Cache cargo registry - uses: Swatinem/rust-cache@988c164c3d0e93c4dbab36aaf5bbeb77425b2894 # v2.4.0 + uses: Swatinem/rust-cache@dd05243424bd5c0e585e4b55eb2d7615cdd32f1f # v2.5.1 - name: Install cargo-release run: cargo install cargo-release diff --git a/.github/workflows/release-napi.yml b/.github/workflows/release-napi.yml index c10c956989..e684ebcf07 100644 --- a/.github/workflows/release-napi.yml +++ b/.github/workflows/release-napi.yml @@ -33,7 +33,7 @@ jobs: release-version: ${{ steps.version.outputs.version }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Branch check if: ${{ github.event.inputs.release_type != 'Dry Run' }} @@ -47,7 +47,7 @@ jobs: - name: Check Release Version id: version - uses: bitwarden/gh-actions/release-version-check@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/release-version-check@12452ffcde72eca60a91abef555090ad17ba2108 with: release-type: ${{ github.event.inputs.release_type }} project-type: ts @@ -67,7 +67,7 @@ jobs: - name: Download all Release artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@12452ffcde72eca60a91abef555090ad17ba2108 with: workflow: build-napi.yml path: artifacts @@ -76,7 +76,7 @@ jobs: - name: Dry Run - Download all artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@12452ffcde72eca60a91abef555090ad17ba2108 with: workflow: build-napi.yml path: artifacts @@ -122,15 +122,35 @@ jobs: _PKG_VERSION: ${{ needs.setup.outputs.release-version }} steps: - name: Checkout repo - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Setup Node - uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3.6.0 + uses: actions/setup-node@e33196f7422957bea03ed53f6fbb155025ffc7b8 # v3.7.0 with: node-version: 18 cache: "npm" cache-dependency-path: crates/bitwarden-napi/package-lock.json + - name: Download schemas + if: ${{ github.event.inputs.release_type != 'Dry Run' }} + uses: bitwarden/gh-actions/download-artifacts@12452ffcde72eca60a91abef555090ad17ba2108 + with: + workflow: build-napi.yml + artifacts: schemas.ts + path: ${{ github.workspace }}/crates/bitwarden-napi/src-ts/bitwarden_client/ + workflow_conclusion: success + branch: ${{ github.ref_name }} + + - name: Dry Run - Download schemas + if: ${{ github.event.inputs.release_type == 'Dry Run' }} + uses: bitwarden/gh-actions/download-artifacts@12452ffcde72eca60a91abef555090ad17ba2108 + with: + workflow: build-napi.yml + artifacts: schemas.ts + path: ${{ github.workspace }}/crates/bitwarden-napi/src-ts/bitwarden_client/ + workflow_conclusion: success + branch: master + - name: Install dependencies run: npm ci @@ -140,18 +160,18 @@ jobs: - name: Login to Azure uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@12452ffcde72eca60a91abef555090ad17ba2108 with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "npm-api-key" - name: Download artifacts if: ${{ github.event.inputs.release_type != 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@12452ffcde72eca60a91abef555090ad17ba2108 with: workflow: build-napi.yml path: ${{ github.workspace }}/crates/bitwarden-napi/artifacts @@ -160,7 +180,7 @@ jobs: - name: Dry Run - Download artifacts if: ${{ github.event.inputs.release_type == 'Dry Run' }} - uses: bitwarden/gh-actions/download-artifacts@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/download-artifacts@12452ffcde72eca60a91abef555090ad17ba2108 with: workflow: build-napi.yml path: ${{ github.workspace }}/crates/bitwarden-napi/artifacts diff --git a/.github/workflows/rust-test.yml b/.github/workflows/rust-test.yml index a9e40acf36..a13d1ae706 100644 --- a/.github/workflows/rust-test.yml +++ b/.github/workflows/rust-test.yml @@ -20,7 +20,7 @@ jobs: - run: exit 0 test: - name: ${{ matrix.os }} / ${{matrix.package}} / ${{matrix.target || 'default' }} + name: ${{ matrix.os }} / ${{matrix.target || 'default' }} runs-on: ${{ matrix.os || 'ubuntu-latest' }} @@ -31,16 +31,9 @@ jobs: - macOS-latest - windows-latest - package: - - bitwarden - - bitwarden-json - - bitwarden-c - - bitwarden-wasm - - bws - steps: - name: Checkout - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Install rust uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af # v1.0.7 @@ -51,19 +44,13 @@ jobs: override: true - name: Cache cargo registry - uses: Swatinem/rust-cache@988c164c3d0e93c4dbab36aaf5bbeb77425b2894 # v2.4.0 - - - name: Build - uses: actions-rs/cargo@844f36862e911db73fe0815f00a4a2602c279505 # v1.0.3 - with: - command: build - args: ${{ matrix.features }} + uses: Swatinem/rust-cache@dd05243424bd5c0e585e4b55eb2d7615cdd32f1f # v2.5.1 - name: Test uses: actions-rs/cargo@844f36862e911db73fe0815f00a4a2602c279505 # v1.0.3 with: command: test - args: -p ${{ matrix.package }} -- --test-threads=1 + args: --all-features wasm: name: WASM @@ -72,7 +59,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Install rust uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af # v1.0.7 @@ -83,7 +70,7 @@ jobs: override: true - name: Cache cargo registry - uses: Swatinem/rust-cache@988c164c3d0e93c4dbab36aaf5bbeb77425b2894 # v2.4.0 + uses: Swatinem/rust-cache@dd05243424bd5c0e585e4b55eb2d7615cdd32f1f # v2.5.1 - name: Check uses: actions-rs/cargo@844f36862e911db73fe0815f00a4a2602c279505 # v1.0.3 diff --git a/.github/workflows/version-bump.yml b/.github/workflows/version-bump.yml index 9db7af0542..92a91ef8bd 100644 --- a/.github/workflows/version-bump.yml +++ b/.github/workflows/version-bump.yml @@ -29,7 +29,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout Branch - uses: actions/checkout@8e5e7e5ab8b370d6c329ec480221332ada57f0ab # v3.5.2 + uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 - name: Install rust uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af # v1.0.7 @@ -40,7 +40,7 @@ jobs: override: true - name: Cache cargo registry - uses: Swatinem/rust-cache@988c164c3d0e93c4dbab36aaf5bbeb77425b2894 # v2.4.0 + uses: Swatinem/rust-cache@dd05243424bd5c0e585e4b55eb2d7615cdd32f1f # v2.5.1 - name: Install cargo-release run: cargo install cargo-edit @@ -48,13 +48,13 @@ jobs: - name: Login to Azure - Prod Subscription uses: Azure/login@92a5484dfaf04ca78a94597f4f19fea633851fa2 # v1.4.7 with: - creds: ${{ secrets.AZURE_PROD_KV_CREDENTIALS }} + creds: ${{ secrets.AZURE_KV_CI_SERVICE_PRINCIPAL }} - name: Retrieve secrets id: retrieve-secrets - uses: bitwarden/gh-actions/get-keyvault-secrets@72594be690a4e7bfa87b1402b2aedc75acdbff12 + uses: bitwarden/gh-actions/get-keyvault-secrets@12452ffcde72eca60a91abef555090ad17ba2108 with: - keyvault: "bitwarden-prod-kv" + keyvault: "bitwarden-ci" secrets: "github-gpg-private-key, github-gpg-private-key-passphrase" - name: Import GPG key diff --git a/.gitignore b/.gitignore index a89686270b..04b15f7bfd 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,10 @@ crates/bitwarden-napi/sdk-napi.*.node # Complied TypeScript client crates/bitwarden-napi/dist languages/js/sdk-client/dist/ + +# Schemas +support/schemas +crates/bitwarden-napi/src-ts/bitwarden_client/schemas.ts +languages/csharp/schemas.cs +languages/js_webassembly/bitwarden_client/schemas.ts +languages/python/BitwardenClient/schemas.py diff --git a/.vscode/settings.json b/.vscode/settings.json index 3e96468c50..7d1a6b11bc 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,12 @@ { - "cSpell.words": ["bindgen", "Bitwarden", "Cdecl", "dylib", "Hkdf", "Maybeable", "wordlist"] + "cSpell.words": [ + "bindgen", + "Bitwarden", + "cloc", + "Cdecl", + "dylib", + "Hkdf", + "Maybeable", + "wordlist" + ] } diff --git a/Cargo.lock b/Cargo.lock index 21e843cc9a..62fdaa0076 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -131,6 +131,18 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" +[[package]] +name = "argon2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e554a8638bdc1e4eae9984845306cc95f8a9208ba8d49c3859fd958b46774d" +dependencies = [ + "base64ct", + "blake2", + "cpufeatures", + "password-hash", +] + [[package]] name = "assert-json-diff" version = "2.0.2" @@ -169,17 +181,6 @@ dependencies = [ "syn 2.0.18", ] -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.1.0" @@ -232,34 +233,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd4b13b0233143ae151a66e0135d715b65f631d1028c40502cc88182bcb9f4fa" dependencies = [ "ansi_colours", - "atty", "bincode", - "bugreport", "bytesize", - "clap", "clircle", "console", "content_inspector", "dirs", "encoding", "flate2", - "git2", "globset", - "grep-cli", "nu-ansi-term", "once_cell", "path_abs", "plist", - "regex", "semver 1.0.17", "serde", "serde_yaml 0.8.26", - "shell-words", "syntect", "thiserror", "unicode-width", - "walkdir", - "wild", ] [[package]] @@ -288,6 +280,7 @@ name = "bitwarden" version = "0.2.1" dependencies = [ "aes", + "argon2", "assert_matches", "base64 0.21.2", "bitwarden-api-api", @@ -358,6 +351,7 @@ name = "bitwarden-json" version = "0.2.1" dependencies = [ "bitwarden", + "log", "schemars", "serde", "serde_json", @@ -402,6 +396,15 @@ dependencies = [ "wasm-bindgen-test", ] +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -427,22 +430,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a246e68bb43f6cd9db24bea052a53e40405417c5fb372e3d1a8a7f770a564ef5" dependencies = [ "memchr", - "once_cell", - "regex-automata", "serde", ] -[[package]] -name = "bugreport" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535120b8182547808081a66f1f77a64533c780b23da26763e0ee34dfb94f98c9" -dependencies = [ - "git-version", - "shell-escape", - "sys-info", -] - [[package]] name = "bumpalo" version = "3.13.0" @@ -457,7 +447,6 @@ version = "0.0.2" name = "bws" version = "0.2.1" dependencies = [ - "atty", "bat", "bitwarden", "chrono", @@ -470,6 +459,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml 0.9.21", + "supports-color", "tempfile", "thiserror", "tokio", @@ -515,9 +505,6 @@ name = "cc" version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" -dependencies = [ - "jobserver", -] [[package]] name = "cfg-if" @@ -568,9 +555,7 @@ dependencies = [ "anstyle", "bitflags 1.3.2", "clap_lex", - "once_cell", "strsim", - "terminal_size", ] [[package]] @@ -638,9 +623,9 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "comfy-table" -version = "6.2.0" +version = "7.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e959d788268e3bf9d35ace83e81b124190378e4c91c9067524675e33394b8ba" +checksum = "9ab77dbd8adecaf3f0db40581631b995f312a8a5ae3aa9993188bb8f23d83a5b" dependencies = [ "crossterm", "strum", @@ -733,9 +718,9 @@ checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cpufeatures" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" dependencies = [ "libc", ] @@ -1221,47 +1206,6 @@ version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" -[[package]] -name = "git-version" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6b0decc02f4636b9ccad390dcbe77b722a77efedfa393caf8379a51d5c61899" -dependencies = [ - "git-version-macro", - "proc-macro-hack", -] - -[[package]] -name = "git-version-macro" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe69f1cbdb6e28af2bac214e943b99ce8a0a06b447d15d3e61161b0423139f3f" -dependencies = [ - "proc-macro-hack", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "git2" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf7f68c2995f392c49fffb4f95ae2c873297830eb25c6bc4c114ce8f4562acc" -dependencies = [ - "bitflags 1.3.2", - "libc", - "libgit2-sys", - "log", - "url", -] - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - [[package]] name = "globset" version = "0.4.10" @@ -1275,23 +1219,6 @@ dependencies = [ "regex", ] -[[package]] -name = "grep-cli" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19fc6687bc64b6719a839cd24f2c700bcb05ffeb684d19da6a637c2455a7ba1" -dependencies = [ - "atty", - "bstr", - "globset", - "lazy_static", - "log", - "regex", - "same-file", - "termcolor", - "winapi-util", -] - [[package]] name = "h2" version = "0.3.19" @@ -1323,15 +1250,6 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.2.6" @@ -1510,6 +1428,7 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown", + "serde", ] [[package]] @@ -1576,11 +1495,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "is_ci" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616cde7c720bb2bb5824a224687d8f77bfd38922027f01d825cd7453be5099fb" + [[package]] name = "itertools" -version = "0.10.5" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" dependencies = [ "either", ] @@ -1591,15 +1516,6 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" -[[package]] -name = "jobserver" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" -dependencies = [ - "libc", -] - [[package]] name = "js-sys" version = "0.3.63" @@ -1624,18 +1540,6 @@ version = "0.2.145" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc86cde3ff845662b8f4ef6cb50ea0e20c524eb3d29ae048287e06a1b3fa6a81" -[[package]] -name = "libgit2-sys" -version = "0.14.2+1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f3d95f6b51075fe9810a7ae22c7095f12b98005ab364d8544797a825ce946a4" -dependencies = [ - "cc", - "libc", - "libz-sys", - "pkg-config", -] - [[package]] name = "libloading" version = "0.7.4" @@ -1652,18 +1556,6 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" -[[package]] -name = "libz-sys" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ee889ecc9568871456d42f603d6a0ce59ff328d291063a45cbdf0036baf6db" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "line-wrap" version = "0.1.1" @@ -1709,9 +1601,9 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" -version = "0.6.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" dependencies = [ "autocfg", ] @@ -2038,6 +1930,17 @@ dependencies = [ "windows-sys 0.45.0", ] +[[package]] +name = "password-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "path_abs" version = "0.5.1" @@ -2130,12 +2033,6 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" -[[package]] -name = "proc-macro-hack" -version = "0.5.20+deprecated" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" - [[package]] name = "proc-macro2" version = "1.0.59" @@ -2147,9 +2044,9 @@ dependencies = [ [[package]] name = "pyo3" -version = "0.17.3" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "268be0c73583c183f2b14052337465768c07726936a260f480f0857cb95ba543" +checksum = "e3b1ac5b3731ba34fdaa9785f8d74d17448cd18f30cf19e0c7e7b1fdb5272109" dependencies = [ "cfg-if", "indoc", @@ -2164,9 +2061,9 @@ dependencies = [ [[package]] name = "pyo3-asyncio" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1febe3946b26194628f00526929ee6f8559f9e807f811257e94d4c456103be0e" +checksum = "d3564762e37035cfc486228e10b0528460fa026d681b5763873c693aa0d5c260" dependencies = [ "futures", "once_cell", @@ -2178,9 +2075,9 @@ dependencies = [ [[package]] name = "pyo3-asyncio-macros" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "270b167ea304b961616aa0f003463c95becd3c11a85bd83ba668fe16129e2469" +checksum = "be72d4cd43a27530306bd0d20d3932182fbdd072c6b98d3638bc37efb9d559dd" dependencies = [ "proc-macro2", "quote", @@ -2189,9 +2086,9 @@ dependencies = [ [[package]] name = "pyo3-build-config" -version = "0.17.3" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28fcd1e73f06ec85bf3280c48c67e731d8290ad3d730f8be9dc07946923005c8" +checksum = "9cb946f5ac61bb61a5014924910d936ebd2b23b705f7a4a3c40b05c720b079a3" dependencies = [ "once_cell", "target-lexicon", @@ -2199,9 +2096,9 @@ dependencies = [ [[package]] name = "pyo3-ffi" -version = "0.17.3" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f6cb136e222e49115b3c51c32792886defbfb0adead26a688142b346a0b9ffc" +checksum = "fd4d7c5337821916ea2a1d21d1092e8443cf34879e53a0ac653fbb98f44ff65c" dependencies = [ "libc", "pyo3-build-config", @@ -2209,9 +2106,9 @@ dependencies = [ [[package]] name = "pyo3-log" -version = "0.7.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5695ccff5060c13ca1751cf8c857a12da9b0bf0378cb071c5e0326f7c7e4c1b" +checksum = "f47b0777feb17f61eea78667d61103758b243a871edc09a7786500a50467b605" dependencies = [ "arc-swap", "log", @@ -2220,9 +2117,9 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.17.3" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94144a1266e236b1c932682136dc35a9dee8d3589728f68130c7c3861ef96b28" +checksum = "a9d39c55dab3fc5a4b25bbd1ac10a2da452c4aca13bb450f22818a002e29648d" dependencies = [ "proc-macro2", "pyo3-macros-backend", @@ -2232,9 +2129,9 @@ dependencies = [ [[package]] name = "pyo3-macros-backend" -version = "0.17.3" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8df9be978a2d2f0cdebabb03206ed73b11314701a5bfe71b0d753b81997777f" +checksum = "97daff08a4c48320587b5224cc98d609e3c27b6d437315bd40b605c98eeb5918" dependencies = [ "proc-macro2", "quote", @@ -2370,12 +2267,6 @@ dependencies = [ "regex-syntax 0.7.2", ] -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" - [[package]] name = "regex-syntax" version = "0.6.29" @@ -2535,6 +2426,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" dependencies = [ "dyn-clone", + "indexmap", "schemars_derive", "serde", "serde_json", @@ -2788,18 +2680,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "shell-escape" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" - -[[package]] -name = "shell-words" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" - [[package]] name = "signal-hook" version = "0.3.15" @@ -2969,6 +2849,16 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +[[package]] +name = "supports-color" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4950e7174bffabe99455511c39707310e7e9b440364a2fcb1cc21521be57b354" +dependencies = [ + "is-terminal", + "is_ci", +] + [[package]] name = "syn" version = "1.0.109" @@ -3004,24 +2894,12 @@ dependencies = [ "lazy_static", "once_cell", "onig", - "plist", "regex-syntax 0.6.29", "serde", "serde_derive", "serde_json", "thiserror", "walkdir", - "yaml-rust", -] - -[[package]] -name = "sys-info" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b3a0d0aba8bf96a0e1ddfdc352fc53b3df7f39318c71854910c3c4b024ae52c" -dependencies = [ - "cc", - "libc", ] [[package]] @@ -3052,16 +2930,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "terminal_size" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e6bf6f19e9f8ed8d4048dc22981458ebcf406d67e94cd422e5ecd73d63b3237" -dependencies = [ - "rustix", - "windows-sys 0.48.0", -] - [[package]] name = "thiserror" version = "1.0.40" @@ -3145,9 +3013,7 @@ dependencies = [ "libc", "mio", "num_cpus", - "parking_lot", "pin-project-lite", - "signal-hook-registry", "socket2", "tokio-macros", "windows-sys 0.48.0", @@ -3521,15 +3387,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "wild" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b116685a6be0c52f5a103334cbff26db643826c7b3735fc0a3ba9871310a74" -dependencies = [ - "glob", -] - [[package]] name = "winapi" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index 02f5b49d19..d2914dd977 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,28 @@ [workspace] +resolver = "2" members = ["crates/*"] + +# Compile all dependencies with some optimizations when building this crate on debug +# This slows down clean builds by about 50%, but the resulting binaries can be orders of magnitude faster +# As clean builds won't occur very often, this won't slow down the development process +[profile.dev.package."*"] +opt-level = 2 + +# Turn on a small amount of optimisation in development mode. This might interfere when trying to use a debugger +# if the compiler decides to optimize some code away, if that's the case, it can be set to 0 or commented out +[profile.dev] +opt-level = 1 + +# Turn on LTO on release mode +[profile.release] +lto = "thin" +codegen-units = 1 +# Stripping the binary reduces the size by ~30%, but the stacktraces won't be usable anymore. +# This is fine as long as we don't have any unhandled panics, but let's keep it disabled for now +# strip = true + [profile.release-wasm] inherits = "release" opt-level = 's' diff --git a/crates/bitwarden-api-api/src/apis/mod.rs b/crates/bitwarden-api-api/src/apis/mod.rs index a0bd115e74..be296aa0e7 100644 --- a/crates/bitwarden-api-api/src/apis/mod.rs +++ b/crates/bitwarden-api-api/src/apis/mod.rs @@ -1,5 +1,4 @@ -use std::error; -use std::fmt; +use std::{error, fmt}; #[derive(Debug, Clone)] pub struct ResponseContent { diff --git a/crates/bitwarden-api-identity/src/apis/mod.rs b/crates/bitwarden-api-identity/src/apis/mod.rs index 6144c7645c..f50e7d44a6 100644 --- a/crates/bitwarden-api-identity/src/apis/mod.rs +++ b/crates/bitwarden-api-identity/src/apis/mod.rs @@ -1,5 +1,4 @@ -use std::error; -use std::fmt; +use std::{error, fmt}; #[derive(Debug, Clone)] pub struct ResponseContent { diff --git a/crates/bitwarden-c/Cargo.toml b/crates/bitwarden-c/Cargo.toml index 0e23cdc407..dc6dc5b5a3 100644 --- a/crates/bitwarden-c/Cargo.toml +++ b/crates/bitwarden-c/Cargo.toml @@ -10,9 +10,9 @@ crate-type = ["lib", "staticlib", "cdylib"] bench = false [target.'cfg(not(target_arch="wasm32"))'.dependencies] -tokio = { version = "1.28.2", features = ["rt-multi-thread", "macros"] } +tokio = { version = ">=1.28.2, <2.0", features = ["rt-multi-thread", "macros"] } bitwarden-json = { path = "../bitwarden-json" } [dependencies] -env_logger = "0.10.0" +env_logger = ">=0.10.0, <0.11" diff --git a/crates/bitwarden-c/src/c.rs b/crates/bitwarden-c/src/c.rs index cf6e248626..0f7c2855df 100644 --- a/crates/bitwarden-c/src/c.rs +++ b/crates/bitwarden-c/src/c.rs @@ -1,8 +1,9 @@ use std::{ffi::CStr, os::raw::c_char, str}; -use crate::{box_ptr, ffi_ref}; use bitwarden_json::client::Client; +use crate::{box_ptr, ffi_ref}; + #[no_mangle] #[tokio::main] pub async extern "C" fn run_command( diff --git a/crates/bitwarden-json/Cargo.toml b/crates/bitwarden-json/Cargo.toml index a151dea020..eaaa881c3c 100644 --- a/crates/bitwarden-json/Cargo.toml +++ b/crates/bitwarden-json/Cargo.toml @@ -17,8 +17,9 @@ rust-version = "1.57" internal = ["bitwarden/internal"] # Internal testing methods [dependencies] -schemars = "0.8.12" -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0.96" +schemars = ">=0.8.12, <0.9" +serde = { version = ">=1.0, <2.0", features = ["derive"] } +serde_json = ">=1.0.96, <2.0" +log = ">=0.4.18, <0.5" bitwarden = { path = "../bitwarden" } diff --git a/crates/bitwarden-json/src/client.rs b/crates/bitwarden-json/src/client.rs index 7e879dc90b..8931269afa 100644 --- a/crates/bitwarden-json/src/client.rs +++ b/crates/bitwarden-json/src/client.rs @@ -1,10 +1,10 @@ -use bitwarden::sdk::request::{ - client_settings::ClientSettings, +use bitwarden::client::client_settings::ClientSettings; + +use crate::{ command::{Command, ProjectsCommand, SecretsCommand}, + response::{Response, ResponseIntoString}, }; -use crate::response::ResponseIntoString; - pub struct Client(bitwarden::Client); impl Client { @@ -17,7 +17,9 @@ impl Client { const SUBCOMMANDS_TO_CLEAN: &[&str] = &["Secrets"]; let mut cmd_value: serde_json::Value = match serde_json::from_str(input_str) { Ok(cmd) => cmd, - Err(e) => return format!("{:#?}", e), + Err(e) => { + return Response::error(format!("Invalid command string: {}", e)).into_string() + } }; if let Some(cmd_value_map) = cmd_value.as_object_mut() { @@ -35,7 +37,9 @@ impl Client { let cmd: Command = match serde_json::from_value(cmd_value) { Ok(cmd) => cmd, - Err(e) => return format!("{:#?}", e), + Err(e) => { + return Response::error(format!("Invalid command value: {}", e)).into_string() + } }; match cmd { @@ -71,8 +75,11 @@ impl Client { fn parse_settings(settings_input: Option) -> Option { if let Some(input) = settings_input.as_ref() { - if let Ok(settings) = serde_json::from_str(input) { - return Some(settings); + match serde_json::from_str(input) { + Ok(settings) => return Some(settings), + Err(e) => { + log::error!("Failed to parse settings: {}", e); + } } } None diff --git a/crates/bitwarden/src/sdk/request/command.rs b/crates/bitwarden-json/src/command.rs similarity index 72% rename from crates/bitwarden/src/sdk/request/command.rs rename to crates/bitwarden-json/src/command.rs index 0388dd2af1..cf8b6418cc 100644 --- a/crates/bitwarden/src/sdk/request/command.rs +++ b/crates/bitwarden-json/src/command.rs @@ -1,25 +1,23 @@ -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; - -#[allow(unused_imports)] -use crate::sdk::{ - auth::request::{AccessTokenLoginRequest, ApiKeyLoginRequest, PasswordLoginRequest}, - request::{ - projects_request::{ +use bitwarden::{ + auth::request::AccessTokenLoginRequest, + secrets_manager::{ + projects::{ ProjectCreateRequest, ProjectGetRequest, ProjectPutRequest, ProjectsDeleteRequest, ProjectsListRequest, }, - secret_verification_request::SecretVerificationRequest, - secrets_request::{ + secrets::{ SecretCreateRequest, SecretGetRequest, SecretIdentifiersRequest, SecretPutRequest, SecretsDeleteRequest, }, - sync_request::SyncRequest, }, }; - #[cfg(feature = "internal")] -use super::fingerprint_request::FingerprintRequest; +use bitwarden::{ + auth::request::{ApiKeyLoginRequest, PasswordLoginRequest}, + platform::{FingerprintRequest, SecretVerificationRequest, SyncRequest}, +}; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, JsonSchema, Debug)] #[serde(rename_all = "camelCase", deny_unknown_fields)] @@ -33,7 +31,7 @@ pub enum Command { /// /// This command is not capable of handling authentication requiring 2fa or captcha. /// - /// Returns: [PasswordLoginResponse](crate::sdk::auth::response::PasswordLoginResponse) + /// Returns: [PasswordLoginResponse](bitwarden::auth::response::PasswordLoginResponse) /// PasswordLogin(PasswordLoginRequest), @@ -42,7 +40,7 @@ pub enum Command { /// /// This command is for initiating an authentication handshake with Bitwarden. /// - /// Returns: [ApiKeyLoginResponse](crate::sdk::auth::response::ApiKeyLoginResponse) + /// Returns: [ApiKeyLoginResponse](bitwarden::auth::response::ApiKeyLoginResponse) /// ApiKeyLogin(ApiKeyLoginRequest), @@ -50,7 +48,7 @@ pub enum Command { /// /// This command is for initiating an authentication handshake with Bitwarden. /// - /// Returns: [ApiKeyLoginResponse](crate::sdk::auth::response::ApiKeyLoginResponse) + /// Returns: [ApiKeyLoginResponse](bitwarden::auth::response::ApiKeyLoginResponse) /// AccessTokenLogin(AccessTokenLoginRequest), @@ -58,7 +56,7 @@ pub enum Command { /// > Requires Authentication /// Get the API key of the currently authenticated user /// - /// Returns: [UserApiKeyResponse](crate::sdk::response::user_api_key_response::UserApiKeyResponse) + /// Returns: [UserApiKeyResponse](bitwarden::platform::UserApiKeyResponse) /// GetUserApiKey(SecretVerificationRequest), @@ -73,7 +71,7 @@ pub enum Command { /// > Requires Authentication /// Retrieve all user data, ciphers and organizations the user is a part of /// - /// Returns: [SyncResponse](crate::sdk::response::sync_response::SyncResponse) + /// Returns: [SyncResponse](bitwarden::platform::SyncResponse) /// Sync(SyncRequest), @@ -88,7 +86,7 @@ pub enum SecretsCommand { /// > Requires using an Access Token for login or calling Sync at least once /// Retrieve a secret by the provided identifier /// - /// Returns: [SecretResponse](crate::sdk::response::secrets_response::SecretResponse) + /// Returns: [SecretResponse](bitwarden::secrets_manager::secrets::SecretResponse) /// Get(SecretGetRequest), @@ -96,7 +94,7 @@ pub enum SecretsCommand { /// > Requires using an Access Token for login or calling Sync at least once /// Creates a new secret in the provided organization using the given data /// - /// Returns: [SecretResponse](crate::sdk::response::secrets_response::SecretResponse) + /// Returns: [SecretResponse](bitwarden::secrets_manager::secrets::SecretResponse) /// Create(SecretCreateRequest), @@ -104,7 +102,7 @@ pub enum SecretsCommand { /// > Requires using an Access Token for login or calling Sync at least once /// Lists all secret identifiers of the given organization, to then retrieve each secret, use `CreateSecret` /// - /// Returns: [SecretIdentifiersResponse](crate::sdk::response::secrets_response::SecretIdentifiersResponse) + /// Returns: [SecretIdentifiersResponse](bitwarden::secrets_manager::secrets::SecretIdentifiersResponse) /// List(SecretIdentifiersRequest), @@ -112,7 +110,7 @@ pub enum SecretsCommand { /// > Requires using an Access Token for login or calling Sync at least once /// Updates an existing secret with the provided ID using the given data /// - /// Returns: [SecretResponse](crate::sdk::response::secrets_response::SecretResponse) + /// Returns: [SecretResponse](bitwarden::secrets_manager::secrets::SecretResponse) /// Update(SecretPutRequest), @@ -120,7 +118,7 @@ pub enum SecretsCommand { /// > Requires using an Access Token for login or calling Sync at least once /// Deletes all the secrets whose IDs match the provided ones /// - /// Returns: [SecretsDeleteResponse](crate::sdk::response::secrets_response::SecretsDeleteResponse) + /// Returns: [SecretsDeleteResponse](bitwarden::secrets_manager::secrets::SecretsDeleteResponse) /// Delete(SecretsDeleteRequest), } @@ -132,7 +130,7 @@ pub enum ProjectsCommand { /// > Requires using an Access Token for login or calling Sync at least once /// Retrieve a project by the provided identifier /// - /// Returns: [ProjectResponse](crate::sdk::response::projects_response::ProjectResponse) + /// Returns: [ProjectResponse](bitwarden::secrets_manager::projects::ProjectResponse) /// Get(ProjectGetRequest), @@ -140,7 +138,7 @@ pub enum ProjectsCommand { /// > Requires using an Access Token for login or calling Sync at least once /// Creates a new project in the provided organization using the given data /// - /// Returns: [ProjectResponse](crate::sdk::response::projects_response::ProjectResponse) + /// Returns: [ProjectResponse](bitwarden::secrets_manager::projects::ProjectResponse) /// Create(ProjectCreateRequest), @@ -148,7 +146,7 @@ pub enum ProjectsCommand { /// > Requires using an Access Token for login or calling Sync at least once /// Lists all projects of the given organization /// - /// Returns: [ProjectsResponse](crate::sdk::response::projects_response::ProjectsResponse) + /// Returns: [ProjectsResponse](bitwarden::secrets_manager::projects::ProjectsResponse) /// List(ProjectsListRequest), @@ -156,7 +154,7 @@ pub enum ProjectsCommand { /// > Requires using an Access Token for login or calling Sync at least once /// Updates an existing project with the provided ID using the given data /// - /// Returns: [ProjectResponse](crate::sdk::response::projects_response::ProjectResponse) + /// Returns: [ProjectResponse](bitwarden::secrets_manager::projects::ProjectResponse) /// Update(ProjectPutRequest), @@ -164,7 +162,7 @@ pub enum ProjectsCommand { /// > Requires using an Access Token for login or calling Sync at least once /// Deletes all the projects whose IDs match the provided ones /// - /// Returns: [ProjectsDeleteResponse](crate::sdk::response::projects_response::ProjectsDeleteResponse) + /// Returns: [ProjectsDeleteResponse](bitwarden::secrets_manager::projects::ProjectsDeleteResponse) /// Delete(ProjectsDeleteRequest), } diff --git a/crates/bitwarden-json/src/lib.rs b/crates/bitwarden-json/src/lib.rs index 99ab87564a..832fa31682 100644 --- a/crates/bitwarden-json/src/lib.rs +++ b/crates/bitwarden-json/src/lib.rs @@ -1,2 +1,3 @@ pub mod client; +pub mod command; pub mod response; diff --git a/crates/bitwarden-json/src/response.rs b/crates/bitwarden-json/src/response.rs index 19392231c2..25c31ef758 100644 --- a/crates/bitwarden-json/src/response.rs +++ b/crates/bitwarden-json/src/response.rs @@ -29,11 +29,13 @@ impl Response { }, } } +} - pub fn error(message: &str) -> Self { +impl Response<()> { + pub fn error(message: String) -> Self { Self { success: false, - error_message: Some(message.into()), + error_message: Some(message), data: None, } } @@ -45,13 +47,18 @@ pub(crate) trait ResponseIntoString { impl ResponseIntoString for Result { fn into_string(self) -> String { - match serde_json::to_string(&Response::new(self)) { + Response::new(self).into_string() + } +} + +impl ResponseIntoString for Response { + fn into_string(self) -> String { + match serde_json::to_string(&self) { Ok(ser) => ser, - Err(e) => serde_json::to_string(&Response::::error(&format!( - "Failed to serialize Response: {}", - e - ))) - .unwrap(), + Err(e) => { + let error = Response::error(format!("Failed to serialize Response: {}", e)); + serde_json::to_string(&error).unwrap() + } } } } diff --git a/crates/bitwarden-napi/package-lock.json b/crates/bitwarden-napi/package-lock.json index bed413648a..be96725b3a 100644 --- a/crates/bitwarden-napi/package-lock.json +++ b/crates/bitwarden-napi/package-lock.json @@ -95,16 +95,16 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.2.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", - "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==", + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==", "dev": true, "peer": true }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -193,9 +193,9 @@ } }, "node_modules/typescript": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", - "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -284,16 +284,16 @@ "dev": true }, "@types/node": { - "version": "20.2.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", - "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==", + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==", "dev": true, "peer": true }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true }, "acorn-walk": { @@ -348,9 +348,9 @@ } }, "typescript": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", - "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true }, "v8-compile-cache-lib": { diff --git a/crates/bitwarden-napi/src-ts/bitwarden_client/index.ts b/crates/bitwarden-napi/src-ts/bitwarden_client/index.ts index 7de32ef7a8..1b8c31f481 100644 --- a/crates/bitwarden-napi/src-ts/bitwarden_client/index.ts +++ b/crates/bitwarden-napi/src-ts/bitwarden_client/index.ts @@ -8,7 +8,6 @@ import { ResponseForSecretIdentifiersResponse, ResponseForSecretResponse, ResponseForSecretsDeleteResponse, - ResponseForSyncResponse, } from "./schemas"; export class BitwardenClient { @@ -26,7 +25,7 @@ export class BitwardenClient { email: email, password: password, }, - }) + }), ); return Convert.toResponseForPasswordLoginResponse(response); @@ -43,6 +42,7 @@ export class BitwardenClient { return Convert.toResponseForAPIKeyLoginResponse(response); } + /* async sync(excludeSubdomains = false): Promise { const response = await this.client.runCommand( Convert.commandToJson({ @@ -54,6 +54,7 @@ export class BitwardenClient { return Convert.toResponseForSyncResponse(response); } + */ secrets(): SecretsClient { return new SecretsClient(this.client); @@ -73,7 +74,7 @@ export class SecretsClient { secrets: { get: { id }, }, - }) + }), ); return Convert.toResponseForSecretResponse(response); @@ -83,14 +84,14 @@ export class SecretsClient { key: string, note: string, organizationId: string, - value: string + value: string, ): Promise { const response = await this.client.runCommand( Convert.commandToJson({ secrets: { create: { key, note, organizationId, value }, }, - }) + }), ); return Convert.toResponseForSecretResponse(response); @@ -102,7 +103,7 @@ export class SecretsClient { secrets: { list: { organizationId }, }, - }) + }), ); return Convert.toResponseForSecretIdentifiersResponse(response); @@ -113,14 +114,14 @@ export class SecretsClient { key: string, note: string, organizationId: string, - value: string + value: string, ): Promise { const response = await this.client.runCommand( Convert.commandToJson({ secrets: { update: { id, key, note, organizationId, value }, }, - }) + }), ); return Convert.toResponseForSecretResponse(response); @@ -132,7 +133,7 @@ export class SecretsClient { secrets: { delete: { ids }, }, - }) + }), ); return Convert.toResponseForSecretsDeleteResponse(response); diff --git a/crates/bitwarden-py/Cargo.toml b/crates/bitwarden-py/Cargo.toml index c6f1508d08..1657d14e58 100644 --- a/crates/bitwarden-py/Cargo.toml +++ b/crates/bitwarden-py/Cargo.toml @@ -6,18 +6,21 @@ rust-version = "1.57" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [lib] -name="bitwarden_py" +name = "bitwarden_py" crate-type = ["cdylib"] [dependencies] -pyo3 = { version = "0.17.3", features = ["extension-module"] } -pyo3-log = "0.7.0" +pyo3 = { version = "0.18.3", features = ["extension-module"] } +pyo3-log = "0.8.3" bitwarden-json = { path = "../bitwarden-json" } [build-dependencies] -pyo3-build-config = { version = "0.17.3"} +pyo3-build-config = { version = "0.18.3" } [target.'cfg(not(target_arch="wasm32"))'.dependencies] tokio = { version = "1.28.2", features = ["rt-multi-thread", "macros"] } -pyo3-asyncio = { version = "0.17.0", features = ["attributes", "tokio-runtime"] } +pyo3-asyncio = { version = "0.18.0", features = [ + "attributes", + "tokio-runtime", +] } diff --git a/crates/bitwarden-wasm/src/client.rs b/crates/bitwarden-wasm/src/client.rs index 2a70a0a461..366dbe7b50 100644 --- a/crates/bitwarden-wasm/src/client.rs +++ b/crates/bitwarden-wasm/src/client.rs @@ -1,9 +1,9 @@ extern crate console_error_panic_hook; -use log::Level; use std::{rc::Rc, sync::RwLock}; use bitwarden_json::client::Client as JsonClient; use js_sys::Promise; +use log::Level; use wasm_bindgen::prelude::*; use wasm_bindgen_futures::future_to_promise; diff --git a/crates/bitwarden/Cargo.toml b/crates/bitwarden/Cargo.toml index fd280d51dd..70b034edeb 100644 --- a/crates/bitwarden/Cargo.toml +++ b/crates/bitwarden/Cargo.toml @@ -13,42 +13,46 @@ edition = "2021" rust-version = "1.57" [features] -internal = [] # Internal testing methods +default = ["internal"] +internal = [] # Internal testing methods stdweb = ["instant/stdweb"] wasm-bindgen = ["instant/wasm-bindgen"] [dependencies] -base64 = "0.21.2" -lazy_static = "1.4.0" -reqwest = { version = "0.11", features = ["json"] } -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0.96" -serde_qs = "0.12.0" -serde_repr = "0.1.12" -schemars = { version = "0.8", features = ["uuid1"] } -log = "0.4.18" -assert_matches = "1.5.0" -thiserror = "1.0.40" -aes = "0.8.2" -cbc = { version = "0.1.2", features = ["alloc"] } -hkdf = "0.12.3" -hmac = "0.12.1" -rsa = "0.9.2" -sha1 = "0.10.5" -sha2 = "0.10.6" -pbkdf2 = { version = "0.12.1", default-features = false } -rand = "0.8.5" -num-bigint = "0.4" -num-traits = "0.2.15" -uuid = { version = "^1.3.3", features = ["serde"] } +base64 = ">=0.21.2, <0.22" +lazy_static = ">=1.4.0, <2.0" +reqwest = { version = ">=0.11, <0.12", features = ["json"] } +serde = { version = ">=1.0, <2.0", features = ["derive"] } +serde_json = ">=1.0.96, <2.0" +serde_qs = ">=0.12.0, <0.13" +serde_repr = ">=0.1.12, <0.2" +schemars = { version = ">=0.8, <0.9", features = ["uuid1"] } +log = ">=0.4.18, <0.5" +assert_matches = ">=1.5.0, <2.0" +thiserror = ">=1.0.40, <2.0" +aes = ">=0.8.2, <0.9" +cbc = { version = ">=0.1.2, <0.2", features = ["alloc"] } +hkdf = ">=0.12.3, <0.13" +hmac = ">=0.12.1, <0.13" +rsa = ">=0.9.2, <0.10" +sha1 = ">=0.10.5, <0.11" +sha2 = ">=0.10.6, <0.11" +pbkdf2 = { version = ">=0.12.1, <0.13", default-features = false } +argon2 = { version = ">=0.5.0, <0.6", features = [ + "alloc", +], default-features = false } +rand = ">=0.8.5, <0.9" +num-bigint = ">=0.4, <0.5" +num-traits = ">=0.2.15, <0.3" +uuid = { version = ">=1.3.3, <2.0", features = ["serde"] } +instant = ">=0.1.12, <0.2" # We don't use this directly (it's used by rand), but we need it here to enable WASM support -getrandom = { version = "0.2.9", features = ["js"] } +getrandom = { version = ">=0.2.9", features = ["js"] } bitwarden-api-identity = { path = "../bitwarden-api-identity", version = "0.2.0" } bitwarden-api-api = { path = "../bitwarden-api-api", version = "0.2.0" } -instant = "0.1.12" [dev-dependencies] tokio = { version = "1.28.2", features = ["rt", "macros"] } diff --git a/crates/bitwarden/README.md b/crates/bitwarden/README.md index 5d6f5ff8d6..49022e082e 100644 --- a/crates/bitwarden/README.md +++ b/crates/bitwarden/README.md @@ -18,15 +18,11 @@ Rust **1.57** or higher. ```rust use bitwarden::{ - Client, + auth::request::AccessTokenLoginRequest, + client::client_settings::{ClientSettings, DeviceType}, error::Result, - sdk::{ - auth::request::AccessTokenLoginRequest, - request::{ - client_settings::{ClientSettings, DeviceType}, - secrets_request::SecretIdentifiersRequest - }, - }, + secrets_manager::secrets::SecretIdentifiersRequest, + Client, }; use uuid::Uuid; diff --git a/crates/bitwarden/src/api/mod.rs b/crates/bitwarden/src/auth/api/mod.rs similarity index 100% rename from crates/bitwarden/src/api/mod.rs rename to crates/bitwarden/src/auth/api/mod.rs diff --git a/crates/bitwarden/src/api/request/access_token_request.rs b/crates/bitwarden/src/auth/api/request/access_token_request.rs similarity index 89% rename from crates/bitwarden/src/api/request/access_token_request.rs rename to crates/bitwarden/src/auth/api/request/access_token_request.rs index f2578e4b8a..b5035269b2 100644 --- a/crates/bitwarden/src/api/request/access_token_request.rs +++ b/crates/bitwarden/src/auth/api/request/access_token_request.rs @@ -2,7 +2,7 @@ use log::debug; use serde::{Deserialize, Serialize}; use uuid::Uuid; -use crate::{api::response::IdentityTokenResponse, client::ApiConfigurations, error::Result}; +use crate::{auth::api::response::IdentityTokenResponse, client::ApiConfigurations, error::Result}; #[derive(Serialize, Deserialize, Debug)] pub struct AccessTokenRequest { diff --git a/crates/bitwarden/src/api/request/api_token_request.rs b/crates/bitwarden/src/auth/api/request/api_token_request.rs similarity index 92% rename from crates/bitwarden/src/api/request/api_token_request.rs rename to crates/bitwarden/src/auth/api/request/api_token_request.rs index 31bbba3f87..087dc7e966 100644 --- a/crates/bitwarden/src/api/request/api_token_request.rs +++ b/crates/bitwarden/src/auth/api/request/api_token_request.rs @@ -1,7 +1,7 @@ use log::debug; use serde::{Deserialize, Serialize}; -use crate::{api::response::IdentityTokenResponse, client::ApiConfigurations, error::Result}; +use crate::{auth::api::response::IdentityTokenResponse, client::ApiConfigurations, error::Result}; #[derive(Serialize, Deserialize, Debug)] pub struct ApiTokenRequest { diff --git a/crates/bitwarden/src/api/request/mod.rs b/crates/bitwarden/src/auth/api/request/mod.rs similarity index 77% rename from crates/bitwarden/src/api/request/mod.rs rename to crates/bitwarden/src/auth/api/request/mod.rs index 7cc217270f..ca0ebe2a69 100644 --- a/crates/bitwarden/src/api/request/mod.rs +++ b/crates/bitwarden/src/auth/api/request/mod.rs @@ -1,16 +1,23 @@ mod access_token_request; +#[cfg(feature = "internal")] mod api_token_request; +#[cfg(feature = "internal")] mod password_token_request; +#[cfg(feature = "internal")] mod renew_token_request; pub(crate) use access_token_request::*; +#[cfg(feature = "internal")] pub(crate) use api_token_request::*; -use base64::Engine; +#[cfg(feature = "internal")] pub(crate) use password_token_request::*; +#[cfg(feature = "internal")] pub(crate) use renew_token_request::*; +use base64::Engine; + use crate::{ - api::response::{parse_identity_response, IdentityTokenResponse}, + auth::api::response::{parse_identity_response, IdentityTokenResponse}, client::ApiConfigurations, error::Result, util::BASE64_ENGINE, @@ -43,12 +50,13 @@ async fn send_identity_connect_request( request = request.header("Auth-Email", BASE64_ENGINE.encode(email.as_bytes())); } - let raw_response = request + let response = request .body(serde_qs::to_string(&body).unwrap()) .send() - .await? - .text() .await?; - parse_identity_response(&raw_response) + let status = response.status(); + let text = response.text().await?; + + parse_identity_response(status, &text) } diff --git a/crates/bitwarden/src/api/request/password_token_request.rs b/crates/bitwarden/src/auth/api/request/password_token_request.rs similarity index 93% rename from crates/bitwarden/src/api/request/password_token_request.rs rename to crates/bitwarden/src/auth/api/request/password_token_request.rs index 519ed654da..f3aec7a8d2 100644 --- a/crates/bitwarden/src/api/request/password_token_request.rs +++ b/crates/bitwarden/src/auth/api/request/password_token_request.rs @@ -1,7 +1,7 @@ use log::debug; use serde::{Deserialize, Serialize}; -use crate::{api::response::IdentityTokenResponse, client::ApiConfigurations, error::Result}; +use crate::{auth::api::response::IdentityTokenResponse, client::ApiConfigurations, error::Result}; #[derive(Serialize, Deserialize, Debug)] pub struct PasswordTokenRequest { diff --git a/crates/bitwarden/src/api/request/renew_token_request.rs b/crates/bitwarden/src/auth/api/request/renew_token_request.rs similarity index 86% rename from crates/bitwarden/src/api/request/renew_token_request.rs rename to crates/bitwarden/src/auth/api/request/renew_token_request.rs index 21a2761e5c..2f7b1161fe 100644 --- a/crates/bitwarden/src/api/request/renew_token_request.rs +++ b/crates/bitwarden/src/auth/api/request/renew_token_request.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; -use crate::{api::response::IdentityTokenResponse, client::ApiConfigurations, error::Result}; +use crate::{auth::api::response::IdentityTokenResponse, client::ApiConfigurations, error::Result}; #[derive(Serialize, Deserialize, Debug)] pub struct RenewTokenRequest { diff --git a/crates/bitwarden/src/api/response/identity_captcha_response.rs b/crates/bitwarden/src/auth/api/response/identity_captcha_response.rs similarity index 100% rename from crates/bitwarden/src/api/response/identity_captcha_response.rs rename to crates/bitwarden/src/auth/api/response/identity_captcha_response.rs diff --git a/crates/bitwarden/src/api/response/identity_payload_response.rs b/crates/bitwarden/src/auth/api/response/identity_payload_response.rs similarity index 100% rename from crates/bitwarden/src/api/response/identity_payload_response.rs rename to crates/bitwarden/src/auth/api/response/identity_payload_response.rs diff --git a/crates/bitwarden/src/api/response/identity_refresh_response.rs b/crates/bitwarden/src/auth/api/response/identity_refresh_response.rs similarity index 100% rename from crates/bitwarden/src/api/response/identity_refresh_response.rs rename to crates/bitwarden/src/auth/api/response/identity_refresh_response.rs diff --git a/crates/bitwarden/src/api/response/identity_success_response.rs b/crates/bitwarden/src/auth/api/response/identity_success_response.rs similarity index 94% rename from crates/bitwarden/src/api/response/identity_success_response.rs rename to crates/bitwarden/src/auth/api/response/identity_success_response.rs index 7f81654ab5..e59f91b7be 100644 --- a/crates/bitwarden/src/api/response/identity_success_response.rs +++ b/crates/bitwarden/src/auth/api/response/identity_success_response.rs @@ -22,7 +22,7 @@ pub struct IdentityTokenSuccessResponse { #[serde( rename = "kdfIterations", alias = "KdfIterations", - default = "crate::util::default_kdf_iterations" + default = "crate::util::default_pbkdf2_iterations" )] kdf_iterations: NonZeroU32, @@ -54,7 +54,7 @@ mod test { key: Default::default(), two_factor_token: Default::default(), kdf: KdfType::Variant0, - kdf_iterations: crate::util::default_kdf_iterations(), + kdf_iterations: crate::util::default_pbkdf2_iterations(), reset_master_password: Default::default(), force_password_reset: Default::default(), api_use_key_connector: Default::default(), diff --git a/crates/bitwarden/src/api/response/identity_token_fail_response.rs b/crates/bitwarden/src/auth/api/response/identity_token_fail_response.rs similarity index 100% rename from crates/bitwarden/src/api/response/identity_token_fail_response.rs rename to crates/bitwarden/src/auth/api/response/identity_token_fail_response.rs diff --git a/crates/bitwarden/src/api/response/identity_token_response.rs b/crates/bitwarden/src/auth/api/response/identity_token_response.rs similarity index 80% rename from crates/bitwarden/src/api/response/identity_token_response.rs rename to crates/bitwarden/src/auth/api/response/identity_token_response.rs index f888684b9a..008b49905b 100644 --- a/crates/bitwarden/src/api/response/identity_token_response.rs +++ b/crates/bitwarden/src/auth/api/response/identity_token_response.rs @@ -1,7 +1,8 @@ +use reqwest::StatusCode; use serde::{Deserialize, Serialize}; use crate::{ - api::response::{ + auth::api::response::{ IdentityCaptchaResponse, IdentityTokenFailResponse, IdentityTokenPayloadResponse, IdentityTokenRefreshResponse, IdentityTokenSuccessResponse, IdentityTwoFactorResponse, }, @@ -17,7 +18,10 @@ pub enum IdentityTokenResponse { CaptchaRequired(IdentityCaptchaResponse), } -pub fn parse_identity_response(response: &str) -> Result { +pub fn parse_identity_response( + status: StatusCode, + response: &str, +) -> Result { if let Ok(r) = serde_json::from_str::(response) { Ok(IdentityTokenResponse::Authenticated(r)) } else if let Ok(r) = serde_json::from_str::(response) { @@ -31,7 +35,10 @@ pub fn parse_identity_response(response: &str) -> Result } else if let Ok(r) = serde_json::from_str::(response) { Err(Error::IdentityFail(r)) } else { - Err(Error::Internal("Failed to parse IdentityTokenResponse")) + Err(Error::ResponseContent { + status: status, + message: response.to_owned(), + }) } } @@ -44,7 +51,7 @@ mod test { let expected = IdentityTokenSuccessResponse::default(); let success = serde_json::to_string(&expected).unwrap(); let expected = IdentityTokenResponse::Authenticated(expected); - let actual = parse_identity_response(&success).unwrap(); + let actual = parse_identity_response(StatusCode::OK, &success).unwrap(); assert_eq!(expected, actual); } @@ -53,7 +60,7 @@ mod test { let expected = IdentityTwoFactorResponse::default(); let two_factor = serde_json::to_string(&expected).unwrap(); let expected = IdentityTokenResponse::TwoFactorRequired(expected); - let actual = parse_identity_response(&two_factor).unwrap(); + let actual = parse_identity_response(StatusCode::BAD_REQUEST, &two_factor).unwrap(); assert_eq!(expected, actual); } @@ -62,7 +69,7 @@ mod test { let expected = IdentityCaptchaResponse::default(); let captcha = serde_json::to_string(&expected).unwrap(); let expected = IdentityTokenResponse::CaptchaRequired(expected); - let actual = parse_identity_response(&captcha).unwrap(); + let actual = parse_identity_response(StatusCode::BAD_REQUEST, &captcha).unwrap(); assert_eq!(expected, actual); } } diff --git a/crates/bitwarden/src/api/response/identity_two_factor_response.rs b/crates/bitwarden/src/auth/api/response/identity_two_factor_response.rs similarity index 93% rename from crates/bitwarden/src/api/response/identity_two_factor_response.rs rename to crates/bitwarden/src/auth/api/response/identity_two_factor_response.rs index c5f23422e0..f4765cc3d5 100644 --- a/crates/bitwarden/src/api/response/identity_two_factor_response.rs +++ b/crates/bitwarden/src/auth/api/response/identity_two_factor_response.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use serde::{Deserialize, Serialize}; use serde_json::Value; -use crate::api::response::two_factor_providers::TwoFactorProviders; +use crate::auth::api::response::two_factor_providers::TwoFactorProviders; #[derive(Serialize, Deserialize, Debug, PartialEq)] pub struct IdentityTwoFactorResponse { diff --git a/crates/bitwarden/src/api/response/mod.rs b/crates/bitwarden/src/auth/api/response/mod.rs similarity index 100% rename from crates/bitwarden/src/api/response/mod.rs rename to crates/bitwarden/src/auth/api/response/mod.rs diff --git a/crates/bitwarden/src/api/response/two_factor_provider_data/authenticator.rs b/crates/bitwarden/src/auth/api/response/two_factor_provider_data/authenticator.rs similarity index 100% rename from crates/bitwarden/src/api/response/two_factor_provider_data/authenticator.rs rename to crates/bitwarden/src/auth/api/response/two_factor_provider_data/authenticator.rs diff --git a/crates/bitwarden/src/api/response/two_factor_provider_data/duo.rs b/crates/bitwarden/src/auth/api/response/two_factor_provider_data/duo.rs similarity index 100% rename from crates/bitwarden/src/api/response/two_factor_provider_data/duo.rs rename to crates/bitwarden/src/auth/api/response/two_factor_provider_data/duo.rs diff --git a/crates/bitwarden/src/api/response/two_factor_provider_data/email.rs b/crates/bitwarden/src/auth/api/response/two_factor_provider_data/email.rs similarity index 100% rename from crates/bitwarden/src/api/response/two_factor_provider_data/email.rs rename to crates/bitwarden/src/auth/api/response/two_factor_provider_data/email.rs diff --git a/crates/bitwarden/src/api/response/two_factor_provider_data/mod.rs b/crates/bitwarden/src/auth/api/response/two_factor_provider_data/mod.rs similarity index 100% rename from crates/bitwarden/src/api/response/two_factor_provider_data/mod.rs rename to crates/bitwarden/src/auth/api/response/two_factor_provider_data/mod.rs diff --git a/crates/bitwarden/src/api/response/two_factor_provider_data/organization_duo.rs b/crates/bitwarden/src/auth/api/response/two_factor_provider_data/organization_duo.rs similarity index 100% rename from crates/bitwarden/src/api/response/two_factor_provider_data/organization_duo.rs rename to crates/bitwarden/src/auth/api/response/two_factor_provider_data/organization_duo.rs diff --git a/crates/bitwarden/src/api/response/two_factor_provider_data/remember.rs b/crates/bitwarden/src/auth/api/response/two_factor_provider_data/remember.rs similarity index 100% rename from crates/bitwarden/src/api/response/two_factor_provider_data/remember.rs rename to crates/bitwarden/src/auth/api/response/two_factor_provider_data/remember.rs diff --git a/crates/bitwarden/src/api/response/two_factor_provider_data/web_authn.rs b/crates/bitwarden/src/auth/api/response/two_factor_provider_data/web_authn.rs similarity index 100% rename from crates/bitwarden/src/api/response/two_factor_provider_data/web_authn.rs rename to crates/bitwarden/src/auth/api/response/two_factor_provider_data/web_authn.rs diff --git a/crates/bitwarden/src/api/response/two_factor_provider_data/yubi_key.rs b/crates/bitwarden/src/auth/api/response/two_factor_provider_data/yubi_key.rs similarity index 100% rename from crates/bitwarden/src/api/response/two_factor_provider_data/yubi_key.rs rename to crates/bitwarden/src/auth/api/response/two_factor_provider_data/yubi_key.rs diff --git a/crates/bitwarden/src/api/response/two_factor_providers.rs b/crates/bitwarden/src/auth/api/response/two_factor_providers.rs similarity index 95% rename from crates/bitwarden/src/api/response/two_factor_providers.rs rename to crates/bitwarden/src/auth/api/response/two_factor_providers.rs index e8a0261377..c6c1accda3 100644 --- a/crates/bitwarden/src/api/response/two_factor_providers.rs +++ b/crates/bitwarden/src/auth/api/response/two_factor_providers.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use serde::{Deserialize, Serialize}; use serde_json::Value; -use crate::api::response::two_factor_provider_data::{ +use crate::auth::api::response::two_factor_provider_data::{ authenticator::Authenticator, duo::Duo, email::Email, organization_duo::OrganizationDuo, remember::Remember, web_authn::WebAuthn, yubi_key::YubiKey, }; diff --git a/crates/bitwarden/src/commands/login.rs b/crates/bitwarden/src/auth/commands/login.rs similarity index 89% rename from crates/bitwarden/src/commands/login.rs rename to crates/bitwarden/src/auth/commands/login.rs index 9cab2c27db..840ef52584 100644 --- a/crates/bitwarden/src/commands/login.rs +++ b/crates/bitwarden/src/auth/commands/login.rs @@ -1,34 +1,42 @@ use std::{str::FromStr, time::Duration}; use base64::Engine; -use bitwarden_api_identity::{ - apis::accounts_api::accounts_prelogin_post, - models::{PreloginRequestModel, PreloginResponseModel}, -}; use instant::Instant; -use log::{debug, info}; use crate::{ - api::{ - request::{AccessTokenRequest, ApiTokenRequest, PasswordTokenRequest}, - response::IdentityTokenResponse, + auth::{ + api::{request::AccessTokenRequest, response::IdentityTokenResponse}, + request::AccessTokenLoginRequest, + response::ApiKeyLoginResponse, }, client::{ access_token::AccessToken, - auth_settings::AuthSettings, encryption_settings::{decrypt, SymmetricCryptoKey}, Client, LoginMethod, }, crypto::CipherString, error::{Error, Result}, - sdk::auth::{ - request::{AccessTokenLoginRequest, ApiKeyLoginRequest, PasswordLoginRequest}, - response::{ApiKeyLoginResponse, PasswordLoginResponse}, - }, util::{decode_token, BASE64_ENGINE}, }; -#[allow(dead_code)] +#[cfg(feature = "internal")] +use { + crate::{ + auth::{ + api::request::{ApiTokenRequest, PasswordTokenRequest}, + request::{ApiKeyLoginRequest, PasswordLoginRequest}, + response::PasswordLoginResponse, + }, + client::auth_settings::AuthSettings, + }, + bitwarden_api_identity::{ + apis::accounts_api::accounts_prelogin_post, + models::{PreloginRequestModel, PreloginResponseModel}, + }, + log::{debug, info}, +}; + +#[cfg(feature = "internal")] pub(crate) async fn password_login( client: &mut Client, input: &PasswordLoginRequest, @@ -58,7 +66,7 @@ pub(crate) async fn password_login( PasswordLoginResponse::process_response(response) } -#[allow(dead_code)] +#[cfg(feature = "internal")] pub(crate) async fn api_key_login( client: &mut Client, input: &ApiKeyLoginRequest, @@ -153,6 +161,7 @@ pub(crate) async fn access_token_login( ApiKeyLoginResponse::process_response(response) } +#[cfg(feature = "internal")] async fn determine_password_hash( client: &mut Client, email: &str, @@ -160,18 +169,20 @@ async fn determine_password_hash( ) -> Result { let pre_login = request_prelogin(client, email.to_owned()).await?; let auth_settings = AuthSettings::new(pre_login, email.to_owned()); - let password_hash = auth_settings.make_user_password_hash(password); + let password_hash = auth_settings.make_user_password_hash(password)?; client.set_auth_settings(auth_settings); Ok(password_hash) } +#[cfg(feature = "internal")] async fn request_prelogin(client: &mut Client, email: String) -> Result { let request_model = PreloginRequestModel::new(email); let config = client.get_api_configurations().await; Ok(accounts_prelogin_post(&config.identity, Some(request_model)).await?) } +#[cfg(feature = "internal")] async fn request_identity_tokens( client: &mut Client, input: &PasswordLoginRequest, @@ -183,7 +194,7 @@ async fn request_identity_tokens( .await } -#[allow(dead_code)] +#[cfg(feature = "internal")] async fn request_api_identity_tokens( client: &mut Client, input: &ApiKeyLoginRequest, @@ -213,19 +224,21 @@ pub(crate) async fn renew_token(client: &mut Client) -> Result<()> { } let res = match login_method { + #[cfg(feature = "internal")] LoginMethod::Username { client_id } => { let refresh = client .refresh_token .as_deref() .ok_or(Error::NotAuthenticated)?; - crate::api::request::RenewTokenRequest::new( + crate::auth::api::request::RenewTokenRequest::new( refresh.to_owned(), client_id.to_owned(), ) .send(&client.__api_configurations) .await? } + #[cfg(feature = "internal")] LoginMethod::ApiKey { client_id, client_secret, diff --git a/crates/bitwarden/src/auth/commands/mod.rs b/crates/bitwarden/src/auth/commands/mod.rs new file mode 100644 index 0000000000..dc86ebb7dd --- /dev/null +++ b/crates/bitwarden/src/auth/commands/mod.rs @@ -0,0 +1,3 @@ +mod login; + +pub(crate) use login::*; diff --git a/crates/bitwarden/src/auth/mod.rs b/crates/bitwarden/src/auth/mod.rs new file mode 100644 index 0000000000..c9afd9341c --- /dev/null +++ b/crates/bitwarden/src/auth/mod.rs @@ -0,0 +1,4 @@ +pub(super) mod api; +pub mod commands; +pub mod request; +pub mod response; diff --git a/crates/bitwarden/src/sdk/auth/request/api_key_login_request.rs b/crates/bitwarden/src/auth/request/api_key_login_request.rs similarity index 100% rename from crates/bitwarden/src/sdk/auth/request/api_key_login_request.rs rename to crates/bitwarden/src/auth/request/api_key_login_request.rs diff --git a/crates/bitwarden/src/sdk/auth/request/mod.rs b/crates/bitwarden/src/auth/request/mod.rs similarity index 100% rename from crates/bitwarden/src/sdk/auth/request/mod.rs rename to crates/bitwarden/src/auth/request/mod.rs diff --git a/crates/bitwarden/src/sdk/auth/request/password_login_request.rs b/crates/bitwarden/src/auth/request/password_login_request.rs similarity index 100% rename from crates/bitwarden/src/sdk/auth/request/password_login_request.rs rename to crates/bitwarden/src/auth/request/password_login_request.rs diff --git a/crates/bitwarden/src/sdk/auth/response/api_key_login_response.rs b/crates/bitwarden/src/auth/response/api_key_login_response.rs similarity index 83% rename from crates/bitwarden/src/sdk/auth/response/api_key_login_response.rs rename to crates/bitwarden/src/auth/response/api_key_login_response.rs index 6d20ff695c..2cc143d01f 100644 --- a/crates/bitwarden/src/sdk/auth/response/api_key_login_response.rs +++ b/crates/bitwarden/src/auth/response/api_key_login_response.rs @@ -2,12 +2,14 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::{ - api::response::IdentityTokenResponse, - error::Result, - sdk::auth::response::{ - password_login_response::PasswordLoginResponse, - two_factor_login_response::TwoFactorProviders, + auth::{ + api::response::IdentityTokenResponse, + response::{ + password_login_response::PasswordLoginResponse, + two_factor_login_response::TwoFactorProviders, + }, }, + error::Result, }; #[derive(Serialize, Deserialize, Debug, JsonSchema)] diff --git a/crates/bitwarden/src/sdk/response/captcha_response.rs b/crates/bitwarden/src/auth/response/captcha_response.rs similarity index 72% rename from crates/bitwarden/src/sdk/response/captcha_response.rs rename to crates/bitwarden/src/auth/response/captcha_response.rs index 87e54bdec3..fcd10994a4 100644 --- a/crates/bitwarden/src/sdk/response/captcha_response.rs +++ b/crates/bitwarden/src/auth/response/captcha_response.rs @@ -8,8 +8,8 @@ pub struct CaptchaResponse { pub site_key: String, } -impl From for CaptchaResponse { - fn from(api: crate::api::response::IdentityCaptchaResponse) -> Self { +impl From for CaptchaResponse { + fn from(api: crate::auth::api::response::IdentityCaptchaResponse) -> Self { Self { site_key: api.site_key, } diff --git a/crates/bitwarden/src/sdk/auth/response/mod.rs b/crates/bitwarden/src/auth/response/mod.rs similarity index 88% rename from crates/bitwarden/src/sdk/auth/response/mod.rs rename to crates/bitwarden/src/auth/response/mod.rs index 02d87a280c..2d8e461f51 100644 --- a/crates/bitwarden/src/sdk/auth/response/mod.rs +++ b/crates/bitwarden/src/auth/response/mod.rs @@ -1,4 +1,5 @@ mod api_key_login_response; +mod captcha_response; mod password_login_response; pub mod two_factor_login_response; diff --git a/crates/bitwarden/src/sdk/auth/response/password_login_response.rs b/crates/bitwarden/src/auth/response/password_login_response.rs similarity index 93% rename from crates/bitwarden/src/sdk/auth/response/password_login_response.rs rename to crates/bitwarden/src/auth/response/password_login_response.rs index 26f6956b45..9c5665f9af 100644 --- a/crates/bitwarden/src/sdk/auth/response/password_login_response.rs +++ b/crates/bitwarden/src/auth/response/password_login_response.rs @@ -2,12 +2,13 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use crate::{ - api::response::IdentityTokenResponse, - error::Result, - sdk::{ - auth::response::two_factor_login_response::TwoFactorProviders, - response::captcha_response::CaptchaResponse, + auth::{ + api::response::IdentityTokenResponse, + response::{ + captcha_response::CaptchaResponse, two_factor_login_response::TwoFactorProviders, + }, }, + error::Result, }; #[derive(Serialize, Deserialize, Debug, JsonSchema)] diff --git a/crates/bitwarden/src/sdk/auth/response/two_factor_login_response/authenticator.rs b/crates/bitwarden/src/auth/response/two_factor_login_response/authenticator.rs similarity index 59% rename from crates/bitwarden/src/sdk/auth/response/two_factor_login_response/authenticator.rs rename to crates/bitwarden/src/auth/response/two_factor_login_response/authenticator.rs index 91d7e05f2c..609bd4d34a 100644 --- a/crates/bitwarden/src/sdk/auth/response/two_factor_login_response/authenticator.rs +++ b/crates/bitwarden/src/auth/response/two_factor_login_response/authenticator.rs @@ -5,11 +5,11 @@ use serde::{Deserialize, Serialize}; #[serde(rename_all = "camelCase", deny_unknown_fields)] pub struct Authenticator {} -impl From +impl From for Authenticator { fn from( - _: crate::api::response::two_factor_provider_data::authenticator::Authenticator, + _: crate::auth::api::response::two_factor_provider_data::authenticator::Authenticator, ) -> Self { Self {} } diff --git a/crates/bitwarden/src/sdk/auth/response/two_factor_login_response/duo.rs b/crates/bitwarden/src/auth/response/two_factor_login_response/duo.rs similarity index 56% rename from crates/bitwarden/src/sdk/auth/response/two_factor_login_response/duo.rs rename to crates/bitwarden/src/auth/response/two_factor_login_response/duo.rs index 06b4155365..719f8a9efd 100644 --- a/crates/bitwarden/src/sdk/auth/response/two_factor_login_response/duo.rs +++ b/crates/bitwarden/src/auth/response/two_factor_login_response/duo.rs @@ -8,8 +8,8 @@ pub struct Duo { pub signature: String, } -impl From for Duo { - fn from(api: crate::api::response::two_factor_provider_data::duo::Duo) -> Self { +impl From for Duo { + fn from(api: crate::auth::api::response::two_factor_provider_data::duo::Duo) -> Self { Self { host: api.host, signature: api.signature, @@ -17,11 +17,11 @@ impl From for Duo { } } -impl From +impl From for Duo { fn from( - api: crate::api::response::two_factor_provider_data::organization_duo::OrganizationDuo, + api: crate::auth::api::response::two_factor_provider_data::organization_duo::OrganizationDuo, ) -> Self { Self { host: api.host, diff --git a/crates/bitwarden/src/sdk/auth/response/two_factor_login_response/email.rs b/crates/bitwarden/src/auth/response/two_factor_login_response/email.rs similarity index 62% rename from crates/bitwarden/src/sdk/auth/response/two_factor_login_response/email.rs rename to crates/bitwarden/src/auth/response/two_factor_login_response/email.rs index d763a7bfc2..65ad184c2b 100644 --- a/crates/bitwarden/src/sdk/auth/response/two_factor_login_response/email.rs +++ b/crates/bitwarden/src/auth/response/two_factor_login_response/email.rs @@ -8,8 +8,8 @@ pub struct Email { pub email: String, } -impl From for Email { - fn from(api: crate::api::response::two_factor_provider_data::email::Email) -> Self { +impl From for Email { + fn from(api: crate::auth::api::response::two_factor_provider_data::email::Email) -> Self { Self { email: api.email } } } diff --git a/crates/bitwarden/src/sdk/auth/response/two_factor_login_response/mod.rs b/crates/bitwarden/src/auth/response/two_factor_login_response/mod.rs similarity index 100% rename from crates/bitwarden/src/sdk/auth/response/two_factor_login_response/mod.rs rename to crates/bitwarden/src/auth/response/two_factor_login_response/mod.rs diff --git a/crates/bitwarden/src/sdk/auth/response/two_factor_login_response/remember.rs b/crates/bitwarden/src/auth/response/two_factor_login_response/remember.rs similarity index 52% rename from crates/bitwarden/src/sdk/auth/response/two_factor_login_response/remember.rs rename to crates/bitwarden/src/auth/response/two_factor_login_response/remember.rs index b5b11eefe3..3275041839 100644 --- a/crates/bitwarden/src/sdk/auth/response/two_factor_login_response/remember.rs +++ b/crates/bitwarden/src/auth/response/two_factor_login_response/remember.rs @@ -5,8 +5,8 @@ use serde::{Deserialize, Serialize}; #[serde(rename_all = "camelCase", deny_unknown_fields)] pub struct Remember {} -impl From for Remember { - fn from(_: crate::api::response::two_factor_provider_data::remember::Remember) -> Self { +impl From for Remember { + fn from(_: crate::auth::api::response::two_factor_provider_data::remember::Remember) -> Self { Self {} } } diff --git a/crates/bitwarden/src/sdk/auth/response/two_factor_login_response/two_factor_providers.rs b/crates/bitwarden/src/auth/response/two_factor_login_response/two_factor_providers.rs similarity index 85% rename from crates/bitwarden/src/sdk/auth/response/two_factor_login_response/two_factor_providers.rs rename to crates/bitwarden/src/auth/response/two_factor_login_response/two_factor_providers.rs index d372a8ac63..db790f3921 100644 --- a/crates/bitwarden/src/sdk/auth/response/two_factor_login_response/two_factor_providers.rs +++ b/crates/bitwarden/src/auth/response/two_factor_login_response/two_factor_providers.rs @@ -1,7 +1,7 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use crate::sdk::auth::response::two_factor_login_response::{ +use crate::auth::response::two_factor_login_response::{ authenticator::Authenticator, duo::Duo, email::Email, remember::Remember, web_authn::WebAuthn, yubi_key::YubiKey, }; @@ -24,8 +24,8 @@ pub struct TwoFactorProviders { pub web_authn: Option, } -impl From for TwoFactorProviders { - fn from(api: crate::api::response::TwoFactorProviders) -> Self { +impl From for TwoFactorProviders { + fn from(api: crate::auth::api::response::TwoFactorProviders) -> Self { Self { authenticator: api.authenticator.map(Into::into), email: api.email.map(Into::into), diff --git a/crates/bitwarden/src/sdk/auth/response/two_factor_login_response/web_authn.rs b/crates/bitwarden/src/auth/response/two_factor_login_response/web_authn.rs similarity index 52% rename from crates/bitwarden/src/sdk/auth/response/two_factor_login_response/web_authn.rs rename to crates/bitwarden/src/auth/response/two_factor_login_response/web_authn.rs index 155b4b3f2d..799fd2b23d 100644 --- a/crates/bitwarden/src/sdk/auth/response/two_factor_login_response/web_authn.rs +++ b/crates/bitwarden/src/auth/response/two_factor_login_response/web_authn.rs @@ -5,8 +5,8 @@ use serde::{Deserialize, Serialize}; #[serde(rename_all = "camelCase", deny_unknown_fields)] pub struct WebAuthn {} -impl From for WebAuthn { - fn from(_: crate::api::response::two_factor_provider_data::web_authn::WebAuthn) -> Self { +impl From for WebAuthn { + fn from(_: crate::auth::api::response::two_factor_provider_data::web_authn::WebAuthn) -> Self { Self {} } } diff --git a/crates/bitwarden/src/sdk/auth/response/two_factor_login_response/yubi_key.rs b/crates/bitwarden/src/auth/response/two_factor_login_response/yubi_key.rs similarity index 62% rename from crates/bitwarden/src/sdk/auth/response/two_factor_login_response/yubi_key.rs rename to crates/bitwarden/src/auth/response/two_factor_login_response/yubi_key.rs index 10abe714b7..d6021bd39d 100644 --- a/crates/bitwarden/src/sdk/auth/response/two_factor_login_response/yubi_key.rs +++ b/crates/bitwarden/src/auth/response/two_factor_login_response/yubi_key.rs @@ -8,8 +8,8 @@ pub struct YubiKey { pub nfc: bool, } -impl From for YubiKey { - fn from(api: crate::api::response::two_factor_provider_data::yubi_key::YubiKey) -> Self { +impl From for YubiKey { + fn from(api: crate::auth::api::response::two_factor_provider_data::yubi_key::YubiKey) -> Self { Self { nfc: api.nfc } } } diff --git a/crates/bitwarden/src/bin/schemas.rs b/crates/bitwarden/src/bin/schemas.rs deleted file mode 100644 index 5b2e03e0f0..0000000000 --- a/crates/bitwarden/src/bin/schemas.rs +++ /dev/null @@ -1,26 +0,0 @@ -/* -use std::{fs::{self, create_dir_all}, path::Path}; - -use bitwarden::sdk::{ - request::PasswordLoginRequest, - response::{captcha_response::CaptchaResponse, password_login_response::PasswordLoginResponse}, -}; -use schemars::{schema_for, JsonSchema}; - -fn main() { - write_to_file::("schemas/request/password-login-request.json".into()); - write_to_file::("schemas/response/password-login-response.json".into()); - write_to_file::("schemas/response/captcha-response.json".into()); -} - -#[allow(unused_must_use)] -fn write_to_file(filename: String) { - let path = Path::new(&filename); - create_dir_all(path.parent().unwrap()); - - let schema = schema_for!(T); - fs::write(filename, serde_json::to_string_pretty(&schema).unwrap()).unwrap(); -} -*/ - -fn main() {} diff --git a/crates/bitwarden/src/client/access_token.rs b/crates/bitwarden/src/client/access_token.rs index 4ebe872b49..d767113761 100644 --- a/crates/bitwarden/src/client/access_token.rs +++ b/crates/bitwarden/src/client/access_token.rs @@ -58,9 +58,10 @@ mod tests { #[test] fn can_decode_access_token() { - use crate::client::AccessToken; use std::str::FromStr; + use crate::client::AccessToken; + let access_token = "0.ec2c1d46-6a4b-4751-a310-af9601317f2d.C2IgxjjLF7qSshsbwe8JGcbM075YXw:X8vbvA0bduihIDe/qrzIQQ=="; let token = AccessToken::from_str(access_token).unwrap(); @@ -74,9 +75,10 @@ mod tests { #[test] fn malformed_tokens() { - use crate::client::AccessToken; use std::str::FromStr; + use crate::client::AccessToken; + // Encryption key without base64 padding, we generate it with padding but ignore it when decoding let t = "0.ec2c1d46-6a4b-4751-a310-af9601317f2d.C2IgxjjLF7qSshsbwe8JGcbM075YXw:X8vbvA0bduihIDe/qrzIQQ"; assert!(AccessToken::from_str(t).is_ok()); diff --git a/crates/bitwarden/src/client/auth_settings.rs b/crates/bitwarden/src/client/auth_settings.rs index 9d5e6120b0..583e78b609 100644 --- a/crates/bitwarden/src/client/auth_settings.rs +++ b/crates/bitwarden/src/client/auth_settings.rs @@ -1,49 +1,70 @@ +use std::num::NonZeroU32; + use base64::Engine; use bitwarden_api_identity::models::{KdfType, PreloginResponseModel}; -use std::num::NonZeroU32; use crate::{ crypto::{PbkdfSha256Hmac, PBKDF_SHA256_HMAC_OUT_SIZE}, - util::{default_kdf_iterations, BASE64_ENGINE}, + error::Result, + util::{ + default_argon2_iterations, default_argon2_memory, default_argon2_parallelism, + default_pbkdf2_iterations, BASE64_ENGINE, + }, }; #[derive(Debug)] pub(crate) struct AuthSettings { pub email: String, - pub kdf_type: KdfType, - pub(crate) kdf_iterations: NonZeroU32, + pub(crate) kdf: Kdf, +} + +#[derive(Debug)] +pub enum Kdf { + PBKDF2 { + iterations: NonZeroU32, + }, + Argon2id { + iterations: NonZeroU32, + memory: NonZeroU32, + parallelism: NonZeroU32, + }, } impl AuthSettings { pub fn new(response: PreloginResponseModel, email: String) -> Self { - Self { - email, - kdf_type: response.kdf.unwrap_or_default(), - kdf_iterations: response - .kdf_iterations - .and_then(|e| NonZeroU32::new(e as u32)) - .unwrap_or_else(default_kdf_iterations), - } + let kdf = match response.kdf.unwrap_or_default() { + KdfType::Variant0 => Kdf::PBKDF2 { + iterations: response + .kdf_iterations + .and_then(|e| NonZeroU32::new(e as u32)) + .unwrap_or_else(default_pbkdf2_iterations), + }, + KdfType::Variant1 => Kdf::Argon2id { + iterations: response + .kdf_iterations + .and_then(|e| NonZeroU32::new(e as u32)) + .unwrap_or_else(default_argon2_iterations), + memory: response + .kdf_memory + .and_then(|e| NonZeroU32::new(e as u32)) + .unwrap_or_else(default_argon2_memory), + parallelism: response + .kdf_parallelism + .and_then(|e| NonZeroU32::new(e as u32)) + .unwrap_or_else(default_argon2_parallelism), + }, + }; + + Self { email, kdf } } - pub fn make_user_password_hash(&self, password: &str) -> String { + pub fn make_user_password_hash(&self, password: &str) -> Result { self.make_password_hash(password, &self.email) } - pub fn make_password_hash(&self, password: &str, salt: &str) -> String { - let hash = match self.kdf_type { - KdfType::Variant0 => { - pbkdf2::pbkdf2_array::( - password.as_bytes(), - salt.as_bytes(), - self.kdf_iterations.get(), - ) - } - KdfType::Variant1 => { - todo!("Implement argon2id") - } - } - .unwrap(); + pub fn make_password_hash(&self, password: &str, salt: &str) -> Result { + let hash: [u8; 32] = + crate::crypto::hash_kdf(password.as_bytes(), salt.as_bytes(), &self.kdf)?; // Server expects hash + 1 iteration let login_hash = pbkdf2::pbkdf2_array::( @@ -51,9 +72,9 @@ impl AuthSettings { password.as_bytes(), 1, ) - .unwrap(); + .expect("hash is a valid fixed size"); - BASE64_ENGINE.encode(login_hash) + Ok(BASE64_ENGINE.encode(login_hash)) } } @@ -64,7 +85,7 @@ mod tests { use super::AuthSettings; #[test] - fn test_password_hash() { + fn test_password_hash_pbkdf2() { let res = PreloginResponseModel { kdf: Some(KdfType::Variant0), kdf_iterations: Some(100_000), @@ -74,12 +95,36 @@ mod tests { let settings = AuthSettings::new(res, "test@bitwarden.com".into()); assert_eq!( - settings.make_password_hash("asdfasdf", "test_salt"), + settings + .make_password_hash("asdfasdf", "test_salt") + .unwrap(), "ZF6HjxUTSyBHsC+HXSOhZoXN+UuMnygV5YkWXCY4VmM=" ); assert_eq!( - settings.make_user_password_hash("asdfasdf"), + settings.make_user_password_hash("asdfasdf").unwrap(), "wmyadRMyBZOH7P/a/ucTCbSghKgdzDpPqUnu/DAVtSw=" ); } + + #[test] + fn test_password_hash_argon2id() { + let res = PreloginResponseModel { + kdf: Some(KdfType::Variant1), + kdf_iterations: Some(4), + kdf_memory: Some(32), + kdf_parallelism: Some(2), + }; + let settings = AuthSettings::new(res, "test@bitwarden.com".into()); + + assert_eq!( + settings + .make_password_hash("asdfasdf", "test_salt") + .unwrap(), + "PR6UjYmjmppTYcdyTiNbAhPJuQQOmynKbdEl1oyi/iQ=" + ); + assert_eq!( + settings.make_user_password_hash("asdfasdf").unwrap(), + "ImYMPyd/X7FPrWzbt+wRfmlICWTA25yZrOob4TBMEZw=" + ); + } } diff --git a/crates/bitwarden/src/client/client.rs b/crates/bitwarden/src/client/client.rs index bb6f4bb0d3..2cc8fac564 100644 --- a/crates/bitwarden/src/client/client.rs +++ b/crates/bitwarden/src/client/client.rs @@ -1,41 +1,39 @@ use std::time::Duration; use instant::Instant; -use log::debug; use reqwest::header::{self}; use uuid::Uuid; -#[allow(unused_imports)] use crate::{ + auth::{ + commands::{access_token_login, renew_token}, + request::AccessTokenLoginRequest, + response::ApiKeyLoginResponse, + }, client::{ - auth_settings::AuthSettings, - client_projects::ClientProjects, - client_secrets::ClientSecrets, + client_settings::{ClientSettings, DeviceType}, encryption_settings::{EncryptionSettings, SymmetricCryptoKey}, }, - commands::{ - access_token_login, api_key_login, generate_fingerprint, get_user_api_key, password_login, - renew_token, sync, - }, - crypto::CipherString, - error::{Error, Result}, - sdk::{ + error::Result, +}; +#[cfg(feature = "internal")] +use { + crate::{ auth::{ - request::{AccessTokenLoginRequest, ApiKeyLoginRequest, PasswordLoginRequest}, - response::{ApiKeyLoginResponse, PasswordLoginResponse}, + commands::{api_key_login, password_login}, + request::{ApiKeyLoginRequest, PasswordLoginRequest}, + response::PasswordLoginResponse, }, - request::{ - client_settings::{ClientSettings, DeviceType, KdfType}, - fingerprint_request::FingerprintRequest, - secret_verification_request::SecretVerificationRequest, - sync_request::SyncRequest, - }, - response::{ - fingerprint_response::FingerprintResponse, sync_response::SyncResponse, - user_api_key_response::UserApiKeyResponse, + client::auth_settings::{AuthSettings, Kdf}, + client::client_settings::KdfType, + crypto::CipherString, + error::Error, + platform::{ + generate_fingerprint, get_user_api_key, sync, FingerprintRequest, FingerprintResponse, + SecretVerificationRequest, SyncRequest, SyncResponse, UserApiKeyResponse, }, }, - util::default_kdf_iterations, + log::debug, }; #[derive(Debug)] @@ -47,9 +45,9 @@ pub(crate) struct ApiConfigurations { #[derive(Debug, Clone)] pub(crate) enum LoginMethod { - Username { - client_id: String, - }, + #[cfg(feature = "internal")] + Username { client_id: String }, + #[cfg(feature = "internal")] ApiKey { client_id: String, client_secret: String, @@ -73,6 +71,7 @@ pub struct Client { #[doc(hidden)] pub(crate) __api_configurations: ApiConfigurations, + #[cfg(feature = "internal")] auth_settings: Option, encryption_settings: Option, @@ -122,13 +121,19 @@ impl Client { api, device_type: settings.device_type, }, + #[cfg(feature = "internal")] auth_settings: settings.internal.map(|s| AuthSettings { email: s.email, - kdf_type: match s.kdf_type { - KdfType::Pbkdf2Sha256 => bitwarden_api_identity::models::KdfType::Variant0, - KdfType::Argon2id => bitwarden_api_identity::models::KdfType::Variant0, + kdf: match s.kdf_type { + KdfType::Pbkdf2Sha256 => Kdf::PBKDF2 { + iterations: s.kdf_iterations, + }, + KdfType::Argon2id => Kdf::Argon2id { + iterations: s.kdf_iterations, + memory: todo!(), + parallelism: todo!(), + }, }, - kdf_iterations: s.kdf_iterations, }), encryption_settings: None, } @@ -177,6 +182,7 @@ impl Client { get_user_api_key(self, input).await } + #[cfg(feature = "internal")] pub(crate) fn get_auth_settings(&self) -> &Option { &self.auth_settings } @@ -194,6 +200,7 @@ impl Client { &self.encryption_settings } + #[cfg(feature = "internal")] pub(crate) fn set_auth_settings(&mut self, auth_settings: AuthSettings) { debug! {"setting auth settings: {:#?}", auth_settings} self.auth_settings = Some(auth_settings); @@ -218,10 +225,12 @@ impl Client { renew_token(self).await } + #[cfg(feature = "internal")] pub fn is_authed(&self) -> bool { self.token.is_some() || self.auth_settings.is_some() } + #[cfg(feature = "internal")] pub(crate) fn initialize_user_crypto( &mut self, password: &str, @@ -250,6 +259,7 @@ impl Client { self.encryption_settings.as_ref().unwrap() } + #[cfg(feature = "internal")] pub(crate) fn initialize_org_crypto( &mut self, org_keys: Vec<(Uuid, CipherString)>, @@ -269,21 +279,11 @@ impl Client { } } -impl<'a> Client { - pub fn secrets(&'a mut self) -> ClientSecrets<'a> { - ClientSecrets { client: self } - } - - pub fn projects(&'a mut self) -> ClientProjects<'a> { - ClientProjects { client: self } - } -} - #[cfg(test)] mod tests { use wiremock::{matchers, Mock, ResponseTemplate}; - use crate::sdk::{auth::request::AccessTokenLoginRequest, request::secrets_request::*}; + use crate::{auth::request::AccessTokenLoginRequest, secrets_manager::secrets::*}; #[tokio::test] async fn test_access_token_login() { diff --git a/crates/bitwarden/src/sdk/request/client_settings.rs b/crates/bitwarden/src/client/client_settings.rs similarity index 97% rename from crates/bitwarden/src/sdk/request/client_settings.rs rename to crates/bitwarden/src/client/client_settings.rs index 2a64bb3c37..157b15fe80 100644 --- a/crates/bitwarden/src/sdk/request/client_settings.rs +++ b/crates/bitwarden/src/client/client_settings.rs @@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize}; /// Defaults to /// /// ``` -/// # use bitwarden::sdk::request::client_settings::{ClientSettings, DeviceType}; +/// # use bitwarden::client::client_settings::{ClientSettings, DeviceType}; /// # use assert_matches::assert_matches; /// let settings = ClientSettings { /// identity_url: "https://identity.bitwarden.com".to_string(), diff --git a/crates/bitwarden/src/client/encryption_settings.rs b/crates/bitwarden/src/client/encryption_settings.rs index c5119f8fb9..6720369acf 100644 --- a/crates/bitwarden/src/client/encryption_settings.rs +++ b/crates/bitwarden/src/client/encryption_settings.rs @@ -7,16 +7,21 @@ use aes::cipher::{ use base64::Engine; use hmac::Mac; use rand::RngCore; -use rsa::{pkcs8::DecodePrivateKey, Oaep, RsaPrivateKey}; +use rsa::RsaPrivateKey; use uuid::Uuid; use crate::{ - client::auth_settings::AuthSettings, crypto::{CipherString, PbkdfSha256Hmac, PBKDF_SHA256_HMAC_OUT_SIZE}, error::{CryptoError, Error, Result}, util::BASE64_ENGINE, }; +#[cfg(feature = "internal")] +use { + crate::client::auth_settings::AuthSettings, + rsa::{pkcs8::DecodePrivateKey, Oaep}, +}; + pub struct SymmetricCryptoKey { pub key: GenericArray, pub mac_key: Option>, @@ -94,6 +99,7 @@ impl std::fmt::Debug for EncryptionSettings { } impl EncryptionSettings { + #[cfg(feature = "internal")] pub(crate) fn new( auth: &AuthSettings, password: &str, @@ -104,9 +110,8 @@ impl EncryptionSettings { let (key, mac_key) = crate::crypto::stretch_key_password( password.as_bytes(), auth.email.as_bytes(), - auth.kdf_iterations, - ) - .map_err(|_| CryptoError::KeyStretch)?; + &auth.kdf, + )?; // Decrypt the user key with the stretched key let user_key = { @@ -140,6 +145,7 @@ impl EncryptionSettings { } } + #[cfg(feature = "internal")] pub(crate) fn set_org_keys( &mut self, org_enc_keys: Vec<(Uuid, CipherString)>, @@ -165,14 +171,14 @@ impl EncryptionSettings { Ok(self) } - fn get_key(&self, org_id: Option) -> Option<&SymmetricCryptoKey> { + fn get_key(&self, org_id: &Option) -> Option<&SymmetricCryptoKey> { // If we don't have a private key set (to decode multiple org keys), we just use the main user key if self.private_key.is_none() { return Some(&self.user_key); } match org_id { - Some(org_id) => match self.org_keys.get(&org_id) { + Some(org_id) => match self.org_keys.get(org_id) { Some(k) => Some(k), None => return None, }, @@ -180,18 +186,13 @@ impl EncryptionSettings { } } - pub fn decrypt(&self, cipher: &CipherString, org_id: Option) -> Result> { + pub(crate) fn decrypt(&self, cipher: &CipherString, org_id: &Option) -> Result { let key = self.get_key(org_id).ok_or(CryptoError::NoKeyForOrg)?; - decrypt(cipher, key) - } - - pub fn decrypt_str(&self, cipher: &str, org_id: Option) -> Result { - let cipher = CipherString::from_str(cipher)?; - let dec = self.decrypt(&cipher, org_id)?; + let dec = decrypt(cipher, key)?; String::from_utf8(dec).map_err(|_| CryptoError::InvalidUtf8String.into()) } - pub fn encrypt(&self, data: &[u8], org_id: Option) -> Result { + pub(crate) fn encrypt(&self, data: &[u8], org_id: &Option) -> Result { let key = self.get_key(org_id).ok_or(CryptoError::NoKeyForOrg)?; let dec = encrypt_aes256(data, key.mac_key, key.key)?; @@ -277,6 +278,7 @@ mod tests { use std::str::FromStr; use super::{EncryptionSettings, SymmetricCryptoKey}; + use crate::crypto::{Decryptable, Encryptable}; #[test] fn test_symmetric_crypto_key() { @@ -295,10 +297,10 @@ mod tests { let key = SymmetricCryptoKey::generate("test"); let settings = EncryptionSettings::new_single_key(key); - let test_string = "encrypted_test_string"; - let cipher = settings.encrypt(test_string.as_bytes(), None).unwrap(); + let test_string = "encrypted_test_string".to_string(); + let cipher = test_string.clone().encrypt(&settings, &None).unwrap(); - let decrypted_str = settings.decrypt_str(&cipher.to_string(), None).unwrap(); + let decrypted_str = cipher.decrypt(&settings, &None).unwrap(); assert_eq!(decrypted_str, test_string); } } diff --git a/crates/bitwarden/src/client/mod.rs b/crates/bitwarden/src/client/mod.rs index ed5ee7c029..6dcfff940f 100644 --- a/crates/bitwarden/src/client/mod.rs +++ b/crates/bitwarden/src/client/mod.rs @@ -2,13 +2,11 @@ pub(crate) use client::*; pub(crate) mod access_token; +#[cfg(feature = "internal")] pub(crate) mod auth_settings; mod client; -mod client_projects; -mod client_secrets; +pub mod client_settings; pub(crate) mod encryption_settings; pub use access_token::AccessToken; pub use client::Client; -pub use client_projects::ClientProjects; -pub use client_secrets::ClientSecrets; diff --git a/crates/bitwarden/src/commands/mod.rs b/crates/bitwarden/src/commands/mod.rs deleted file mode 100644 index 736f0ed9a5..0000000000 --- a/crates/bitwarden/src/commands/mod.rs +++ /dev/null @@ -1,13 +0,0 @@ -pub(crate) use generate_fingerprint::*; -pub(crate) use get_user_api_key::*; -pub(crate) use login::*; -pub(crate) use projects::*; -pub(crate) use secrets::*; -pub(crate) use sync::*; - -mod generate_fingerprint; -pub(crate) mod get_user_api_key; -mod login; -mod projects; -mod secrets; -mod sync; diff --git a/crates/bitwarden/src/commands/projects.rs b/crates/bitwarden/src/commands/projects.rs deleted file mode 100644 index 6f17aec0fe..0000000000 --- a/crates/bitwarden/src/commands/projects.rs +++ /dev/null @@ -1,119 +0,0 @@ -use bitwarden_api_api::models::{ProjectCreateRequestModel, ProjectUpdateRequestModel}; - -use crate::{ - client::Client, - error::{Error, Result}, - sdk::{ - request::projects_request::{ - ProjectCreateRequest, ProjectGetRequest, ProjectPutRequest, ProjectsDeleteRequest, - ProjectsListRequest, - }, - response::projects_response::{ProjectResponse, ProjectsDeleteResponse, ProjectsResponse}, - }, -}; - -pub(crate) async fn get_project( - client: &mut Client, - input: &ProjectGetRequest, -) -> Result { - let config = client.get_api_configurations().await; - - let res = bitwarden_api_api::apis::projects_api::projects_id_get(&config.api, input.id).await?; - - let enc = client - .get_encryption_settings() - .as_ref() - .ok_or(Error::VaultLocked)?; - - ProjectResponse::process_response(res, enc) -} - -pub(crate) async fn create_project( - client: &mut Client, - input: &ProjectCreateRequest, -) -> Result { - let enc = client - .get_encryption_settings() - .as_ref() - .ok_or(Error::VaultLocked)?; - - let org_id = Some(input.organization_id); - - let project = Some(ProjectCreateRequestModel { - name: enc.encrypt(input.name.as_bytes(), org_id)?.to_string(), - }); - - let config = client.get_api_configurations().await; - let res = bitwarden_api_api::apis::projects_api::organizations_organization_id_projects_post( - &config.api, - input.organization_id, - project, - ) - .await?; - - let enc = client - .get_encryption_settings() - .as_ref() - .ok_or(Error::VaultLocked)?; - - ProjectResponse::process_response(res, enc) -} - -pub(crate) async fn list_projects( - client: &mut Client, - input: &ProjectsListRequest, -) -> Result { - let config = client.get_api_configurations().await; - let res = bitwarden_api_api::apis::projects_api::organizations_organization_id_projects_get( - &config.api, - input.organization_id, - ) - .await?; - - let enc = client - .get_encryption_settings() - .as_ref() - .ok_or(Error::VaultLocked)?; - - ProjectsResponse::process_response(res, enc) -} - -pub(crate) async fn update_project( - client: &mut Client, - input: &ProjectPutRequest, -) -> Result { - let enc = client - .get_encryption_settings() - .as_ref() - .ok_or(Error::VaultLocked)?; - - let org_id = Some(input.organization_id); - - let project = Some(ProjectUpdateRequestModel { - name: enc.encrypt(input.name.as_bytes(), org_id)?.to_string(), - }); - - let config = client.get_api_configurations().await; - let res = - bitwarden_api_api::apis::projects_api::projects_id_put(&config.api, input.id, project) - .await?; - - let enc = client - .get_encryption_settings() - .as_ref() - .ok_or(Error::VaultLocked)?; - - ProjectResponse::process_response(res, enc) -} - -pub(crate) async fn delete_projects( - client: &mut Client, - input: ProjectsDeleteRequest, -) -> Result { - let config = client.get_api_configurations().await; - let res = - bitwarden_api_api::apis::projects_api::projects_delete_post(&config.api, Some(input.ids)) - .await?; - - ProjectsDeleteResponse::process_response(res) -} diff --git a/crates/bitwarden/src/commands/secrets.rs b/crates/bitwarden/src/commands/secrets.rs deleted file mode 100644 index 898015ca71..0000000000 --- a/crates/bitwarden/src/commands/secrets.rs +++ /dev/null @@ -1,144 +0,0 @@ -use bitwarden_api_api::models::{SecretCreateRequestModel, SecretUpdateRequestModel}; - -use crate::{ - client::Client, - error::{Error, Result}, - sdk::{ - request::secrets_request::{ - SecretCreateRequest, SecretGetRequest, SecretIdentifiersByProjectRequest, - SecretIdentifiersRequest, SecretPutRequest, SecretsDeleteRequest, - }, - response::secrets_response::{ - SecretIdentifiersResponse, SecretResponse, SecretsDeleteResponse, - }, - }, -}; - -pub(crate) async fn get_secret( - client: &mut Client, - input: &SecretGetRequest, -) -> Result { - let config = client.get_api_configurations().await; - let res = bitwarden_api_api::apis::secrets_api::secrets_id_get(&config.api, input.id).await?; - - let enc = client - .get_encryption_settings() - .as_ref() - .ok_or(Error::VaultLocked)?; - - SecretResponse::process_response(res, enc) -} - -pub(crate) async fn create_secret( - client: &mut Client, - input: &SecretCreateRequest, -) -> Result { - let enc = client - .get_encryption_settings() - .as_ref() - .ok_or(Error::VaultLocked)?; - - let org_id = Some(input.organization_id); - - let secret = Some(SecretCreateRequestModel { - key: enc.encrypt(input.key.as_bytes(), org_id)?.to_string(), - value: enc.encrypt(input.value.as_bytes(), org_id)?.to_string(), - note: enc.encrypt(input.note.as_bytes(), org_id)?.to_string(), - project_ids: input.project_ids.clone(), - }); - - let config = client.get_api_configurations().await; - let res = bitwarden_api_api::apis::secrets_api::organizations_organization_id_secrets_post( - &config.api, - input.organization_id, - secret, - ) - .await?; - - let enc = client - .get_encryption_settings() - .as_ref() - .ok_or(Error::VaultLocked)?; - - SecretResponse::process_response(res, enc) -} - -pub(crate) async fn list_secrets( - client: &mut Client, - input: &SecretIdentifiersRequest, -) -> Result { - let config = client.get_api_configurations().await; - let res = bitwarden_api_api::apis::secrets_api::organizations_organization_id_secrets_get( - &config.api, - input.organization_id, - ) - .await?; - - let enc = client - .get_encryption_settings() - .as_ref() - .ok_or(Error::VaultLocked)?; - - SecretIdentifiersResponse::process_response(res, enc) -} - -pub(crate) async fn list_secrets_by_project( - client: &mut Client, - input: &SecretIdentifiersByProjectRequest, -) -> Result { - let config = client.get_api_configurations().await; - let res = bitwarden_api_api::apis::secrets_api::projects_project_id_secrets_get( - &config.api, - input.project_id, - ) - .await?; - - let enc = client - .get_encryption_settings() - .as_ref() - .ok_or(Error::VaultLocked)?; - - SecretIdentifiersResponse::process_response(res, enc) -} - -pub(crate) async fn update_secret( - client: &mut Client, - input: &SecretPutRequest, -) -> Result { - let enc = client - .get_encryption_settings() - .as_ref() - .ok_or(Error::VaultLocked)?; - - let org_id = Some(input.organization_id); - - let secret = Some(SecretUpdateRequestModel { - key: enc.encrypt(input.key.as_bytes(), org_id)?.to_string(), - value: enc.encrypt(input.value.as_bytes(), org_id)?.to_string(), - note: enc.encrypt(input.note.as_bytes(), org_id)?.to_string(), - project_ids: None, - }); - - let config = client.get_api_configurations().await; - let res = - bitwarden_api_api::apis::secrets_api::secrets_id_put(&config.api, input.id, secret).await?; - - let enc = client - .get_encryption_settings() - .as_ref() - .ok_or(Error::VaultLocked)?; - - SecretResponse::process_response(res, enc) -} - -pub(crate) async fn delete_secrets( - client: &mut Client, - input: SecretsDeleteRequest, -) -> Result { - let config = client.get_api_configurations().await; - let res = - bitwarden_api_api::apis::secrets_api::secrets_delete_post(&config.api, Some(input.ids)) - .await?; - - SecretsDeleteResponse::process_response(res) -} diff --git a/crates/bitwarden/src/commands/sync.rs b/crates/bitwarden/src/commands/sync.rs deleted file mode 100644 index 49b0f6ddc6..0000000000 --- a/crates/bitwarden/src/commands/sync.rs +++ /dev/null @@ -1,27 +0,0 @@ -use crate::{ - client::Client, - error::{Error, Result}, - sdk::{request::sync_request::SyncRequest, response::sync_response::SyncResponse}, -}; - -#[allow(dead_code)] -pub(crate) async fn sync(client: &mut Client, input: &SyncRequest) -> Result { - let config = client.get_api_configurations().await; - let sync = - bitwarden_api_api::apis::sync_api::sync_get(&config.api, input.exclude_subdomains).await?; - - let org_keys: Vec<_> = sync - .profile - .as_ref() - .ok_or(Error::MissingFields)? - .organizations - .as_deref() - .unwrap_or_default() - .iter() - .filter_map(|o| o.id.zip(o.key.as_deref().and_then(|k| k.parse().ok()))) - .collect(); - - let enc = client.initialize_org_crypto(org_keys)?; - - SyncResponse::process_response(sync, enc) -} diff --git a/crates/bitwarden/src/crypto.rs b/crates/bitwarden/src/crypto.rs index 5f04c8a67b..f1607d1593 100644 --- a/crates/bitwarden/src/crypto.rs +++ b/crates/bitwarden/src/crypto.rs @@ -1,24 +1,26 @@ //! Cryptographic primitives used in the SDK -use std::{fmt::Display, num::NonZeroU32, str::FromStr}; +use std::{collections::HashMap, fmt::Display, hash::Hash, str::FromStr}; -use aes::cipher::{ - generic_array::GenericArray, - typenum::{U32, U64}, - Unsigned, -}; +use aes::cipher::{generic_array::GenericArray, typenum::U64, Unsigned}; use base64::Engine; use hmac::digest::OutputSizeUser; -use num_bigint::BigUint; -use num_traits::cast::ToPrimitive; use serde::{de::Visitor, Deserialize, Serialize}; -use sha2::{Digest, Sha256}; +use uuid::Uuid; -pub use crate::client::encryption_settings::{decrypt, encrypt_aes256, SymmetricCryptoKey}; use crate::{ + client::encryption_settings::{EncryptionSettings, SymmetricCryptoKey}, error::{CSParseError, Error, Result}, util::BASE64_ENGINE, - wordlist::EFF_LONG_WORD_LIST, +}; + +#[cfg(feature = "internal")] +use { + crate::{client::auth_settings::Kdf, wordlist::EFF_LONG_WORD_LIST}, + aes::cipher::typenum::U32, + num_bigint::BigUint, + num_traits::cast::ToPrimitive, + sha2::{Digest, Sha256}, }; #[allow(unused, non_camel_case_types)] @@ -236,25 +238,63 @@ pub(crate) type PbkdfSha256Hmac = hmac::Hmac; pub(crate) const PBKDF_SHA256_HMAC_OUT_SIZE: usize = <::OutputSize as Unsigned>::USIZE; +#[cfg(feature = "internal")] +pub(crate) fn hash_kdf(secret: &[u8], salt: &[u8], kdf: &Kdf) -> Result<[u8; 32]> { + let hash = match kdf { + Kdf::PBKDF2 { iterations } => pbkdf2::pbkdf2_array::< + PbkdfSha256Hmac, + PBKDF_SHA256_HMAC_OUT_SIZE, + >(secret, salt, iterations.get()) + .unwrap(), + + Kdf::Argon2id { + iterations, + memory, + parallelism, + } => { + use argon2::*; + + let argon = Argon2::new( + Algorithm::Argon2id, + Version::V0x13, + Params::new( + memory.get() * 1024, // Convert MiB to KiB + iterations.get(), + parallelism.get(), + Some(32), + ) + .unwrap(), + ); + + let salt_sha = sha2::Sha256::new().chain_update(salt).finalize(); + + let mut hash = [0u8; 32]; + argon + .hash_password_into(secret, &salt_sha, &mut hash) + .unwrap(); + hash + } + }; + Ok(hash) +} + +#[cfg(feature = "internal")] pub(crate) fn stretch_key_password( secret: &[u8], salt: &[u8], - iterations: NonZeroU32, -) -> Result<(GenericArray, GenericArray), hkdf::InvalidLength> { - let master_key = pbkdf2::pbkdf2_array::( - secret, - salt, - iterations.get(), - ) - .unwrap(); - - let hkdf = - hkdf::Hkdf::::from_prk(&master_key).map_err(|_| hkdf::InvalidLength)?; - - let mut key = GenericArray::default(); - hkdf.expand("enc".as_bytes(), &mut key)?; - let mut mac_key = GenericArray::default(); - hkdf.expand("mac".as_bytes(), &mut mac_key)?; + kdf: &Kdf, +) -> Result<(GenericArray, GenericArray)> { + let master_key: [u8; 32] = hash_kdf(secret, salt, kdf)?; + + let hkdf = hkdf::Hkdf::::from_prk(&master_key) + .expect("Input is a valid fixed size hash"); + + let mut key = GenericArray::::default(); + hkdf.expand("enc".as_bytes(), &mut key) + .expect("key is a valid fixed size buffer"); + let mut mac_key = GenericArray::::default(); + hkdf.expand("mac".as_bytes(), &mut mac_key) + .expect("mac_key is a valid fixed size buffer"); Ok((key, mac_key)) } @@ -282,6 +322,7 @@ pub(crate) fn stretch_key(secret: [u8; 16], name: &str, info: Option<&str>) -> S SymmetricCryptoKey::try_from(key.as_slice()).unwrap() } +#[cfg(feature = "internal")] pub(crate) fn fingerprint(fingerprint_material: &str, public_key: &[u8]) -> Result { let mut h = Sha256::new(); h.update(public_key); @@ -297,6 +338,7 @@ pub(crate) fn fingerprint(fingerprint_material: &str, public_key: &[u8]) -> Resu Ok(hash_word(user_fingerprint).unwrap()) } +#[cfg(feature = "internal")] fn hash_word(hash: [u8; 32]) -> Result { let minimum_entropy = 64; @@ -324,14 +366,93 @@ fn hash_word(hash: [u8; 32]) -> Result { Ok(phrase.join("-")) } -#[cfg(test)] -mod tests { - use std::num::NonZeroU32; +pub trait Encryptable { + fn encrypt(self, enc: &EncryptionSettings, org_id: &Option) -> Result; +} + +pub trait Decryptable { + fn decrypt(&self, enc: &EncryptionSettings, org_id: &Option) -> Result; +} + +impl Encryptable for String { + fn encrypt(self, enc: &EncryptionSettings, org_id: &Option) -> Result { + enc.encrypt(self.as_bytes(), org_id) + } +} + +impl Decryptable for CipherString { + fn decrypt(&self, enc: &EncryptionSettings, org_id: &Option) -> Result { + enc.decrypt(&self, org_id) + } +} + +impl, Output> Encryptable> for Option { + fn encrypt(self, enc: &EncryptionSettings, org_id: &Option) -> Result> { + self.map(|e| e.encrypt(enc, org_id)).transpose() + } +} + +impl, Output> Decryptable> for Option { + fn decrypt(&self, enc: &EncryptionSettings, org_id: &Option) -> Result> { + self.as_ref().map(|e| e.decrypt(enc, org_id)).transpose() + } +} + +impl, Output> Encryptable> for Vec { + fn encrypt(self, enc: &EncryptionSettings, org_id: &Option) -> Result> { + self.into_iter().map(|e| e.encrypt(enc, org_id)).collect() + } +} + +impl, Output> Decryptable> for Vec { + fn decrypt(&self, enc: &EncryptionSettings, org_id: &Option) -> Result> { + self.into_iter().map(|e| e.decrypt(enc, org_id)).collect() + } +} - use crate::crypto::{stretch_key_password, CipherString}; +impl, Output, Id: Hash + Eq> Encryptable> + for HashMap +{ + fn encrypt( + self, + enc: &EncryptionSettings, + org_id: &Option, + ) -> Result> { + self.into_iter() + .map(|(id, e)| Ok((id, e.encrypt(enc, org_id)?))) + .collect::>>() + } +} - use super::{fingerprint, stretch_key}; +impl, Output, Id: Hash + Eq + Copy> Decryptable> + for HashMap +{ + fn decrypt( + &self, + enc: &EncryptionSettings, + org_id: &Option, + ) -> Result> { + self.into_iter() + .map(|(id, e)| Ok((*id, e.decrypt(enc, org_id)?))) + .collect::>>() + } +} +#[cfg(test)] +mod tests { + use super::stretch_key; + + #[cfg(feature = "internal")] + use { + super::fingerprint, + crate::{ + client::auth_settings::Kdf, + crypto::{stretch_key_password, CipherString}, + }, + std::num::NonZeroU32, + }; + + #[cfg(feature = "internal")] #[test] fn test_cipher_string_serialization() { #[derive(serde::Serialize, serde::Deserialize)] @@ -355,11 +476,17 @@ mod tests { let key = stretch_key(*b"67t9b5g67$%Dh89n", "test_key", Some("test")); assert_eq!(key.to_base64(), "F9jVQmrACGx9VUPjuzfMYDjr726JtL300Y3Yg+VYUnVQtQ1s8oImJ5xtp1KALC9h2nav04++1LDW4iFD+infng=="); + } + #[cfg(feature = "internal")] + #[test] + fn test_key_stretch_password_pbkdf2() { let (key, mac) = stretch_key_password( &b"67t9b5g67$%Dh89n"[..], "test_key".as_bytes(), - NonZeroU32::new(10000).unwrap(), + &Kdf::PBKDF2 { + iterations: NonZeroU32::new(10000).unwrap(), + }, ) .unwrap(); @@ -379,6 +506,37 @@ mod tests { ); } + #[cfg(feature = "internal")] + #[test] + fn test_key_stretch_password_argon2() { + let (key, mac) = stretch_key_password( + &b"67t9b5g67$%Dh89n"[..], + "test_key".as_bytes(), + &Kdf::Argon2id { + iterations: NonZeroU32::new(4).unwrap(), + memory: NonZeroU32::new(32).unwrap(), + parallelism: NonZeroU32::new(2).unwrap(), + }, + ) + .unwrap(); + + assert_eq!( + key.as_slice(), + [ + 236, 253, 166, 121, 207, 124, 98, 149, 42, 141, 97, 226, 207, 71, 173, 60, 10, 0, + 184, 255, 252, 87, 62, 32, 188, 166, 173, 223, 146, 159, 222, 219 + ] + ); + assert_eq!( + mac.as_slice(), + [ + 214, 144, 76, 173, 225, 106, 132, 131, 173, 56, 134, 241, 223, 227, 165, 161, 146, + 37, 111, 206, 155, 24, 224, 151, 134, 189, 202, 0, 27, 149, 131, 21 + ] + ); + } + + #[cfg(feature = "internal")] #[test] fn test_fingerprint() { let user_id = "a09726a0-9590-49d1-a5f5-afe300b6a515"; diff --git a/crates/bitwarden/src/error.rs b/crates/bitwarden/src/error.rs index 09554d442d..98f1fce2d9 100644 --- a/crates/bitwarden/src/error.rs +++ b/crates/bitwarden/src/error.rs @@ -2,11 +2,10 @@ use std::fmt::Debug; -use reqwest::StatusCode; -use thiserror::Error; - use bitwarden_api_api::apis::Error as ApiError; use bitwarden_api_identity::apis::Error as IdentityError; +use reqwest::StatusCode; +use thiserror::Error; #[derive(Debug, Error)] pub enum Error { @@ -31,7 +30,7 @@ pub enum Error { InvalidCipherString(#[from] CSParseError), #[error("Error parsing Identity response: {0}")] - IdentityFail(crate::api::response::IdentityTokenFailResponse), + IdentityFail(crate::auth::api::response::IdentityTokenFailResponse), #[error(transparent)] Reqwest(#[from] reqwest::Error), @@ -69,8 +68,6 @@ pub enum AccessTokenInvalidError { #[derive(Debug, Error)] pub enum CryptoError { - #[error("Error stretching key")] - KeyStretch, #[error("The provided key is not the expected type")] InvalidKey, #[error("The cipher's MAC doesn't match the expected value")] diff --git a/crates/bitwarden/src/lib.rs b/crates/bitwarden/src/lib.rs index b84e4fc454..018cd6d4f5 100644 --- a/crates/bitwarden/src/lib.rs +++ b/crates/bitwarden/src/lib.rs @@ -16,17 +16,12 @@ //! //! ```rust //! use bitwarden::{ -//! Client, +//! auth::request::AccessTokenLoginRequest, +//! client::client_settings::{ClientSettings, DeviceType}, //! error::Result, -//! sdk::{ -//! auth::request::AccessTokenLoginRequest, -//! request::{ -//! client_settings::{ClientSettings, DeviceType}, -//! secrets_request::SecretIdentifiersRequest -//! }, -//! }, +//! secrets_manager::secrets::SecretIdentifiersRequest, +//! Client, //! }; -//! //! use uuid::Uuid; //! //! async fn test() -> Result<()> { @@ -54,12 +49,13 @@ //! ``` //! -mod api; +pub mod auth; pub mod client; -mod commands; pub mod crypto; pub mod error; -pub mod sdk; +#[cfg(feature = "internal")] +pub mod platform; +pub mod secrets_manager; mod util; pub mod wordlist; diff --git a/crates/bitwarden/src/platform/generate_fingerprint.rs b/crates/bitwarden/src/platform/generate_fingerprint.rs new file mode 100644 index 0000000000..9f6d5f2813 --- /dev/null +++ b/crates/bitwarden/src/platform/generate_fingerprint.rs @@ -0,0 +1,29 @@ +use log::{debug, info}; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +use crate::{crypto::fingerprint, error::Result}; + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct FingerprintRequest { + /// The input material, used in the fingerprint generation process. + pub fingerprint_material: String, + /// The user's public key encoded with base64. + pub public_key: String, +} + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct FingerprintResponse { + pub fingerprint: String, +} + +pub(crate) fn generate_fingerprint(input: &FingerprintRequest) -> Result { + info!("Generating fingerprint"); + debug!("{:?}", input); + + Ok(FingerprintResponse { + fingerprint: fingerprint(&input.fingerprint_material, input.public_key.as_bytes())?, + }) +} diff --git a/crates/bitwarden/src/commands/get_user_api_key.rs b/crates/bitwarden/src/platform/get_user_api_key.rs similarity index 57% rename from crates/bitwarden/src/commands/get_user_api_key.rs rename to crates/bitwarden/src/platform/get_user_api_key.rs index f1e6c79f03..98035ad45a 100644 --- a/crates/bitwarden/src/commands/get_user_api_key.rs +++ b/crates/bitwarden/src/platform/get_user_api_key.rs @@ -1,19 +1,18 @@ use bitwarden_api_api::{ - apis::accounts_api::accounts_api_key_post, models::SecretVerificationRequestModel, + apis::accounts_api::accounts_api_key_post, + models::{ApiKeyResponseModel, SecretVerificationRequestModel}, }; use log::{debug, info}; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use super::SecretVerificationRequest; use crate::{ client::auth_settings::AuthSettings, error::{Error, Result}, - sdk::{ - request::secret_verification_request::SecretVerificationRequest, - response::user_api_key_response::UserApiKeyResponse, - }, Client, }; -#[allow(dead_code)] pub(crate) async fn get_user_api_key( client: &mut Client, input: &SecretVerificationRequest, @@ -22,7 +21,7 @@ pub(crate) async fn get_user_api_key( debug!("{:?}", input); let auth_settings = get_auth_settings(client)?; - let request = get_secret_verification_request(auth_settings, input); + let request = get_secret_verification_request(auth_settings, input)?; let config = client.get_api_configurations().await; @@ -45,15 +44,32 @@ fn get_auth_settings(client: &Client) -> Result<&AuthSettings> { fn get_secret_verification_request( auth_settings: &AuthSettings, input: &SecretVerificationRequest, -) -> SecretVerificationRequestModel { +) -> Result { let master_password_hash = input .master_password .as_ref() - .map(|p| auth_settings.make_user_password_hash(p)); - SecretVerificationRequestModel { + .map(|p| auth_settings.make_user_password_hash(p)) + .transpose()?; + Ok(SecretVerificationRequestModel { master_password_hash, otp: input.otp.as_ref().cloned(), secret: None, auth_request_access_code: None, + }) +} + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct UserApiKeyResponse { + /// The user's API key, which represents the client_secret portion of an oauth request. + api_key: String, +} + +impl UserApiKeyResponse { + pub(crate) fn process_response(response: ApiKeyResponseModel) -> Result { + match response.api_key { + Some(api_key) => Ok(UserApiKeyResponse { api_key }), + None => Err(Error::MissingFields), + } } } diff --git a/crates/bitwarden/src/platform/mod.rs b/crates/bitwarden/src/platform/mod.rs new file mode 100644 index 0000000000..0224e8d3a8 --- /dev/null +++ b/crates/bitwarden/src/platform/mod.rs @@ -0,0 +1,12 @@ +mod generate_fingerprint; +mod get_user_api_key; +mod secret_verification_request; +mod sync; + +pub(crate) use generate_fingerprint::generate_fingerprint; +pub use generate_fingerprint::{FingerprintRequest, FingerprintResponse}; +pub(crate) use get_user_api_key::get_user_api_key; +pub use get_user_api_key::UserApiKeyResponse; +pub use secret_verification_request::SecretVerificationRequest; +pub(crate) use sync::sync; +pub use sync::{SyncRequest, SyncResponse}; diff --git a/crates/bitwarden/src/sdk/request/secret_verification_request.rs b/crates/bitwarden/src/platform/secret_verification_request.rs similarity index 100% rename from crates/bitwarden/src/sdk/request/secret_verification_request.rs rename to crates/bitwarden/src/platform/secret_verification_request.rs diff --git a/crates/bitwarden/src/sdk/response/sync_response.rs b/crates/bitwarden/src/platform/sync.rs similarity index 75% rename from crates/bitwarden/src/sdk/response/sync_response.rs rename to crates/bitwarden/src/platform/sync.rs index 6162f5d337..fd33e4343a 100644 --- a/crates/bitwarden/src/sdk/response/sync_response.rs +++ b/crates/bitwarden/src/platform/sync.rs @@ -7,10 +7,38 @@ use serde::{Deserialize, Serialize}; use uuid::Uuid; use crate::{ - client::encryption_settings::EncryptionSettings, + client::{encryption_settings::EncryptionSettings, Client}, error::{Error, Result}, }; +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct SyncRequest { + /// Exclude the subdomains from the response, defaults to false + pub exclude_subdomains: Option, +} + +pub(crate) async fn sync(client: &mut Client, input: &SyncRequest) -> Result { + let config = client.get_api_configurations().await; + let sync = + bitwarden_api_api::apis::sync_api::sync_get(&config.api, input.exclude_subdomains).await?; + + let org_keys: Vec<_> = sync + .profile + .as_ref() + .ok_or(Error::MissingFields)? + .organizations + .as_deref() + .unwrap_or_default() + .iter() + .filter_map(|o| o.id.zip(o.key.as_deref().and_then(|k| k.parse().ok()))) + .collect(); + + let enc = client.initialize_org_crypto(org_keys)?; + + SyncResponse::process_response(sync, enc) +} + #[derive(Serialize, Deserialize, Debug, JsonSchema)] #[serde(rename_all = "camelCase", deny_unknown_fields)] pub struct ProfileResponse { diff --git a/crates/bitwarden/src/sdk/auth/mod.rs b/crates/bitwarden/src/sdk/auth/mod.rs deleted file mode 100644 index e0062185c4..0000000000 --- a/crates/bitwarden/src/sdk/auth/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod request; -pub mod response; diff --git a/crates/bitwarden/src/sdk/mod.rs b/crates/bitwarden/src/sdk/mod.rs deleted file mode 100644 index 2d9ad73aa7..0000000000 --- a/crates/bitwarden/src/sdk/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod auth; -pub mod request; -pub mod response; diff --git a/crates/bitwarden/src/sdk/request/fingerprint_request.rs b/crates/bitwarden/src/sdk/request/fingerprint_request.rs deleted file mode 100644 index 54930d0f65..0000000000 --- a/crates/bitwarden/src/sdk/request/fingerprint_request.rs +++ /dev/null @@ -1,11 +0,0 @@ -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct FingerprintRequest { - /// The input material, used in the fingerprint generation process. - pub fingerprint_material: String, - /// The user's public key encoded with base64. - pub public_key: String, -} diff --git a/crates/bitwarden/src/sdk/request/mod.rs b/crates/bitwarden/src/sdk/request/mod.rs deleted file mode 100644 index 94efa4ccb7..0000000000 --- a/crates/bitwarden/src/sdk/request/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -pub mod client_settings; -pub mod command; -pub mod fingerprint_request; -pub mod projects_request; -pub mod secret_verification_request; -pub mod secrets_request; -pub mod sync_request; diff --git a/crates/bitwarden/src/sdk/request/projects_request.rs b/crates/bitwarden/src/sdk/request/projects_request.rs deleted file mode 100644 index 6f78d064e6..0000000000 --- a/crates/bitwarden/src/sdk/request/projects_request.rs +++ /dev/null @@ -1,44 +0,0 @@ -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct ProjectGetRequest { - /// ID of the project to retrieve - pub id: Uuid, -} - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct ProjectCreateRequest { - /// Organization where the project will be created - pub organization_id: Uuid, - - pub name: String, -} - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct ProjectPutRequest { - /// ID of the project to modify - pub id: Uuid, - /// Organization ID of the project to modify - pub organization_id: Uuid, - - pub name: String, -} - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct ProjectsListRequest { - /// Organization to retrieve all the projects from - pub organization_id: Uuid, -} - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct ProjectsDeleteRequest { - /// IDs of the projects to delete - pub ids: Vec, -} diff --git a/crates/bitwarden/src/sdk/request/secrets_request.rs b/crates/bitwarden/src/sdk/request/secrets_request.rs deleted file mode 100644 index 846a456839..0000000000 --- a/crates/bitwarden/src/sdk/request/secrets_request.rs +++ /dev/null @@ -1,58 +0,0 @@ -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct SecretGetRequest { - /// ID of the secret to retrieve - pub id: Uuid, -} - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct SecretCreateRequest { - /// Organization where the secret will be created - pub organization_id: Uuid, - - pub key: String, - pub value: String, - pub note: String, - - /// IDs of the projects that this secret will belong to - pub project_ids: Option>, -} - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct SecretPutRequest { - /// ID of the secret to modify - pub id: Uuid, - /// Organization ID of the secret to modify - pub organization_id: Uuid, - - pub key: String, - pub value: String, - pub note: String, -} - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct SecretIdentifiersRequest { - /// Organization to retrieve all the secrets from - pub organization_id: Uuid, -} - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct SecretIdentifiersByProjectRequest { - /// Project to retrieve all the secrets from - pub project_id: Uuid, -} - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct SecretsDeleteRequest { - /// IDs of the secrets to delete - pub ids: Vec, -} diff --git a/crates/bitwarden/src/sdk/request/sync_request.rs b/crates/bitwarden/src/sdk/request/sync_request.rs deleted file mode 100644 index 2408ff5b9c..0000000000 --- a/crates/bitwarden/src/sdk/request/sync_request.rs +++ /dev/null @@ -1,9 +0,0 @@ -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct SyncRequest { - /// Exclude the subdomains from the response, defaults to false - pub exclude_subdomains: Option, -} diff --git a/crates/bitwarden/src/sdk/response/fingerprint_response.rs b/crates/bitwarden/src/sdk/response/fingerprint_response.rs deleted file mode 100644 index c70a96c5f9..0000000000 --- a/crates/bitwarden/src/sdk/response/fingerprint_response.rs +++ /dev/null @@ -1,8 +0,0 @@ -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct FingerprintResponse { - pub fingerprint: String, -} diff --git a/crates/bitwarden/src/sdk/response/mod.rs b/crates/bitwarden/src/sdk/response/mod.rs deleted file mode 100644 index 9c300f7da0..0000000000 --- a/crates/bitwarden/src/sdk/response/mod.rs +++ /dev/null @@ -1,6 +0,0 @@ -pub mod captcha_response; -pub mod fingerprint_response; -pub mod projects_response; -pub mod secrets_response; -pub mod sync_response; -pub mod user_api_key_response; diff --git a/crates/bitwarden/src/sdk/response/projects_response.rs b/crates/bitwarden/src/sdk/response/projects_response.rs deleted file mode 100644 index 380b904e55..0000000000 --- a/crates/bitwarden/src/sdk/response/projects_response.rs +++ /dev/null @@ -1,109 +0,0 @@ -use bitwarden_api_api::models::{ - BulkDeleteResponseModel, BulkDeleteResponseModelListResponseModel, ProjectResponseModel, - ProjectResponseModelListResponseModel, -}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -use crate::{ - client::encryption_settings::EncryptionSettings, - error::{Error, Result}, -}; - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct ProjectResponse { - pub object: String, - pub id: Uuid, - pub organization_id: Uuid, - pub name: String, - pub creation_date: String, - pub revision_date: String, -} - -impl ProjectResponse { - pub(crate) fn process_response( - response: ProjectResponseModel, - enc: &EncryptionSettings, - ) -> Result { - let organization_id = response.organization_id.ok_or(Error::MissingFields)?; - - let name = enc.decrypt_str( - &response.name.ok_or(Error::MissingFields)?, - Some(organization_id), - )?; - - Ok(ProjectResponse { - object: "project".to_owned(), - - id: response.id.ok_or(Error::MissingFields)?, - organization_id, - name, - - creation_date: response.creation_date.ok_or(Error::MissingFields)?, - revision_date: response.revision_date.ok_or(Error::MissingFields)?, - }) - } -} - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct ProjectsResponse { - pub data: Vec, -} - -impl ProjectsResponse { - pub(crate) fn process_response( - response: ProjectResponseModelListResponseModel, - enc: &EncryptionSettings, - ) -> Result { - let data = response.data.unwrap_or_default(); - - Ok(ProjectsResponse { - data: data - .into_iter() - .map(|r| ProjectResponse::process_response(r, enc)) - .collect::>()?, - }) - } -} - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct ProjectsDeleteResponse { - pub data: Vec, -} - -impl ProjectsDeleteResponse { - pub(crate) fn process_response( - response: BulkDeleteResponseModelListResponseModel, - ) -> Result { - Ok(ProjectsDeleteResponse { - data: response - .data - .unwrap_or_default() - .into_iter() - .map(ProjectDeleteResponse::process_response) - .collect::>()?, - }) - } -} - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct ProjectDeleteResponse { - pub id: Uuid, - pub error: Option, -} - -impl ProjectDeleteResponse { - pub(crate) fn process_response( - response: BulkDeleteResponseModel, - ) -> Result { - Ok(ProjectDeleteResponse { - id: response.id.ok_or(Error::MissingFields)?, - error: response.error, - }) - } -} diff --git a/crates/bitwarden/src/sdk/response/secrets_response.rs b/crates/bitwarden/src/sdk/response/secrets_response.rs deleted file mode 100644 index 72e7bb1149..0000000000 --- a/crates/bitwarden/src/sdk/response/secrets_response.rs +++ /dev/null @@ -1,149 +0,0 @@ -use bitwarden_api_api::models::{ - BulkDeleteResponseModel, BulkDeleteResponseModelListResponseModel, SecretResponseModel, - SecretWithProjectsListResponseModel, SecretsWithProjectsInnerSecret, -}; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -use crate::{ - client::encryption_settings::EncryptionSettings, - error::{Error, Result}, -}; - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct SecretResponse { - pub object: String, - pub id: Uuid, - pub organization_id: Uuid, - pub project_id: Option, - - pub key: String, - pub value: String, - pub note: String, - - pub creation_date: String, - pub revision_date: String, -} - -impl SecretResponse { - pub(crate) fn process_response( - response: SecretResponseModel, - enc: &EncryptionSettings, - ) -> Result { - let org_id = response.organization_id; - - let key = enc.decrypt_str(&response.key.ok_or(Error::MissingFields)?, org_id)?; - let value = enc.decrypt_str(&response.value.ok_or(Error::MissingFields)?, org_id)?; - let note = enc.decrypt_str(&response.note.ok_or(Error::MissingFields)?, org_id)?; - - let project = response - .projects - .and_then(|p| p.into_iter().next()) - .and_then(|p| p.id); - - Ok(SecretResponse { - object: "secret".to_owned(), - id: response.id.ok_or(Error::MissingFields)?, - organization_id: org_id.ok_or(Error::MissingFields)?, - project_id: project, - key, - value, - note, - - creation_date: response.creation_date.ok_or(Error::MissingFields)?, - revision_date: response.revision_date.ok_or(Error::MissingFields)?, - }) - } -} - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct SecretIdentifiersResponse { - pub data: Vec, -} - -impl SecretIdentifiersResponse { - pub(crate) fn process_response( - response: SecretWithProjectsListResponseModel, - enc: &EncryptionSettings, - ) -> Result { - Ok(SecretIdentifiersResponse { - data: response - .secrets - .unwrap_or_default() - .into_iter() - .map(|r| SecretIdentifierResponse::process_response(r, enc)) - .collect::>()?, - }) - } -} - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct SecretIdentifierResponse { - pub id: Uuid, - pub organization_id: Uuid, - - pub key: String, -} - -impl SecretIdentifierResponse { - pub(crate) fn process_response( - response: SecretsWithProjectsInnerSecret, - enc: &EncryptionSettings, - ) -> Result { - let organization_id = response.organization_id.ok_or(Error::MissingFields)?; - - let key = enc.decrypt_str( - &response.key.ok_or(Error::MissingFields)?, - Some(organization_id), - )?; - - Ok(SecretIdentifierResponse { - id: response.id.ok_or(Error::MissingFields)?, - organization_id, - key, - }) - } -} - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct SecretsDeleteResponse { - pub data: Vec, -} - -impl SecretsDeleteResponse { - pub(crate) fn process_response( - response: BulkDeleteResponseModelListResponseModel, - ) -> Result { - Ok(SecretsDeleteResponse { - data: response - .data - .unwrap_or_default() - .into_iter() - .map(SecretDeleteResponse::process_response) - .collect::>()?, - }) - } -} - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct SecretDeleteResponse { - pub id: Uuid, - pub error: Option, -} - -impl SecretDeleteResponse { - pub(crate) fn process_response( - response: BulkDeleteResponseModel, - ) -> Result { - Ok(SecretDeleteResponse { - id: response.id.ok_or(Error::MissingFields)?, - error: response.error, - }) - } -} diff --git a/crates/bitwarden/src/sdk/response/user_api_key_response.rs b/crates/bitwarden/src/sdk/response/user_api_key_response.rs deleted file mode 100644 index 4f0d074116..0000000000 --- a/crates/bitwarden/src/sdk/response/user_api_key_response.rs +++ /dev/null @@ -1,21 +0,0 @@ -use bitwarden_api_api::models::ApiKeyResponseModel; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; - -use crate::error::{Error, Result}; - -#[derive(Serialize, Deserialize, Debug, JsonSchema)] -#[serde(rename_all = "camelCase", deny_unknown_fields)] -pub struct UserApiKeyResponse { - /// The user's API key, which represents the client_secret portion of an oauth request. - api_key: String, -} - -impl UserApiKeyResponse { - pub(crate) fn process_response(response: ApiKeyResponseModel) -> Result { - match response.api_key { - Some(api_key) => Ok(UserApiKeyResponse { api_key }), - None => Err(Error::MissingFields), - } - } -} diff --git a/crates/bitwarden/src/client/client_projects.rs b/crates/bitwarden/src/secrets_manager/client_projects.rs similarity index 67% rename from crates/bitwarden/src/client/client_projects.rs rename to crates/bitwarden/src/secrets_manager/client_projects.rs index 4be6e7ad97..acd4adfaee 100644 --- a/crates/bitwarden/src/client/client_projects.rs +++ b/crates/bitwarden/src/secrets_manager/client_projects.rs @@ -1,13 +1,11 @@ use crate::{ - commands::{create_project, delete_projects, get_project, list_projects, update_project}, error::Result, - sdk::{ - request::projects_request::{ - ProjectCreateRequest, ProjectGetRequest, ProjectPutRequest, ProjectsDeleteRequest, - ProjectsListRequest, - }, - response::projects_response::{ProjectResponse, ProjectsDeleteResponse, ProjectsResponse}, + secrets_manager::projects::{ + create_project, delete_projects, get_project, list_projects, update_project, + ProjectCreateRequest, ProjectGetRequest, ProjectPutRequest, ProjectResponse, + ProjectsDeleteRequest, ProjectsDeleteResponse, ProjectsListRequest, ProjectsResponse, }, + Client, }; pub struct ClientProjects<'a> { @@ -35,3 +33,9 @@ impl<'a> ClientProjects<'a> { delete_projects(self.client, input).await } } + +impl<'a> Client { + pub fn projects(&'a mut self) -> ClientProjects<'a> { + ClientProjects { client: self } + } +} diff --git a/crates/bitwarden/src/client/client_secrets.rs b/crates/bitwarden/src/secrets_manager/client_secrets.rs similarity index 74% rename from crates/bitwarden/src/client/client_secrets.rs rename to crates/bitwarden/src/secrets_manager/client_secrets.rs index 158c87c569..2974e067a7 100644 --- a/crates/bitwarden/src/client/client_secrets.rs +++ b/crates/bitwarden/src/secrets_manager/client_secrets.rs @@ -1,18 +1,12 @@ use crate::{ - commands::{ - create_secret, delete_secrets, get_secret, list_secrets, list_secrets_by_project, - update_secret, - }, error::Result, - sdk::{ - request::secrets_request::{ - SecretCreateRequest, SecretGetRequest, SecretIdentifiersByProjectRequest, - SecretIdentifiersRequest, SecretPutRequest, SecretsDeleteRequest, - }, - response::secrets_response::{ - SecretIdentifiersResponse, SecretResponse, SecretsDeleteResponse, - }, + secrets_manager::secrets::{ + create_secret, delete_secrets, get_secret, list_secrets, list_secrets_by_project, + update_secret, SecretCreateRequest, SecretGetRequest, SecretIdentifiersByProjectRequest, + SecretIdentifiersRequest, SecretIdentifiersResponse, SecretPutRequest, SecretResponse, + SecretsDeleteRequest, SecretsDeleteResponse, }, + Client, }; pub struct ClientSecrets<'a> { @@ -50,3 +44,9 @@ impl<'a> ClientSecrets<'a> { delete_secrets(self.client, input).await } } + +impl<'a> Client { + pub fn secrets(&'a mut self) -> ClientSecrets<'a> { + ClientSecrets { client: self } + } +} diff --git a/crates/bitwarden/src/secrets_manager/mod.rs b/crates/bitwarden/src/secrets_manager/mod.rs new file mode 100644 index 0000000000..0afbfe38c9 --- /dev/null +++ b/crates/bitwarden/src/secrets_manager/mod.rs @@ -0,0 +1,5 @@ +pub mod projects; +pub mod secrets; + +mod client_projects; +mod client_secrets; diff --git a/crates/bitwarden/src/secrets_manager/projects/create.rs b/crates/bitwarden/src/secrets_manager/projects/create.rs new file mode 100644 index 0000000000..35f33ff973 --- /dev/null +++ b/crates/bitwarden/src/secrets_manager/projects/create.rs @@ -0,0 +1,50 @@ +use bitwarden_api_api::models::ProjectCreateRequestModel; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use super::ProjectResponse; +use crate::{ + client::Client, + error::{Error, Result}, +}; + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct ProjectCreateRequest { + /// Organization where the project will be created + pub organization_id: Uuid, + + pub name: String, +} + +pub(crate) async fn create_project( + client: &mut Client, + input: &ProjectCreateRequest, +) -> Result { + let enc = client + .get_encryption_settings() + .as_ref() + .ok_or(Error::VaultLocked)?; + + let org_id = Some(input.organization_id); + + let project = Some(ProjectCreateRequestModel { + name: enc.encrypt(input.name.as_bytes(), &org_id)?.to_string(), + }); + + let config = client.get_api_configurations().await; + let res = bitwarden_api_api::apis::projects_api::organizations_organization_id_projects_post( + &config.api, + input.organization_id, + project, + ) + .await?; + + let enc = client + .get_encryption_settings() + .as_ref() + .ok_or(Error::VaultLocked)?; + + ProjectResponse::process_response(res, enc) +} diff --git a/crates/bitwarden/src/secrets_manager/projects/delete.rs b/crates/bitwarden/src/secrets_manager/projects/delete.rs new file mode 100644 index 0000000000..55f7926693 --- /dev/null +++ b/crates/bitwarden/src/secrets_manager/projects/delete.rs @@ -0,0 +1,69 @@ +use bitwarden_api_api::models::{ + BulkDeleteResponseModel, BulkDeleteResponseModelListResponseModel, +}; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use crate::{ + client::Client, + error::{Error, Result}, +}; + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct ProjectsDeleteRequest { + /// IDs of the projects to delete + pub ids: Vec, +} + +pub(crate) async fn delete_projects( + client: &mut Client, + input: ProjectsDeleteRequest, +) -> Result { + let config = client.get_api_configurations().await; + let res = + bitwarden_api_api::apis::projects_api::projects_delete_post(&config.api, Some(input.ids)) + .await?; + + ProjectsDeleteResponse::process_response(res) +} + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct ProjectsDeleteResponse { + pub data: Vec, +} + +impl ProjectsDeleteResponse { + pub(crate) fn process_response( + response: BulkDeleteResponseModelListResponseModel, + ) -> Result { + Ok(ProjectsDeleteResponse { + data: response + .data + .unwrap_or_default() + .into_iter() + .map(ProjectDeleteResponse::process_response) + .collect::>()?, + }) + } +} + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct ProjectDeleteResponse { + pub id: Uuid, + pub error: Option, +} + +impl ProjectDeleteResponse { + pub(crate) fn process_response( + response: BulkDeleteResponseModel, + ) -> Result { + Ok(ProjectDeleteResponse { + id: response.id.ok_or(Error::MissingFields)?, + error: response.error, + }) + } +} diff --git a/crates/bitwarden/src/secrets_manager/projects/get.rs b/crates/bitwarden/src/secrets_manager/projects/get.rs new file mode 100644 index 0000000000..9601cbc19d --- /dev/null +++ b/crates/bitwarden/src/secrets_manager/projects/get.rs @@ -0,0 +1,32 @@ +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use super::ProjectResponse; +use crate::{ + client::Client, + error::{Error, Result}, +}; + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct ProjectGetRequest { + /// ID of the project to retrieve + pub id: Uuid, +} + +pub(crate) async fn get_project( + client: &mut Client, + input: &ProjectGetRequest, +) -> Result { + let config = client.get_api_configurations().await; + + let res = bitwarden_api_api::apis::projects_api::projects_id_get(&config.api, input.id).await?; + + let enc = client + .get_encryption_settings() + .as_ref() + .ok_or(Error::VaultLocked)?; + + ProjectResponse::process_response(res, enc) +} diff --git a/crates/bitwarden/src/secrets_manager/projects/list.rs b/crates/bitwarden/src/secrets_manager/projects/list.rs new file mode 100644 index 0000000000..9bdeb1f196 --- /dev/null +++ b/crates/bitwarden/src/secrets_manager/projects/list.rs @@ -0,0 +1,58 @@ +use bitwarden_api_api::models::ProjectResponseModelListResponseModel; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use super::ProjectResponse; +use crate::{ + client::{encryption_settings::EncryptionSettings, Client}, + error::{Error, Result}, +}; + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct ProjectsListRequest { + /// Organization to retrieve all the projects from + pub organization_id: Uuid, +} + +pub(crate) async fn list_projects( + client: &mut Client, + input: &ProjectsListRequest, +) -> Result { + let config = client.get_api_configurations().await; + let res = bitwarden_api_api::apis::projects_api::organizations_organization_id_projects_get( + &config.api, + input.organization_id, + ) + .await?; + + let enc = client + .get_encryption_settings() + .as_ref() + .ok_or(Error::VaultLocked)?; + + ProjectsResponse::process_response(res, enc) +} + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct ProjectsResponse { + pub data: Vec, +} + +impl ProjectsResponse { + pub(crate) fn process_response( + response: ProjectResponseModelListResponseModel, + enc: &EncryptionSettings, + ) -> Result { + let data = response.data.unwrap_or_default(); + + Ok(ProjectsResponse { + data: data + .into_iter() + .map(|r| ProjectResponse::process_response(r, enc)) + .collect::>()?, + }) + } +} diff --git a/crates/bitwarden/src/secrets_manager/projects/mod.rs b/crates/bitwarden/src/secrets_manager/projects/mod.rs new file mode 100644 index 0000000000..20ae5d95b8 --- /dev/null +++ b/crates/bitwarden/src/secrets_manager/projects/mod.rs @@ -0,0 +1,18 @@ +mod create; +mod delete; +mod get; +mod list; +mod project_response; +mod update; + +pub(crate) use create::create_project; +pub use create::ProjectCreateRequest; +pub(crate) use delete::delete_projects; +pub use delete::{ProjectsDeleteRequest, ProjectsDeleteResponse}; +pub(crate) use get::get_project; +pub use get::ProjectGetRequest; +pub(crate) use list::list_projects; +pub use list::{ProjectsListRequest, ProjectsResponse}; +pub use project_response::ProjectResponse; +pub(crate) use update::update_project; +pub use update::ProjectPutRequest; diff --git a/crates/bitwarden/src/secrets_manager/projects/project_response.rs b/crates/bitwarden/src/secrets_manager/projects/project_response.rs new file mode 100644 index 0000000000..5485d012b1 --- /dev/null +++ b/crates/bitwarden/src/secrets_manager/projects/project_response.rs @@ -0,0 +1,47 @@ +use bitwarden_api_api::models::ProjectResponseModel; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use crate::{ + client::encryption_settings::EncryptionSettings, + crypto::{CipherString, Decryptable}, + error::{Error, Result}, +}; + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct ProjectResponse { + pub object: String, + pub id: Uuid, + pub organization_id: Uuid, + pub name: String, + pub creation_date: String, + pub revision_date: String, +} + +impl ProjectResponse { + pub(crate) fn process_response( + response: ProjectResponseModel, + enc: &EncryptionSettings, + ) -> Result { + let organization_id = response.organization_id.ok_or(Error::MissingFields)?; + + let name = response + .name + .ok_or(Error::MissingFields)? + .parse::()? + .decrypt(enc, &Some(organization_id))?; + + Ok(ProjectResponse { + object: "project".to_owned(), + + id: response.id.ok_or(Error::MissingFields)?, + organization_id, + name, + + creation_date: response.creation_date.ok_or(Error::MissingFields)?, + revision_date: response.revision_date.ok_or(Error::MissingFields)?, + }) + } +} diff --git a/crates/bitwarden/src/secrets_manager/projects/update.rs b/crates/bitwarden/src/secrets_manager/projects/update.rs new file mode 100644 index 0000000000..eee84cac6c --- /dev/null +++ b/crates/bitwarden/src/secrets_manager/projects/update.rs @@ -0,0 +1,49 @@ +use bitwarden_api_api::models::ProjectUpdateRequestModel; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use super::ProjectResponse; +use crate::{ + client::Client, + error::{Error, Result}, +}; + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct ProjectPutRequest { + /// ID of the project to modify + pub id: Uuid, + /// Organization ID of the project to modify + pub organization_id: Uuid, + + pub name: String, +} + +pub(crate) async fn update_project( + client: &mut Client, + input: &ProjectPutRequest, +) -> Result { + let enc = client + .get_encryption_settings() + .as_ref() + .ok_or(Error::VaultLocked)?; + + let org_id = Some(input.organization_id); + + let project = Some(ProjectUpdateRequestModel { + name: enc.encrypt(input.name.as_bytes(), &org_id)?.to_string(), + }); + + let config = client.get_api_configurations().await; + let res = + bitwarden_api_api::apis::projects_api::projects_id_put(&config.api, input.id, project) + .await?; + + let enc = client + .get_encryption_settings() + .as_ref() + .ok_or(Error::VaultLocked)?; + + ProjectResponse::process_response(res, enc) +} diff --git a/crates/bitwarden/src/secrets_manager/secrets/create.rs b/crates/bitwarden/src/secrets_manager/secrets/create.rs new file mode 100644 index 0000000000..bcecaeee32 --- /dev/null +++ b/crates/bitwarden/src/secrets_manager/secrets/create.rs @@ -0,0 +1,58 @@ +use bitwarden_api_api::models::SecretCreateRequestModel; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use super::SecretResponse; +use crate::{ + error::{Error, Result}, + Client, +}; + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct SecretCreateRequest { + /// Organization where the secret will be created + pub organization_id: Uuid, + + pub key: String, + pub value: String, + pub note: String, + + /// IDs of the projects that this secret will belong to + pub project_ids: Option>, +} + +pub(crate) async fn create_secret( + client: &mut Client, + input: &SecretCreateRequest, +) -> Result { + let enc = client + .get_encryption_settings() + .as_ref() + .ok_or(Error::VaultLocked)?; + + let org_id = Some(input.organization_id); + + let secret = Some(SecretCreateRequestModel { + key: enc.encrypt(input.key.as_bytes(), &org_id)?.to_string(), + value: enc.encrypt(input.value.as_bytes(), &org_id)?.to_string(), + note: enc.encrypt(input.note.as_bytes(), &org_id)?.to_string(), + project_ids: input.project_ids.clone(), + }); + + let config = client.get_api_configurations().await; + let res = bitwarden_api_api::apis::secrets_api::organizations_organization_id_secrets_post( + &config.api, + input.organization_id, + secret, + ) + .await?; + + let enc = client + .get_encryption_settings() + .as_ref() + .ok_or(Error::VaultLocked)?; + + SecretResponse::process_response(res, enc) +} diff --git a/crates/bitwarden/src/secrets_manager/secrets/delete.rs b/crates/bitwarden/src/secrets_manager/secrets/delete.rs new file mode 100644 index 0000000000..19337e7a1d --- /dev/null +++ b/crates/bitwarden/src/secrets_manager/secrets/delete.rs @@ -0,0 +1,69 @@ +use bitwarden_api_api::models::{ + BulkDeleteResponseModel, BulkDeleteResponseModelListResponseModel, +}; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use crate::{ + client::Client, + error::{Error, Result}, +}; + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct SecretsDeleteRequest { + /// IDs of the secrets to delete + pub ids: Vec, +} + +pub(crate) async fn delete_secrets( + client: &mut Client, + input: SecretsDeleteRequest, +) -> Result { + let config = client.get_api_configurations().await; + let res = + bitwarden_api_api::apis::secrets_api::secrets_delete_post(&config.api, Some(input.ids)) + .await?; + + SecretsDeleteResponse::process_response(res) +} + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct SecretsDeleteResponse { + pub data: Vec, +} + +impl SecretsDeleteResponse { + pub(crate) fn process_response( + response: BulkDeleteResponseModelListResponseModel, + ) -> Result { + Ok(SecretsDeleteResponse { + data: response + .data + .unwrap_or_default() + .into_iter() + .map(SecretDeleteResponse::process_response) + .collect::>()?, + }) + } +} + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct SecretDeleteResponse { + pub id: Uuid, + pub error: Option, +} + +impl SecretDeleteResponse { + pub(crate) fn process_response( + response: BulkDeleteResponseModel, + ) -> Result { + Ok(SecretDeleteResponse { + id: response.id.ok_or(Error::MissingFields)?, + error: response.error, + }) + } +} diff --git a/crates/bitwarden/src/secrets_manager/secrets/get.rs b/crates/bitwarden/src/secrets_manager/secrets/get.rs new file mode 100644 index 0000000000..2d3a8983bf --- /dev/null +++ b/crates/bitwarden/src/secrets_manager/secrets/get.rs @@ -0,0 +1,31 @@ +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use super::SecretResponse; +use crate::{ + error::{Error, Result}, + Client, +}; + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct SecretGetRequest { + /// ID of the secret to retrieve + pub id: Uuid, +} + +pub(crate) async fn get_secret( + client: &mut Client, + input: &SecretGetRequest, +) -> Result { + let config = client.get_api_configurations().await; + let res = bitwarden_api_api::apis::secrets_api::secrets_id_get(&config.api, input.id).await?; + + let enc = client + .get_encryption_settings() + .as_ref() + .ok_or(Error::VaultLocked)?; + + SecretResponse::process_response(res, enc) +} diff --git a/crates/bitwarden/src/secrets_manager/secrets/list.rs b/crates/bitwarden/src/secrets_manager/secrets/list.rs new file mode 100644 index 0000000000..7ecff9a409 --- /dev/null +++ b/crates/bitwarden/src/secrets_manager/secrets/list.rs @@ -0,0 +1,116 @@ +use bitwarden_api_api::models::{ + SecretWithProjectsListResponseModel, SecretsWithProjectsInnerSecret, +}; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use crate::{ + client::{encryption_settings::EncryptionSettings, Client}, + crypto::{CipherString, Decryptable}, + error::{Error, Result}, +}; + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct SecretIdentifiersRequest { + /// Organization to retrieve all the secrets from + pub organization_id: Uuid, +} + +pub(crate) async fn list_secrets( + client: &mut Client, + input: &SecretIdentifiersRequest, +) -> Result { + let config = client.get_api_configurations().await; + let res = bitwarden_api_api::apis::secrets_api::organizations_organization_id_secrets_get( + &config.api, + input.organization_id, + ) + .await?; + + let enc = client + .get_encryption_settings() + .as_ref() + .ok_or(Error::VaultLocked)?; + + SecretIdentifiersResponse::process_response(res, enc) +} + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct SecretIdentifiersByProjectRequest { + /// Project to retrieve all the secrets from + pub project_id: Uuid, +} + +pub(crate) async fn list_secrets_by_project( + client: &mut Client, + input: &SecretIdentifiersByProjectRequest, +) -> Result { + let config = client.get_api_configurations().await; + let res = bitwarden_api_api::apis::secrets_api::projects_project_id_secrets_get( + &config.api, + input.project_id, + ) + .await?; + + let enc = client + .get_encryption_settings() + .as_ref() + .ok_or(Error::VaultLocked)?; + + SecretIdentifiersResponse::process_response(res, enc) +} + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct SecretIdentifiersResponse { + pub data: Vec, +} + +impl SecretIdentifiersResponse { + pub(crate) fn process_response( + response: SecretWithProjectsListResponseModel, + enc: &EncryptionSettings, + ) -> Result { + Ok(SecretIdentifiersResponse { + data: response + .secrets + .unwrap_or_default() + .into_iter() + .map(|r| SecretIdentifierResponse::process_response(r, enc)) + .collect::>()?, + }) + } +} + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct SecretIdentifierResponse { + pub id: Uuid, + pub organization_id: Uuid, + + pub key: String, +} + +impl SecretIdentifierResponse { + pub(crate) fn process_response( + response: SecretsWithProjectsInnerSecret, + enc: &EncryptionSettings, + ) -> Result { + let organization_id = response.organization_id.ok_or(Error::MissingFields)?; + + let key = response + .key + .ok_or(Error::MissingFields)? + .parse::()? + .decrypt(enc, &Some(organization_id))?; + + Ok(SecretIdentifierResponse { + id: response.id.ok_or(Error::MissingFields)?, + organization_id, + key, + }) + } +} diff --git a/crates/bitwarden/src/secrets_manager/secrets/mod.rs b/crates/bitwarden/src/secrets_manager/secrets/mod.rs new file mode 100644 index 0000000000..de628e6185 --- /dev/null +++ b/crates/bitwarden/src/secrets_manager/secrets/mod.rs @@ -0,0 +1,20 @@ +mod create; +mod delete; +mod get; +mod list; +mod secret_response; +mod update; + +pub(crate) use create::create_secret; +pub use create::SecretCreateRequest; +pub(crate) use delete::delete_secrets; +pub use delete::{SecretsDeleteRequest, SecretsDeleteResponse}; +pub(crate) use get::get_secret; +pub use get::SecretGetRequest; +pub(crate) use list::{list_secrets, list_secrets_by_project}; +pub use list::{ + SecretIdentifiersByProjectRequest, SecretIdentifiersRequest, SecretIdentifiersResponse, +}; +pub use secret_response::SecretResponse; +pub(crate) use update::update_secret; +pub use update::SecretPutRequest; diff --git a/crates/bitwarden/src/secrets_manager/secrets/secret_response.rs b/crates/bitwarden/src/secrets_manager/secrets/secret_response.rs new file mode 100644 index 0000000000..ab8f04721c --- /dev/null +++ b/crates/bitwarden/src/secrets_manager/secrets/secret_response.rs @@ -0,0 +1,69 @@ +use bitwarden_api_api::models::SecretResponseModel; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use crate::{ + client::encryption_settings::EncryptionSettings, + crypto::{CipherString, Decryptable}, + error::{Error, Result}, +}; + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct SecretResponse { + pub object: String, + pub id: Uuid, + pub organization_id: Uuid, + pub project_id: Option, + + pub key: String, + pub value: String, + pub note: String, + + pub creation_date: String, + pub revision_date: String, +} + +impl SecretResponse { + pub(crate) fn process_response( + response: SecretResponseModel, + enc: &EncryptionSettings, + ) -> Result { + let org_id = response.organization_id; + + let key = response + .key + .ok_or(Error::MissingFields)? + .parse::()? + .decrypt(enc, &org_id)?; + let value = response + .value + .ok_or(Error::MissingFields)? + .parse::()? + .decrypt(enc, &org_id)?; + let note = response + .note + .ok_or(Error::MissingFields)? + .parse::()? + .decrypt(enc, &org_id)?; + + let project = response + .projects + .and_then(|p| p.into_iter().next()) + .and_then(|p| p.id); + + Ok(SecretResponse { + object: "secret".to_owned(), + id: response.id.ok_or(Error::MissingFields)?, + organization_id: org_id.ok_or(Error::MissingFields)?, + project_id: project, + key, + value, + note, + + creation_date: response.creation_date.ok_or(Error::MissingFields)?, + revision_date: response.revision_date.ok_or(Error::MissingFields)?, + }) + } +} diff --git a/crates/bitwarden/src/secrets_manager/secrets/update.rs b/crates/bitwarden/src/secrets_manager/secrets/update.rs new file mode 100644 index 0000000000..5fce871965 --- /dev/null +++ b/crates/bitwarden/src/secrets_manager/secrets/update.rs @@ -0,0 +1,53 @@ +use bitwarden_api_api::models::SecretUpdateRequestModel; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; +use uuid::Uuid; + +use super::SecretResponse; +use crate::{ + client::Client, + error::{Error, Result}, +}; + +#[derive(Serialize, Deserialize, Debug, JsonSchema)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +pub struct SecretPutRequest { + /// ID of the secret to modify + pub id: Uuid, + /// Organization ID of the secret to modify + pub organization_id: Uuid, + + pub key: String, + pub value: String, + pub note: String, +} + +pub(crate) async fn update_secret( + client: &mut Client, + input: &SecretPutRequest, +) -> Result { + let enc = client + .get_encryption_settings() + .as_ref() + .ok_or(Error::VaultLocked)?; + + let org_id = Some(input.organization_id); + + let secret = Some(SecretUpdateRequestModel { + key: enc.encrypt(input.key.as_bytes(), &org_id)?.to_string(), + value: enc.encrypt(input.value.as_bytes(), &org_id)?.to_string(), + note: enc.encrypt(input.note.as_bytes(), &org_id)?.to_string(), + project_ids: None, + }); + + let config = client.get_api_configurations().await; + let res = + bitwarden_api_api::apis::secrets_api::secrets_id_put(&config.api, input.id, secret).await?; + + let enc = client + .get_encryption_settings() + .as_ref() + .ok_or(Error::VaultLocked)?; + + SecretResponse::process_response(res, enc) +} diff --git a/crates/bitwarden/src/util.rs b/crates/bitwarden/src/util.rs index d0553947ea..9a5acf35c6 100644 --- a/crates/bitwarden/src/util.rs +++ b/crates/bitwarden/src/util.rs @@ -8,9 +8,21 @@ use base64::{ use crate::error::Result; -pub fn default_kdf_iterations() -> NonZeroU32 { +pub fn default_pbkdf2_iterations() -> NonZeroU32 { NonZeroU32::new(600_000).unwrap() } +#[cfg(feature = "internal")] +pub fn default_argon2_iterations() -> NonZeroU32 { + NonZeroU32::new(3).unwrap() +} +#[cfg(feature = "internal")] +pub fn default_argon2_memory() -> NonZeroU32 { + NonZeroU32::new(64).unwrap() +} +#[cfg(feature = "internal")] +pub fn default_argon2_parallelism() -> NonZeroU32 { + NonZeroU32::new(4).unwrap() +} #[derive(serde::Deserialize)] pub struct JWTToken { @@ -77,11 +89,11 @@ pub async fn start_mock(mocks: Vec) -> (wiremock::MockServer, cr server.register(mock).await; } - let settings = crate::sdk::request::client_settings::ClientSettings { + let settings = crate::client::client_settings::ClientSettings { identity_url: format!("http://{}/identity", server.address()), api_url: format!("http://{}/api", server.address()), user_agent: "Bitwarden Rust-SDK [TEST]".into(), - device_type: crate::sdk::request::client_settings::DeviceType::SDK, + device_type: crate::client::client_settings::DeviceType::SDK, internal: None, }; diff --git a/crates/bitwarden/src/wordlist.rs b/crates/bitwarden/src/wordlist.rs index b5a640d020..03853ea257 100644 --- a/crates/bitwarden/src/wordlist.rs +++ b/crates/bitwarden/src/wordlist.rs @@ -1,4 +1,5 @@ // EFF's Long Wordlist from https://www.eff.org/dice +#[cfg(feature = "internal")] pub(crate) const EFF_LONG_WORD_LIST: &'static [&str] = &[ "abacus", "abdomen", diff --git a/crates/bws/Cargo.toml b/crates/bws/Cargo.toml index d84f8b2ff2..7dcf39097e 100644 --- a/crates/bws/Cargo.toml +++ b/crates/bws/Cargo.toml @@ -20,16 +20,16 @@ tokio = { version = "1.28.2", features = ["rt-multi-thread", "macros"] } log = "0.4.18" bitwarden = { path = "../bitwarden", version = "0.2.1" } env_logger = "0.10.0" -atty = "0.2" +supports-color = "2.0.0" thiserror = "1.0.40" serde = "^1.0.163" serde_json = "^1.0.96" serde_yaml = "0.9" -bat = "0.23.0" +bat = { version = "0.23.0", features = ["regex-onig"], default-features = false } directories = "5.0.1" color-eyre = "0.6" toml = "0.7.4" -comfy-table = "^6.2.0" +comfy-table = "^7.0.1" chrono = { version = "0.4.26", features = ["clock", "std"], default-features = false } uuid = { version = "^1.3.3", features = ["serde"] } diff --git a/crates/bws/src/main.rs b/crates/bws/src/main.rs index 3fffce0020..b8dacad916 100644 --- a/crates/bws/src/main.rs +++ b/crates/bws/src/main.rs @@ -1,26 +1,22 @@ use std::{path::PathBuf, str::FromStr}; -use clap::{ArgGroup, CommandFactory, Parser, Subcommand}; -use color_eyre::eyre::{bail, Result}; -use log::error; - use bitwarden::{ - client::AccessToken, - sdk::{ - auth::request::AccessTokenLoginRequest, - request::{ - client_settings::ClientSettings, - projects_request::{ - ProjectCreateRequest, ProjectGetRequest, ProjectPutRequest, ProjectsDeleteRequest, - ProjectsListRequest, - }, - secrets_request::{ - SecretCreateRequest, SecretGetRequest, SecretIdentifiersByProjectRequest, - SecretIdentifiersRequest, SecretPutRequest, SecretsDeleteRequest, - }, + auth::request::AccessTokenLoginRequest, + client::{client_settings::ClientSettings, AccessToken}, + secrets_manager::{ + projects::{ + ProjectCreateRequest, ProjectGetRequest, ProjectPutRequest, ProjectsDeleteRequest, + ProjectsListRequest, + }, + secrets::{ + SecretCreateRequest, SecretGetRequest, SecretIdentifiersByProjectRequest, + SecretIdentifiersRequest, SecretPutRequest, SecretsDeleteRequest, }, }, }; +use clap::{ArgGroup, CommandFactory, Parser, Subcommand}; +use color_eyre::eyre::{bail, Result}; +use log::error; mod config; mod render; @@ -62,39 +58,100 @@ struct Cli { #[derive(Subcommand, Debug)] enum Commands { - #[command(long_about = "List items")] - List { + #[command(long_about = "Configure the CLI", arg_required_else_help(true))] + Config { + name: Option, + value: Option, + + #[arg(short = 'd', long)] + delete: bool, + }, + #[command(long_about = "Commands available on Projects")] + Project { #[command(subcommand)] - cmd: ListCommand, + cmd: ProjectCommand, }, - #[command(long_about = "Retrieve a single item")] - Get { + #[command(long_about = "Commands available on Secrets")] + Secret { #[command(subcommand)] - cmd: GetCommand, + cmd: SecretCommand, }, - #[command(long_about = "Create a single item")] + #[command(long_about = "Create a single item (deprecated)", hide(true))] Create { #[command(subcommand)] cmd: CreateCommand, }, - #[command(long_about = "Edit a single item")] + #[command(long_about = "Delete one or more items (deprecated)", hide(true))] + Delete { + #[command(subcommand)] + cmd: DeleteCommand, + }, + #[command(long_about = "Edit a single item (deprecated)", hide(true))] Edit { #[command(subcommand)] cmd: EditCommand, }, - #[command(long_about = "Delete one or more items")] - Delete { + #[command(long_about = "Retrieve a single item (deprecated)", hide(true))] + Get { #[command(subcommand)] - cmd: DeleteCommand, + cmd: GetCommand, }, - #[command(long_about = "Configure the CLI", arg_required_else_help(true))] - Config { - name: Option, + #[command(long_about = "List items (deprecated)", hide(true))] + List { + #[command(subcommand)] + cmd: ListCommand, + }, +} + +#[derive(Subcommand, Debug)] +enum SecretCommand { + Create { + key: String, + value: String, + + #[arg(long, help = "An optional note to add to the secret")] + note: Option, + + #[arg(long, help = "The ID of the project this secret will be added to")] + project_id: Option, + }, + Delete { + secret_ids: Vec, + }, + Edit { + secret_id: Uuid, + #[arg(long, group = "edit_field")] + key: Option, + #[arg(long, group = "edit_field")] value: Option, + #[arg(long, group = "edit_field")] + note: Option, + }, + Get { + secret_id: Uuid, + }, + List { + project_id: Option, + }, +} - #[arg(short = 'd', long)] - delete: bool, +#[derive(Subcommand, Debug)] +enum ProjectCommand { + Create { + name: String, + }, + Delete { + project_ids: Vec, + }, + Edit { + project_id: Uuid, + #[arg(long, group = "edit_field")] + name: String, + }, + Get { + project_id: Uuid, }, + List, } #[derive(Subcommand, Debug)] @@ -111,6 +168,9 @@ enum GetCommand { #[derive(Subcommand, Debug)] enum CreateCommand { + Project { + name: String, + }, Secret { key: String, value: String, @@ -121,13 +181,16 @@ enum CreateCommand { #[arg(long, help = "The ID of the project this secret will be added to")] project_id: Option, }, - Project { - name: String, - }, } #[derive(Subcommand, Debug)] enum EditCommand { + #[clap(group = ArgGroup::new("edit_field").required(true).multiple(true))] + Project { + project_id: Uuid, + #[arg(long, group = "edit_field")] + name: String, + }, #[clap(group = ArgGroup::new("edit_field").required(true).multiple(true))] Secret { secret_id: Uuid, @@ -138,18 +201,12 @@ enum EditCommand { #[arg(long, group = "edit_field")] note: Option, }, - #[clap(group = ArgGroup::new("edit_field").required(true).multiple(true))] - Project { - project_id: Uuid, - #[arg(long, group = "edit_field")] - name: String, - }, } #[derive(Subcommand, Debug)] enum DeleteCommand { - Secret { secret_ids: Vec }, Project { project_ids: Vec }, + Secret { secret_ids: Vec }, } #[tokio::main(flavor = "current_thread")] @@ -258,7 +315,10 @@ async fn process_commands() -> Result<()> { // And finally we process all the commands which require authentication match command { - Commands::List { + Commands::Project { + cmd: ProjectCommand::List, + } + | Commands::List { cmd: ListCommand::Projects, } => { let projects = client @@ -271,35 +331,10 @@ async fn process_commands() -> Result<()> { serialize_response(projects, cli.output, color); } - Commands::List { - cmd: ListCommand::Secrets { project_id }, - } => { - let res = if let Some(project_id) = project_id { - client - .secrets() - .list_by_project(&SecretIdentifiersByProjectRequest { - project_id: project_id, - }) - .await? - } else { - client - .secrets() - .list(&SecretIdentifiersRequest { - organization_id: organization_id.clone(), - }) - .await? - }; - - let mut secrets = Vec::new(); - - for s in res.data { - let secret = client.secrets().get(&SecretGetRequest { id: s.id }).await?; - secrets.push(secret); - } - serialize_response(secrets, cli.output, color); + Commands::Project { + cmd: ProjectCommand::Get { project_id }, } - - Commands::Get { + | Commands::Get { cmd: GetCommand::Project { project_id }, } => { let project = client @@ -309,7 +344,10 @@ async fn process_commands() -> Result<()> { serialize_response(project, cli.output, color); } - Commands::Create { + Commands::Project { + cmd: ProjectCommand::Create { name }, + } + | Commands::Create { cmd: CreateCommand::Project { name }, } => { let project = client @@ -322,7 +360,10 @@ async fn process_commands() -> Result<()> { serialize_response(project, cli.output, color); } - Commands::Edit { + Commands::Project { + cmd: ProjectCommand::Edit { project_id, name }, + } + | Commands::Edit { cmd: EditCommand::Project { project_id, name }, } => { let project = client @@ -336,7 +377,10 @@ async fn process_commands() -> Result<()> { serialize_response(project, cli.output, color); } - Commands::Delete { + Commands::Project { + cmd: ProjectCommand::Delete { project_ids }, + } + | Commands::Delete { cmd: DeleteCommand::Project { project_ids }, } => { let project_count = project_ids.len(); @@ -353,7 +397,41 @@ async fn process_commands() -> Result<()> { } } - Commands::Get { + Commands::Secret { + cmd: SecretCommand::List { project_id }, + } + | Commands::List { + cmd: ListCommand::Secrets { project_id }, + } => { + let res = if let Some(project_id) = project_id { + client + .secrets() + .list_by_project(&SecretIdentifiersByProjectRequest { + project_id: project_id, + }) + .await? + } else { + client + .secrets() + .list(&SecretIdentifiersRequest { + organization_id: organization_id.clone(), + }) + .await? + }; + + let mut secrets = Vec::new(); + + for s in res.data { + let secret = client.secrets().get(&SecretGetRequest { id: s.id }).await?; + secrets.push(secret); + } + serialize_response(secrets, cli.output, color); + } + + Commands::Secret { + cmd: SecretCommand::Get { secret_id }, + } + | Commands::Get { cmd: GetCommand::Secret { secret_id }, } => { let secret = client @@ -363,7 +441,16 @@ async fn process_commands() -> Result<()> { serialize_response(secret, cli.output, color); } - Commands::Create { + Commands::Secret { + cmd: + SecretCommand::Create { + key, + value, + note, + project_id, + }, + } + | Commands::Create { cmd: CreateCommand::Secret { key, @@ -385,7 +472,16 @@ async fn process_commands() -> Result<()> { serialize_response(secret, cli.output, color); } - Commands::Edit { + Commands::Secret { + cmd: + SecretCommand::Edit { + secret_id, + key, + value, + note, + }, + } + | Commands::Edit { cmd: EditCommand::Secret { secret_id, @@ -414,7 +510,10 @@ async fn process_commands() -> Result<()> { serialize_response(secret, cli.output, color); } - Commands::Delete { + Commands::Secret { + cmd: SecretCommand::Delete { secret_ids }, + } + | Commands::Delete { cmd: DeleteCommand::Secret { secret_ids }, } => { client diff --git a/crates/bws/src/render.rs b/crates/bws/src/render.rs index 671fe8b1c2..53306af0d3 100644 --- a/crates/bws/src/render.rs +++ b/crates/bws/src/render.rs @@ -1,6 +1,4 @@ -use bitwarden::sdk::response::{ - projects_response::ProjectResponse, secrets_response::SecretResponse, -}; +use bitwarden::secrets_manager::{projects::ProjectResponse, secrets::SecretResponse}; use chrono::DateTime; use clap::ValueEnum; use comfy_table::Table; @@ -27,13 +25,7 @@ impl Color { match self { Color::No => false, Color::Yes => true, - Color::Auto => { - if std::env::var("NO_COLOR").is_ok() { - false - } else { - atty::is(atty::Stream::Stdout) - } - } + Color::Auto => supports_color::on(supports_color::Stream::Stdout).is_some(), } } } diff --git a/crates/sdk-schemas/Cargo.toml b/crates/sdk-schemas/Cargo.toml index 0e8a884a71..2e7ef9ce64 100644 --- a/crates/sdk-schemas/Cargo.toml +++ b/crates/sdk-schemas/Cargo.toml @@ -7,10 +7,10 @@ rust-version = "1.57" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -schemars = "0.8.12" +schemars = { version = "0.8.12", features = ["preserve_order"] } serde_json = "1.0.96" anyhow = "1.0.71" -itertools = "0.10.5" +itertools = "0.11.0" bitwarden = { path = "../bitwarden" } bitwarden-json = { path = "../bitwarden-json" } diff --git a/crates/sdk-schemas/src/main.rs b/crates/sdk-schemas/src/main.rs index 544e49f90b..fa193a32e2 100644 --- a/crates/sdk-schemas/src/main.rs +++ b/crates/sdk-schemas/src/main.rs @@ -1,10 +1,8 @@ -use anyhow::Result; -use itertools::Itertools; -use schemars::schema::RootSchema; -use schemars::schema_for; use std::{fs::File, io::Write}; -use bitwarden::sdk::*; +use anyhow::Result; +use itertools::Itertools; +use schemars::{schema::RootSchema, schema_for}; /// Creates a json schema file for any type passed in using Schemars. The filename and path of the generated /// schema file is derived from the namespace passed into the macro or supplied as the first argument. @@ -91,33 +89,26 @@ fn write_schema(schema: RootSchema, dir_path: String, type_name: String) -> Resu } fn main() -> Result<()> { - write_schema_for!(request::client_settings::ClientSettings); - write_schema_for!(request::command::Command); + // Input types for new Client + write_schema_for!(bitwarden::client::client_settings::ClientSettings); + // Input types for Client::run_command + write_schema_for!(bitwarden_json::command::Command); - write_schema_for!( - "response", - bitwarden_json::response::Response - ); - write_schema_for!( - "response", - bitwarden_json::response::Response - ); - write_schema_for!( - "response", - bitwarden_json::response::Response - ); + // Output types for Client::run_command + // Only add structs which are direct results of SDK commands. + write_schema_for_response! { + bitwarden::auth::response::ApiKeyLoginResponse, + bitwarden::auth::response::PasswordLoginResponse, + bitwarden::secrets_manager::secrets::SecretIdentifiersResponse, + bitwarden::secrets_manager::secrets::SecretResponse, + bitwarden::secrets_manager::secrets::SecretsDeleteResponse, + }; + // Same as above, but for the internal feature + #[cfg(feature = "internal")] write_schema_for_response! { - auth::response::ApiKeyLoginResponse, - auth::response::PasswordLoginResponse, - response::fingerprint_response::FingerprintResponse, - response::secrets_response::SecretDeleteResponse, - response::secrets_response::SecretIdentifierResponse, - response::secrets_response::SecretIdentifiersResponse, - response::secrets_response::SecretResponse, - response::secrets_response::SecretsDeleteResponse, - response::sync_response::SyncResponse, - response::user_api_key_response::UserApiKeyResponse, + bitwarden::platform::SyncResponse, + bitwarden::platform::UserApiKeyResponse, }; Ok(()) diff --git a/languages/js_webassembly/package-lock.json b/languages/js_webassembly/package-lock.json new file mode 100644 index 0000000000..19de373d19 --- /dev/null +++ b/languages/js_webassembly/package-lock.json @@ -0,0 +1,7216 @@ +{ + "name": "js_webassembly", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "devDependencies": { + "html-webpack-plugin": "5.5.1", + "text-encoding": "0.7.0", + "ts-loader": "9.4.2", + "wasm-pack": "0.11.0", + "webpack": "5.81.0", + "webpack-cli": "5.0.2", + "webpack-dev-server": "4.13.3" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, + "node_modules/@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, + "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/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/binary-install": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/binary-install/-/binary-install-1.1.0.tgz", + "integrity": "sha512-rkwNGW+3aQVSZoD0/o3mfPN6Yxh3Id0R/xzTVBVVpGNlVz8EGwusksxRlbk/A5iKTZt9zkMn3qIqmAt3vpfbzg==", + "dev": true, + "dependencies": { + "axios": "^0.26.1", + "rimraf": "^3.0.2", + "tar": "^6.1.11" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001516", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz", + "integrity": "sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/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/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/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "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/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "node_modules/dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "dev": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.461", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.461.tgz", + "integrity": "sha512-1JkvV2sgEGTDXjdsaQCeSwYYuhLRphRpc+g6EHTFELJXEiznLt3/0pZ9JuAOQ5p2rI3YxKTbivtvajirIfhrEQ==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/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/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "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/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/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/hpack.js/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/hpack.js/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/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz", + "integrity": "sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA==", + "dev": true, + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-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-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "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-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "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/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "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 + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "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, + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "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/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "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, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "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/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/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/spdy/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/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/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.0.tgz", + "integrity": "sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/text-encoding": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", + "integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==", + "deprecated": "no longer maintained", + "dev": true + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "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/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-loader": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "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/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/wasm-pack": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/wasm-pack/-/wasm-pack-0.11.0.tgz", + "integrity": "sha512-PB/4QcPNo02d3cyfxxw/T8RvB9G3uMMfKT1cD028+NaC8Gnoqz8qfRQa446vgneK/4V5FUZY9Nvoi/lVI1/wKw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "binary-install": "^1.0.1" + }, + "bin": { + "wasm-pack": "node ./run.js" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "5.81.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.81.0.tgz", + "integrity": "sha512-AAjaJ9S4hYCVODKLQTgG5p5e11hiMawBwV2v8MYLE0C/6UAGLuAF4n1qa9GOwdxnicaP+5k6M5HrLmD4+gIB8Q==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.13.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.2.tgz", + "integrity": "sha512-4y3W5Dawri5+8dXm3+diW6Mn1Ya+Dei6eEVAdIduAmYNLzv1koKVAqsfgrrc9P2mhrYHQphx5htnGkcNwtubyQ==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.0.1", + "@webpack-cli/info": "^2.0.1", + "@webpack-cli/serve": "^2.0.2", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.13.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.3.tgz", + "integrity": "sha512-KqqzrzMRSRy5ePz10VhjyL27K2dxqwXQLP5rAKwRJBPUahe7Z2bBWzHw37jeb8GCPKxZRO79ZdQUAPesMh/Nug==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-merge": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.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, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "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/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + }, + "dependencies": { + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } + } + }, + "@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, + "@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, + "@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "@types/node": { + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==", + "dev": true + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dev": true, + "requires": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "requires": {} + }, + "@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "axios": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", + "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", + "dev": true, + "requires": { + "follow-redirects": "^1.14.8" + } + }, + "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 + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "binary-install": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/binary-install/-/binary-install-1.1.0.tgz", + "integrity": "sha512-rkwNGW+3aQVSZoD0/o3mfPN6Yxh3Id0R/xzTVBVVpGNlVz8EGwusksxRlbk/A5iKTZt9zkMn3qIqmAt3vpfbzg==", + "dev": true, + "requires": { + "axios": "^0.26.1", + "rimraf": "^3.0.2", + "tar": "^6.1.11" + } + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + } + } + }, + "bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dev": true, + "requires": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "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, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "caniuse-lite": { + "version": "1.0.30001516", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz", + "integrity": "sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "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 + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "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 + }, + "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, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "dev": true, + "requires": { + "@leichtgewicht/ip-codec": "^2.0.1" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.461", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.461.tgz", + "integrity": "sha512-1JkvV2sgEGTDXjdsaQCeSwYYuhLRphRpc+g6EHTFELJXEiznLt3/0pZ9JuAOQ5p2rI3YxKTbivtvajirIfhrEQ==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "envinfo": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", + "dev": true + }, + "es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "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" + } + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + } + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "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, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "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, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "fs-monkey": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==", + "dev": true + }, + "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 + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "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 + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "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" + } + }, + "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, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "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 + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "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 + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "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, + "requires": { + "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" + } + }, + "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 + }, + "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, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true + }, + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "requires": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + } + }, + "html-webpack-plugin": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz", + "integrity": "sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA==", + "dev": true, + "requires": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "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 + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "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, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true + }, + "ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "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, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "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 + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "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 + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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 + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "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 + }, + "launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dev": true, + "requires": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true + }, + "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, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "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, + "requires": { + "yallist": "^4.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, + "memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "requires": { + "fs-monkey": "^1.0.4" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "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 + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "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 + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dev": true, + "requires": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "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 + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true + }, + "node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "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, + "requires": { + "path-key": "^3.0.0" + } + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "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, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "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, + "requires": { + "p-try": "^2.0.0" + } + }, + "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, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + } + }, + "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 + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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 + }, + "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 + }, + "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 + }, + "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 + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "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 + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } + } + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + } + } + }, + "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, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "requires": { + "resolve": "^1.20.0" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true + }, + "renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "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 + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dev": true, + "requires": { + "node-forge": "^1" + } + }, + "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, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "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, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "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 + }, + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "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 + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "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 + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + } + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "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, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "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 + }, + "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, + "requires": { + "has-flag": "^4.0.0" + } + }, + "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 + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "terser": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.0.tgz", + "integrity": "sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + } + }, + "text-encoding": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz", + "integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==", + "dev": true + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "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, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "ts-loader": { + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", + "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + } + }, + "tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "peer": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "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 + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true + }, + "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 + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "wasm-pack": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/wasm-pack/-/wasm-pack-0.11.0.tgz", + "integrity": "sha512-PB/4QcPNo02d3cyfxxw/T8RvB9G3uMMfKT1cD028+NaC8Gnoqz8qfRQa446vgneK/4V5FUZY9Nvoi/lVI1/wKw==", + "dev": true, + "requires": { + "binary-install": "^1.0.1" + } + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webpack": { + "version": "5.81.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.81.0.tgz", + "integrity": "sha512-AAjaJ9S4hYCVODKLQTgG5p5e11hiMawBwV2v8MYLE0C/6UAGLuAF4n1qa9GOwdxnicaP+5k6M5HrLmD4+gIB8Q==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.13.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + } + }, + "webpack-cli": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.0.2.tgz", + "integrity": "sha512-4y3W5Dawri5+8dXm3+diW6Mn1Ya+Dei6eEVAdIduAmYNLzv1koKVAqsfgrrc9P2mhrYHQphx5htnGkcNwtubyQ==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.0.1", + "@webpack-cli/info": "^2.0.1", + "@webpack-cli/serve": "^2.0.2", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true + } + } + }, + "webpack-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } + } + }, + "webpack-dev-server": { + "version": "4.13.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.13.3.tgz", + "integrity": "sha512-KqqzrzMRSRy5ePz10VhjyL27K2dxqwXQLP5rAKwRJBPUahe7Z2bBWzHw37jeb8GCPKxZRO79ZdQUAPesMh/Nug==", + "dev": true, + "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.1", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } + } + }, + "webpack-merge": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "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 + }, + "ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "requires": {} + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/languages/python/BitwardenClient/schemas.py b/languages/python/BitwardenClient/schemas.py deleted file mode 100644 index 83c0657dcd..0000000000 --- a/languages/python/BitwardenClient/schemas.py +++ /dev/null @@ -1,1710 +0,0 @@ -from enum import Enum -from dataclasses import dataclass -from typing import Any, Optional, List, TypeVar, Type, cast, Callable -from uuid import UUID - - -T = TypeVar("T") -EnumT = TypeVar("EnumT", bound=Enum) - - -def from_str(x: Any) -> str: - assert isinstance(x, str) - return x - - -def from_int(x: Any) -> int: - assert isinstance(x, int) and not isinstance(x, bool) - return x - - -def to_enum(c: Type[EnumT], x: Any) -> EnumT: - assert isinstance(x, c) - return x.value - - -def from_none(x: Any) -> Any: - assert x is None - return x - - -def from_union(fs, x): - for f in fs: - try: - return f(x) - except: - pass - assert False - - -def to_class(c: Type[T], x: Any) -> dict: - assert isinstance(x, c) - return cast(Any, x).to_dict() - - -def from_list(f: Callable[[Any], T], x: Any) -> List[T]: - assert isinstance(x, list) - return [f(y) for y in x] - - -def from_bool(x: Any) -> bool: - assert isinstance(x, bool) - return x - - -class DeviceType(Enum): - """Device type to send to Bitwarden. Defaults to SDK""" - ANDROID = "Android" - ANDROID_AMAZON = "AndroidAmazon" - CHROME_BROWSER = "ChromeBrowser" - CHROME_EXTENSION = "ChromeExtension" - EDGE_BROWSER = "EdgeBrowser" - EDGE_EXTENSION = "EdgeExtension" - FIREFOX_BROWSER = "FirefoxBrowser" - FIREFOX_EXTENSION = "FirefoxExtension" - IE_BROWSER = "IEBrowser" - I_OS = "iOS" - LINUX_DESKTOP = "LinuxDesktop" - MAC_OS_DESKTOP = "MacOsDesktop" - OPERA_BROWSER = "OperaBrowser" - OPERA_EXTENSION = "OperaExtension" - SAFARI_BROWSER = "SafariBrowser" - SAFARI_EXTENSION = "SafariExtension" - SDK = "SDK" - UNKNOWN_BROWSER = "UnknownBrowser" - UWP = "UWP" - VIVALDI_BROWSER = "VivaldiBrowser" - VIVALDI_EXTENSION = "VivaldiExtension" - WINDOWS_DESKTOP = "WindowsDesktop" - - -class KdfType(Enum): - ARGON2_ID = "argon2id" - PBKDF2_SHA256 = "pbkdf2Sha256" - - -@dataclass -class ClientSettingsInternal: - access_token: str - email: str - expires_in: int - kdf_iterations: int - kdf_type: KdfType - refresh_token: str - - @staticmethod - def from_dict(obj: Any) -> 'ClientSettingsInternal': - assert isinstance(obj, dict) - access_token = from_str(obj.get("accessToken")) - email = from_str(obj.get("email")) - expires_in = from_int(obj.get("expiresIn")) - kdf_iterations = from_int(obj.get("kdfIterations")) - kdf_type = KdfType(obj.get("kdfType")) - refresh_token = from_str(obj.get("refreshToken")) - return ClientSettingsInternal(access_token, email, expires_in, kdf_iterations, kdf_type, refresh_token) - - def to_dict(self) -> dict: - result: dict = {} - result["accessToken"] = from_str(self.access_token) - result["email"] = from_str(self.email) - result["expiresIn"] = from_int(self.expires_in) - result["kdfIterations"] = from_int(self.kdf_iterations) - result["kdfType"] = to_enum(KdfType, self.kdf_type) - result["refreshToken"] = from_str(self.refresh_token) - return result - - -@dataclass -class ClientSettings: - """Basic client behavior settings. These settings specify the various targets and behavior - of the Bitwarden Client. They are optional and uneditable once the client is - initialized. - - Defaults to - - ``` # use bitwarden::sdk::request::client_settings::{ClientSettings, DeviceType}; # use - assert_matches::assert_matches; let settings = ClientSettings { identity_url: - "https://identity.bitwarden.com".to_string(), api_url: - "https://api.bitwarden.com".to_string(), user_agent: "Bitwarden Rust-SDK".to_string(), - device_type: DeviceType::SDK, internal: None, }; let default = ClientSettings::default(); - assert_matches!(settings, default); ``` - - Targets `localhost:8080` for debug builds. - """ - """The api url of the targeted Bitwarden instance. Defaults to `https://api.bitwarden.com`""" - api_url: str - """Device type to send to Bitwarden. Defaults to SDK""" - device_type: DeviceType - """The identity url of the targeted Bitwarden instance. Defaults to - `https://identity.bitwarden.com` - """ - identity_url: str - """The user_agent to sent to Bitwarden. Defaults to `Bitwarden Rust-SDK`""" - user_agent: str - internal: Optional[ClientSettingsInternal] = None - - @staticmethod - def from_dict(obj: Any) -> 'ClientSettings': - assert isinstance(obj, dict) - api_url = from_str(obj.get("apiUrl")) - device_type = DeviceType(obj.get("deviceType")) - identity_url = from_str(obj.get("identityUrl")) - user_agent = from_str(obj.get("userAgent")) - internal = from_union([ClientSettingsInternal.from_dict, from_none], obj.get("internal")) - return ClientSettings(api_url, device_type, identity_url, user_agent, internal) - - def to_dict(self) -> dict: - result: dict = {} - result["apiUrl"] = from_str(self.api_url) - result["deviceType"] = to_enum(DeviceType, self.device_type) - result["identityUrl"] = from_str(self.identity_url) - result["userAgent"] = from_str(self.user_agent) - if self.internal is not None: - result["internal"] = from_union([lambda x: to_class(ClientSettingsInternal, x), from_none], self.internal) - return result - - -@dataclass -class AccessTokenLoginRequest: - """Login to Bitwarden with access token""" - """Bitwarden service API access token""" - access_token: str - - @staticmethod - def from_dict(obj: Any) -> 'AccessTokenLoginRequest': - assert isinstance(obj, dict) - access_token = from_str(obj.get("accessToken")) - return AccessTokenLoginRequest(access_token) - - def to_dict(self) -> dict: - result: dict = {} - result["accessToken"] = from_str(self.access_token) - return result - - -@dataclass -class APIKeyLoginRequest: - """Login to Bitwarden with Api Key""" - """Bitwarden account client_id""" - client_id: str - """Bitwarden account client_secret""" - client_secret: str - """Bitwarden account master password""" - password: str - - @staticmethod - def from_dict(obj: Any) -> 'APIKeyLoginRequest': - assert isinstance(obj, dict) - client_id = from_str(obj.get("clientId")) - client_secret = from_str(obj.get("clientSecret")) - password = from_str(obj.get("password")) - return APIKeyLoginRequest(client_id, client_secret, password) - - def to_dict(self) -> dict: - result: dict = {} - result["clientId"] = from_str(self.client_id) - result["clientSecret"] = from_str(self.client_secret) - result["password"] = from_str(self.password) - return result - - -@dataclass -class FingerprintRequest: - """The input material, used in the fingerprint generation process.""" - fingerprint_material: str - """The user's public key encoded with base64.""" - public_key: str - - @staticmethod - def from_dict(obj: Any) -> 'FingerprintRequest': - assert isinstance(obj, dict) - fingerprint_material = from_str(obj.get("fingerprintMaterial")) - public_key = from_str(obj.get("publicKey")) - return FingerprintRequest(fingerprint_material, public_key) - - def to_dict(self) -> dict: - result: dict = {} - result["fingerprintMaterial"] = from_str(self.fingerprint_material) - result["publicKey"] = from_str(self.public_key) - return result - - -@dataclass -class SecretVerificationRequest: - """The user's master password to use for user verification. If supplied, this will be used - for verification purposes. - """ - master_password: Optional[str] = None - """Alternate user verification method through OTP. This is provided for users who have no - master password due to use of Customer Managed Encryption. Must be present and valid if - master_password is absent. - """ - otp: Optional[str] = None - - @staticmethod - def from_dict(obj: Any) -> 'SecretVerificationRequest': - assert isinstance(obj, dict) - master_password = from_union([from_none, from_str], obj.get("masterPassword")) - otp = from_union([from_none, from_str], obj.get("otp")) - return SecretVerificationRequest(master_password, otp) - - def to_dict(self) -> dict: - result: dict = {} - if self.master_password is not None: - result["masterPassword"] = from_union([from_none, from_str], self.master_password) - if self.otp is not None: - result["otp"] = from_union([from_none, from_str], self.otp) - return result - - -@dataclass -class PasswordLoginRequest: - """Login to Bitwarden with Username and Password""" - """Bitwarden account email address""" - email: str - """Bitwarden account master password""" - password: str - - @staticmethod - def from_dict(obj: Any) -> 'PasswordLoginRequest': - assert isinstance(obj, dict) - email = from_str(obj.get("email")) - password = from_str(obj.get("password")) - return PasswordLoginRequest(email, password) - - def to_dict(self) -> dict: - result: dict = {} - result["email"] = from_str(self.email) - result["password"] = from_str(self.password) - return result - - -@dataclass -class ProjectCreateRequest: - name: str - """Organization where the project will be created""" - organization_id: UUID - - @staticmethod - def from_dict(obj: Any) -> 'ProjectCreateRequest': - assert isinstance(obj, dict) - name = from_str(obj.get("name")) - organization_id = UUID(obj.get("organizationId")) - return ProjectCreateRequest(name, organization_id) - - def to_dict(self) -> dict: - result: dict = {} - result["name"] = from_str(self.name) - result["organizationId"] = str(self.organization_id) - return result - - -@dataclass -class ProjectsDeleteRequest: - """IDs of the projects to delete""" - ids: List[UUID] - - @staticmethod - def from_dict(obj: Any) -> 'ProjectsDeleteRequest': - assert isinstance(obj, dict) - ids = from_list(lambda x: UUID(x), obj.get("ids")) - return ProjectsDeleteRequest(ids) - - def to_dict(self) -> dict: - result: dict = {} - result["ids"] = from_list(lambda x: str(x), self.ids) - return result - - -@dataclass -class ProjectGetRequest: - """ID of the project to retrieve""" - id: UUID - - @staticmethod - def from_dict(obj: Any) -> 'ProjectGetRequest': - assert isinstance(obj, dict) - id = UUID(obj.get("id")) - return ProjectGetRequest(id) - - def to_dict(self) -> dict: - result: dict = {} - result["id"] = str(self.id) - return result - - -@dataclass -class ProjectsListRequest: - """Organization to retrieve all the projects from""" - organization_id: UUID - - @staticmethod - def from_dict(obj: Any) -> 'ProjectsListRequest': - assert isinstance(obj, dict) - organization_id = UUID(obj.get("organizationId")) - return ProjectsListRequest(organization_id) - - def to_dict(self) -> dict: - result: dict = {} - result["organizationId"] = str(self.organization_id) - return result - - -@dataclass -class ProjectPutRequest: - """ID of the project to modify""" - id: UUID - name: str - """Organization ID of the project to modify""" - organization_id: UUID - - @staticmethod - def from_dict(obj: Any) -> 'ProjectPutRequest': - assert isinstance(obj, dict) - id = UUID(obj.get("id")) - name = from_str(obj.get("name")) - organization_id = UUID(obj.get("organizationId")) - return ProjectPutRequest(id, name, organization_id) - - def to_dict(self) -> dict: - result: dict = {} - result["id"] = str(self.id) - result["name"] = from_str(self.name) - result["organizationId"] = str(self.organization_id) - return result - - -@dataclass -class ProjectsCommand: - """> Requires Authentication > Requires using an Access Token for login or calling Sync at - least once Retrieve a project by the provided identifier - - Returns: [ProjectResponse](crate::sdk::response::projects_response::ProjectResponse) - - > Requires Authentication > Requires using an Access Token for login or calling Sync at - least once Creates a new project in the provided organization using the given data - - Returns: [ProjectResponse](crate::sdk::response::projects_response::ProjectResponse) - - > Requires Authentication > Requires using an Access Token for login or calling Sync at - least once Lists all projects of the given organization - - Returns: [ProjectsResponse](crate::sdk::response::projects_response::ProjectsResponse) - - > Requires Authentication > Requires using an Access Token for login or calling Sync at - least once Updates an existing project with the provided ID using the given data - - Returns: [ProjectResponse](crate::sdk::response::projects_response::ProjectResponse) - - > Requires Authentication > Requires using an Access Token for login or calling Sync at - least once Deletes all the projects whose IDs match the provided ones - - Returns: - [ProjectsDeleteResponse](crate::sdk::response::projects_response::ProjectsDeleteResponse) - """ - get: Optional[ProjectGetRequest] = None - create: Optional[ProjectCreateRequest] = None - list: Optional[ProjectsListRequest] = None - update: Optional[ProjectPutRequest] = None - delete: Optional[ProjectsDeleteRequest] = None - - @staticmethod - def from_dict(obj: Any) -> 'ProjectsCommand': - assert isinstance(obj, dict) - get = from_union([ProjectGetRequest.from_dict, from_none], obj.get("get")) - create = from_union([ProjectCreateRequest.from_dict, from_none], obj.get("create")) - list = from_union([ProjectsListRequest.from_dict, from_none], obj.get("list")) - update = from_union([ProjectPutRequest.from_dict, from_none], obj.get("update")) - delete = from_union([ProjectsDeleteRequest.from_dict, from_none], obj.get("delete")) - return ProjectsCommand(get, create, list, update, delete) - - def to_dict(self) -> dict: - result: dict = {} - if self.get is not None: - result["get"] = from_union([lambda x: to_class(ProjectGetRequest, x), from_none], self.get) - if self.create is not None: - result["create"] = from_union([lambda x: to_class(ProjectCreateRequest, x), from_none], self.create) - if self.list is not None: - result["list"] = from_union([lambda x: to_class(ProjectsListRequest, x), from_none], self.list) - if self.update is not None: - result["update"] = from_union([lambda x: to_class(ProjectPutRequest, x), from_none], self.update) - if self.delete is not None: - result["delete"] = from_union([lambda x: to_class(ProjectsDeleteRequest, x), from_none], self.delete) - return result - - -@dataclass -class SecretCreateRequest: - key: str - note: str - """Organization where the secret will be created""" - organization_id: UUID - value: str - """IDs of the projects that this secret will belong to""" - project_ids: Optional[List[UUID]] = None - - @staticmethod - def from_dict(obj: Any) -> 'SecretCreateRequest': - assert isinstance(obj, dict) - key = from_str(obj.get("key")) - note = from_str(obj.get("note")) - organization_id = UUID(obj.get("organizationId")) - value = from_str(obj.get("value")) - project_ids = from_union([from_none, lambda x: from_list(lambda x: UUID(x), x)], obj.get("projectIds")) - return SecretCreateRequest(key, note, organization_id, value, project_ids) - - def to_dict(self) -> dict: - result: dict = {} - result["key"] = from_str(self.key) - result["note"] = from_str(self.note) - result["organizationId"] = str(self.organization_id) - result["value"] = from_str(self.value) - if self.project_ids is not None: - result["projectIds"] = from_union([from_none, lambda x: from_list(lambda x: str(x), x)], self.project_ids) - return result - - -@dataclass -class SecretsDeleteRequest: - """IDs of the secrets to delete""" - ids: List[UUID] - - @staticmethod - def from_dict(obj: Any) -> 'SecretsDeleteRequest': - assert isinstance(obj, dict) - ids = from_list(lambda x: UUID(x), obj.get("ids")) - return SecretsDeleteRequest(ids) - - def to_dict(self) -> dict: - result: dict = {} - result["ids"] = from_list(lambda x: str(x), self.ids) - return result - - -@dataclass -class SecretGetRequest: - """ID of the secret to retrieve""" - id: UUID - - @staticmethod - def from_dict(obj: Any) -> 'SecretGetRequest': - assert isinstance(obj, dict) - id = UUID(obj.get("id")) - return SecretGetRequest(id) - - def to_dict(self) -> dict: - result: dict = {} - result["id"] = str(self.id) - return result - - -@dataclass -class SecretIdentifiersRequest: - """Organization to retrieve all the secrets from""" - organization_id: UUID - - @staticmethod - def from_dict(obj: Any) -> 'SecretIdentifiersRequest': - assert isinstance(obj, dict) - organization_id = UUID(obj.get("organizationId")) - return SecretIdentifiersRequest(organization_id) - - def to_dict(self) -> dict: - result: dict = {} - result["organizationId"] = str(self.organization_id) - return result - - -@dataclass -class SecretPutRequest: - """ID of the secret to modify""" - id: UUID - key: str - note: str - """Organization ID of the secret to modify""" - organization_id: UUID - value: str - - @staticmethod - def from_dict(obj: Any) -> 'SecretPutRequest': - assert isinstance(obj, dict) - id = UUID(obj.get("id")) - key = from_str(obj.get("key")) - note = from_str(obj.get("note")) - organization_id = UUID(obj.get("organizationId")) - value = from_str(obj.get("value")) - return SecretPutRequest(id, key, note, organization_id, value) - - def to_dict(self) -> dict: - result: dict = {} - result["id"] = str(self.id) - result["key"] = from_str(self.key) - result["note"] = from_str(self.note) - result["organizationId"] = str(self.organization_id) - result["value"] = from_str(self.value) - return result - - -@dataclass -class SecretsCommand: - """> Requires Authentication > Requires using an Access Token for login or calling Sync at - least once Retrieve a secret by the provided identifier - - Returns: [SecretResponse](crate::sdk::response::secrets_response::SecretResponse) - - > Requires Authentication > Requires using an Access Token for login or calling Sync at - least once Creates a new secret in the provided organization using the given data - - Returns: [SecretResponse](crate::sdk::response::secrets_response::SecretResponse) - - > Requires Authentication > Requires using an Access Token for login or calling Sync at - least once Lists all secret identifiers of the given organization, to then retrieve each - secret, use `CreateSecret` - - Returns: - [SecretIdentifiersResponse](crate::sdk::response::secrets_response::SecretIdentifiersResponse) - - > Requires Authentication > Requires using an Access Token for login or calling Sync at - least once Updates an existing secret with the provided ID using the given data - - Returns: [SecretResponse](crate::sdk::response::secrets_response::SecretResponse) - - > Requires Authentication > Requires using an Access Token for login or calling Sync at - least once Deletes all the secrets whose IDs match the provided ones - - Returns: - [SecretsDeleteResponse](crate::sdk::response::secrets_response::SecretsDeleteResponse) - """ - get: Optional[SecretGetRequest] = None - create: Optional[SecretCreateRequest] = None - list: Optional[SecretIdentifiersRequest] = None - update: Optional[SecretPutRequest] = None - delete: Optional[SecretsDeleteRequest] = None - - @staticmethod - def from_dict(obj: Any) -> 'SecretsCommand': - assert isinstance(obj, dict) - get = from_union([SecretGetRequest.from_dict, from_none], obj.get("get")) - create = from_union([SecretCreateRequest.from_dict, from_none], obj.get("create")) - list = from_union([SecretIdentifiersRequest.from_dict, from_none], obj.get("list")) - update = from_union([SecretPutRequest.from_dict, from_none], obj.get("update")) - delete = from_union([SecretsDeleteRequest.from_dict, from_none], obj.get("delete")) - return SecretsCommand(get, create, list, update, delete) - - def to_dict(self) -> dict: - result: dict = {} - if self.get is not None: - result["get"] = from_union([lambda x: to_class(SecretGetRequest, x), from_none], self.get) - if self.create is not None: - result["create"] = from_union([lambda x: to_class(SecretCreateRequest, x), from_none], self.create) - if self.list is not None: - result["list"] = from_union([lambda x: to_class(SecretIdentifiersRequest, x), from_none], self.list) - if self.update is not None: - result["update"] = from_union([lambda x: to_class(SecretPutRequest, x), from_none], self.update) - if self.delete is not None: - result["delete"] = from_union([lambda x: to_class(SecretsDeleteRequest, x), from_none], self.delete) - return result - - -@dataclass -class SyncRequest: - """Exclude the subdomains from the response, defaults to false""" - exclude_subdomains: Optional[bool] = None - - @staticmethod - def from_dict(obj: Any) -> 'SyncRequest': - assert isinstance(obj, dict) - exclude_subdomains = from_union([from_none, from_bool], obj.get("excludeSubdomains")) - return SyncRequest(exclude_subdomains) - - def to_dict(self) -> dict: - result: dict = {} - if self.exclude_subdomains is not None: - result["excludeSubdomains"] = from_union([from_none, from_bool], self.exclude_subdomains) - return result - - -@dataclass -class Command: - """Login with username and password - - This command is for initiating an authentication handshake with Bitwarden. Authorization - may fail due to requiring 2fa or captcha challenge completion despite accurate - credentials. - - This command is not capable of handling authentication requiring 2fa or captcha. - - Returns: [PasswordLoginResponse](crate::sdk::auth::response::PasswordLoginResponse) - - Login with API Key - - This command is for initiating an authentication handshake with Bitwarden. - - Returns: [ApiKeyLoginResponse](crate::sdk::auth::response::ApiKeyLoginResponse) - - Login with Secrets Manager Access Token - - This command is for initiating an authentication handshake with Bitwarden. - - Returns: [ApiKeyLoginResponse](crate::sdk::auth::response::ApiKeyLoginResponse) - - > Requires Authentication Get the API key of the currently authenticated user - - Returns: - [UserApiKeyResponse](crate::sdk::response::user_api_key_response::UserApiKeyResponse) - - Get the user's passphrase - - Returns: String - - > Requires Authentication Retrieve all user data, ciphers and organizations the user is a - part of - - Returns: [SyncResponse](crate::sdk::response::sync_response::SyncResponse) - """ - password_login: Optional[PasswordLoginRequest] = None - api_key_login: Optional[APIKeyLoginRequest] = None - access_token_login: Optional[AccessTokenLoginRequest] = None - get_user_api_key: Optional[SecretVerificationRequest] = None - fingerprint: Optional[FingerprintRequest] = None - sync: Optional[SyncRequest] = None - secrets: Optional[SecretsCommand] = None - projects: Optional[ProjectsCommand] = None - - @staticmethod - def from_dict(obj: Any) -> 'Command': - assert isinstance(obj, dict) - password_login = from_union([PasswordLoginRequest.from_dict, from_none], obj.get("passwordLogin")) - api_key_login = from_union([APIKeyLoginRequest.from_dict, from_none], obj.get("apiKeyLogin")) - access_token_login = from_union([AccessTokenLoginRequest.from_dict, from_none], obj.get("accessTokenLogin")) - get_user_api_key = from_union([SecretVerificationRequest.from_dict, from_none], obj.get("getUserApiKey")) - fingerprint = from_union([FingerprintRequest.from_dict, from_none], obj.get("fingerprint")) - sync = from_union([SyncRequest.from_dict, from_none], obj.get("sync")) - secrets = from_union([SecretsCommand.from_dict, from_none], obj.get("secrets")) - projects = from_union([ProjectsCommand.from_dict, from_none], obj.get("projects")) - return Command(password_login, api_key_login, access_token_login, get_user_api_key, fingerprint, sync, secrets, projects) - - def to_dict(self) -> dict: - result: dict = {} - if self.password_login is not None: - result["passwordLogin"] = from_union([lambda x: to_class(PasswordLoginRequest, x), from_none], self.password_login) - if self.api_key_login is not None: - result["apiKeyLogin"] = from_union([lambda x: to_class(APIKeyLoginRequest, x), from_none], self.api_key_login) - if self.access_token_login is not None: - result["accessTokenLogin"] = from_union([lambda x: to_class(AccessTokenLoginRequest, x), from_none], self.access_token_login) - if self.get_user_api_key is not None: - result["getUserApiKey"] = from_union([lambda x: to_class(SecretVerificationRequest, x), from_none], self.get_user_api_key) - if self.fingerprint is not None: - result["fingerprint"] = from_union([lambda x: to_class(FingerprintRequest, x), from_none], self.fingerprint) - if self.sync is not None: - result["sync"] = from_union([lambda x: to_class(SyncRequest, x), from_none], self.sync) - if self.secrets is not None: - result["secrets"] = from_union([lambda x: to_class(SecretsCommand, x), from_none], self.secrets) - if self.projects is not None: - result["projects"] = from_union([lambda x: to_class(ProjectsCommand, x), from_none], self.projects) - return result - - -@dataclass -class PurpleAuthenticator: - pass - - @staticmethod - def from_dict(obj: Any) -> 'PurpleAuthenticator': - assert isinstance(obj, dict) - return PurpleAuthenticator() - - def to_dict(self) -> dict: - result: dict = {} - return result - - -@dataclass -class PurpleDuo: - host: str - signature: str - - @staticmethod - def from_dict(obj: Any) -> 'PurpleDuo': - assert isinstance(obj, dict) - host = from_str(obj.get("host")) - signature = from_str(obj.get("signature")) - return PurpleDuo(host, signature) - - def to_dict(self) -> dict: - result: dict = {} - result["host"] = from_str(self.host) - result["signature"] = from_str(self.signature) - return result - - -@dataclass -class PurpleEmail: - """The email to request a 2fa TOTP for""" - email: str - - @staticmethod - def from_dict(obj: Any) -> 'PurpleEmail': - assert isinstance(obj, dict) - email = from_str(obj.get("email")) - return PurpleEmail(email) - - def to_dict(self) -> dict: - result: dict = {} - result["email"] = from_str(self.email) - return result - - -@dataclass -class PurpleRemember: - pass - - @staticmethod - def from_dict(obj: Any) -> 'PurpleRemember': - assert isinstance(obj, dict) - return PurpleRemember() - - def to_dict(self) -> dict: - result: dict = {} - return result - - -@dataclass -class PurpleWebAuthn: - pass - - @staticmethod - def from_dict(obj: Any) -> 'PurpleWebAuthn': - assert isinstance(obj, dict) - return PurpleWebAuthn() - - def to_dict(self) -> dict: - result: dict = {} - return result - - -@dataclass -class PurpleYubiKey: - """Whether the stored yubikey supports near field communication""" - nfc: bool - - @staticmethod - def from_dict(obj: Any) -> 'PurpleYubiKey': - assert isinstance(obj, dict) - nfc = from_bool(obj.get("nfc")) - return PurpleYubiKey(nfc) - - def to_dict(self) -> dict: - result: dict = {} - result["nfc"] = from_bool(self.nfc) - return result - - -@dataclass -class APIKeyLoginResponseTwoFactorProviders: - authenticator: Optional[PurpleAuthenticator] = None - """Duo-backed 2fa""" - duo: Optional[PurpleDuo] = None - """Email 2fa""" - email: Optional[PurpleEmail] = None - """Duo-backed 2fa operated by an organization the user is a member of""" - organization_duo: Optional[PurpleDuo] = None - """Presence indicates the user has stored this device as bypassing 2fa""" - remember: Optional[PurpleRemember] = None - """WebAuthn-backed 2fa""" - web_authn: Optional[PurpleWebAuthn] = None - """Yubikey-backed 2fa""" - yubi_key: Optional[PurpleYubiKey] = None - - @staticmethod - def from_dict(obj: Any) -> 'APIKeyLoginResponseTwoFactorProviders': - assert isinstance(obj, dict) - authenticator = from_union([PurpleAuthenticator.from_dict, from_none], obj.get("authenticator")) - duo = from_union([PurpleDuo.from_dict, from_none], obj.get("duo")) - email = from_union([PurpleEmail.from_dict, from_none], obj.get("email")) - organization_duo = from_union([PurpleDuo.from_dict, from_none], obj.get("organizationDuo")) - remember = from_union([PurpleRemember.from_dict, from_none], obj.get("remember")) - web_authn = from_union([PurpleWebAuthn.from_dict, from_none], obj.get("webAuthn")) - yubi_key = from_union([PurpleYubiKey.from_dict, from_none], obj.get("yubiKey")) - return APIKeyLoginResponseTwoFactorProviders(authenticator, duo, email, organization_duo, remember, web_authn, yubi_key) - - def to_dict(self) -> dict: - result: dict = {} - if self.authenticator is not None: - result["authenticator"] = from_union([lambda x: to_class(PurpleAuthenticator, x), from_none], self.authenticator) - if self.duo is not None: - result["duo"] = from_union([lambda x: to_class(PurpleDuo, x), from_none], self.duo) - if self.email is not None: - result["email"] = from_union([lambda x: to_class(PurpleEmail, x), from_none], self.email) - if self.organization_duo is not None: - result["organizationDuo"] = from_union([lambda x: to_class(PurpleDuo, x), from_none], self.organization_duo) - if self.remember is not None: - result["remember"] = from_union([lambda x: to_class(PurpleRemember, x), from_none], self.remember) - if self.web_authn is not None: - result["webAuthn"] = from_union([lambda x: to_class(PurpleWebAuthn, x), from_none], self.web_authn) - if self.yubi_key is not None: - result["yubiKey"] = from_union([lambda x: to_class(PurpleYubiKey, x), from_none], self.yubi_key) - return result - - -@dataclass -class APIKeyLoginResponse: - authenticated: bool - """Whether or not the user is required to update their master password""" - force_password_reset: bool - """TODO: What does this do?""" - reset_master_password: bool - two_factor: Optional[APIKeyLoginResponseTwoFactorProviders] = None - - @staticmethod - def from_dict(obj: Any) -> 'APIKeyLoginResponse': - assert isinstance(obj, dict) - authenticated = from_bool(obj.get("authenticated")) - force_password_reset = from_bool(obj.get("forcePasswordReset")) - reset_master_password = from_bool(obj.get("resetMasterPassword")) - two_factor = from_union([APIKeyLoginResponseTwoFactorProviders.from_dict, from_none], obj.get("twoFactor")) - return APIKeyLoginResponse(authenticated, force_password_reset, reset_master_password, two_factor) - - def to_dict(self) -> dict: - result: dict = {} - result["authenticated"] = from_bool(self.authenticated) - result["forcePasswordReset"] = from_bool(self.force_password_reset) - result["resetMasterPassword"] = from_bool(self.reset_master_password) - if self.two_factor is not None: - result["twoFactor"] = from_union([lambda x: to_class(APIKeyLoginResponseTwoFactorProviders, x), from_none], self.two_factor) - return result - - -@dataclass -class ResponseForAPIKeyLoginResponse: - """Whether or not the SDK request succeeded.""" - success: bool - """The response data. Populated if `success` is true.""" - data: Optional[APIKeyLoginResponse] = None - """A message for any error that may occur. Populated if `success` is false.""" - error_message: Optional[str] = None - - @staticmethod - def from_dict(obj: Any) -> 'ResponseForAPIKeyLoginResponse': - assert isinstance(obj, dict) - success = from_bool(obj.get("success")) - data = from_union([APIKeyLoginResponse.from_dict, from_none], obj.get("data")) - error_message = from_union([from_none, from_str], obj.get("errorMessage")) - return ResponseForAPIKeyLoginResponse(success, data, error_message) - - def to_dict(self) -> dict: - result: dict = {} - result["success"] = from_bool(self.success) - if self.data is not None: - result["data"] = from_union([lambda x: to_class(APIKeyLoginResponse, x), from_none], self.data) - if self.error_message is not None: - result["errorMessage"] = from_union([from_none, from_str], self.error_message) - return result - - -@dataclass -class FingerprintResponse: - fingerprint: str - - @staticmethod - def from_dict(obj: Any) -> 'FingerprintResponse': - assert isinstance(obj, dict) - fingerprint = from_str(obj.get("fingerprint")) - return FingerprintResponse(fingerprint) - - def to_dict(self) -> dict: - result: dict = {} - result["fingerprint"] = from_str(self.fingerprint) - return result - - -@dataclass -class ResponseForFingerprintResponse: - """Whether or not the SDK request succeeded.""" - success: bool - """The response data. Populated if `success` is true.""" - data: Optional[FingerprintResponse] = None - """A message for any error that may occur. Populated if `success` is false.""" - error_message: Optional[str] = None - - @staticmethod - def from_dict(obj: Any) -> 'ResponseForFingerprintResponse': - assert isinstance(obj, dict) - success = from_bool(obj.get("success")) - data = from_union([FingerprintResponse.from_dict, from_none], obj.get("data")) - error_message = from_union([from_none, from_str], obj.get("errorMessage")) - return ResponseForFingerprintResponse(success, data, error_message) - - def to_dict(self) -> dict: - result: dict = {} - result["success"] = from_bool(self.success) - if self.data is not None: - result["data"] = from_union([lambda x: to_class(FingerprintResponse, x), from_none], self.data) - if self.error_message is not None: - result["errorMessage"] = from_union([from_none, from_str], self.error_message) - return result - - -@dataclass -class CAPTCHAResponse: - """hcaptcha site key""" - site_key: str - - @staticmethod - def from_dict(obj: Any) -> 'CAPTCHAResponse': - assert isinstance(obj, dict) - site_key = from_str(obj.get("siteKey")) - return CAPTCHAResponse(site_key) - - def to_dict(self) -> dict: - result: dict = {} - result["siteKey"] = from_str(self.site_key) - return result - - -@dataclass -class FluffyAuthenticator: - pass - - @staticmethod - def from_dict(obj: Any) -> 'FluffyAuthenticator': - assert isinstance(obj, dict) - return FluffyAuthenticator() - - def to_dict(self) -> dict: - result: dict = {} - return result - - -@dataclass -class FluffyDuo: - host: str - signature: str - - @staticmethod - def from_dict(obj: Any) -> 'FluffyDuo': - assert isinstance(obj, dict) - host = from_str(obj.get("host")) - signature = from_str(obj.get("signature")) - return FluffyDuo(host, signature) - - def to_dict(self) -> dict: - result: dict = {} - result["host"] = from_str(self.host) - result["signature"] = from_str(self.signature) - return result - - -@dataclass -class FluffyEmail: - """The email to request a 2fa TOTP for""" - email: str - - @staticmethod - def from_dict(obj: Any) -> 'FluffyEmail': - assert isinstance(obj, dict) - email = from_str(obj.get("email")) - return FluffyEmail(email) - - def to_dict(self) -> dict: - result: dict = {} - result["email"] = from_str(self.email) - return result - - -@dataclass -class FluffyRemember: - pass - - @staticmethod - def from_dict(obj: Any) -> 'FluffyRemember': - assert isinstance(obj, dict) - return FluffyRemember() - - def to_dict(self) -> dict: - result: dict = {} - return result - - -@dataclass -class FluffyWebAuthn: - pass - - @staticmethod - def from_dict(obj: Any) -> 'FluffyWebAuthn': - assert isinstance(obj, dict) - return FluffyWebAuthn() - - def to_dict(self) -> dict: - result: dict = {} - return result - - -@dataclass -class FluffyYubiKey: - """Whether the stored yubikey supports near field communication""" - nfc: bool - - @staticmethod - def from_dict(obj: Any) -> 'FluffyYubiKey': - assert isinstance(obj, dict) - nfc = from_bool(obj.get("nfc")) - return FluffyYubiKey(nfc) - - def to_dict(self) -> dict: - result: dict = {} - result["nfc"] = from_bool(self.nfc) - return result - - -@dataclass -class PasswordLoginResponseTwoFactorProviders: - authenticator: Optional[FluffyAuthenticator] = None - """Duo-backed 2fa""" - duo: Optional[FluffyDuo] = None - """Email 2fa""" - email: Optional[FluffyEmail] = None - """Duo-backed 2fa operated by an organization the user is a member of""" - organization_duo: Optional[FluffyDuo] = None - """Presence indicates the user has stored this device as bypassing 2fa""" - remember: Optional[FluffyRemember] = None - """WebAuthn-backed 2fa""" - web_authn: Optional[FluffyWebAuthn] = None - """Yubikey-backed 2fa""" - yubi_key: Optional[FluffyYubiKey] = None - - @staticmethod - def from_dict(obj: Any) -> 'PasswordLoginResponseTwoFactorProviders': - assert isinstance(obj, dict) - authenticator = from_union([FluffyAuthenticator.from_dict, from_none], obj.get("authenticator")) - duo = from_union([FluffyDuo.from_dict, from_none], obj.get("duo")) - email = from_union([FluffyEmail.from_dict, from_none], obj.get("email")) - organization_duo = from_union([FluffyDuo.from_dict, from_none], obj.get("organizationDuo")) - remember = from_union([FluffyRemember.from_dict, from_none], obj.get("remember")) - web_authn = from_union([FluffyWebAuthn.from_dict, from_none], obj.get("webAuthn")) - yubi_key = from_union([FluffyYubiKey.from_dict, from_none], obj.get("yubiKey")) - return PasswordLoginResponseTwoFactorProviders(authenticator, duo, email, organization_duo, remember, web_authn, yubi_key) - - def to_dict(self) -> dict: - result: dict = {} - if self.authenticator is not None: - result["authenticator"] = from_union([lambda x: to_class(FluffyAuthenticator, x), from_none], self.authenticator) - if self.duo is not None: - result["duo"] = from_union([lambda x: to_class(FluffyDuo, x), from_none], self.duo) - if self.email is not None: - result["email"] = from_union([lambda x: to_class(FluffyEmail, x), from_none], self.email) - if self.organization_duo is not None: - result["organizationDuo"] = from_union([lambda x: to_class(FluffyDuo, x), from_none], self.organization_duo) - if self.remember is not None: - result["remember"] = from_union([lambda x: to_class(FluffyRemember, x), from_none], self.remember) - if self.web_authn is not None: - result["webAuthn"] = from_union([lambda x: to_class(FluffyWebAuthn, x), from_none], self.web_authn) - if self.yubi_key is not None: - result["yubiKey"] = from_union([lambda x: to_class(FluffyYubiKey, x), from_none], self.yubi_key) - return result - - -@dataclass -class PasswordLoginResponse: - authenticated: bool - """Whether or not the user is required to update their master password""" - force_password_reset: bool - """TODO: What does this do?""" - reset_master_password: bool - """The information required to present the user with a captcha challenge. Only present when - authentication fails due to requiring validation of a captcha challenge. - """ - captcha: Optional[CAPTCHAResponse] = None - """The available two factor authentication options. Present only when authentication fails - due to requiring a second authentication factor. - """ - two_factor: Optional[PasswordLoginResponseTwoFactorProviders] = None - - @staticmethod - def from_dict(obj: Any) -> 'PasswordLoginResponse': - assert isinstance(obj, dict) - authenticated = from_bool(obj.get("authenticated")) - force_password_reset = from_bool(obj.get("forcePasswordReset")) - reset_master_password = from_bool(obj.get("resetMasterPassword")) - captcha = from_union([CAPTCHAResponse.from_dict, from_none], obj.get("captcha")) - two_factor = from_union([PasswordLoginResponseTwoFactorProviders.from_dict, from_none], obj.get("twoFactor")) - return PasswordLoginResponse(authenticated, force_password_reset, reset_master_password, captcha, two_factor) - - def to_dict(self) -> dict: - result: dict = {} - result["authenticated"] = from_bool(self.authenticated) - result["forcePasswordReset"] = from_bool(self.force_password_reset) - result["resetMasterPassword"] = from_bool(self.reset_master_password) - if self.captcha is not None: - result["captcha"] = from_union([lambda x: to_class(CAPTCHAResponse, x), from_none], self.captcha) - if self.two_factor is not None: - result["twoFactor"] = from_union([lambda x: to_class(PasswordLoginResponseTwoFactorProviders, x), from_none], self.two_factor) - return result - - -@dataclass -class ResponseForPasswordLoginResponse: - """Whether or not the SDK request succeeded.""" - success: bool - """The response data. Populated if `success` is true.""" - data: Optional[PasswordLoginResponse] = None - """A message for any error that may occur. Populated if `success` is false.""" - error_message: Optional[str] = None - - @staticmethod - def from_dict(obj: Any) -> 'ResponseForPasswordLoginResponse': - assert isinstance(obj, dict) - success = from_bool(obj.get("success")) - data = from_union([PasswordLoginResponse.from_dict, from_none], obj.get("data")) - error_message = from_union([from_none, from_str], obj.get("errorMessage")) - return ResponseForPasswordLoginResponse(success, data, error_message) - - def to_dict(self) -> dict: - result: dict = {} - result["success"] = from_bool(self.success) - if self.data is not None: - result["data"] = from_union([lambda x: to_class(PasswordLoginResponse, x), from_none], self.data) - if self.error_message is not None: - result["errorMessage"] = from_union([from_none, from_str], self.error_message) - return result - - -@dataclass -class SecretDeleteResponse: - id: UUID - error: Optional[str] = None - - @staticmethod - def from_dict(obj: Any) -> 'SecretDeleteResponse': - assert isinstance(obj, dict) - id = UUID(obj.get("id")) - error = from_union([from_none, from_str], obj.get("error")) - return SecretDeleteResponse(id, error) - - def to_dict(self) -> dict: - result: dict = {} - result["id"] = str(self.id) - if self.error is not None: - result["error"] = from_union([from_none, from_str], self.error) - return result - - -@dataclass -class ResponseForSecretDeleteResponse: - """Whether or not the SDK request succeeded.""" - success: bool - """The response data. Populated if `success` is true.""" - data: Optional[SecretDeleteResponse] = None - """A message for any error that may occur. Populated if `success` is false.""" - error_message: Optional[str] = None - - @staticmethod - def from_dict(obj: Any) -> 'ResponseForSecretDeleteResponse': - assert isinstance(obj, dict) - success = from_bool(obj.get("success")) - data = from_union([SecretDeleteResponse.from_dict, from_none], obj.get("data")) - error_message = from_union([from_none, from_str], obj.get("errorMessage")) - return ResponseForSecretDeleteResponse(success, data, error_message) - - def to_dict(self) -> dict: - result: dict = {} - result["success"] = from_bool(self.success) - if self.data is not None: - result["data"] = from_union([lambda x: to_class(SecretDeleteResponse, x), from_none], self.data) - if self.error_message is not None: - result["errorMessage"] = from_union([from_none, from_str], self.error_message) - return result - - -@dataclass -class SecretIdentifierResponse: - id: UUID - key: str - organization_id: UUID - - @staticmethod - def from_dict(obj: Any) -> 'SecretIdentifierResponse': - assert isinstance(obj, dict) - id = UUID(obj.get("id")) - key = from_str(obj.get("key")) - organization_id = UUID(obj.get("organizationId")) - return SecretIdentifierResponse(id, key, organization_id) - - def to_dict(self) -> dict: - result: dict = {} - result["id"] = str(self.id) - result["key"] = from_str(self.key) - result["organizationId"] = str(self.organization_id) - return result - - -@dataclass -class ResponseForSecretIdentifierResponse: - """Whether or not the SDK request succeeded.""" - success: bool - """The response data. Populated if `success` is true.""" - data: Optional[SecretIdentifierResponse] = None - """A message for any error that may occur. Populated if `success` is false.""" - error_message: Optional[str] = None - - @staticmethod - def from_dict(obj: Any) -> 'ResponseForSecretIdentifierResponse': - assert isinstance(obj, dict) - success = from_bool(obj.get("success")) - data = from_union([SecretIdentifierResponse.from_dict, from_none], obj.get("data")) - error_message = from_union([from_none, from_str], obj.get("errorMessage")) - return ResponseForSecretIdentifierResponse(success, data, error_message) - - def to_dict(self) -> dict: - result: dict = {} - result["success"] = from_bool(self.success) - if self.data is not None: - result["data"] = from_union([lambda x: to_class(SecretIdentifierResponse, x), from_none], self.data) - if self.error_message is not None: - result["errorMessage"] = from_union([from_none, from_str], self.error_message) - return result - - -@dataclass -class DatumElement: - id: UUID - key: str - organization_id: UUID - - @staticmethod - def from_dict(obj: Any) -> 'DatumElement': - assert isinstance(obj, dict) - id = UUID(obj.get("id")) - key = from_str(obj.get("key")) - organization_id = UUID(obj.get("organizationId")) - return DatumElement(id, key, organization_id) - - def to_dict(self) -> dict: - result: dict = {} - result["id"] = str(self.id) - result["key"] = from_str(self.key) - result["organizationId"] = str(self.organization_id) - return result - - -@dataclass -class SecretIdentifiersResponse: - data: List[DatumElement] - - @staticmethod - def from_dict(obj: Any) -> 'SecretIdentifiersResponse': - assert isinstance(obj, dict) - data = from_list(DatumElement.from_dict, obj.get("data")) - return SecretIdentifiersResponse(data) - - def to_dict(self) -> dict: - result: dict = {} - result["data"] = from_list(lambda x: to_class(DatumElement, x), self.data) - return result - - -@dataclass -class ResponseForSecretIdentifiersResponse: - """Whether or not the SDK request succeeded.""" - success: bool - """The response data. Populated if `success` is true.""" - data: Optional[SecretIdentifiersResponse] = None - """A message for any error that may occur. Populated if `success` is false.""" - error_message: Optional[str] = None - - @staticmethod - def from_dict(obj: Any) -> 'ResponseForSecretIdentifiersResponse': - assert isinstance(obj, dict) - success = from_bool(obj.get("success")) - data = from_union([SecretIdentifiersResponse.from_dict, from_none], obj.get("data")) - error_message = from_union([from_none, from_str], obj.get("errorMessage")) - return ResponseForSecretIdentifiersResponse(success, data, error_message) - - def to_dict(self) -> dict: - result: dict = {} - result["success"] = from_bool(self.success) - if self.data is not None: - result["data"] = from_union([lambda x: to_class(SecretIdentifiersResponse, x), from_none], self.data) - if self.error_message is not None: - result["errorMessage"] = from_union([from_none, from_str], self.error_message) - return result - - -@dataclass -class SecretResponse: - creation_date: str - id: UUID - key: str - note: str - object: str - organization_id: UUID - revision_date: str - value: str - project_id: Optional[UUID] = None - - @staticmethod - def from_dict(obj: Any) -> 'SecretResponse': - assert isinstance(obj, dict) - creation_date = from_str(obj.get("creationDate")) - id = UUID(obj.get("id")) - key = from_str(obj.get("key")) - note = from_str(obj.get("note")) - object = from_str(obj.get("object")) - organization_id = UUID(obj.get("organizationId")) - revision_date = from_str(obj.get("revisionDate")) - value = from_str(obj.get("value")) - project_id = from_union([from_none, lambda x: UUID(x)], obj.get("projectId")) - return SecretResponse(creation_date, id, key, note, object, organization_id, revision_date, value, project_id) - - def to_dict(self) -> dict: - result: dict = {} - result["creationDate"] = from_str(self.creation_date) - result["id"] = str(self.id) - result["key"] = from_str(self.key) - result["note"] = from_str(self.note) - result["object"] = from_str(self.object) - result["organizationId"] = str(self.organization_id) - result["revisionDate"] = from_str(self.revision_date) - result["value"] = from_str(self.value) - if self.project_id is not None: - result["projectId"] = from_union([from_none, lambda x: str(x)], self.project_id) - return result - - -@dataclass -class ResponseForSecretResponse: - """Whether or not the SDK request succeeded.""" - success: bool - """The response data. Populated if `success` is true.""" - data: Optional[SecretResponse] = None - """A message for any error that may occur. Populated if `success` is false.""" - error_message: Optional[str] = None - - @staticmethod - def from_dict(obj: Any) -> 'ResponseForSecretResponse': - assert isinstance(obj, dict) - success = from_bool(obj.get("success")) - data = from_union([SecretResponse.from_dict, from_none], obj.get("data")) - error_message = from_union([from_none, from_str], obj.get("errorMessage")) - return ResponseForSecretResponse(success, data, error_message) - - def to_dict(self) -> dict: - result: dict = {} - result["success"] = from_bool(self.success) - if self.data is not None: - result["data"] = from_union([lambda x: to_class(SecretResponse, x), from_none], self.data) - if self.error_message is not None: - result["errorMessage"] = from_union([from_none, from_str], self.error_message) - return result - - -@dataclass -class DatumClass: - id: UUID - error: Optional[str] = None - - @staticmethod - def from_dict(obj: Any) -> 'DatumClass': - assert isinstance(obj, dict) - id = UUID(obj.get("id")) - error = from_union([from_none, from_str], obj.get("error")) - return DatumClass(id, error) - - def to_dict(self) -> dict: - result: dict = {} - result["id"] = str(self.id) - if self.error is not None: - result["error"] = from_union([from_none, from_str], self.error) - return result - - -@dataclass -class SecretsDeleteResponse: - data: List[DatumClass] - - @staticmethod - def from_dict(obj: Any) -> 'SecretsDeleteResponse': - assert isinstance(obj, dict) - data = from_list(DatumClass.from_dict, obj.get("data")) - return SecretsDeleteResponse(data) - - def to_dict(self) -> dict: - result: dict = {} - result["data"] = from_list(lambda x: to_class(DatumClass, x), self.data) - return result - - -@dataclass -class ResponseForSecretsDeleteResponse: - """Whether or not the SDK request succeeded.""" - success: bool - """The response data. Populated if `success` is true.""" - data: Optional[SecretsDeleteResponse] = None - """A message for any error that may occur. Populated if `success` is false.""" - error_message: Optional[str] = None - - @staticmethod - def from_dict(obj: Any) -> 'ResponseForSecretsDeleteResponse': - assert isinstance(obj, dict) - success = from_bool(obj.get("success")) - data = from_union([SecretsDeleteResponse.from_dict, from_none], obj.get("data")) - error_message = from_union([from_none, from_str], obj.get("errorMessage")) - return ResponseForSecretsDeleteResponse(success, data, error_message) - - def to_dict(self) -> dict: - result: dict = {} - result["success"] = from_bool(self.success) - if self.data is not None: - result["data"] = from_union([lambda x: to_class(SecretsDeleteResponse, x), from_none], self.data) - if self.error_message is not None: - result["errorMessage"] = from_union([from_none, from_str], self.error_message) - return result - - -@dataclass -class CipherDetailsResponse: - pass - - @staticmethod - def from_dict(obj: Any) -> 'CipherDetailsResponse': - assert isinstance(obj, dict) - return CipherDetailsResponse() - - def to_dict(self) -> dict: - result: dict = {} - return result - - -@dataclass -class ProfileOrganizationResponse: - id: UUID - - @staticmethod - def from_dict(obj: Any) -> 'ProfileOrganizationResponse': - assert isinstance(obj, dict) - id = UUID(obj.get("id")) - return ProfileOrganizationResponse(id) - - def to_dict(self) -> dict: - result: dict = {} - result["id"] = str(self.id) - return result - - -@dataclass -class ProfileResponse: - """Data about the user, including their encryption keys and the organizations they are a - part of - """ - email: str - id: UUID - name: str - organizations: List[ProfileOrganizationResponse] - - @staticmethod - def from_dict(obj: Any) -> 'ProfileResponse': - assert isinstance(obj, dict) - email = from_str(obj.get("email")) - id = UUID(obj.get("id")) - name = from_str(obj.get("name")) - organizations = from_list(ProfileOrganizationResponse.from_dict, obj.get("organizations")) - return ProfileResponse(email, id, name, organizations) - - def to_dict(self) -> dict: - result: dict = {} - result["email"] = from_str(self.email) - result["id"] = str(self.id) - result["name"] = from_str(self.name) - result["organizations"] = from_list(lambda x: to_class(ProfileOrganizationResponse, x), self.organizations) - return result - - -@dataclass -class SyncResponse: - """List of ciphers accesible by the user""" - ciphers: List[CipherDetailsResponse] - """Data about the user, including their encryption keys and the organizations they are a - part of - """ - profile: ProfileResponse - - @staticmethod - def from_dict(obj: Any) -> 'SyncResponse': - assert isinstance(obj, dict) - ciphers = from_list(CipherDetailsResponse.from_dict, obj.get("ciphers")) - profile = ProfileResponse.from_dict(obj.get("profile")) - return SyncResponse(ciphers, profile) - - def to_dict(self) -> dict: - result: dict = {} - result["ciphers"] = from_list(lambda x: to_class(CipherDetailsResponse, x), self.ciphers) - result["profile"] = to_class(ProfileResponse, self.profile) - return result - - -@dataclass -class ResponseForSyncResponse: - """Whether or not the SDK request succeeded.""" - success: bool - """The response data. Populated if `success` is true.""" - data: Optional[SyncResponse] = None - """A message for any error that may occur. Populated if `success` is false.""" - error_message: Optional[str] = None - - @staticmethod - def from_dict(obj: Any) -> 'ResponseForSyncResponse': - assert isinstance(obj, dict) - success = from_bool(obj.get("success")) - data = from_union([SyncResponse.from_dict, from_none], obj.get("data")) - error_message = from_union([from_none, from_str], obj.get("errorMessage")) - return ResponseForSyncResponse(success, data, error_message) - - def to_dict(self) -> dict: - result: dict = {} - result["success"] = from_bool(self.success) - if self.data is not None: - result["data"] = from_union([lambda x: to_class(SyncResponse, x), from_none], self.data) - if self.error_message is not None: - result["errorMessage"] = from_union([from_none, from_str], self.error_message) - return result - - -@dataclass -class UserAPIKeyResponse: - """The user's API key, which represents the client_secret portion of an oauth request.""" - api_key: str - - @staticmethod - def from_dict(obj: Any) -> 'UserAPIKeyResponse': - assert isinstance(obj, dict) - api_key = from_str(obj.get("apiKey")) - return UserAPIKeyResponse(api_key) - - def to_dict(self) -> dict: - result: dict = {} - result["apiKey"] = from_str(self.api_key) - return result - - -@dataclass -class ResponseForUserAPIKeyResponse: - """Whether or not the SDK request succeeded.""" - success: bool - """The response data. Populated if `success` is true.""" - data: Optional[UserAPIKeyResponse] = None - """A message for any error that may occur. Populated if `success` is false.""" - error_message: Optional[str] = None - - @staticmethod - def from_dict(obj: Any) -> 'ResponseForUserAPIKeyResponse': - assert isinstance(obj, dict) - success = from_bool(obj.get("success")) - data = from_union([UserAPIKeyResponse.from_dict, from_none], obj.get("data")) - error_message = from_union([from_none, from_str], obj.get("errorMessage")) - return ResponseForUserAPIKeyResponse(success, data, error_message) - - def to_dict(self) -> dict: - result: dict = {} - result["success"] = from_bool(self.success) - if self.data is not None: - result["data"] = from_union([lambda x: to_class(UserAPIKeyResponse, x), from_none], self.data) - if self.error_message is not None: - result["errorMessage"] = from_union([from_none, from_str], self.error_message) - return result - - -def client_settings_from_dict(s: Any) -> ClientSettings: - return ClientSettings.from_dict(s) - - -def client_settings_to_dict(x: ClientSettings) -> Any: - return to_class(ClientSettings, x) - - -def command_from_dict(s: Any) -> Command: - return Command.from_dict(s) - - -def command_to_dict(x: Command) -> Any: - return to_class(Command, x) - - -def response_for_api_key_login_response_from_dict(s: Any) -> ResponseForAPIKeyLoginResponse: - return ResponseForAPIKeyLoginResponse.from_dict(s) - - -def response_for_api_key_login_response_to_dict(x: ResponseForAPIKeyLoginResponse) -> Any: - return to_class(ResponseForAPIKeyLoginResponse, x) - - -def response_for_fingerprint_response_from_dict(s: Any) -> ResponseForFingerprintResponse: - return ResponseForFingerprintResponse.from_dict(s) - - -def response_for_fingerprint_response_to_dict(x: ResponseForFingerprintResponse) -> Any: - return to_class(ResponseForFingerprintResponse, x) - - -def response_for_password_login_response_from_dict(s: Any) -> ResponseForPasswordLoginResponse: - return ResponseForPasswordLoginResponse.from_dict(s) - - -def response_for_password_login_response_to_dict(x: ResponseForPasswordLoginResponse) -> Any: - return to_class(ResponseForPasswordLoginResponse, x) - - -def response_for_secret_delete_response_from_dict(s: Any) -> ResponseForSecretDeleteResponse: - return ResponseForSecretDeleteResponse.from_dict(s) - - -def response_for_secret_delete_response_to_dict(x: ResponseForSecretDeleteResponse) -> Any: - return to_class(ResponseForSecretDeleteResponse, x) - - -def response_for_secret_identifier_response_from_dict(s: Any) -> ResponseForSecretIdentifierResponse: - return ResponseForSecretIdentifierResponse.from_dict(s) - - -def response_for_secret_identifier_response_to_dict(x: ResponseForSecretIdentifierResponse) -> Any: - return to_class(ResponseForSecretIdentifierResponse, x) - - -def response_for_secret_identifiers_response_from_dict(s: Any) -> ResponseForSecretIdentifiersResponse: - return ResponseForSecretIdentifiersResponse.from_dict(s) - - -def response_for_secret_identifiers_response_to_dict(x: ResponseForSecretIdentifiersResponse) -> Any: - return to_class(ResponseForSecretIdentifiersResponse, x) - - -def response_for_secret_response_from_dict(s: Any) -> ResponseForSecretResponse: - return ResponseForSecretResponse.from_dict(s) - - -def response_for_secret_response_to_dict(x: ResponseForSecretResponse) -> Any: - return to_class(ResponseForSecretResponse, x) - - -def response_for_secrets_delete_response_from_dict(s: Any) -> ResponseForSecretsDeleteResponse: - return ResponseForSecretsDeleteResponse.from_dict(s) - - -def response_for_secrets_delete_response_to_dict(x: ResponseForSecretsDeleteResponse) -> Any: - return to_class(ResponseForSecretsDeleteResponse, x) - - -def response_for_sync_response_from_dict(s: Any) -> ResponseForSyncResponse: - return ResponseForSyncResponse.from_dict(s) - - -def response_for_sync_response_to_dict(x: ResponseForSyncResponse) -> Any: - return to_class(ResponseForSyncResponse, x) - - -def response_for_user_api_key_response_from_dict(s: Any) -> ResponseForUserAPIKeyResponse: - return ResponseForUserAPIKeyResponse.from_dict(s) - - -def response_for_user_api_key_response_to_dict(x: ResponseForUserAPIKeyResponse) -> Any: - return to_class(ResponseForUserAPIKeyResponse, x) - diff --git a/package-lock.json b/package-lock.json index d46a9414c6..91f07c6cfd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,17 +10,17 @@ "license": "SEE LICENSE IN LICENSE", "devDependencies": { "@openapitools/openapi-generator-cli": "2.6.0", - "prettier": "2.8.8", - "quicktype-core": "21.0.16", + "prettier": "3.0.0", + "quicktype-core": "23.0.59", "rimraf": "5.0.0", "ts-node": "10.9.1", "typescript": "5.0.4" } }, "node_modules/@babel/runtime": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz", - "integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.11" @@ -42,9 +42,9 @@ } }, "node_modules/@glideapps/ts-necessities": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.1.2.tgz", - "integrity": "sha512-tLjfhinr6doUBcWi7BWnkT2zT6G5UhiZftsiIH6xVvykeXE+FU7Wr0MyqwmqideWlDD5rG+VjVLptLviGo04CA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.1.3.tgz", + "integrity": "sha512-q9U8v/n9qbkd2zDYjuX3qtlbl+OIyI9zF+zQhZjfYOE9VMDH7tfcUSJ9p0lXoY3lxmGFne09yi4iiNeQUwV7AA==", "dev": true }, "node_modules/@isaacs/cliui": { @@ -404,9 +404,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.2.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", - "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==", + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==", "dev": true, "peer": true }, @@ -429,9 +429,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -799,12 +799,12 @@ "dev": true }, "node_modules/cross-fetch": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", - "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", "dev": true, "dependencies": { - "node-fetch": "^2.6.11" + "node-fetch": "^2.6.12" } }, "node_modules/cross-spawn": { @@ -1269,9 +1269,9 @@ } }, "node_modules/lru-cache": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", - "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -1326,9 +1326,9 @@ } }, "node_modules/minipass": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", - "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", + "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -1341,9 +1341,9 @@ "dev": true }, "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "dev": true, "dependencies": { "whatwg-url": "^5.0.0" @@ -1441,13 +1441,13 @@ } }, "node_modules/path-scurry": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", - "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.2" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -1472,15 +1472,15 @@ } }, "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -1496,12 +1496,12 @@ } }, "node_modules/quicktype-core": { - "version": "21.0.16", - "resolved": "https://registry.npmjs.org/quicktype-core/-/quicktype-core-21.0.16.tgz", - "integrity": "sha512-582Ksfns/RGcR+r3mTcTzlpHINjPpTbBoQziDciN5TtqwvF0UzRZo6ivGoPyRIK3i4rutOPWGT8oqXqxwBgq/Q==", + "version": "23.0.59", + "resolved": "https://registry.npmjs.org/quicktype-core/-/quicktype-core-23.0.59.tgz", + "integrity": "sha512-D8DwNyJkDi3kcQ0kY3QYHx/REobwa1kJ+2udTo7it1ofqtjQVNncRsjKN0urml6hByqdDCOT7IiFgOB7i0M2Nw==", "dev": true, "dependencies": { - "@glideapps/ts-necessities": "2.1.2", + "@glideapps/ts-necessities": "2.1.3", "@types/urijs": "^1.19.19", "browser-or-node": "^2.1.1", "collection-utils": "^1.0.1", @@ -1515,7 +1515,7 @@ "unicode-properties": "^1.4.1", "urijs": "^1.19.1", "wordwrap": "^1.0.0", - "yaml": "^2.2.1" + "yaml": "^2.3.1" } }, "node_modules/quicktype-core/node_modules/buffer": { @@ -1633,16 +1633,16 @@ } }, "node_modules/rimraf/node_modules/glob": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz", - "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" }, "bin": { "glob": "dist/cjs/src/bin.js" @@ -1655,9 +1655,9 @@ } }, "node_modules/rimraf/node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -1688,9 +1688,9 @@ } }, "node_modules/rxjs/node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", "dev": true }, "node_modules/safe-buffer": { @@ -2159,9 +2159,9 @@ }, "dependencies": { "@babel/runtime": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz", - "integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dev": true, "requires": { "regenerator-runtime": "^0.13.11" @@ -2177,9 +2177,9 @@ } }, "@glideapps/ts-necessities": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.1.2.tgz", - "integrity": "sha512-tLjfhinr6doUBcWi7BWnkT2zT6G5UhiZftsiIH6xVvykeXE+FU7Wr0MyqwmqideWlDD5rG+VjVLptLviGo04CA==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@glideapps/ts-necessities/-/ts-necessities-2.1.3.tgz", + "integrity": "sha512-q9U8v/n9qbkd2zDYjuX3qtlbl+OIyI9zF+zQhZjfYOE9VMDH7tfcUSJ9p0lXoY3lxmGFne09yi4iiNeQUwV7AA==", "dev": true }, "@isaacs/cliui": { @@ -2416,9 +2416,9 @@ "dev": true }, "@types/node": { - "version": "20.2.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", - "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==", + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==", "dev": true, "peer": true }, @@ -2438,9 +2438,9 @@ } }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true }, "acorn-walk": { @@ -2710,12 +2710,12 @@ "dev": true }, "cross-fetch": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", - "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", "dev": true, "requires": { - "node-fetch": "^2.6.11" + "node-fetch": "^2.6.12" } }, "cross-spawn": { @@ -3047,9 +3047,9 @@ } }, "lru-cache": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", - "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.0.tgz", + "integrity": "sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==", "dev": true }, "make-error": { @@ -3089,9 +3089,9 @@ } }, "minipass": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", - "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.2.tgz", + "integrity": "sha512-eL79dXrE1q9dBbDCLg7xfn/vl7MS4F1gvJAgjJrQli/jbQWdUttuVawphqpffoIYfRdq78LHx6GP4bU/EQ2ATA==", "dev": true }, "mute-stream": { @@ -3101,9 +3101,9 @@ "dev": true }, "node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "dev": true, "requires": { "whatwg-url": "^5.0.0" @@ -3169,13 +3169,13 @@ "dev": true }, "path-scurry": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", - "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dev": true, "requires": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.2" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "path-to-regexp": { @@ -3191,9 +3191,9 @@ "dev": true }, "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", "dev": true }, "process": { @@ -3203,12 +3203,12 @@ "dev": true }, "quicktype-core": { - "version": "21.0.16", - "resolved": "https://registry.npmjs.org/quicktype-core/-/quicktype-core-21.0.16.tgz", - "integrity": "sha512-582Ksfns/RGcR+r3mTcTzlpHINjPpTbBoQziDciN5TtqwvF0UzRZo6ivGoPyRIK3i4rutOPWGT8oqXqxwBgq/Q==", + "version": "23.0.59", + "resolved": "https://registry.npmjs.org/quicktype-core/-/quicktype-core-23.0.59.tgz", + "integrity": "sha512-D8DwNyJkDi3kcQ0kY3QYHx/REobwa1kJ+2udTo7it1ofqtjQVNncRsjKN0urml6hByqdDCOT7IiFgOB7i0M2Nw==", "dev": true, "requires": { - "@glideapps/ts-necessities": "2.1.2", + "@glideapps/ts-necessities": "2.1.3", "@types/urijs": "^1.19.19", "browser-or-node": "^2.1.1", "collection-utils": "^1.0.1", @@ -3222,7 +3222,7 @@ "unicode-properties": "^1.4.1", "urijs": "^1.19.1", "wordwrap": "^1.0.0", - "yaml": "^2.2.1" + "yaml": "^2.3.1" }, "dependencies": { "buffer": { @@ -3307,22 +3307,22 @@ } }, "glob": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz", - "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==", + "version": "10.3.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", + "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", "dev": true, "requires": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" } }, "minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -3346,9 +3346,9 @@ }, "dependencies": { "tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", "dev": true } } diff --git a/package.json b/package.json index f286ddfd6e..4f6283e5a9 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,8 @@ }, "devDependencies": { "@openapitools/openapi-generator-cli": "2.6.0", - "prettier": "2.8.8", - "quicktype-core": "21.0.16", + "prettier": "3.0.0", + "quicktype-core": "23.0.59", "rimraf": "5.0.0", "ts-node": "10.9.1", "typescript": "5.0.4" diff --git a/support/schemas/request/ClientSettings.json b/support/schemas/request/ClientSettings.json deleted file mode 100644 index dd31ba0214..0000000000 --- a/support/schemas/request/ClientSettings.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "ClientSettings", - "description": "Basic client behavior settings. These settings specify the various targets and behavior of the Bitwarden Client. They are optional and uneditable once the client is initialized.\n\nDefaults to\n\n``` # use bitwarden::sdk::request::client_settings::{ClientSettings, DeviceType}; # use assert_matches::assert_matches; let settings = ClientSettings { identity_url: \"https://identity.bitwarden.com\".to_string(), api_url: \"https://api.bitwarden.com\".to_string(), user_agent: \"Bitwarden Rust-SDK\".to_string(), device_type: DeviceType::SDK, internal: None, }; let default = ClientSettings::default(); assert_matches!(settings, default); ```\n\nTargets `localhost:8080` for debug builds.", - "type": "object", - "required": [ - "apiUrl", - "deviceType", - "identityUrl", - "userAgent" - ], - "properties": { - "apiUrl": { - "description": "The api url of the targeted Bitwarden instance. Defaults to `https://api.bitwarden.com`", - "type": "string" - }, - "deviceType": { - "description": "Device type to send to Bitwarden. Defaults to SDK", - "allOf": [ - { - "$ref": "#/definitions/DeviceType" - } - ] - }, - "identityUrl": { - "description": "The identity url of the targeted Bitwarden instance. Defaults to `https://identity.bitwarden.com`", - "type": "string" - }, - "internal": { - "anyOf": [ - { - "$ref": "#/definitions/ClientSettingsInternal" - }, - { - "type": "null" - } - ] - }, - "userAgent": { - "description": "The user_agent to sent to Bitwarden. Defaults to `Bitwarden Rust-SDK`", - "type": "string" - } - }, - "additionalProperties": false, - "definitions": { - "ClientSettingsInternal": { - "type": "object", - "required": [ - "accessToken", - "email", - "expiresIn", - "kdfIterations", - "kdfType", - "refreshToken" - ], - "properties": { - "accessToken": { - "type": "string" - }, - "email": { - "type": "string" - }, - "expiresIn": { - "type": "integer", - "format": "uint64", - "minimum": 0.0 - }, - "kdfIterations": { - "type": "integer", - "format": "uint32", - "minimum": 1.0 - }, - "kdfType": { - "$ref": "#/definitions/KdfType" - }, - "refreshToken": { - "type": "string" - } - }, - "additionalProperties": false - }, - "DeviceType": { - "type": "string", - "enum": [ - "Android", - "iOS", - "ChromeExtension", - "FirefoxExtension", - "OperaExtension", - "EdgeExtension", - "WindowsDesktop", - "MacOsDesktop", - "LinuxDesktop", - "ChromeBrowser", - "FirefoxBrowser", - "OperaBrowser", - "EdgeBrowser", - "IEBrowser", - "UnknownBrowser", - "AndroidAmazon", - "UWP", - "SafariBrowser", - "VivaldiBrowser", - "VivaldiExtension", - "SafariExtension", - "SDK" - ] - }, - "KdfType": { - "type": "string", - "enum": [ - "pbkdf2Sha256", - "argon2id" - ] - } - } -} diff --git a/support/schemas/request/Command.json b/support/schemas/request/Command.json deleted file mode 100644 index 6e7a8e9508..0000000000 --- a/support/schemas/request/Command.json +++ /dev/null @@ -1,557 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Command", - "oneOf": [ - { - "description": "Login with username and password\n\nThis command is for initiating an authentication handshake with Bitwarden. Authorization may fail due to requiring 2fa or captcha challenge completion despite accurate credentials.\n\nThis command is not capable of handling authentication requiring 2fa or captcha.\n\nReturns: [PasswordLoginResponse](crate::sdk::auth::response::PasswordLoginResponse)", - "type": "object", - "required": [ - "passwordLogin" - ], - "properties": { - "passwordLogin": { - "$ref": "#/definitions/PasswordLoginRequest" - } - }, - "additionalProperties": false - }, - { - "description": "Login with API Key\n\nThis command is for initiating an authentication handshake with Bitwarden.\n\nReturns: [ApiKeyLoginResponse](crate::sdk::auth::response::ApiKeyLoginResponse)", - "type": "object", - "required": [ - "apiKeyLogin" - ], - "properties": { - "apiKeyLogin": { - "$ref": "#/definitions/ApiKeyLoginRequest" - } - }, - "additionalProperties": false - }, - { - "description": "Login with Secrets Manager Access Token\n\nThis command is for initiating an authentication handshake with Bitwarden.\n\nReturns: [ApiKeyLoginResponse](crate::sdk::auth::response::ApiKeyLoginResponse)", - "type": "object", - "required": [ - "accessTokenLogin" - ], - "properties": { - "accessTokenLogin": { - "$ref": "#/definitions/AccessTokenLoginRequest" - } - }, - "additionalProperties": false - }, - { - "description": "> Requires Authentication Get the API key of the currently authenticated user\n\nReturns: [UserApiKeyResponse](crate::sdk::response::user_api_key_response::UserApiKeyResponse)", - "type": "object", - "required": [ - "getUserApiKey" - ], - "properties": { - "getUserApiKey": { - "$ref": "#/definitions/SecretVerificationRequest" - } - }, - "additionalProperties": false - }, - { - "description": "Get the user's passphrase\n\nReturns: String", - "type": "object", - "required": [ - "fingerprint" - ], - "properties": { - "fingerprint": { - "$ref": "#/definitions/FingerprintRequest" - } - }, - "additionalProperties": false - }, - { - "description": "> Requires Authentication Retrieve all user data, ciphers and organizations the user is a part of\n\nReturns: [SyncResponse](crate::sdk::response::sync_response::SyncResponse)", - "type": "object", - "required": [ - "sync" - ], - "properties": { - "sync": { - "$ref": "#/definitions/SyncRequest" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "secrets" - ], - "properties": { - "secrets": { - "$ref": "#/definitions/SecretsCommand" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "projects" - ], - "properties": { - "projects": { - "$ref": "#/definitions/ProjectsCommand" - } - }, - "additionalProperties": false - } - ], - "definitions": { - "AccessTokenLoginRequest": { - "description": "Login to Bitwarden with access token", - "type": "object", - "required": [ - "accessToken" - ], - "properties": { - "accessToken": { - "description": "Bitwarden service API access token", - "type": "string" - } - }, - "additionalProperties": false - }, - "ApiKeyLoginRequest": { - "description": "Login to Bitwarden with Api Key", - "type": "object", - "required": [ - "clientId", - "clientSecret", - "password" - ], - "properties": { - "clientId": { - "description": "Bitwarden account client_id", - "type": "string" - }, - "clientSecret": { - "description": "Bitwarden account client_secret", - "type": "string" - }, - "password": { - "description": "Bitwarden account master password", - "type": "string" - } - }, - "additionalProperties": false - }, - "FingerprintRequest": { - "type": "object", - "required": [ - "fingerprintMaterial", - "publicKey" - ], - "properties": { - "fingerprintMaterial": { - "description": "The input material, used in the fingerprint generation process.", - "type": "string" - }, - "publicKey": { - "description": "The user's public key encoded with base64.", - "type": "string" - } - }, - "additionalProperties": false - }, - "PasswordLoginRequest": { - "description": "Login to Bitwarden with Username and Password", - "type": "object", - "required": [ - "email", - "password" - ], - "properties": { - "email": { - "description": "Bitwarden account email address", - "type": "string" - }, - "password": { - "description": "Bitwarden account master password", - "type": "string" - } - }, - "additionalProperties": false - }, - "ProjectCreateRequest": { - "type": "object", - "required": [ - "name", - "organizationId" - ], - "properties": { - "name": { - "type": "string" - }, - "organizationId": { - "description": "Organization where the project will be created", - "type": "string", - "format": "uuid" - } - }, - "additionalProperties": false - }, - "ProjectGetRequest": { - "type": "object", - "required": [ - "id" - ], - "properties": { - "id": { - "description": "ID of the project to retrieve", - "type": "string", - "format": "uuid" - } - }, - "additionalProperties": false - }, - "ProjectPutRequest": { - "type": "object", - "required": [ - "id", - "name", - "organizationId" - ], - "properties": { - "id": { - "description": "ID of the project to modify", - "type": "string", - "format": "uuid" - }, - "name": { - "type": "string" - }, - "organizationId": { - "description": "Organization ID of the project to modify", - "type": "string", - "format": "uuid" - } - }, - "additionalProperties": false - }, - "ProjectsCommand": { - "oneOf": [ - { - "description": "> Requires Authentication > Requires using an Access Token for login or calling Sync at least once Retrieve a project by the provided identifier\n\nReturns: [ProjectResponse](crate::sdk::response::projects_response::ProjectResponse)", - "type": "object", - "required": [ - "get" - ], - "properties": { - "get": { - "$ref": "#/definitions/ProjectGetRequest" - } - }, - "additionalProperties": false - }, - { - "description": "> Requires Authentication > Requires using an Access Token for login or calling Sync at least once Creates a new project in the provided organization using the given data\n\nReturns: [ProjectResponse](crate::sdk::response::projects_response::ProjectResponse)", - "type": "object", - "required": [ - "create" - ], - "properties": { - "create": { - "$ref": "#/definitions/ProjectCreateRequest" - } - }, - "additionalProperties": false - }, - { - "description": "> Requires Authentication > Requires using an Access Token for login or calling Sync at least once Lists all projects of the given organization\n\nReturns: [ProjectsResponse](crate::sdk::response::projects_response::ProjectsResponse)", - "type": "object", - "required": [ - "list" - ], - "properties": { - "list": { - "$ref": "#/definitions/ProjectsListRequest" - } - }, - "additionalProperties": false - }, - { - "description": "> Requires Authentication > Requires using an Access Token for login or calling Sync at least once Updates an existing project with the provided ID using the given data\n\nReturns: [ProjectResponse](crate::sdk::response::projects_response::ProjectResponse)", - "type": "object", - "required": [ - "update" - ], - "properties": { - "update": { - "$ref": "#/definitions/ProjectPutRequest" - } - }, - "additionalProperties": false - }, - { - "description": "> Requires Authentication > Requires using an Access Token for login or calling Sync at least once Deletes all the projects whose IDs match the provided ones\n\nReturns: [ProjectsDeleteResponse](crate::sdk::response::projects_response::ProjectsDeleteResponse)", - "type": "object", - "required": [ - "delete" - ], - "properties": { - "delete": { - "$ref": "#/definitions/ProjectsDeleteRequest" - } - }, - "additionalProperties": false - } - ] - }, - "ProjectsDeleteRequest": { - "type": "object", - "required": [ - "ids" - ], - "properties": { - "ids": { - "description": "IDs of the projects to delete", - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } - } - }, - "additionalProperties": false - }, - "ProjectsListRequest": { - "type": "object", - "required": [ - "organizationId" - ], - "properties": { - "organizationId": { - "description": "Organization to retrieve all the projects from", - "type": "string", - "format": "uuid" - } - }, - "additionalProperties": false - }, - "SecretCreateRequest": { - "type": "object", - "required": [ - "key", - "note", - "organizationId", - "value" - ], - "properties": { - "key": { - "type": "string" - }, - "note": { - "type": "string" - }, - "organizationId": { - "description": "Organization where the secret will be created", - "type": "string", - "format": "uuid" - }, - "projectIds": { - "description": "IDs of the projects that this secret will belong to", - "type": [ - "array", - "null" - ], - "items": { - "type": "string", - "format": "uuid" - } - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - }, - "SecretGetRequest": { - "type": "object", - "required": [ - "id" - ], - "properties": { - "id": { - "description": "ID of the secret to retrieve", - "type": "string", - "format": "uuid" - } - }, - "additionalProperties": false - }, - "SecretIdentifiersRequest": { - "type": "object", - "required": [ - "organizationId" - ], - "properties": { - "organizationId": { - "description": "Organization to retrieve all the secrets from", - "type": "string", - "format": "uuid" - } - }, - "additionalProperties": false - }, - "SecretPutRequest": { - "type": "object", - "required": [ - "id", - "key", - "note", - "organizationId", - "value" - ], - "properties": { - "id": { - "description": "ID of the secret to modify", - "type": "string", - "format": "uuid" - }, - "key": { - "type": "string" - }, - "note": { - "type": "string" - }, - "organizationId": { - "description": "Organization ID of the secret to modify", - "type": "string", - "format": "uuid" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - }, - "SecretVerificationRequest": { - "type": "object", - "properties": { - "masterPassword": { - "description": "The user's master password to use for user verification. If supplied, this will be used for verification purposes.", - "type": [ - "string", - "null" - ] - }, - "otp": { - "description": "Alternate user verification method through OTP. This is provided for users who have no master password due to use of Customer Managed Encryption. Must be present and valid if master_password is absent.", - "type": [ - "string", - "null" - ] - } - }, - "additionalProperties": false - }, - "SecretsCommand": { - "oneOf": [ - { - "description": "> Requires Authentication > Requires using an Access Token for login or calling Sync at least once Retrieve a secret by the provided identifier\n\nReturns: [SecretResponse](crate::sdk::response::secrets_response::SecretResponse)", - "type": "object", - "required": [ - "get" - ], - "properties": { - "get": { - "$ref": "#/definitions/SecretGetRequest" - } - }, - "additionalProperties": false - }, - { - "description": "> Requires Authentication > Requires using an Access Token for login or calling Sync at least once Creates a new secret in the provided organization using the given data\n\nReturns: [SecretResponse](crate::sdk::response::secrets_response::SecretResponse)", - "type": "object", - "required": [ - "create" - ], - "properties": { - "create": { - "$ref": "#/definitions/SecretCreateRequest" - } - }, - "additionalProperties": false - }, - { - "description": "> Requires Authentication > Requires using an Access Token for login or calling Sync at least once Lists all secret identifiers of the given organization, to then retrieve each secret, use `CreateSecret`\n\nReturns: [SecretIdentifiersResponse](crate::sdk::response::secrets_response::SecretIdentifiersResponse)", - "type": "object", - "required": [ - "list" - ], - "properties": { - "list": { - "$ref": "#/definitions/SecretIdentifiersRequest" - } - }, - "additionalProperties": false - }, - { - "description": "> Requires Authentication > Requires using an Access Token for login or calling Sync at least once Updates an existing secret with the provided ID using the given data\n\nReturns: [SecretResponse](crate::sdk::response::secrets_response::SecretResponse)", - "type": "object", - "required": [ - "update" - ], - "properties": { - "update": { - "$ref": "#/definitions/SecretPutRequest" - } - }, - "additionalProperties": false - }, - { - "description": "> Requires Authentication > Requires using an Access Token for login or calling Sync at least once Deletes all the secrets whose IDs match the provided ones\n\nReturns: [SecretsDeleteResponse](crate::sdk::response::secrets_response::SecretsDeleteResponse)", - "type": "object", - "required": [ - "delete" - ], - "properties": { - "delete": { - "$ref": "#/definitions/SecretsDeleteRequest" - } - }, - "additionalProperties": false - } - ] - }, - "SecretsDeleteRequest": { - "type": "object", - "required": [ - "ids" - ], - "properties": { - "ids": { - "description": "IDs of the secrets to delete", - "type": "array", - "items": { - "type": "string", - "format": "uuid" - } - } - }, - "additionalProperties": false - }, - "SyncRequest": { - "type": "object", - "properties": { - "excludeSubdomains": { - "description": "Exclude the subdomains from the response, defaults to false", - "type": [ - "boolean", - "null" - ] - } - }, - "additionalProperties": false - } - } -} diff --git a/support/schemas/response/ApiKeyLoginResponse.json b/support/schemas/response/ApiKeyLoginResponse.json deleted file mode 100644 index 3bfecfb4eb..0000000000 --- a/support/schemas/response/ApiKeyLoginResponse.json +++ /dev/null @@ -1,203 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Response_for_ApiKeyLoginResponse", - "type": "object", - "required": [ - "success" - ], - "properties": { - "data": { - "description": "The response data. Populated if `success` is true.", - "anyOf": [ - { - "$ref": "#/definitions/ApiKeyLoginResponse" - }, - { - "type": "null" - } - ] - }, - "errorMessage": { - "description": "A message for any error that may occur. Populated if `success` is false.", - "type": [ - "string", - "null" - ] - }, - "success": { - "description": "Whether or not the SDK request succeeded.", - "type": "boolean" - } - }, - "additionalProperties": false, - "definitions": { - "ApiKeyLoginResponse": { - "type": "object", - "required": [ - "authenticated", - "forcePasswordReset", - "resetMasterPassword" - ], - "properties": { - "authenticated": { - "type": "boolean" - }, - "forcePasswordReset": { - "description": "Whether or not the user is required to update their master password", - "type": "boolean" - }, - "resetMasterPassword": { - "description": "TODO: What does this do?", - "type": "boolean" - }, - "twoFactor": { - "anyOf": [ - { - "$ref": "#/definitions/TwoFactorProviders" - }, - { - "type": "null" - } - ] - } - }, - "additionalProperties": false - }, - "Authenticator": { - "type": "object", - "additionalProperties": false - }, - "Duo": { - "type": "object", - "required": [ - "host", - "signature" - ], - "properties": { - "host": { - "type": "string" - }, - "signature": { - "type": "string" - } - }, - "additionalProperties": false - }, - "Email": { - "type": "object", - "required": [ - "email" - ], - "properties": { - "email": { - "description": "The email to request a 2fa TOTP for", - "type": "string" - } - }, - "additionalProperties": false - }, - "Remember": { - "type": "object", - "additionalProperties": false - }, - "TwoFactorProviders": { - "type": "object", - "properties": { - "authenticator": { - "anyOf": [ - { - "$ref": "#/definitions/Authenticator" - }, - { - "type": "null" - } - ] - }, - "duo": { - "description": "Duo-backed 2fa", - "anyOf": [ - { - "$ref": "#/definitions/Duo" - }, - { - "type": "null" - } - ] - }, - "email": { - "description": "Email 2fa", - "anyOf": [ - { - "$ref": "#/definitions/Email" - }, - { - "type": "null" - } - ] - }, - "organizationDuo": { - "description": "Duo-backed 2fa operated by an organization the user is a member of", - "anyOf": [ - { - "$ref": "#/definitions/Duo" - }, - { - "type": "null" - } - ] - }, - "remember": { - "description": "Presence indicates the user has stored this device as bypassing 2fa", - "anyOf": [ - { - "$ref": "#/definitions/Remember" - }, - { - "type": "null" - } - ] - }, - "webAuthn": { - "description": "WebAuthn-backed 2fa", - "anyOf": [ - { - "$ref": "#/definitions/WebAuthn" - }, - { - "type": "null" - } - ] - }, - "yubiKey": { - "description": "Yubikey-backed 2fa", - "anyOf": [ - { - "$ref": "#/definitions/YubiKey" - }, - { - "type": "null" - } - ] - } - }, - "additionalProperties": false - }, - "WebAuthn": { - "type": "object", - "additionalProperties": false - }, - "YubiKey": { - "type": "object", - "required": [ - "nfc" - ], - "properties": { - "nfc": { - "description": "Whether the stored yubikey supports near field communication", - "type": "boolean" - } - }, - "additionalProperties": false - } - } -} diff --git a/support/schemas/response/FingerprintResponse.json b/support/schemas/response/FingerprintResponse.json deleted file mode 100644 index e70ed88f4f..0000000000 --- a/support/schemas/response/FingerprintResponse.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Response_for_FingerprintResponse", - "type": "object", - "required": [ - "success" - ], - "properties": { - "data": { - "description": "The response data. Populated if `success` is true.", - "anyOf": [ - { - "$ref": "#/definitions/FingerprintResponse" - }, - { - "type": "null" - } - ] - }, - "errorMessage": { - "description": "A message for any error that may occur. Populated if `success` is false.", - "type": [ - "string", - "null" - ] - }, - "success": { - "description": "Whether or not the SDK request succeeded.", - "type": "boolean" - } - }, - "additionalProperties": false, - "definitions": { - "FingerprintResponse": { - "type": "object", - "required": [ - "fingerprint" - ], - "properties": { - "fingerprint": { - "type": "string" - } - }, - "additionalProperties": false - } - } -} diff --git a/support/schemas/response/PasswordLoginResponse.json b/support/schemas/response/PasswordLoginResponse.json deleted file mode 100644 index be96773497..0000000000 --- a/support/schemas/response/PasswordLoginResponse.json +++ /dev/null @@ -1,228 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Response_for_PasswordLoginResponse", - "type": "object", - "required": [ - "success" - ], - "properties": { - "data": { - "description": "The response data. Populated if `success` is true.", - "anyOf": [ - { - "$ref": "#/definitions/PasswordLoginResponse" - }, - { - "type": "null" - } - ] - }, - "errorMessage": { - "description": "A message for any error that may occur. Populated if `success` is false.", - "type": [ - "string", - "null" - ] - }, - "success": { - "description": "Whether or not the SDK request succeeded.", - "type": "boolean" - } - }, - "additionalProperties": false, - "definitions": { - "Authenticator": { - "type": "object", - "additionalProperties": false - }, - "CaptchaResponse": { - "type": "object", - "required": [ - "siteKey" - ], - "properties": { - "siteKey": { - "description": "hcaptcha site key", - "type": "string" - } - }, - "additionalProperties": false - }, - "Duo": { - "type": "object", - "required": [ - "host", - "signature" - ], - "properties": { - "host": { - "type": "string" - }, - "signature": { - "type": "string" - } - }, - "additionalProperties": false - }, - "Email": { - "type": "object", - "required": [ - "email" - ], - "properties": { - "email": { - "description": "The email to request a 2fa TOTP for", - "type": "string" - } - }, - "additionalProperties": false - }, - "PasswordLoginResponse": { - "type": "object", - "required": [ - "authenticated", - "forcePasswordReset", - "resetMasterPassword" - ], - "properties": { - "authenticated": { - "type": "boolean" - }, - "captcha": { - "description": "The information required to present the user with a captcha challenge. Only present when authentication fails due to requiring validation of a captcha challenge.", - "anyOf": [ - { - "$ref": "#/definitions/CaptchaResponse" - }, - { - "type": "null" - } - ] - }, - "forcePasswordReset": { - "description": "Whether or not the user is required to update their master password", - "type": "boolean" - }, - "resetMasterPassword": { - "description": "TODO: What does this do?", - "type": "boolean" - }, - "twoFactor": { - "description": "The available two factor authentication options. Present only when authentication fails due to requiring a second authentication factor.", - "anyOf": [ - { - "$ref": "#/definitions/TwoFactorProviders" - }, - { - "type": "null" - } - ] - } - }, - "additionalProperties": false - }, - "Remember": { - "type": "object", - "additionalProperties": false - }, - "TwoFactorProviders": { - "type": "object", - "properties": { - "authenticator": { - "anyOf": [ - { - "$ref": "#/definitions/Authenticator" - }, - { - "type": "null" - } - ] - }, - "duo": { - "description": "Duo-backed 2fa", - "anyOf": [ - { - "$ref": "#/definitions/Duo" - }, - { - "type": "null" - } - ] - }, - "email": { - "description": "Email 2fa", - "anyOf": [ - { - "$ref": "#/definitions/Email" - }, - { - "type": "null" - } - ] - }, - "organizationDuo": { - "description": "Duo-backed 2fa operated by an organization the user is a member of", - "anyOf": [ - { - "$ref": "#/definitions/Duo" - }, - { - "type": "null" - } - ] - }, - "remember": { - "description": "Presence indicates the user has stored this device as bypassing 2fa", - "anyOf": [ - { - "$ref": "#/definitions/Remember" - }, - { - "type": "null" - } - ] - }, - "webAuthn": { - "description": "WebAuthn-backed 2fa", - "anyOf": [ - { - "$ref": "#/definitions/WebAuthn" - }, - { - "type": "null" - } - ] - }, - "yubiKey": { - "description": "Yubikey-backed 2fa", - "anyOf": [ - { - "$ref": "#/definitions/YubiKey" - }, - { - "type": "null" - } - ] - } - }, - "additionalProperties": false - }, - "WebAuthn": { - "type": "object", - "additionalProperties": false - }, - "YubiKey": { - "type": "object", - "required": [ - "nfc" - ], - "properties": { - "nfc": { - "description": "Whether the stored yubikey supports near field communication", - "type": "boolean" - } - }, - "additionalProperties": false - } - } -} diff --git a/support/schemas/response/SecretDeleteResponse.json b/support/schemas/response/SecretDeleteResponse.json deleted file mode 100644 index 383ece5c1c..0000000000 --- a/support/schemas/response/SecretDeleteResponse.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Response_for_SecretDeleteResponse", - "type": "object", - "required": [ - "success" - ], - "properties": { - "data": { - "description": "The response data. Populated if `success` is true.", - "anyOf": [ - { - "$ref": "#/definitions/SecretDeleteResponse" - }, - { - "type": "null" - } - ] - }, - "errorMessage": { - "description": "A message for any error that may occur. Populated if `success` is false.", - "type": [ - "string", - "null" - ] - }, - "success": { - "description": "Whether or not the SDK request succeeded.", - "type": "boolean" - } - }, - "additionalProperties": false, - "definitions": { - "SecretDeleteResponse": { - "type": "object", - "required": [ - "id" - ], - "properties": { - "error": { - "type": [ - "string", - "null" - ] - }, - "id": { - "type": "string", - "format": "uuid" - } - }, - "additionalProperties": false - } - } -} diff --git a/support/schemas/response/SecretIdentifierResponse.json b/support/schemas/response/SecretIdentifierResponse.json deleted file mode 100644 index 79632f412a..0000000000 --- a/support/schemas/response/SecretIdentifierResponse.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Response_for_SecretIdentifierResponse", - "type": "object", - "required": [ - "success" - ], - "properties": { - "data": { - "description": "The response data. Populated if `success` is true.", - "anyOf": [ - { - "$ref": "#/definitions/SecretIdentifierResponse" - }, - { - "type": "null" - } - ] - }, - "errorMessage": { - "description": "A message for any error that may occur. Populated if `success` is false.", - "type": [ - "string", - "null" - ] - }, - "success": { - "description": "Whether or not the SDK request succeeded.", - "type": "boolean" - } - }, - "additionalProperties": false, - "definitions": { - "SecretIdentifierResponse": { - "type": "object", - "required": [ - "id", - "key", - "organizationId" - ], - "properties": { - "id": { - "type": "string", - "format": "uuid" - }, - "key": { - "type": "string" - }, - "organizationId": { - "type": "string", - "format": "uuid" - } - }, - "additionalProperties": false - } - } -} diff --git a/support/schemas/response/SecretIdentifiersResponse.json b/support/schemas/response/SecretIdentifiersResponse.json deleted file mode 100644 index 7e9224238c..0000000000 --- a/support/schemas/response/SecretIdentifiersResponse.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Response_for_SecretIdentifiersResponse", - "type": "object", - "required": [ - "success" - ], - "properties": { - "data": { - "description": "The response data. Populated if `success` is true.", - "anyOf": [ - { - "$ref": "#/definitions/SecretIdentifiersResponse" - }, - { - "type": "null" - } - ] - }, - "errorMessage": { - "description": "A message for any error that may occur. Populated if `success` is false.", - "type": [ - "string", - "null" - ] - }, - "success": { - "description": "Whether or not the SDK request succeeded.", - "type": "boolean" - } - }, - "additionalProperties": false, - "definitions": { - "SecretIdentifierResponse": { - "type": "object", - "required": [ - "id", - "key", - "organizationId" - ], - "properties": { - "id": { - "type": "string", - "format": "uuid" - }, - "key": { - "type": "string" - }, - "organizationId": { - "type": "string", - "format": "uuid" - } - }, - "additionalProperties": false - }, - "SecretIdentifiersResponse": { - "type": "object", - "required": [ - "data" - ], - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/definitions/SecretIdentifierResponse" - } - } - }, - "additionalProperties": false - } - } -} diff --git a/support/schemas/response/SecretResponse.json b/support/schemas/response/SecretResponse.json deleted file mode 100644 index 01da0296c4..0000000000 --- a/support/schemas/response/SecretResponse.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Response_for_SecretResponse", - "type": "object", - "required": [ - "success" - ], - "properties": { - "data": { - "description": "The response data. Populated if `success` is true.", - "anyOf": [ - { - "$ref": "#/definitions/SecretResponse" - }, - { - "type": "null" - } - ] - }, - "errorMessage": { - "description": "A message for any error that may occur. Populated if `success` is false.", - "type": [ - "string", - "null" - ] - }, - "success": { - "description": "Whether or not the SDK request succeeded.", - "type": "boolean" - } - }, - "additionalProperties": false, - "definitions": { - "SecretResponse": { - "type": "object", - "required": [ - "creationDate", - "id", - "key", - "note", - "object", - "organizationId", - "revisionDate", - "value" - ], - "properties": { - "creationDate": { - "type": "string" - }, - "id": { - "type": "string", - "format": "uuid" - }, - "key": { - "type": "string" - }, - "note": { - "type": "string" - }, - "object": { - "type": "string" - }, - "organizationId": { - "type": "string", - "format": "uuid" - }, - "projectId": { - "type": [ - "string", - "null" - ], - "format": "uuid" - }, - "revisionDate": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "additionalProperties": false - } - } -} diff --git a/support/schemas/response/SecretsDeleteResponse.json b/support/schemas/response/SecretsDeleteResponse.json deleted file mode 100644 index 718696afd4..0000000000 --- a/support/schemas/response/SecretsDeleteResponse.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Response_for_SecretsDeleteResponse", - "type": "object", - "required": [ - "success" - ], - "properties": { - "data": { - "description": "The response data. Populated if `success` is true.", - "anyOf": [ - { - "$ref": "#/definitions/SecretsDeleteResponse" - }, - { - "type": "null" - } - ] - }, - "errorMessage": { - "description": "A message for any error that may occur. Populated if `success` is false.", - "type": [ - "string", - "null" - ] - }, - "success": { - "description": "Whether or not the SDK request succeeded.", - "type": "boolean" - } - }, - "additionalProperties": false, - "definitions": { - "SecretDeleteResponse": { - "type": "object", - "required": [ - "id" - ], - "properties": { - "error": { - "type": [ - "string", - "null" - ] - }, - "id": { - "type": "string", - "format": "uuid" - } - }, - "additionalProperties": false - }, - "SecretsDeleteResponse": { - "type": "object", - "required": [ - "data" - ], - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/definitions/SecretDeleteResponse" - } - } - }, - "additionalProperties": false - } - } -} diff --git a/support/schemas/response/SyncResponse.json b/support/schemas/response/SyncResponse.json deleted file mode 100644 index 6c149ab63e..0000000000 --- a/support/schemas/response/SyncResponse.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Response_for_SyncResponse", - "type": "object", - "required": [ - "success" - ], - "properties": { - "data": { - "description": "The response data. Populated if `success` is true.", - "anyOf": [ - { - "$ref": "#/definitions/SyncResponse" - }, - { - "type": "null" - } - ] - }, - "errorMessage": { - "description": "A message for any error that may occur. Populated if `success` is false.", - "type": [ - "string", - "null" - ] - }, - "success": { - "description": "Whether or not the SDK request succeeded.", - "type": "boolean" - } - }, - "additionalProperties": false, - "definitions": { - "CipherDetailsResponse": { - "type": "object", - "additionalProperties": false - }, - "ProfileOrganizationResponse": { - "type": "object", - "required": [ - "id" - ], - "properties": { - "id": { - "type": "string", - "format": "uuid" - } - }, - "additionalProperties": false - }, - "ProfileResponse": { - "type": "object", - "required": [ - "email", - "id", - "name", - "organizations" - ], - "properties": { - "email": { - "type": "string" - }, - "id": { - "type": "string", - "format": "uuid" - }, - "name": { - "type": "string" - }, - "organizations": { - "type": "array", - "items": { - "$ref": "#/definitions/ProfileOrganizationResponse" - } - } - }, - "additionalProperties": false - }, - "SyncResponse": { - "type": "object", - "required": [ - "ciphers", - "profile" - ], - "properties": { - "ciphers": { - "description": "List of ciphers accesible by the user", - "type": "array", - "items": { - "$ref": "#/definitions/CipherDetailsResponse" - } - }, - "profile": { - "description": "Data about the user, including their encryption keys and the organizations they are a part of", - "allOf": [ - { - "$ref": "#/definitions/ProfileResponse" - } - ] - } - }, - "additionalProperties": false - } - } -} diff --git a/support/schemas/response/UserApiKeyResponse.json b/support/schemas/response/UserApiKeyResponse.json deleted file mode 100644 index cf7bae88e2..0000000000 --- a/support/schemas/response/UserApiKeyResponse.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "Response_for_UserApiKeyResponse", - "type": "object", - "required": [ - "success" - ], - "properties": { - "data": { - "description": "The response data. Populated if `success` is true.", - "anyOf": [ - { - "$ref": "#/definitions/UserApiKeyResponse" - }, - { - "type": "null" - } - ] - }, - "errorMessage": { - "description": "A message for any error that may occur. Populated if `success` is false.", - "type": [ - "string", - "null" - ] - }, - "success": { - "description": "Whether or not the SDK request succeeded.", - "type": "boolean" - } - }, - "additionalProperties": false, - "definitions": { - "UserApiKeyResponse": { - "type": "object", - "required": [ - "apiKey" - ], - "properties": { - "apiKey": { - "description": "The user's API key, which represents the client_secret portion of an oauth request.", - "type": "string" - } - }, - "additionalProperties": false - } - } -}