diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index fccf0482de..0000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,2 +0,0 @@ -# This is the default code owners for the whole Lens repo -* @lensapp/lens-ide diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index dab52add93..0000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: 'bug' -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Environment (please complete the following information):** -- Lens Version: -- OS: [e.g. OSX] -- Installation method (e.g. snap or AppImage in Linux): - -**Logs:** -When you run the application executable from command line you will see some logging output. Please paste them here: -``` -Your logs go here... -``` - -**Kubeconfig:** -Quite often the problems are caused by malformed kubeconfig which the application tries to load. Please share your kubeconfig, remember to remove any secret and sensitive information. -``` -your kubeconfig here -``` - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/enhancement.md b/.github/ISSUE_TEMPLATE/enhancement.md deleted file mode 100644 index 1b3bd32b59..0000000000 --- a/.github/ISSUE_TEMPLATE/enhancement.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -name: Enhancement Request -about: Suggest an enhancement to the Lens application -labels: enhancement ---- - - - -**What would you like to be added**: - - -**Why is this needed**: - - -**Environment you are Lens application on:** - -- Kubernetes distribution: [EKS, AKS, GKE, Rancher, ...] -- Desktop OS: - diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md deleted file mode 100644 index 0f90478a7c..0000000000 --- a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +++ /dev/null @@ -1,16 +0,0 @@ - - -Fixes # - -**Description of changes:** - -- diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 822722ed6c..0000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,19 +0,0 @@ -# See https://docs.github.com/en/free-pro-team@latest/github/administering-a-repository/configuration-options-for-dependency-updates -# for config options - -version: 2 -updates: - - package-ecosystem: npm - directory: / - schedule: - interval: daily - open-pull-requests-limit: 4 - reviewers: - - lensapp/lens-ide - labels: - - dependencies - versioning-strategy: increase - ignore: - - dependency-name: "*" - update-types: - - version-update:semver-major diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml deleted file mode 100644 index 74f7dfc549..0000000000 --- a/.github/release-drafter.yml +++ /dev/null @@ -1,22 +0,0 @@ -exclude-labels: - - 'skip-changelog' -categories: - - title: '🚀 Features' - labels: - - 'enhancement' - - title: '🐛 Bug Fixes' - labels: - - 'bug' - - title: '🧰 Maintenance' - labels: - - 'chore' - - 'area/documentation' - - 'area/ci' - - 'area/tests' - - 'dependencies' - - 'area/documentation' -change-template: '$TITLE (**#$NUMBER**) @$AUTHOR ' -template: | - ## Changes since $PREVIOUS_TAG - - $CHANGES diff --git a/.github/screenshot.png b/.github/screenshot.png deleted file mode 100644 index 15c45dcc28..0000000000 Binary files a/.github/screenshot.png and /dev/null differ diff --git a/.github/workflows/check-docs.yml b/.github/workflows/check-docs.yml deleted file mode 100644 index ae26867a96..0000000000 --- a/.github/workflows/check-docs.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: Check Documentation -on: - pull_request: - branches: - - "**" -jobs: - build: - name: Check Docs - runs-on: ubuntu-latest - if: ${{ contains(github.event.pull_request.labels.*.name, 'area/documentation') }} - strategy: - matrix: - node-version: [16.x] - steps: - - name: Checkout Release from lens - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Using Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - - - name: Install specific npm version - run: npm install -g npm@^9.6.7 - - - name: Generate Extensions API Reference using typedocs - run: | - npm install - npm run build:docs - - - name: Verify that the markdown is valid - run: | - npm run mkdocs:verify diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index b43814b584..0000000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,71 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" - -on: - push: - branches: [master] - pull_request: - # The branches below must be a subset of the branches above - branches: [master] - schedule: - - cron: "41 3 * * 2" - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: ["javascript"] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] - # Learn more: - # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v2 - - # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/cron-test.yaml b/.github/workflows/cron-test.yaml deleted file mode 100644 index 3c751a52a4..0000000000 --- a/.github/workflows/cron-test.yaml +++ /dev/null @@ -1,60 +0,0 @@ -name: Cron Test -on: - schedule: - - cron: "0 0 * * 1" # Run on the first day over every week -jobs: - test: - name: cron unit tests on ${{ matrix.os }} - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-20.04, macos-11, windows-2019] - node-version: [16.x] - steps: - - name: Checkout Release from lens - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Add the current IP address, long hostname and short hostname record to /etc/hosts file - if: runner.os == 'Linux' - run: | - echo -e "$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)\t$(hostname -f) $(hostname -s)" | sudo tee -a /etc/hosts - - - name: Using Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - - - name: Install specific npm version - run: npm install -g npm@^9.6.7 - - - name: Get npm cache directory path - if: ${{ runner.os != 'Windows' }} - id: npm-cache-dir-path - shell: bash - run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT - - - uses: actions/cache@v3 - if: ${{ runner.os != 'Windows' }} - id: npm-cache # use this to check for `cache-hit` (`steps.npm-cache.outputs.cache-hit != 'true'`) - with: - path: ${{ steps.npm-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-npm- - - - uses: nick-fields/retry@v2 - name: Install dependencies - with: - timeout_minutes: 20 - max_attempts: 3 - retry_on: error - command: npm ci - - - name: Build library parts - run: npm run build -- --ignore open-lens - - - run: npm run test:unit - name: Run tests diff --git a/.github/workflows/daily-alpha.yml b/.github/workflows/daily-alpha.yml deleted file mode 100644 index 02454a5df8..0000000000 --- a/.github/workflows/daily-alpha.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: Release daily alpha -on: - schedule: - - cron: 0 0 30 * 1-5 # At 12:30am UTC work day - workflow_dispatch: # for testing -jobs: - create-alpha-release-pr: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - with: - token: ${{ secrets.GITHUB_TOKEN }} - fetch-depth: 0 - - - name: Setup Node.js - uses: actions/setup-node@v3 - with: - node-version: "16.x" - registry-url: "https://npm.pkg.github.com" - - - name: Install specific npm version - run: npm install -g npm@^9.6.7 - - - name: Install deps - run: | - npm install - env: - NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Create PR - run: | - git config --local user.email "info@k8slens.dev" - git config --local user.name "K8s Lens Bot" - npm run create-release-pr - env: - BUMP_PACKAGE_ARGS: -- --conventional-commits --conventional-prerelease --yes - PICK_ALL_PRS: "true" - FAIL_ON_NO_CHANGES: "false" - GH_TOKEN: ${{ secrets.GH_TOKEN }} diff --git a/.github/workflows/electronegativity.yml b/.github/workflows/electronegativity.yml deleted file mode 100644 index 51fc19b600..0000000000 --- a/.github/workflows/electronegativity.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: Electronegativity -on: - push: - branches: - - master - pull_request: - branches: - - master -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true -jobs: - build_job: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - uses: actions/setup-node@v3 - with: - node-version: "16" - - - uses: doyensec/electronegativity-action@v1.1 - with: - input: packages/core/src/ - electron-version: "19.0.4" - severity: medium - - - name: Upload sarif - uses: github/codeql-action/upload-sarif@v1 - with: - sarif_file: ../results diff --git a/.github/workflows/license-header.yml b/.github/workflows/license-header.yml deleted file mode 100644 index ba277b3245..0000000000 --- a/.github/workflows/license-header.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Check License Header -on: - push: - branches: - - master - pull_request: - branches: - - master -jobs: - css: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - name: Set up Golang - uses: actions/setup-go@v2 - with: - go-version: "^1.18.0" - - name: Install addlicense - run: | - export PATH=${PATH}:`go env GOPATH`/bin - go install github.com/google/addlicense@v1.0.0 - - name: Check license headers - run: | - set -e - export PATH=${PATH}:`go env GOPATH`/bin - - addlicense -check -l mit -c "OpenLens Authors" packages/*/src/**/*.?css diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml deleted file mode 100644 index 455dd0800b..0000000000 --- a/.github/workflows/linter.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: Lint Repo -on: - - pull_request -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true -jobs: - build: - name: Lint - runs-on: ubuntu-latest - strategy: - matrix: - node-version: [16.x] - steps: - - name: Checkout Release from lens - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Using Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - - - name: Install specific npm version - run: npm install -g npm@^9.6.7 - - - name: Install deps - run: npm install - - - name: Lint - run: npm run lint - - - name: Verify Publish Configurations - run: ./scripts/lint-publish-configs.sh - - - name: Verify No Duplicate Dependencies - run: ./scripts/lint-package-dependencies.sh diff --git a/.github/workflows/maintenance.yml b/.github/workflows/maintenance.yml deleted file mode 100644 index dfa16b99c7..0000000000 --- a/.github/workflows/maintenance.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: "Maintenance" -on: - # So that PRs touching the same files as the push are updated - push: - # So that the `dirtyLabel` is removed if conflicts are resolve - # We recommend `pull_request_target` so that github secrets are available. - # In `pull_request` we wouldn't be able to change labels of fork PRs - pull_request_target: - types: [synchronize] - -jobs: - main: - runs-on: ubuntu-latest - steps: - - name: check if prs are dirty - uses: eps1lon/actions-label-merge-conflict@releases/2.x - with: - dirtyLabel: "PR: needs rebase" - removeOnDirtyLabel: "PR: ready to ship" - repoToken: "${{ secrets.GITHUB_TOKEN }}" - commentOnDirty: "This pull request has conflicts, please resolve those before we can evaluate the pull request." - commentOnClean: "Conflicts have been resolved. A maintainer will review the pull request shortly." diff --git a/.github/workflows/mkdocs-delete-version.yml b/.github/workflows/mkdocs-delete-version.yml deleted file mode 100644 index aa0d0d0ccf..0000000000 --- a/.github/workflows/mkdocs-delete-version.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Delete Documentation Version -on: - workflow_dispatch: - inputs: - version: - description: 'Version string to be deleted (e.g."v0.0.1")' - required: true -jobs: - build: - name: Delete docs Version - runs-on: ubuntu-latest - steps: - - name: Set up Python 3.7 - uses: actions/setup-python@v2 - with: - python-version: "3.x" - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install mkdocs-material - pip install mike - - - name: Checkout Release from lens - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: git config - run: | - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - - - name: mkdocs delete version - run: | - mike delete --push ${{ github.event.inputs.version }} diff --git a/.github/workflows/mkdocs-manual.yml b/.github/workflows/mkdocs-manual.yml deleted file mode 100644 index 3b07c0422d..0000000000 --- a/.github/workflows/mkdocs-manual.yml +++ /dev/null @@ -1,70 +0,0 @@ -name: Manual documentation update to sync a deployed Version with Master branch -on: - workflow_dispatch: - inputs: - version: - description: 'Version string to use (e.g."v0.0.1")' - required: true -jobs: - build: - name: Manual documentation update to sync a deployed Version with Master branch - runs-on: ubuntu-latest - strategy: - matrix: - node-version: [16.x] - steps: - - name: Set up Python 3.7 - uses: actions/setup-python@v2 - with: - python-version: "3.x" - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install mkdocs-material - pip install mike - - - name: Checkout Version from lens - uses: actions/checkout@v3 - with: - fetch-depth: 0 - ref: "${{ github.event.inputs.version }}" - - - name: Using Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - - - name: Install specific npm version - run: npm install -g npm@^9.6.7 - - - name: Generate Extensions API Reference using typedocs - run: | - npm install - npm run typedocs-extensions-api - - - name: Checkout master branch from lens - uses: actions/checkout@v3 - with: - path: "master" - ref: "master" - - - name: Bring in latest mkdocs.yml from master - run: | - cp -p ./master/mkdocs.yml . - cp -p ./master/docs/stylesheets/extra.css ./docs/stylesheets/extra.css - rm -fr ./docs/clusters ./docs/contributing ./docs/faq ./docs/getting-started ./docs/helm ./docs/support ./docs/supporting - sed -i '/Protocol Handlers/d' ./mkdocs.yml - sed -i '/IPC/d' ./mkdocs.yml - sed -i 's#../../clusters/adding-clusters.md#https://docs.k8slens.dev/getting-started/add-cluster/#g' ./docs/extensions/get-started/your-first-extension.md - sed -i 's#clusters/adding-clusters.md#https://docs.k8slens.dev//getting-started/adding-clusters/#g' ./docs/README.md - sed -i 's#../../contributing/README.md#https://docs.k8slens.dev/contributing/#g' ./docs/extensions/guides/generator.md - - - name: git config - run: | - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - - - name: mkdocs deploy new release - run: | - mike deploy --push --force ${{ github.event.inputs.version }} diff --git a/.github/workflows/mkdocs-set-default-version.yml b/.github/workflows/mkdocs-set-default-version.yml deleted file mode 100644 index 509ddc785b..0000000000 --- a/.github/workflows/mkdocs-set-default-version.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Update Default Documentation Version -on: - workflow_dispatch: - inputs: - version: - description: 'Version string to be default (e.g."v0.0.1")' - required: true -jobs: - build: - name: Update default docs Version - runs-on: ubuntu-latest - steps: - - name: Set up Python 3.7 - uses: actions/setup-python@v2 - with: - python-version: "3.x" - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install mkdocs-material - pip install mike - - - name: Checkout Release from lens - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: git config - run: | - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - - - name: mkdocs update default version - run: | - mike set-default --push ${{ github.event.inputs.version }} diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml deleted file mode 100644 index a5faa9b675..0000000000 --- a/.github/workflows/publish-docs.yml +++ /dev/null @@ -1,103 +0,0 @@ -name: Publish docs via GitHub Pages -on: - push: - branches: - - master - release: - types: - - published -concurrency: - group: publish-docs - cancel-in-progress: true -jobs: - verify-docs: - name: Verify docs - runs-on: ubuntu-latest - strategy: - matrix: - node-version: [16.x] - steps: - - name: Set up Python 3.7 - uses: actions/setup-python@v2 - with: - python-version: "3.x" - - - name: Checkout Release from lens - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Using Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - - - name: Install specific npm version - run: npm install -g npm@^9.6.7 - - - name: Generate Extensions API Reference using typedocs - run: | - npm install - npm run build:docs - - - name: Verify that the markdown is valid - run: | - npm run mkdocs:verify - - build: - name: Deploy docs - runs-on: ubuntu-latest - strategy: - matrix: - node-version: [16.x] - needs: verify-docs - steps: - - name: Set up Python 3.7 - uses: actions/setup-python@v2 - with: - python-version: "3.x" - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install mkdocs-material - pip install mike - - - name: Checkout Release from lens - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: git config - run: | - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - - - name: Using Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - - - name: Install specific npm version - run: npm install -g npm@^9.6.7 - - - name: Generate Extensions API Reference using typedocs - run: | - npm ci - npm run build:docs - - - name: mkdocs deploy master - if: contains(github.ref, 'refs/heads/master') - run: | - mike deploy --push master - - - name: Get the release version - if: contains(github.ref, 'refs/tags/v') && !github.event.release.prerelease - id: get_version - run: echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_OUTPUT - - - name: mkdocs deploy new release - if: contains(github.ref, 'refs/tags/v') && !github.event.release.prerelease - run: | - mike deploy --push --update-aliases ${{ steps.get_version.outputs.VERSION }} latest - mike set-default --push ${{ steps.get_version.outputs.VERSION }} diff --git a/.github/workflows/publish-release-npm.yml b/.github/workflows/publish-release-npm.yml deleted file mode 100644 index a3eeb56cba..0000000000 --- a/.github/workflows/publish-release-npm.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: Publish NPM Package Release -on: - workflow_call: - inputs: - version: - required: true - type: string - workflow_dispatch: - inputs: - version: - required: true - type: string - description: The version to release manually -jobs: - publish-npm-packages: - name: Publish NPM Packages - runs-on: ubuntu-latest - strategy: - matrix: - node-version: [16.x] - steps: - - name: Checkout Release - uses: actions/checkout@v3 - with: - fetch-depth: 0 - ref: ${{ inputs.version }} - - - name: Using Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - - - name: Install specific npm version - run: npm install -g npm@^9.6.7 - - - name: Generate NPM packages - run: | - npm ci - npm run build - - - name: Publish NPM packages - run: | - npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}" - VERSION=$(cat packages/core/package.json | jq '.version' --raw-output) - echo ${VERSION} - DIST_TAG=$(node packages/semver/dist/index.js --prerelease 0 ${VERSION}) - npx lerna \ - publish from-package \ - --no-push \ - --no-git-tag-version \ - --yes \ - --dist-tag ${DIST_TAG:-latest} - env: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 9603693a30..0000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Release Open Lens -on: - pull_request: - types: - - closed - branches: - - master - - release/v*.* -jobs: - release: - name: Release - runs-on: ubuntu-latest - if: ${{ github.event.pull_request.merged == true && contains(github.event.pull_request.labels.*.name, 'release') }} - outputs: - version: ${{ steps.tagger.outputs.tagname }} - steps: - - name: Checkout Release from lens - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - uses: butlerlogic/action-autotag@stable - id: tagger - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - tag_prefix: v - root: /packages/core - - uses: ncipollo/release-action@v1 - if: ${{ steps.tagger.outputs.tagname != '' }} - with: - name: ${{ steps.tagger.outputs.tagname }} - commit: master - tag: ${{ steps.tagger.outputs.tagname }} - body: ${{ github.event.pull_request.body }} - prerelease: ${{ contains(steps.tagger.outputs.tagname, '-alpha.') || contains(steps.tagger.outputs.tagname, '-beta.') }} - publish-npm: - uses: ./.github/workflows/publish-release-npm.yml - needs: release - if: ${{ needs.release.outputs.version != '' }} - secrets: inherit - with: - version: ${{ needs.release.outputs.version }} diff --git a/.github/workflows/require-milestone.yml b/.github/workflows/require-milestone.yml deleted file mode 100644 index 8fc2c28ba2..0000000000 --- a/.github/workflows/require-milestone.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: Require Milestone -on: - pull_request: - types: [opened, edited, synchronize] -jobs: - milestone: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Require Milestone - run: | - exit $(gh pr view ${{ github.event.pull_request.number }} --json milestone | jq 'if .milestone == null then 1 else 0 end') - env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} diff --git a/.github/workflows/require-type-labels.yml b/.github/workflows/require-type-labels.yml deleted file mode 100644 index 00a8545e91..0000000000 --- a/.github/workflows/require-type-labels.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: Require Release Category Labels -on: - pull_request: - types: [opened, labeled, unlabeled, synchronize] -jobs: - label: - runs-on: ubuntu-latest - steps: - - uses: mheap/github-action-required-labels@v1 - with: - mode: exactly - count: 1 - labels: "enhancement, bug, chore, area/ci, area/tests, dependencies, area/documentation, skip-changelog" diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml deleted file mode 100644 index 801e4ca180..0000000000 --- a/.github/workflows/stale.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: Cull Stale Issues -on: - schedule: - - cron: "30 1 * * *" -jobs: - stale: - runs-on: ubuntu-latest - steps: - - uses: actions/stale@v4 - with: - only-issue-labels: "needs-information" - repo-token: "${{ secrets.GITHUB_TOKEN }}" - # -1 here means that PRs will never be marked as stale - days-before-pr-stale: -1 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 42b174274e..0000000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,136 +0,0 @@ -name: Test -on: - pull_request: - branches: - - "**" - push: - branches: - - master -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true -jobs: - integration-test: - name: integration tests on ${{ matrix.os }} - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-20.04, macos-11, windows-2019] - node-version: [16.x] - steps: - - name: Checkout Release from lens - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Add the current IP address, long hostname and short hostname record to /etc/hosts file - if: runner.os == 'Linux' - run: | - echo -e "$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)\t$(hostname -f) $(hostname -s)" | sudo tee -a /etc/hosts - - - name: Using Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - - - name: Install specific npm version - run: npm install -g npm@^9.6.7 - - - name: Get npm cache directory path - if: ${{ runner.os != 'Windows' }} - id: npm-cache-dir-path - shell: bash - run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT - - - uses: actions/cache@v3 - if: ${{ runner.os != 'Windows' }} - id: npm-cache # use this to check for `cache-hit` (`steps.npm-cache.outputs.cache-hit != 'true'`) - with: - path: ${{ steps.npm-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }} - restore-keys: | - ${{ runner.os }}-npm- - - - uses: nick-fields/retry@v2 - name: Install dependencies - with: - timeout_minutes: 20 - max_attempts: 3 - retry_on: error - command: npm ci - - - name: Install integration test dependencies - id: minikube - uses: medyagh/setup-minikube@master - with: - minikube-version: latest - if: ${{ runner.os == 'Linux' }} - - - run: xvfb-run --auto-servernum --server-args='-screen 0, 1600x900x24' npm run test:integration - name: Run Linux integration tests - if: ${{ runner.os == 'Linux' }} - - - run: npm run test:integration - name: Run macOS integration tests - shell: bash - if: ${{ runner.os == 'macOS' }} - - - run: npm run test:integration - name: Run Windows integration tests - if: ${{ runner.os == 'Windows' }} - - unit-test: - name: unit tests on ${{ matrix.os }} - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: [ubuntu-20.04] - node-version: [16.x] - steps: - - name: Checkout Release from lens - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Add the current IP address, long hostname and short hostname record to /etc/hosts file - if: runner.os == 'Linux' - run: | - echo -e "$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)\t$(hostname -f) $(hostname -s)" | sudo tee -a /etc/hosts - - - name: Using Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} - - - name: Install specific npm version - run: npm install -g npm@^9.6.7 - - - name: Get npm cache directory path - if: ${{ runner.os != 'Windows' }} - id: npm-cache-dir-path - shell: bash - run: echo "dir=$(npm config get cache)" >> $GITHUB_OUTPUT - - - uses: actions/cache@v3 - if: ${{ runner.os != 'Windows' }} - id: npm-cache # use this to check for `cache-hit` (`steps.npm-cache.outputs.cache-hit != 'true'`) - with: - path: ${{ steps.npm-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-npm- - - - uses: nick-fields/retry@v2 - name: Install dependencies - with: - timeout_minutes: 20 - max_attempts: 3 - retry_on: error - command: npm ci - - - run: | - npm run build -- --ignore open-lens - npm run test:unit - name: Run tests diff --git a/.gitignore b/.gitignore deleted file mode 100644 index e66e11e0e2..0000000000 --- a/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -node_modules/ -.DS_Store -yarn-error.log -tmp/ -lens.log -docs/extensions/api -site/ -lerna-debug.log -coverage -dist -node_modules -.linkable.json -yalc.lock -.yalc diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index b58b603fea..0000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index 7abc908e60..0000000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index 79ee123c2b..0000000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index 97626ba454..0000000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 15223a3492..0000000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml deleted file mode 100644 index 0034429ff9..0000000000 --- a/.idea/jsLibraryMappings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/jsLinters/eslint.xml b/.idea/jsLinters/eslint.xml deleted file mode 100644 index 541945bb08..0000000000 --- a/.idea/jsLinters/eslint.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/lens.iml b/.idea/lens.iml deleted file mode 100644 index df2c450ec8..0000000000 --- a/.idea/lens.iml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/.idea/libraries/ogre_tools.xml b/.idea/libraries/ogre_tools.xml deleted file mode 100644 index 6deeb167ce..0000000000 --- a/.idea/libraries/ogre_tools.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 039e6a7313..0000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 4af03d0504..0000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/prettier.xml b/.idea/prettier.xml deleted file mode 100644 index 8004cebd99..0000000000 --- a/.idea/prettier.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f4c..0000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/webResources.xml b/.idea/webResources.xml deleted file mode 100644 index 717d9d6656..0000000000 --- a/.idea/webResources.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.npmrc b/.npmrc deleted file mode 100644 index d914e569aa..0000000000 --- a/.npmrc +++ /dev/null @@ -1,4 +0,0 @@ -disturl "https://electronjs.org/headers" -target "19.0.4" -runtime "electron" -engine-strict=true diff --git a/.nxignore b/.nxignore deleted file mode 100644 index e05139bcf1..0000000000 --- a/.nxignore +++ /dev/null @@ -1,8 +0,0 @@ -open-lens/dist -open-lens/static/build -open-lens/static/webpack -open-lens/binaries -packages/**/dist -packages/**/static/build -packages/**/build/webpack -packages/**/binaries diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 7d7cef13d8..0000000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Main Process", - "type": "node", - "request": "launch", - "cwd": "${workspaceFolder}", - "protocol": "inspector", - "preLaunchTask": "compile-dev", - "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron", - "windows": { - "runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd" - }, - "runtimeArgs": [ - "--remote-debugging-port=9223", - "--inspect", - "." - ], - "outputCapture": "std" - }, - { - "name": "Renderer Process", - "type": "pwa-chrome", - "request": "attach", - "port": 9223, - "webRoot": "${workspaceFolder}", - "timeout": 30000 - }, - { - "name": "Integration Tests", - "type": "node", - "request": "launch", - "console": "integratedTerminal", - "runtimeArgs": [ - "${workspaceFolder}/node_modules/.bin/jest", - "--runInBand", - "integration" - ], - }, - { - "name": "Unit Tests", - "type": "node", - "request": "launch", - "internalConsoleOptions": "openOnSessionStart", - "program": "${workspaceFolder}/node_modules/jest/bin/jest.js", - "args": [ - "--env=jsdom", - "-i", - "src" - ] - } - ], -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index f10919822d..0000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "eslint.workingDirectories": [ - { - "mode": "auto" - } - ], - "typescript.tsdk": "node_modules/typescript/lib" -} diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 03a7b306f7..0000000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - // See https://go.microsoft.com/fwlink/?LinkId=733558 - // for the documentation about the tasks.json format - "version": "2.0.0", - "tasks": [ - { - "type": "shell", - "group": "build", - "command": "yarn", - "args": [ - "debug-build" - ], - "problemMatcher": [], - "label": "compile-dev", - "detail": "Compiles main and extension types" - } - ] -} \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 305e095517..0000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,3 +0,0 @@ -# Contributing to Lens - -See [Contributing to Lens](https://docs.k8slens.dev/contributing/contribute-to-lens/) documentation. diff --git a/LICENSE b/LICENSE index 42319c9dae..122acbda8c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,11 +1,6 @@ -Copyright (c) 2022 OpenLens Authors. +The MIT License (MIT) -Portions of this software are licensed as follows: - -* All content residing under the "docs/" directory of this repository, if that -directory exists, is licensed under "Creative Commons: CC BY-SA 4.0 license". -* Content outside of the above mentioned directories or restrictions above is -available under the "MIT" license as defined below. +Copyright (c) 2024 Mirantis Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index e0a7a8d32d..f25af3c7df 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,32 @@ -# Lens Desktop Core ("OpenLens") + +
+
+
+

+ + + Lens logo + +

+

+ Lens Website •  + Pricing •  + Forums •  + Docs •  + Company •  + Contact +

+

+ The Way The World Runs Kubernetes +

+

+ Meet the new standard for cloud native software development & operations.
+ With over 1 million users, Lens is the most popular Kubernetes IDE in the world. +

+ lens-product-image +
+ -[![Build Status](https://github.com/lensapp/lens/actions/workflows/test.yml/badge.svg)](https://github.com/lensapp/lens/actions/workflows/test.yml) -[Explore our Forums](https://forums.k8slens.dev) +## This Repository -## The Repository - -This repository is where Team Lens develops the core of the [Lens Desktop](https://k8slens.dev) product together with the community. - -The core is a library, powered by [Electron](https://www.electronjs.org/) and [React](https://reactjs.org/). Unlike generic Electron + React frameworks / boilerplates, it is very opinionated for creating Lens Desktop-like applications and has support for Lens Extensions. - -In the future, this library will be streamlined to become more customizable and pluggable with easy to use tooling for Lens Extension developers. - -This source code is available to everyone under the [MIT license](./LICENSE). - -## Lens Desktop - -[Lens Desktop](https://k8slens.dev) is built on top of the Lens Desktop Core with Team Lens built extensions released under a traditional [Terms Of Service](https://k8slens.dev/licenses/tos). - -Lens Desktop is a standalone application for MacOS, Windows and Linux operating systems. Get started by downloading it from [Lens website](https://k8slens.dev). - -[![Screenshot](.github/screenshot.png)](https://www.youtube.com/watch?v=eeDwdVXattc) - -## Development - -See [Development](https://docs.k8slens.dev/contributing/development/) page. - -## Contributing - -See [Contributing](https://docs.k8slens.dev/contributing/contribute-to-lens/) page. - -## License - -See [License](LICENSE). +Lorem Ipsum... diff --git a/RELEASE_GUIDE.md b/RELEASE_GUIDE.md deleted file mode 100644 index 68f713bfda..0000000000 --- a/RELEASE_GUIDE.md +++ /dev/null @@ -1,30 +0,0 @@ -# Release Guide - -Releases for this repository are made via running the `create-release-pr` script defined in the `package.json`. -All releases will be made by creating a PR which bumps the version field in the `package.json` and, if necessary, cherry pick the relevant commits from master. - -## Prerequisites - -- `npm` -- Running `npm install` -- `gh` (Github's CLI) with a version at least 2.15.0 - -## Steps - -1. If you are making a minor or major release (or prereleases of one) make sure you are on the `master` branch. -1. If you are making a patch release (or a prerelease for one) make sure you are on the `release/v.` branch. -1. Run `npm run create-release-pr`. - - NOTES: - - The PRs that picked are based on which milestone they are marked as being a part of and if they have already been released - - The milestone is automatically computed from the version of the `@k8slens/core`. - If there is are any prerelease tags then the milestone will be for the next stable version (no prereleases). - Otherwise, it will be for the next patch version. -1. Pick the PRs that you want to include in this release using the keys listed. - - If you are making a patch release this might include fixing up some cherry-picking of commits. These actions should be done in a separate terminal. - - If a package version is having a major version bump then `npm` will complain about `peerDependency` conflicts. These will have to be fixed up separately. -1. Once the PR is created, approved, and then merged the `Release Open Lens` workflow will create a tag and release for you. -1. If you are making a major or minor release, create a `release/v.` branch and push it to `origin` so that future patch releases can be made from it. -1. If you released a major or minor version, create a new patch milestone and move all bug issues to that milestone and all enhancement issues to the next minor milestone. -1. If you released a patch version, create a new patch milestone for the next patch version and move all the issues and PRs (open or closed) that weren't included in the current release to that milestone. -1. Close the milestone related to the release that was just made (if not a prerelease release). -1. If you released a patch version and it contains PRs that targeted `release/v.` make a new PR targeting master and include all the relevant PRs as cherry-picks. This PR should have the `skip-changelog` label and have a milestone of the next minor. diff --git a/assets/hero-home.png b/assets/hero-home.png new file mode 100644 index 0000000000..da0a630b6a Binary files /dev/null and b/assets/hero-home.png differ diff --git a/assets/lens-mirantis-logo.svg b/assets/lens-mirantis-logo.svg new file mode 100644 index 0000000000..38cc592ebf --- /dev/null +++ b/assets/lens-mirantis-logo.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100644 index f51f3799f9..0000000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -api-docs.k8slens.dev diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index b22509eb16..0000000000 --- a/docs/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# Lens Extension API - -Customize and enhance the Lens experience with the Lens Extension API. -Use the extension API to create menus or page content. -The same extension API was used to create many of Lens's core features. -To install your first extension you should goto the [extension page](lens://app/extensions) in lens. - -This documentation describes: - -- How to build, run, test, and publish an extension. -- How to take full advantage of the Lens Extension API. -- Where to find [guides](extensions/guides/README.md) and [code samples](https://github.com/lensapp/lens-extension-samples) to help get you started. - -## What Extensions Can Do - -Here are some examples of what you can achieve with the Extension API: - -- Add custom components & views in the UI - Extending the Lens Workbench - -For an overview of the Lens Extension API, refer to the [Common Capabilities](extensions/capabilities/common-capabilities.md) page. [Extension Guides Overview](extensions/guides/README.md) also includes a list of code samples and guides that illustrate various ways of using the Lens Extension API. - -## How to Build Extensions - -Here is what each section of the Lens Extension API docs can help you with: - -- **Getting Started** teaches fundamental concepts for building extensions with the Hello World sample. -- **Extension Capabilities** dissects Lens's Extension API into smaller categories and points you to more detailed topics. -- **Extension Guides** includes guides and code samples that explain specific usages of Lens Extension API. -- **Testing and Publishing** includes in-depth guides on various extension development topics, such as testing and publishing extensions. -- **API Reference** contains exhaustive references for the Lens Extension API, Contribution Points, and many other topics. - -## What's New - -Just like Lens itself, the extension API updates on a monthly cadence, rolling out new features with every release. - -Keep up with Lens and the Lens Extension API by reviewing the [release notes](https://github.com/lensapp/lens/releases). - -## Important changes since Lens v4 - -Lens has undergone major design improvements in v5, which have resulted in several large changes to the extension API. -Workspaces are gone, and the catalog is introduced for containing clusters, as well as other items, including custom entities. -Lens has migrated from using mobx 5 to mobx 6 for internal state management, and this may have ramifications for extension implementations. -Although the API retains many components from v4, given these changes, extensions written for Lens v4 are not compatible with the Lens v5 extension API. -See the [Lens v4 to v5 extension migration notes](extensions/extension-migration.md) on getting old extensions working in Lens v5. - -## Looking for Help - -If you have questions for extension development, try asking on the [Lens Forums](http://forums.k8slens.dev/). It's a public chatroom for Lens developers, where Lens team members chime in from time to time. - -To provide feedback on the documentation or issues with the Lens Extension API, create new issues at [lensapp/lens](https://github.com/lensapp/lens/issues). Please use the labels `area/documentation` and/or `area/extension`. - -## Downloading Lens - -[Download Lens](https://k8slens.dev/) for macOS, Windows, or Linux. diff --git a/docs/architecture/decisions/README.md b/docs/architecture/decisions/README.md deleted file mode 100644 index ff03a7ca8a..0000000000 --- a/docs/architecture/decisions/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Architecture Decision Records - diff --git a/docs/custom_theme/img/favicon.ico b/docs/custom_theme/img/favicon.ico deleted file mode 100644 index 19b2de71d1..0000000000 Binary files a/docs/custom_theme/img/favicon.ico and /dev/null differ diff --git a/docs/custom_theme/main.html b/docs/custom_theme/main.html deleted file mode 100644 index 94d9808cc7..0000000000 --- a/docs/custom_theme/main.html +++ /dev/null @@ -1 +0,0 @@ -{% extends "base.html" %} diff --git a/docs/extensions/capabilities/README.md b/docs/extensions/capabilities/README.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/extensions/capabilities/common-capabilities.md b/docs/extensions/capabilities/common-capabilities.md deleted file mode 100644 index e7b585af66..0000000000 --- a/docs/extensions/capabilities/common-capabilities.md +++ /dev/null @@ -1,337 +0,0 @@ -# Common Capabilities - -Here we will discuss common and important building blocks for your extensions, and explain how you can use them. -Almost all extensions use some of these functionalities. - -## Main Extension - -The main extension runs in the background. -It adds app menu items to the Lens UI. -In order to see logs from this extension, you need to start Lens from the command line. - -### Activate - -This extension can register a custom callback that is executed when an extension is activated (started). - -``` javascript -import { Main } from "@k8slens/extensions" - -export default class ExampleMainExtension extends Main.LensExtension { - async onActivate() { - console.log("hello world") - } -} -``` - -### Deactivate - -This extension can register a custom callback that is executed when an extension is deactivated (stopped). - -``` javascript -import { Main } from "@k8slens/extensions" - -export default class ExampleMainExtension extends Main.LensExtension { - async onDeactivate() { - console.log("bye bye") - } -} -``` - -### Menus - -This extension can register custom app and tray menus that will be displayed on OS native menus. - -Example: - -```typescript -import { Main } from "@k8slens/extensions" - -export default class ExampleMainExtension extends Main.LensExtension { - appMenus = [ - { - parentId: "help", - label: "Example item", - click() { - Main.Navigation.navigate("https://k8slens.dev"); - } - } - ] - - trayMenus = [ - { - label: "My links", - submenu: [ - { - label: "Lens", - click() { - Main.Navigation.navigate("https://k8slens.dev"); - } - }, - { - type: "separator" - }, - { - label: "Lens Github", - click() { - Main.Navigation.navigate("https://github.com/lensapp/lens"); - } - } - ] - } - ] -} -``` - -## Renderer Extension - -The renderer extension runs in a browser context, and is visible in Lens's main window. -In order to see logs from this extension you need to check them via **View** > **Toggle Developer Tools** > **Console**. - -### Activate - -This extension can register a custom callback that is executed when an extension is activated (started). - -``` javascript -import { Renderer } from "@k8slens/extensions" - -export default class ExampleExtension extends Renderer.LensExtension { - async onActivate() { - console.log("hello world") - } -} -``` - -### Deactivate - -This extension can register a custom callback that is executed when an extension is deactivated (stopped). - -``` javascript -import { Renderer } from "@k8slens/extensions" - -export default class ExampleMainExtension extends Renderer.LensExtension { - async onDeactivate() { - console.log("bye bye") - } -} -``` - -### Global Pages - -This extension can register custom global pages (views) to Lens's main window. -The global page is a full-screen page that hides all other content from a window. - -```typescript -import React from "react" -import { Renderer } from "@k8slens/extensions" -import { ExamplePage } from "./src/example-page" - -const { - Component: { - Icon, - } -} = Renderer; - -export default class ExampleRendererExtension extends Renderer.LensExtension { - globalPages = [ - { - id: "example", - components: { - Page: ExamplePage, - } - } - ] - - globalPageMenus = [ - { - title: "Example page", // used in icon's tooltip - target: { pageId: "example" } - components: { - Icon: () => , - } - } - ] -} -``` - -### App Preferences - -This extension can register custom app preferences. -It is responsible for storing a state for custom preferences. - -```typescript -import React from "react" -import { Renderer } from "@k8slens/extensions" -import { myCustomPreferencesStore } from "./src/my-custom-preferences-store" -import { MyCustomPreferenceHint, MyCustomPreferenceInput } from "./src/my-custom-preference" - - -export default class ExampleRendererExtension extends Renderer.LensExtension { - appPreferences = [ - { - title: "My Custom Preference", - components: { - Hint: () => , - Input: () => - } - } - ] -} -``` - -### Cluster Pages - -This extension can register custom cluster pages. -These pages are visible in a cluster menu when a cluster is opened. - -```typescript -import React from "react" -import { Renderer } from "@k8slens/extensions"; -import { ExampleIcon, ExamplePage } from "./src/page" - -export default class ExampleExtension extends Renderer.LensExtension { - clusterPages = [ - { - id: "extension-example", // optional - exact: true, // optional - components: { - Page: () => , - } - } - ] - - clusterPageMenus = [ - { - url: "/extension-example", // optional - title: "Example Extension", - components: { - Icon: ExampleIcon, - } - } - ] -} - -``` - -### Top Bar Items - -This extension can register custom components to a top bar area. - -```typescript -import React from "react"; -import { Renderer } from "@k8slens/extensions"; - -const { - Component: { - Icon, - } -} = Renderer; - -export default class ExampleExtension extends Renderer.LensExtension { - topBarItems = [ - { - components: { - Item: () => ( - this.navigate("/example-page" /> - ) - } - } - ] -} - -``` - -### Status Bar Items - -This extension can register custom icons and text to a status bar area. - -```typescript -import React from "react"; -import { Renderer } from "@k8slens/extensions"; - -const { - Component: { - Icon, - } -} = Renderer; - -export default class ExampleExtension extends Renderer.LensExtension { - statusBarItems = [ - { - components: { - Item: () => ( -
this.navigate("/example-page")} > - -
- ) - } - } - ] -} - -``` - -### Kubernetes Workloads Overview Items - -This extension can register custom workloads overview items. - -```typescript -import React from "react" -import { Renderer } from "@k8slens/extensions"; -import { CustomWorkloadsOverviewItem } from "./src/custom-workloads-overview-item" - -export default class ExampleExtension extends Renderer.LensExtension { - kubeWorkloadsOverviewItems = [ - { - components: { - Details: () => - } - } - ] -} - -``` - -### Kubernetes Object Menu Items - -This extension can register custom menu items (actions) for specified Kubernetes kinds/apiVersions. - -```typescript -import React from "react" -import { Renderer } from "@k8slens/extensions"; -import { CustomMenuItem, CustomMenuItemProps } from "./src/custom-menu-item" - -export default class ExampleExtension extends Renderer.LensExtension { - kubeObjectMenuItems = [ - { - kind: "Node", - apiVersions: ["v1"], - components: { - MenuItem: (props: CustomMenuItemProps) => - } - } - ] -} - -``` - -### Kubernetes Object Details - -This extension can register custom details (content) for specified Kubernetes kinds/apiVersions. - -```typescript -import React from "react" -import { Renderer } from "@k8slens/extensions"; -import { CustomKindDetails, CustomKindDetailsProps } from "./src/custom-kind-details" - -export default class ExampleExtension extends Renderer.LensExtension { - kubeObjectDetailItems = [ - { - kind: "CustomKind", - apiVersions: ["custom.acme.org/v1"], - components: { - Details: (props: CustomKindDetailsProps) => - } - } - ] -} -``` diff --git a/docs/extensions/capabilities/images/css-vars-in-devtools.png b/docs/extensions/capabilities/images/css-vars-in-devtools.png deleted file mode 100644 index a9df97e6bb..0000000000 Binary files a/docs/extensions/capabilities/images/css-vars-in-devtools.png and /dev/null differ diff --git a/docs/extensions/capabilities/images/theme-selector.png b/docs/extensions/capabilities/images/theme-selector.png deleted file mode 100644 index 5c2eba3165..0000000000 Binary files a/docs/extensions/capabilities/images/theme-selector.png and /dev/null differ diff --git a/docs/extensions/capabilities/styling.md b/docs/extensions/capabilities/styling.md deleted file mode 100644 index 152a2e3937..0000000000 --- a/docs/extensions/capabilities/styling.md +++ /dev/null @@ -1,163 +0,0 @@ -# Styling an Extension - -Lens provides a set of global styles and UI components that can be used by any extension to preserve the look and feel of the application. - -## Layout - -For layout tasks, Lens uses the [flex.box](https://www.npmjs.com/package/flex.box) library which provides helpful class names to specify some of the [flexbox](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox) properties. -For example, consider the following HTML and its associated CSS properties: - -```html -
-``` - -```css -div { - display: flex; - flex-direction: column; - align-items: center; -} -``` - -However, you are free to use any styling technique or framework you like, including [Emotion](https://github.com/emotion-js/emotion) or even plain CSS. - -### Layout Variables - -There is a set of CSS variables available for for basic layout needs. -They are located inside `:root` and are defined in [app.scss](https://github.com/lensapp/lens/blob/master/src/renderer/components/app.scss): - -```css ---unit: 8px; ---padding: var(--unit); ---margin: var(--unit); ---border-radius: 3px; -``` - -These variables are intended to set consistent margins and paddings across components. -For example: - -```css -.status { - padding-left: calc(var(--padding) * 2); - border-radius: var(--border-radius); -} -``` - -## Themes - -Lens uses two built-in themes defined in [the themes directory](https://github.com/lensapp/lens/tree/master/src/renderer/themes) – one light and one dark. - -### Theme Variables - -When Lens is loaded, it transforms the selected theme's `json` file into a list of [CSS Custom Properties (CSS Variables)](https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties). -This list then gets injected into the `:root` element so that any of the down-level components can use them. -![CSS vars listed in devtools](images/css-vars-in-devtools.png) - -When the user changes the theme, the above process is repeated, and new CSS variables appear, replacing the previous ones. - -If you want to preserve Lens's native look and feel, with respect to the lightness or darkness of your extension, you can use the provided variables and built-in Lens components such as `Button`, `Select`, `Table`, and so on. - -There is a set of CSS variables available for extensions to use for theming. -They are all located inside `:root` and are defined in [app.scss](https://github.com/lensapp/lens/blob/master/src/renderer/components/app.scss): - -```css ---font-main: 'Roboto', 'Helvetica', 'Arial', sans-serif; ---font-monospace: Lucida Console, Monaco, Consolas, monospace; ---font-size-small: calc(1.5 * var(--unit)); ---font-size: calc(1.75 * var(--unit)); ---font-size-big: calc(2 * var(--unit)); ---font-weight-thin: 300; ---font-weight-normal: 400; ---font-weight-bold: 500; -``` - -as well as in [the theme modules](https://github.com/lensapp/lens/tree/master/src/renderer/themes): - -``` ---blue: #3d90ce; ---magenta: #c93dce; ---golden: #ffc63d; ---halfGray: #87909c80; ---primary: #3d90ce; ---textColorPrimary: #555555; ---textColorSecondary: #51575d; ---textColorAccent: #333333; ---borderColor: #c9cfd3; ---borderFaintColor: #dfdfdf; ---mainBackground: #f1f1f1; ---contentColor: #ffffff; ---layoutBackground: #e8e8e8; ---layoutTabsBackground: #f8f8f8; ---layoutTabsActiveColor: #333333; ---layoutTabsLineColor: #87909c80; -... -``` - -These variables can be used in the following form: `var(--magenta)`. -For example: - -```css -.status { - font-size: var(--font-size-small); - background-color: var(--colorSuccess); -} -``` - -### Theme Switching - -When the light theme is active, the `` element gets a "theme-light" class, or: ``. -If the class isn't there, the theme defaults to dark. The active theme can be changed in the **Preferences** page: -![Color Theme](images/theme-selector.png) - -There is a way of detect active theme and its changes in JS. [MobX observer function/decorator](https://github.com/mobxjs/mobx-react#observercomponent) can be used for this purpose. - -```js -import React from "react" -import { observer } from "mobx-react" -import { Renderer } from "@k8slens/extensions"; - -@observer -export class SupportPage extends React.Component { - render() { - return ( -
-

Active theme is {Renderer.Theme.getActiveTheme().name}

-
- ); - } -} -``` - -`Theme` entity from `@k8slens/extensions` provides active theme object and `@observer` decorator makes component reactive - so it will rerender each time any of the observables (active theme in our case) will be changed. - -Working example provided in [Styling with Emotion](https://github.com/lensapp/lens-extension-samples/tree/master/styling-emotion-sample) sample extension. - -## Injected Styles - -Every extension is affected by the list of default global styles defined in [app.scss](https://github.com/lensapp/lens/blob/master/src/renderer/components/app.scss). These are basic browser resets and element styles, including: - -- setting the `box-sizing` property for every element -- default text and background colors -- default font sizes -- basic heading (h1, h2, etc) formatting -- custom scrollbar styling - -Extensions may overwrite these defaults if needed. They have low CSS specificity, so overriding them should be fairly easy. - -## CSS-in-JS - -If an extension uses a system like `Emotion` to work with styles, it can use CSS variables as follows: - -```javascript -const Container = styled.div(() => ({ - backgroundColor: 'var(--mainBackground)' -})); -``` - -## Examples - -You can explore samples for each styling technique that you can use for extensions: - -- [Styling with Sass](https://github.com/lensapp/lens-extension-samples/tree/master/styling-sass-sample) -- [Styling with Emotion](https://github.com/lensapp/lens-extension-samples/tree/master/styling-emotion-sample) -- [Styling with CSS Modules](https://github.com/lensapp/lens-extension-samples/tree/master/styling-css-modules-sample) diff --git a/docs/extensions/extension-migration.md b/docs/extensions/extension-migration.md deleted file mode 100644 index 93ccd0d923..0000000000 --- a/docs/extensions/extension-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Lens v4 to v5 Extension Migration Notes - -* Lens v5 inspects the version of the extension to ensure it is compatible. -The `package.json` for your extension must have an `"engines"` field specifying the lens version that your extension is targeted for, e.g: -``` - "engines": { - "lens": "^5.0.0-beta.7" - }, -``` -Note that Lens v5 supports all the range semantics that [semver](https://www.npmjs.com/package/semver) provides. -* Types and components have been reorganized, many have been grouped by process (`Main` and `Renderer`) plus those not specific to a process (`Common`). -For example the `LensMainExtension` class is now referred to by `Main.LensExtension`. -See the [API Reference](api/README.md) for the new organization. -* The `globalPageMenus` field of the Renderer extension class (now `Renderer.LensExtension`) is removed. -Global pages can still be made accessible via the application menus and the status bar, as well as from the newly added Welcome menu. -* The `clusterFeatures` field of the Renderer extension class (now `Renderer.LensExtension`) is removed. -Cluster features can still be implemented but Lens no longer dictates how a feature's lifecycle (install/upgrade/uninstall) is managed. -`Renderer.K8sApi.ResourceStack` provides the functionality to input and apply kubernetes resources to a cluster. -It is up to the extension developer to manage the lifecycle. -It could be applied automatically to a cluster by the extension or the end-user could be expected to install it, etc. from the cluster **Settings** page. -* Lens v5 now relies on mobx 6 for state management. Extensions that use mobx will need to be modified to work with mobx 6. -See [Migrating from Mobx 4/5](https://mobx.js.org/migrating-from-4-or-5.html) for specific details. - -For an example of an existing extension that is compatible with Lens v5 see the [Lens Resource Map Extension](https://github.com/nevalla/lens-resource-map-extension) diff --git a/docs/extensions/get-started/anatomy.md b/docs/extensions/get-started/anatomy.md deleted file mode 100644 index 4794261d8f..0000000000 --- a/docs/extensions/get-started/anatomy.md +++ /dev/null @@ -1,153 +0,0 @@ -# Extension Anatomy - -In the [previous section](your-first-extension.md) you learned how to create your first extension. -In this section you will learn how this extension works under the hood. - -The Hello World sample extension does three things: - -- Implements `onActivate()` and outputs a message to the console. -- Implements `onDeactivate()` and outputs a message to the console. -- Registers `ClusterPage` so that the page is visible in the left-side menu of the cluster dashboard. - -Let's take a closer look at our Hello World sample's source code and see how these three things are achieved. - -## Extension File Structure - -``` -. -├── .gitignore // Ignore build output and node_modules -├── Makefile // Config for build tasks that compiles the extension -├── README.md // Readable description of your extension's functionality -├── src -│ └── page.tsx // Extension's additional source code -├── main.ts // Source code for extension's main entrypoint -├── package.json // Extension manifest and dependencies -├── renderer.tsx // Source code for extension's renderer entrypoint -├── tsconfig.json // TypeScript configuration -├── webpack.config.js // Webpack configuration -``` - -The extension directory contains the extension's entry files and a few configuration files. -Three files: `package.json`, `main.ts` and `renderer.tsx` are essential to understanding the Hello World sample extension. -We'll look at those first. - -### Extension Manifest - -Each Lens extension must have a `package.json` file. -It contains a mix of Node.js fields, including scripts and dependencies, and Lens-specific fields such as `publisher` and `contributes`. -Some of the most-important fields include: - -- `name` and `publisher`: Lens uses `@/` as a unique ID for the extension. - For example, the Hello World sample has the ID `@lensapp-samples/helloworld-sample`. - Lens uses this ID to uniquely identify your extension. -- `main`: the extension's entry point run in `main` process. -- `renderer`: the extension's entry point run in `renderer` process. -- `engines.lens`: the minimum version of Lens API that the extension depends upon. - We only support the `^` range, which is also optional to specify, and only major and minor version numbers. - Meaning that `^5.4` and `5.4` both mean the same thing, and the patch version in `5.4.2` is ignored. - -```javascript -{ - "name": "helloworld-sample", - "publisher": "lens-samples", - "version": "0.0.1", - "description": "Lens helloworld-sample", - "license": "MIT", - "homepage": "https://github.com/lensapp/lens-extension-samples", - "engines": { - "node": "^16.14.2", - "lens": "5.4" - }, - "main": "dist/main.js", - "renderer": "dist/renderer.js", - "scripts": { - "build": "webpack --config webpack.config.js", - "dev": "npm run build --watch" - }, - "dependencies": { - "react-open-doodles": "^1.0.5" - }, - "devDependencies": { - "@k8slens/extensions": "^5.4.6", - "ts-loader": "^8.0.4", - "typescript": "^4.5.5", - "@types/react": "^17.0.44", - "@types/node": "^16.14.2", - "webpack": "^4.44.2", - "webpack-cli": "^3.3.11" - } -} -``` - -## Webpack configuration - -The following webpack `externals` are provided by `Lens` and must be used (when available) to make sure that the versions used are in sync. - -| Package | webpack external syntax | Lens versions | Available in Main | Available in Renderer | -| ------------------ | --------------------------- | ------------- | ----------------- | --------------------- | -| `mobx` | `var global.Mobx` | `>5.0.0` | ✅ | ✅ | -| `mobx-react` | `var global.MobxReact` | `>5.0.0` | ❌ | ✅ | -| `react` | `var global.React` | `>5.0.0` | ❌ | ✅ | -| `react-router` | `var global.ReactRouter` | `>5.0.0` | ❌ | ✅ | -| `react-router-dom` | `var global.ReactRouterDom` | `>5.0.0` | ❌ | ✅ | -| `react-dom` | `var global.ReactDOM` | `>5.5.0` | ❌ | ✅ | - -What is exported is the whole of the packages as a `*` import (within typescript). - -For example, the following is how you would specify these within your webpack configuration files. - -```json -{ - ... - "externals": [ - ... - { - "mobx": "var global.Mobx" - "mobx-react": "var global.MobxReact" - "react": "var global.React" - "react-router": "var global.ReactRouter" - "react-router-dom": "var global.ReactRouterDom" - "react-dom": "var global.ReactDOM" - } - ] -} -``` - -## Extension Entry Files - -Lens extensions can have two separate entry files. -One file is used in the `main` process of the Lens application and the other is used in the `renderer` process. -The `main` entry file exports the class that extends `LensMainExtension`, and the `renderer` entry file exports the class that extends `LensRendererExtension`. - -Both extension classes have `onActivate` and `onDeactivate` methods. -The `onActivate` method is executed when your extension is activated. -If you need to initialize something in your extension, this is where such an operation should occur. -The `onDeactivate` method gives you a chance to clean up before your extension becomes deactivated. -For extensions where explicit cleanup is not required, you don't need to override this method. -However, if an extension needs to perform an operation when Lens is shutting down (or if the extension is disabled or uninstalled), this is the method where such an operation should occur. - -The Hello World sample extension does not do anything on the `main` process, so we'll focus on the `renderer` process, instead. -On the `renderer` entry point, the Hello World sample extension defines the `Cluster Page` object. -The `Cluster Page` object registers the `/extension-example` path, and this path renders the `ExamplePage` React component. -It also registers the `MenuItem` component that displays the `ExampleIcon` React component and the "Hello World" text in the left-side menu of the cluster dashboard. -These React components are defined in the additional `./src/page.tsx` file. - -```typescript -import { Renderer } from "@k8slens/extensions"; -import { ExampleIcon, ExamplePage } from "./page"; -import React from "react"; - -export default class ExampleExtension extends Renderer.LensExtension { - clusterPages = [ - { - id: "extension-example", - components: { - Page: () => , - }, - }, - ]; -} -``` - -The Hello World sample extension uses the `Cluster Page` capability, which is just one of the Lens extension API's capabilities. -The [Common Capabilities](../capabilities/common-capabilities.md) page will help you home in on the right capabilities to use with your own extensions. diff --git a/docs/extensions/get-started/overview.md b/docs/extensions/get-started/overview.md deleted file mode 100644 index 84777aafa0..0000000000 --- a/docs/extensions/get-started/overview.md +++ /dev/null @@ -1,27 +0,0 @@ -# Extension Development Overview - -This is a general overview to how the development of an extension will proceed. -For building extensions there will be a few things that you should have installed, and some other things that might be of help. - -### Required: -- [Node.js](https://www.nodejs.org/en/) -- [Git](https://www.git-scm.com/) -- Some sort of text editor – we recommend [VSCode](https://code.visualstudio.com/) -- We use [Webpack](https://www.webpack.js.org/) for compilation. -All extension need to be at least compatible with a webpack system. - -### Recommended: - -All Lens extensions are javascript packages. -We recommend that you program in [Typescript](https://www.typescriptlang.org/) because it catches many common errors. - -Lens is a standard [Electron](https://www.electronjs.org/) application with both main and renderer processes. -An extension is made up of two parts, one for each of Lens's core processes. -When an extension is loaded, each part is first loaded and issues a notification that it has been loaded. -From there, the extension can start doing is work. - -Lens uses [React](https://www.reactjs.org/) as its UI framework and provides some of Lens's own components for reuse with extensions. -An extension is responsible for the lifetime of any resources it spins up. -If an extension's main part starts new processes they all must be stopped and cleaned up when the extension is deactivated or unloaded. - -See [Your First Extension](your-first-extension.md) to get started. diff --git a/docs/extensions/get-started/wrapping-up.md b/docs/extensions/get-started/wrapping-up.md deleted file mode 100644 index f4aa174476..0000000000 --- a/docs/extensions/get-started/wrapping-up.md +++ /dev/null @@ -1,24 +0,0 @@ -# Wrapping Up - -In [Your First Extension](your-first-extension.md), you learned how to create and run an extension. -In [Extension Anatomy](anatomy.md), you learned in detail how a basic extension works. -This is just a glimpse into what can be created with Lens extensions. -Below are some suggested routes for learning more. - -## Extension Capabilities - -In this section, you'll find information on common extension capabilities, styling information, and a color reference guide. -Determine whether your idea for an extension is doable and get ideas for new extensions by reading through the [Common Capabilities](../capabilities/common-capabilities.md) page. - -## Guides and Samples - -Here you'll find a collection of sample extensions that you can use as a base to work from. -Some of these samples include a detailed guide that explains the source code. -You can find all samples and guides in the [lens-extension-samples](https://github.com/lensapp/lens-extension-samples) repository. - -## Testing and Publishing - -In this section, you can learn: - -* How to add [integration tests](../testing-and-publishing/testing.md) to your extension -* How to [publish your extension](../testing-and-publishing/publishing.md) diff --git a/docs/extensions/get-started/your-first-extension.md b/docs/extensions/get-started/your-first-extension.md deleted file mode 100644 index ec797f7441..0000000000 --- a/docs/extensions/get-started/your-first-extension.md +++ /dev/null @@ -1,100 +0,0 @@ -# Your First Extension - -We recommend to always use [Yeoman generator for Lens Extension](https://github.com/lensapp/generator-lens-ext) to start new extension project. -[Read the generator guide here](../guides/generator.md). - -If you want to setup the project manually, please continue reading. - -## First Extension - -In this topic, you'll learn the basics of building extensions by creating an extension that adds a "Hello World" page to a cluster menu. - -## Install the Extension - -To install the extension, clone the [Lens Extension samples](https://github.com/lensapp/lens-extension-samples) repository to your local machine: - -```sh -git clone https://github.com/lensapp/lens-extension-samples.git -``` - -Next you need to create a symlink. -A symlink connects the directory that Lens will monitor for user-installed extensions to the sample extension. -In this case the sample extension is `helloworld-sample`. - -### Linux & macOS - -```sh -mkdir -p ~/.k8slens/extensions -cd ~/.k8slens/extensions -ln -s lens-extension-samples/helloworld-sample helloworld-sample -``` - -### Windows - -Create the directory that Lens will monitor for user-installed extensions: - -```sh -mkdir C:\Users\\.k8slens\extensions -force -cd C:\Users\\.k8slens\extensions -``` - -If you have administrator rights, you can create symlink to the sample extension – in this case `helloworld-sample`: - -```sh -cmd /c mklink /D helloworld-sample lens-extension-samples\helloworld-sample -``` - -Without administrator rights, you need to copy the extensions sample directory into `C:\Users\\.k8slens\extensions`: - -```sh -Copy-Item 'lens-extension-samples\helloworld-sample' 'C:\Users\\.k8slens\extensions\helloworld-sample' -``` - -## Build the Extension - -To build the extension you can use `make` or run the `npm` commands manually: - -```sh -cd /helloworld-sample -make build -``` - -To run the `npm` commands, enter: - -```sh -cd /helloworld-sample -npm install -npm run build -``` - -Optionally, automatically rebuild the extension by watching for changes to the source code. -To do so, enter: - -```sh -cd /helloworld-sample -npm run dev -``` - -You must restart Lens for the extension to load. -After this initial restart, reload Lens and it will automatically pick up changes any time the extension rebuilds. - -With Lens running, either connect to an existing cluster or create a new one - refer to the latest [Lens Documentation](https://docs.k8slens.dev/getting-started/add-cluster/) for details on how to add a cluster in Lens IDE. -You will see the "Hello World" page in the left-side cluster menu. - -## Develop the Extension - -Finally, you'll make a change to the message that our Hello World sample extension displays: - -1. Navigate to `/helloworld-sample`. -2. In `page.tsx`, change the message from `HelloWorld!` to `Hello Lens Extensions`. -3. Rebuild the extension. If you used `npm run dev`, the extension will rebuild automatically. -4. Reload the Lens window. -5. Click on the Hello World page. -6. The updated message will appear. - -## Next Steps - -In the [next topic](anatomy.md), we'll take a closer look at the source code of our Hello World sample. - -You can find the source code for this tutorial at: [lensapp/lens-extension-samples](https://github.com/lensapp/lens-extension-samples/tree/master/helloworld-sample). -[Extension Guides](../guides/README.md) contains additional samples. diff --git a/docs/extensions/guides/README.md b/docs/extensions/guides/README.md deleted file mode 100644 index 90368645f3..0000000000 --- a/docs/extensions/guides/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# Extension Guides - -This section explains how to use specific Lens Extension APIs. -It includes detailed guides and code samples. -For introductory information about the Lens Extension API, please see [Your First Extension](../get-started/your-first-extension.md). - -Each guide or code sample includes the following: - -- Clearly commented source code. -- Instructions for running the sample extension. -- An image showing the sample extension's appearance and usage. -- A listing of the Extension API being used. -- An explanation of the concepts relevant to the Extension. - -## Guides - -| Guide | APIs | -| --------------------------------------------------------------- | ---------------------- | -| [Generate new extension project](generator.md) | | -| [Main process extension](main-extension.md) | Main.LensExtension | -| [Renderer process extension](renderer-extension.md) | Renderer.LensExtension | -| [Resource stack (cluster feature)](resource-stack.md) | | -| [Extending KubernetesCluster)](extending-kubernetes-cluster.md) | | -| [Stores](stores.md) | | -| [Components](components.md) | | -| [KubeObjectListLayout](kube-object-list-layout.md) | | -| [Working with mobx](working-with-mobx.md) | | -| [Protocol Handlers](protocol-handlers.md) | | -| [Sending Data between main and renderer](ipc.md) | | -| [Catalog Entities and Categories](catalog.md) | | - -## Samples - -| Sample | APIs | -| ---------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [hello-world](https://github.com/lensapp/lens-extension-samples/tree/master/helloworld-sample) | LensMainExtension
LensRendererExtension
Renderer.Component.Icon
Renderer.Component.IconProps | -| [styling-css-modules-sample](https://github.com/lensapp/lens-extension-samples/tree/master/styling-css-modules-sample) | LensMainExtension
LensRendererExtension
Renderer.Component.Icon
Renderer.Component.IconProps | -| [styling-emotion-sample](https://github.com/lensapp/lens-extension-samples/tree/master/styling-emotion-sample) | LensMainExtension
LensRendererExtension
Renderer.Component.Icon
Renderer.Component.IconProps | -| [styling-sass-sample](https://github.com/lensapp/lens-extension-samples/tree/master/styling-sass-sample) | LensMainExtension
LensRendererExtension
Renderer.Component.Icon
Renderer.Component.IconProps | -| [custom-resource-page](https://github.com/lensapp/lens-extension-samples/tree/master/custom-resource-page) | LensRendererExtension
Renderer.K8sApi.KubeApi
Renderer.K8sApi.KubeObjectStore
Renderer.Component.KubeObjectListLayout
Renderer.Component.KubeObjectDetailsProps
Renderer.Component.IconProps | diff --git a/docs/extensions/guides/anatomy.md b/docs/extensions/guides/anatomy.md deleted file mode 100644 index cc7b84e256..0000000000 --- a/docs/extensions/guides/anatomy.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -WIP ---- diff --git a/docs/extensions/guides/catalog.md b/docs/extensions/guides/catalog.md deleted file mode 100644 index 6ddc5755c7..0000000000 --- a/docs/extensions/guides/catalog.md +++ /dev/null @@ -1,71 +0,0 @@ -# Catalog (WIP) - -This guide is a brief overview about how the catalog works within Lens. -The catalog should be thought of as the single source of truth about data within Lens. - -The data flow is unidirectional, it only flows from the main side to the renderer side. -All data is public within the catalog. - -## Categories - -A category is the declaration to the catalog of a specific kind of entity. -It declares the currently supported versions of that kind of entity but providing the constructors for the entity classes. - -To declare a new category class you must create a new class that extends [Common.Catalog.CatalogCategory](../api/classes/Common.Catalog.CatalogCategory.md) and implement all of the abstract fields. - -The categories provided by Lens itself have the following names: - -- `KubernetesClusters` -- `WebLinks` -- `General` - -To register a category, call the `Main.Catalog.catalogCategories.add()` and `Renderer.Catalog.catalogCategories.add()` with instances of your class. - -### Custom Category Views - -By default when a specific category is selected in the catalog page a list of entities of the group and kind that the category has registered. -It is possible to register custom views for specific categories by registering them on your `Renderer.LensExtension` class. - -A registration takes the form of a [Common.Types.CustomCategoryViewRegistration](../api/interfaces/Common.Types.CustomCategoryViewRegistration.md) - -For example: - -```typescript -import { Renderer, Common } from "@k8slens/extensions"; - -function MyKubernetesClusterView({ - category, -}: Common.Types.CustomCategoryViewProps) { - return
My view: {category.getId()}
; -} - -export default class extends Renderer.LensExtension { - customCategoryViews = [ - { - group: "entity.k8slens.dev", - kind: "KubernetesCluster", - priority: 10, - components: { - View: MyKubernetesClusterView, - }, - }, - ]; -} -``` - -Will register a new view for the KubernetesCluster category, and because the priority is < 50 it will be displayed above the default list view. - -The default list view has a priority of 50 and and custom views with priority (defaulting to 50) >= 50 will be displayed afterwards. - -#### Styling Custom Views - -By default, custom view blocks are styled with [Flexbox](https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Flexbox). Some details comes from this. - -- To set fixed height of a custom block, use `max-height` css rule. -- To set flexible height, use `height`. -- Otherwise, custom view will have height of it's contents. - -## Entities - -An entity is the data within the catalog. -All entities are typed and the class instances will be recreated on the renderer side by the catalog and the category registrations. diff --git a/docs/extensions/guides/components.md b/docs/extensions/guides/components.md deleted file mode 100644 index cc7b84e256..0000000000 --- a/docs/extensions/guides/components.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -WIP ---- diff --git a/docs/extensions/guides/extending-kubernetes-cluster.md b/docs/extensions/guides/extending-kubernetes-cluster.md deleted file mode 100644 index 5c8170a2fe..0000000000 --- a/docs/extensions/guides/extending-kubernetes-cluster.md +++ /dev/null @@ -1,69 +0,0 @@ -# Extending KubernetesCluster - -Extension can specify it's own subclass of Common.Catalog.KubernetesCluster. Extension can also specify a new Category for it in the Catalog. - -## Extending Common.Catalog.KubernetesCluster - -``` typescript -import { Common } from "@k8slens/extensions"; - -// The kind must be different from KubernetesCluster's kind -export const kind = "ManagedDevCluster"; - -export class ManagedDevCluster extends Common.Catalog.KubernetesCluster { - public static readonly kind = kind; - - public readonly kind = kind; -} -``` - -## Extending Common.Catalog.CatalogCategory - -These custom Catalog entities can be added a new Category in the Catalog. - -``` typescript -import { Common } from "@k8slens/extensions"; -import { kind, ManagedDevCluster } from "../entities/ManagedDevCluster"; - -class ManagedDevClusterCategory extends Common.Catalog.CatalogCategory { - public readonly apiVersion = "catalog.k8slens.dev/v1alpha1"; - public readonly kind = "CatalogCategory"; - public metadata = { - name: "Managed Dev Clusters", - icon: "" - }; - public spec: Common.Catalog.CatalogCategorySpec = { - group: "entity.k8slens.dev", - versions: [ - { - name: "v1alpha1", - entityClass: ManagedDevCluster as any, - }, - ], - names: { - kind - }, - }; -} - -export { ManagedDevClusterCategory }; -export type { ManagedDevClusterCategory as ManagedDevClusterCategoryType }; -``` - -The category needs to be registered in the `onActivate()` method both in main and renderer - -``` typescript -// in main's on onActivate -Main.Catalog.catalogCategories.add(new ManagedDevClusterCategory()); -``` - -``` typescript -// in renderer's on onActivate -Renderer.Catalog.catalogCategories.add(new ManagedDevClusterCategory()); -``` - -You can then add the entities to the Catalog as a new source: - -``` typescript -this.addCatalogSource("managedDevClusters", this.managedDevClusters); -``` diff --git a/docs/extensions/guides/generator.md b/docs/extensions/guides/generator.md deleted file mode 100644 index fbc1723b0b..0000000000 --- a/docs/extensions/guides/generator.md +++ /dev/null @@ -1,75 +0,0 @@ -# Lens Extension Generator - -The [Lens Extension Generator](https://github.com/lensapp/generator-lens-ext) creates a directory with the necessary files for developing an extension. - -## Installing and Getting Started with the Generator - -To begin, install Yeoman and the Lens Extension Generator with the following command: - -```bash -npm install -g yo generator-lens-ext -``` - -Run the generator by entering the following command: `yo lens-ext`. - -Answer the following questions: - -```bash -# ? What type of extension do you want to create? New Extension (TypeScript) -# ? What's the name of your extension? my-first-lens-ext -# ? What's the description of your extension? My hello world extension -# ? What's your extension's publisher name? @my-org/my-first-lens-ext -# ? Initialize a git repository? Yes -# ? Install dependencies after initialization? Yes -# ? Which package manager to use? yarn -# ? symlink created extension folder to ~/.k8slens/extensions (mac/linux) or :Users\\.k8slens\extensions (windows)? Yes -``` - -Next, you'll need to have webpack watch the `my-first-lens-ext` folder. -Start webpack by entering: - -```bash -cd my-first-lens-ext -npm start # start the webpack server in watch mode -``` - -Open Lens and you will see a **Hello World** item in the left-side menu under **Custom Resources**: - -![Hello World](images/hello-world.png) - -## Developing the Extension - -Next, you'll try changing the way the new menu item appears in the UI. -You'll change it from "Hello World" to "Hello Lens". - -Open `my-first-lens-ext/renderer.tsx` and change the value of `title` from `"Hello World"` to `"Hello Lens"`: - -```typescript -clusterPageMenus = [ - { - target: { pageId: "hello" }, - title: "Hello Lens", - components: { - Icon: ExampleIcon, - }, - }, -]; -``` - -Reload Lens and you will see that the menu item text has changed to "Hello Lens". -To reload Lens, enter `CMD+R` on Mac and `Ctrl+R` on Windows/Linux. - -![Hello World](images/hello-lens.png) - -## Debugging the Extension - -To debug your extension, please see our instructions on [Testing Extensions](../testing-and-publishing/testing.md). - -## Next Steps - -To dive deeper, consider looking at [Common Capabilities](../capabilities/common-capabilities.md), [Styling](../capabilities/styling.md), or [Extension Anatomy](anatomy.md). - -If you find problems with the Lens Extension Generator, or have feature requests, you are welcome to raise an [issue](https://github.com/lensapp/generator-lens-ext/issues). -You can find the latest Lens contribution guidelines [here](https://docs.k8slens.dev/contributing). - -The Generator source code is hosted at [GitHub](https://github.com/lensapp/generator-lens-ext). diff --git a/docs/extensions/guides/images/certificates-crd-list.png b/docs/extensions/guides/images/certificates-crd-list.png deleted file mode 100644 index 19c9558f71..0000000000 Binary files a/docs/extensions/guides/images/certificates-crd-list.png and /dev/null differ diff --git a/docs/extensions/guides/images/clusterfeature.png b/docs/extensions/guides/images/clusterfeature.png deleted file mode 100644 index ada8beba6f..0000000000 Binary files a/docs/extensions/guides/images/clusterfeature.png and /dev/null differ diff --git a/docs/extensions/guides/images/clusterpagemenus.png b/docs/extensions/guides/images/clusterpagemenus.png deleted file mode 100644 index 77a3ec118a..0000000000 Binary files a/docs/extensions/guides/images/clusterpagemenus.png and /dev/null differ diff --git a/docs/extensions/guides/images/globalpagemenus.png b/docs/extensions/guides/images/globalpagemenus.png deleted file mode 100644 index e986cc32e9..0000000000 Binary files a/docs/extensions/guides/images/globalpagemenus.png and /dev/null differ diff --git a/docs/extensions/guides/images/hello-lens.png b/docs/extensions/guides/images/hello-lens.png deleted file mode 100644 index 5e2c0ac0a5..0000000000 Binary files a/docs/extensions/guides/images/hello-lens.png and /dev/null differ diff --git a/docs/extensions/guides/images/hello-world.png b/docs/extensions/guides/images/hello-world.png deleted file mode 100644 index 1a4a9c73a9..0000000000 Binary files a/docs/extensions/guides/images/hello-world.png and /dev/null differ diff --git a/docs/extensions/guides/images/kubeobjectdetailitem.png b/docs/extensions/guides/images/kubeobjectdetailitem.png deleted file mode 100644 index e2d68f0c3b..0000000000 Binary files a/docs/extensions/guides/images/kubeobjectdetailitem.png and /dev/null differ diff --git a/docs/extensions/guides/images/kubeobjectdetailitemwithpods.png b/docs/extensions/guides/images/kubeobjectdetailitemwithpods.png deleted file mode 100644 index 9a91f230f3..0000000000 Binary files a/docs/extensions/guides/images/kubeobjectdetailitemwithpods.png and /dev/null differ diff --git a/docs/extensions/guides/images/kubeobjectmenuitem.png b/docs/extensions/guides/images/kubeobjectmenuitem.png deleted file mode 100644 index f9f91675de..0000000000 Binary files a/docs/extensions/guides/images/kubeobjectmenuitem.png and /dev/null differ diff --git a/docs/extensions/guides/images/kubeobjectmenuitemdetail.png b/docs/extensions/guides/images/kubeobjectmenuitemdetail.png deleted file mode 100644 index ab5f9ac0f0..0000000000 Binary files a/docs/extensions/guides/images/kubeobjectmenuitemdetail.png and /dev/null differ diff --git a/docs/extensions/guides/images/routing-diag.png b/docs/extensions/guides/images/routing-diag.png deleted file mode 100644 index 9185ce94d8..0000000000 Binary files a/docs/extensions/guides/images/routing-diag.png and /dev/null differ diff --git a/docs/extensions/guides/ipc.md b/docs/extensions/guides/ipc.md deleted file mode 100644 index df4684ac5d..0000000000 --- a/docs/extensions/guides/ipc.md +++ /dev/null @@ -1,132 +0,0 @@ -# Inter Process Communication - -A Lens Extension can utilize IPC to send information between the `renderer` and `main` processes. -This is useful when wanting to communicate directly within your extension. - -For example, if a user logs into a service that your extension is a facade for and `main` needs to know some information so that you can start syncing items to the `Catalog`, this would be a good way to send that information along. - -IPC channels are sectioned off per extension. -Meaning that each extension can only communicate with itself. - -## Types of Communication - -There are two flavours of communication that are provided: - -- Event based (IPC) -- Request based (RPC) - -### Event Based or IPC - -This is the same as an [Event Emitter](https://nodejs.org/api/events.html#events_class_eventemitter) but is not limited to just one Javascript process. -This is a good option when you need to report that something has happened but you don't need a response. - -This is a fully two-way form of communication. -Both `main` and `renderer` can do this sort of IPC. - -### Request Based or RPC - -This is more like a Remote Procedure Call (RPC) or Send-Receive-Reply (SRR). -With this sort of communication the caller needs to wait for the result from the other side. -This is accomplished by `await`-ing the returned `Promise`. - -This is a unidirectional form of communication. -Only `renderer` can initiate this kind of request, and only `main` can receive and respond to this kind of request. - -## Registering IPC Handlers and Listeners - -The general terminology is as follows: - -- A "handler" is the function that responds to a "Request Based IPC" event. -- A "listener" is the function that is called when a "Event Based IPC" event is emitted. - -To register either a handler or a listener, you should do something like the following: - -`main.ts`: -```typescript -import { Main } from "@k8slens/extensions"; -import { IpcMain } from "./helpers/main"; - -export class ExampleExtensionMain extends Main.LensExtension { - onActivate() { - IpcMain.createInstance(this); - } -} -``` - -This file shows that you need to create an instance of the store to be able to use IPC. -Lens will automatically clean up that store and all the handlers on deactivation and uninstall. - ---- - -`helpers/main.ts`: -```typescript -import { Main } from "@k8slens/extensions"; - -export class IpcMain extends Main.Ipc { - constructor(extension: Main.LensExtension) { - super(extension); - - this.listen("initialize", onInitialize); - } -} - -function onInitialize(event: Types.IpcMainEvent, id: string) { - console.log(`starting to initialize: ${id}`); -} -``` - -In other files, it is not necessary to pass around any instances. -You should be able to just call `IpcMain.getInstance()` anywhere it is needed in your extension. - ---- - -`renderer.ts`: -```typescript -import { Renderer } from "@k8slens/extensions"; -import { IpcRenderer } from "./helpers/renderer"; - -export class ExampleExtensionRenderer extends Renderer.LensExtension { - onActivate() { - const ipc = IpcRenderer.createInstance(this); - - setTimeout(() => ipc.broadcast("initialize", "an-id"), 5000); - } -} -``` - -It is also needed to create an instance to broadcast messages too. - ---- - -`helpers/renderer.ts`: -```typescript -import { Renderer } from "@k8slens/extensions"; - -export class IpcRenderer extends Renderer.Ipc {} -``` - -It is necessary to create child classes of these `abstract class`'s in your extension before you can use them. - ---- - -As this example shows: the channel names *must* be the same. -It should also be noted that "listeners" and "handlers" are specific to either `renderer` or `main`. -There is no behind the scenes transfer of these functions. - -To register a "handler" call `IpcMain.getInstance().handle(...)`. -The cleanup of these handlers is handled by Lens itself. - -The `listen()` methods on `Main.Ipc` and `Renderer.Ipc` return a `Disposer`, or more specifically, a `() => void`. -This can be optionally called to remove the listener early. - -Calling either `IpcRenderer.getInstance().broadcast(...)` or `IpcMain.getInstance().broadcast(...)` sends an event to all `renderer` frames and to `main`. -Because of this, no matter where you broadcast from, all listeners in `main` and `renderer` will be notified. - -### Allowed Values - -This IPC mechanism utilizes the [Structured Clone Algorithm](developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm) for serialization. -This means that more types than what are JSON serializable can be used, but not all the information will be passed through. - -## Using Request Based Communication - -If you are meaning to do a request based call from `renderer`, you should do `const res = await IpcRenderer.getInstance().invoke(, ...));` instead. diff --git a/docs/extensions/guides/kube-object-list-layout.md b/docs/extensions/guides/kube-object-list-layout.md deleted file mode 100644 index 6d350c98cf..0000000000 --- a/docs/extensions/guides/kube-object-list-layout.md +++ /dev/null @@ -1,325 +0,0 @@ -# KubeObjectListLayout Sample - -In this guide we will learn how to list Kubernetes CRD objects on the cluster dashboard. -You can see the complete source code for this guide [here](https://github.com/lensapp/lens-extension-samples/tree/master/custom-resource-page). - -![](./images/certificates-crd-list.png) - -Next, we will go the implementation through in steps. -To achieve our goal, we need to: - -1. [Register ClusterPage and ClusterPageMenu objects](#register-objects-for-clustepages-and-clusterpagemenus) -2. [List Certificate Objects on the Cluster Page](#list-certificate-objects-on-the-cluster-page) -3. [Customize Details Panel](#customize-details-panel) - -## Register `clusterPage` and `clusterPageMenu` Objects - -First thing we need to do with our extension is to register new menu item in the cluster menu and create a cluster page that is opened when clicking the menu item. -We will do this in our extension class `CrdSampleExtension` that is derived `LensRendererExtension` class: - -```typescript -export default class CrdSampleExtension extends Renderer.LensExtension { -} -``` - -To register menu item in the cluster menu we need to register `PageMenuRegistration` object. -This object will register a menu item with "Certificates" text. -It will also use `CertificateIcon` component to render an icon and navigate to cluster page that is having `certificates` page id. - -```typescript -import { Renderer } from "@k8slens/extensions"; - -type IconProps = Renderer.Component.IconProps; - -const { - Component: { - Icon, - }, -} = Renderer; - -export function CertificateIcon(props: IconProps) { - return -} - -export default class CrdSampleExtension extends Renderer.LensExtension { - - clusterPageMenus = [ - { - target: { pageId: "certificates" }, - title: "Certificates", - components: { - Icon: CertificateIcon, - } - }, - ] -} -``` - -Then we need to register `PageRegistration` object with `certificates` id and define `CertificatePage` component to render certificates. - -```typescript -export default class CrdSampleExtension extends Renderer.LensExtension { - ... - - clusterPages = [{ - id: "certificates", - components: { - Page: () => , - MenuIcon: CertificateIcon, - } - }] -} -``` - -## List Certificate Objects on the Cluster Page - -In the previous step we defined `CertificatePage` component to render certificates. -In this step we will actually implement that. -`CertificatePage` is a React component that will render `Renderer.Component.KubeObjectListLayout` component to list `Certificate` CRD objects. - -### Get CRD objects - -In order to list CRD objects, we need first fetch those from Kubernetes API. -Lens Extensions API provides easy mechanism to do this. -We just need to define `Certificate` class derived from `Renderer.K8sApi.KubeObject`, `CertificatesApi`derived from `Renderer.K8sApi.KubeApi` and `CertificatesStore` derived from `Renderer.K8sApi.KubeObjectStore`. - -`Certificate` class defines properties found in the CRD object: - -```typescript -import { Renderer } from "@k8slens/extensions"; - -const { - K8sApi: { - KubeObject, - KubeObjectStore, - KubeApi, - apiManager, - }, -} = Renderer; - -export class Certificate extends KubeObject { - static kind = "Certificate" - static namespaced = true - static apiBase = "/apis/cert-manager.io/v1alpha2/certificates" - - kind: string - apiVersion: string - metadata: { - name: string; - namespace: string; - selfLink: string; - uid: string; - resourceVersion: string; - creationTimestamp: string; - labels: { - [key: string]: string; - }; - annotations: { - [key: string]: string; - }; - } - spec: { - dnsNames: string[]; - issuerRef: { - group: string; - kind: string; - name: string; - } - secretName: string - } - status: { - conditions: { - lastTransitionTime: string; - message: string; - reason: string; - status: string; - type?: string; - }[]; - } -} -``` - -With `CertificatesApi` class we are able to manage `Certificate` objects in Kubernetes API: - -```typescript -export class CertificatesApi extends KubeApi {} - -export const certificatesApi = new CertificatesApi({ - objectConstructor: Certificate -}); -``` - -`CertificateStore` defines storage for `Certificate` objects - -```typescript -export class CertificatesStore extends KubeObjectStore { - api = certificatesApi -} - -export const certificatesStore = new CertificatesStore(); -``` - -And, finally, we register this store to Lens's API manager. - -```typescript -apiManager.registerStore(certificatesStore); -``` - - -### Create CertificatePage component - -Now we have created mechanism to manage `Certificate` objects in Kubernetes API. -Then we need to fetch those and render them in the UI. - -First we define `CertificatePage` class that extends `React.Component`. - -```typescript -import { Renderer } from "@k8slens/extensions"; -import React from "react"; -import { certificatesStore } from "../certificate-store"; -import { Certificate } from "../certificate" - -export class CertificatePage extends React.Component<{ extension: Renderer.LensExtension }> { - -} -``` - -Next we will implement `render` method that will display certificates in a list. -To do that, we just need to add `Renderer.Component.KubeObjectListLayout` component inside `Renderer.Component.TabLayout` component in render method. -To define which objects the list is showing, we need to pass `certificateStore` object to `Renderer.Component.KubeObjectListLayout` in `store` property. -`Renderer.Component.KubeObjectListLayout` will fetch automatically items from the given store when component is mounted. -Also, we can define needed sorting callbacks and search filters for the list: - -```typescript -import { Renderer } from "@k8slens/extensions"; - -const { - Component: { - TabLayout, - KubeObjectListLayout, - }, -} = Renderer; - -enum sortBy { - name = "name", - namespace = "namespace", - issuer = "issuer" -} - -export class CertificatePage extends React.Component<{ extension: LensRendererExtension }> { - // ... - - render() { - return ( - - certificate.getName(), - [sortBy.namespace]: (certificate: Certificate) => certificate.metadata.namespace, - [sortBy.issuer]: (certificate: Certificate) => certificate.spec.issuerRef.name - }} - searchFilters={[ - (certificate: Certificate) => certificate.getSearchFields() - ]} - renderHeaderTitle="Certificates" - renderTableHeader={[ - { title: "Name", className: "name", sortBy: sortBy.name }, - { title: "Namespace", className: "namespace", sortBy: sortBy.namespace }, - { title: "Issuer", className: "issuer", sortBy: sortBy.namespace }, - ]} - renderTableContents={(certificate: Certificate) => [ - certificate.getName(), - certificate.metadata.namespace, - certificate.spec.issuerRef.name - ]} - /> - - ) - } -} -``` - -### Customize Details panel - -We have learned now, how to list CRD objects in a list view. -Next, we will learn how to customize details panel that will be opened when the object is clicked in the list. - -First, we need to register our custom component to render details for the specific Kubernetes custom resource, in our case `Certificate`. -We will do this again in `CrdSampleExtension` class: - -```typescript -export default class CrdSampleExtension extends Renderer.LensExtension { - //... - - kubeObjectDetailItems = [{ - kind: Certificate.kind, - apiVersions: ["cert-manager.io/v1alpha2"], - components: { - Details: (props: CertificateDetailsProps) => - } - }] -} -``` - -Here we defined that `CertificateDetails` component will render the resource details. -So, next we need to implement that component. -Lens will inject `Certificate` object into our component so we just need to render some information out of it. -We can use `Renderer.Component.DrawerItem` component from Lens Extensions API to give the same look and feel as Lens is using elsewhere: - -```typescript -import { Renderer } from "@k8slens/extensions"; -import React from "react"; -import { Certificate } from "../certificate"; - -const { - Component: { - KubeObjectDetailsProps, - DrawerItem, - Badge, - } -} = Renderer; - -export interface CertificateDetailsProps extends KubeObjectDetailsProps{ -} - -export class CertificateDetails extends React.Component { - - render() { - const { object: certificate } = this.props; - if (!certificate) return null; - return ( -
- - {certificate.getAge(true, false)} ago ({certificate.metadata.creationTimestamp }) - - - {certificate.spec.dnsNames.join(",")} - - - {certificate.spec.secretName} - - - {certificate.status.conditions.map((condition, index) => { - const { type, reason, message, status } = condition; - const kind = type || reason; - if (!kind) return null; - return ( - - ); - })} - -
- ) - } -} -``` - -## Summary - -Like we can see above, it's very easy to add custom pages and fetch Kubernetes resources by using Extensions API. -Please see the [complete source code](https://github.com/lensapp/lens-extension-samples/tree/master/custom-resource-page) to test it out. diff --git a/docs/extensions/guides/main-extension.md b/docs/extensions/guides/main-extension.md deleted file mode 100644 index d05368529c..0000000000 --- a/docs/extensions/guides/main-extension.md +++ /dev/null @@ -1,134 +0,0 @@ -# Main Extension - -The Main Extension API is the interface to Lens's main process. -Lens runs in both main and renderer processes. -The Main Extension API allows you to access, configure, and customize Lens data, add custom application menu items and [protocol handlers](protocol-handlers.md), and run custom code in Lens's main process. -It also provides convenient methods for navigating to built-in Lens pages and extension pages, as well as adding and removing sources of catalog entities. - -## `Main.LensExtension` Class - -### `onActivate()` and `onDeactivate()` Methods - -To create a main extension simply extend the `Main.LensExtension` class: - -```typescript -import { Main } from "@k8slens/extensions"; - -export default class ExampleExtensionMain extends Main.LensExtension { - onActivate() { - console.log("custom main process extension code started"); - } - - onDeactivate() { - console.log("custom main process extension de-activated"); - } -} -``` - -Two methods enable you to run custom code: `onActivate()` and `onDeactivate()`. -Enabling your extension calls `onActivate()` and disabling your extension calls `onDeactivate()`. -You can initiate custom code by implementing `onActivate()`. -Implementing `onDeactivate()` gives you the opportunity to clean up after your extension. - -Disable extensions from the Lens Extensions page: - -1. Navigate to **File** > **Extensions** in the top menu bar. - (On Mac, it is **Lens** > **Extensions**.) -2. Click **Disable** on the extension you want to disable. - -The example above logs messages when the extension is enabled and disabled. -To see standard output from the main process there must be a console connected to it. -Achieve this by starting Lens from the command prompt. - -For more details on accessing Lens state data, please see the [Stores](stores.md) guide. - -### `appMenus` - -The Main Extension API allows you to customize the UI application menu. -The following example demonstrates adding an item to the **Help** menu. - -```typescript -import { Main } from "@k8slens/extensions"; - -export default class SamplePageMainExtension extends Main.LensExtension { - appMenus = [ - { - parentId: "help", - label: "Sample", - click() { - console.log("Sample clicked"); - }, - }, - ]; -} -``` - -`appMenus` is an array of objects that satisfy the `MenuRegistration` interface. -`MenuRegistration` extends Electron's `MenuItemConstructorOptions` interface. -The properties of the appMenus array objects are defined as follows: - -- `parentId` is the name of the menu where your new menu item will be listed. - Valid values include: `"file"`, `"edit"`, `"view"`, and `"help"`. - `"lens"` is valid on Mac only. -- `label` is the name of your menu item. -- `click()` is called when the menu item is selected. - In this example, we simply log a message. - However, you would typically have this navigate to a specific page or perform another operation. - Note that pages are associated with the [`Renderer.LensExtension`](renderer-extension.md) class and can be defined in the process of extending it. - -The following example demonstrates how an application menu can be used to navigate to such a page: - -```typescript -import { Main } from "@k8slens/extensions"; - -export default class SamplePageMainExtension extends Main.LensExtension { - appMenus = [ - { - parentId: "help", - label: "Sample", - click: () => this.navigate("myGlobalPage"), - }, - ]; -} -``` - -When the menu item is clicked the `navigate()` method looks for and displays a global page with id `"myGlobalPage"`. -This page would be defined in your extension's `Renderer.LensExtension` implementation (See [`Renderer.LensExtension`](renderer-extension.md)). - -### `trayMenus` - -`trayMenus` is an array of `TrayMenuRegistration` objects. Most importantly you can define a `label` and a `click` handler. Other properties are `submenu`, `enabled`, `toolTip`, `id` and `type`. - -```typescript -interface TrayMenuRegistration { - label?: string; - click?: (menuItem: TrayMenuRegistration) => void; - id?: string; - type?: "normal" | "separator" | "submenu"; - toolTip?: string; - enabled?: boolean; - submenu?: TrayMenuRegistration[]; -} -``` - -The following example demonstrates how tray menus can be added from extension: - -```typescript -import { Main } from "@k8slens/extensions"; - -export default class SampleTrayMenuMainExtension extends Main.LensExtension { - trayMenus = [ - { - label: "menu from the extension", - click: () => { - console.log("tray menu clicked!"); - }, - }, - ]; -} -``` - -### `addCatalogSource()` and `removeCatalogSource()` Methods - -The `Main.LensExtension` class also provides the `addCatalogSource()` and `removeCatalogSource()` methods, for managing custom catalog items (or entities). -See the [`Catalog`](catalog.md) documentation for full details about the catalog. diff --git a/docs/extensions/guides/protocol-handlers.md b/docs/extensions/guides/protocol-handlers.md deleted file mode 100644 index f3335cba56..0000000000 --- a/docs/extensions/guides/protocol-handlers.md +++ /dev/null @@ -1,83 +0,0 @@ -# Lens Protocol Handlers - -Lens has a file association with the `lens://` protocol. -This means that Lens can be opened by external programs by providing a link that has `lens` as its protocol. -Lens provides a routing mechanism that extensions can use to register custom handlers. - -## Registering A Protocol Handler - -The field `protocolHandlers` exists both on [`LensMainExtension`](extensions/api/classes/lensmainextension/#protocolhandlers) and on [`LensRendererExtension`](extensions/api/classes/lensrendererextension/#protocolhandlers). -This field will be iterated through every time a `lens://` request gets sent to the application. -The `pathSchema` argument must comply with the [path-to-regexp](https://www.npmjs.com/package/path-to-regexp) package's `compileToRegex` function. - -Once you have registered a handler it will be called when a user opens a link on their computer. -Handlers will be run in both `main` and `renderer` in parallel with no synchronization between the two processes. -Furthermore, both `main` and `renderer` are routed separately. -In other words, which handler is selected in either process is independent from the list of possible handlers in the other. - -Example of registering a handler: - -```typescript -import { Main, Common } from "@k8slens/extensions"; - -function rootHandler(params: Common.Types.ProtocolRouteParams) { - console.log("routed to ExampleExtension", params); -} - -export default class ExampleExtensionMain extends Main.LensExtension { - protocolHandlers = [ - pathSchema: "/", - handler: rootHandler, - ] -} -``` - -For testing the routing of URIs the `open` (on macOS) or `xdg-open` (on most linux) CLI utilities can be used. -For the above handler, the following URI would be always routed to it: - -``` -open lens://extension/example-extension/ -``` - -## Deregistering A Protocol Handler - -All that is needed to deregister a handler is to remove it from the array of handlers. - -## Routing Algorithm - -The routing mechanism for extensions is quite straight forward. -For example consider an extension `example-extension` which is published by the `@mirantis` org. -If it were to register a handler with `"/display/:type"` as its corresponding link then we would match the following URI like this: - -![Lens Protocol Link Resolution](images/routing-diag.png) - -Once matched, the handler would be called with the following argument (note both `"search"` and `"pathname"` will always be defined): - -```json -{ - "search": { - "text": "Hello" - }, - "pathname": { - "type": "notification" - } -} -``` - -As the diagram above shows, the search (or query) params are not considered as part of the handler resolution. -If the URI had instead been `lens://extension/@mirantis/example-extension/display/notification/green` then a third (and optional) field will have the rest of the path. -The `tail` field would be filled with `"/green"`. -If multiple `pathSchema`'s match a given URI then the most specific handler will be called. - -For example consider the following `pathSchema`'s: - -1. `"/"` -1. `"/display"` -1. `"/display/:type"` -1. `"/show/:id"` - -The URI sub-path `"/display"` would be routed to #2 since it is an exact match. -On the other hand, the subpath `"/display/notification"` would be routed to #3. - -The URI is routed to the most specific matching `pathSchema`. -This way the `"/"` (root) `pathSchema` acts as a sort of catch all or default route if no other route matches. diff --git a/docs/extensions/guides/renderer-extension.md b/docs/extensions/guides/renderer-extension.md deleted file mode 100644 index 4cc6e338bf..0000000000 --- a/docs/extensions/guides/renderer-extension.md +++ /dev/null @@ -1,788 +0,0 @@ -# Renderer Extension (WIP) - -The Renderer Extension API is the interface to Lens's renderer process. -Lens runs in both the main and renderer processes. -The Renderer Extension API allows you to access, configure, and customize Lens data, add custom Lens UI elements, protocol handlers, and command palette commands, as well as run custom code in Lens's renderer process. - -The custom Lens UI elements that you can add include: - -- [Cluster pages](#clusterpages) -- [Cluster page menus](#clusterpagemenus) -- [Global pages](#globalpages) -- [Welcome menus](#welcomemenus) -- [App preferences](#apppreferences) -- [Top bar items](#topbaritems) -- [Status bar items](#statusbaritems) -- [KubeObject menu items](#kubeobjectmenuitems) -- [KubeObject detail items](#kubeobjectdetailitems) -- [KubeObject status texts](#kubeobjectstatustexts) -- [Kube workloads overview items](#kubeworkloadsoverviewitems) - -as well as catalog-related UI elements: - -- [Entity settings](#entitysettings) -- [Catalog entity detail items](#catalogentitydetailitems) - -All UI elements are based on React components. - -Finally, you can also add commands and protocol handlers: - -- [Command palette commands](#commandpalettecommands) -- [protocol handlers](protocol-handlers.md) - -## `Renderer.LensExtension` Class - -### `onActivate()` and `onDeactivate()` Methods - -To create a renderer extension, extend the `Renderer.LensExtension` class: - -```typescript -import { Renderer } from "@k8slens/extensions"; - -export default class ExampleExtensionMain extends Renderer.LensExtension { - onActivate() { - console.log("custom renderer process extension code started"); - } - - onDeactivate() { - console.log("custom renderer process extension de-activated"); - } -} -``` - -Two methods enable you to run custom code: `onActivate()` and `onDeactivate()`. -Enabling your extension calls `onActivate()` and disabling your extension calls `onDeactivate()`. -You can initiate custom code by implementing `onActivate()`. -Implementing `onDeactivate()` gives you the opportunity to clean up after your extension. - -!!! info -Disable extensions from the Lens Extensions page: - - 1. Navigate to **File** > **Extensions** in the top menu bar. - (On Mac, it is **Lens** > **Extensions**.) - 2. For the extension you want to disable, open the context menu (click on the three vertical dots) and choose **Disable**. - -The example above logs messages when the extension is enabled and disabled. - -### `clusterPages` - -Cluster pages appear in the cluster dashboard. -Use cluster pages to display information about or add functionality to the active cluster. -It is also possible to include custom details from other clusters. -Use your extension to access Kubernetes resources in the active cluster with [`ClusterStore.getInstance()`](../stores#Clusterstore). - -Add a cluster page definition to a `Renderer.LensExtension` subclass with the following example: - -```typescript -import { Renderer } from "@k8slens/extensions"; -import { ExampleIcon, ExamplePage } from "./page"; -import React from "react"; - -export default class ExampleExtension extends Renderer.LensExtension { - clusterPages = [ - { - id: "hello", - components: { - Page: () => , - }, - }, - ]; -} -``` - -`clusterPages` is an array of objects that satisfy the `PageRegistration` interface. -The properties of the `clusterPages` array objects are defined as follows: - -- `id` is a string that identifies the page. -- `components` matches the `PageComponents` interface for which there is one field, `Page`. -- `Page` is of type ` React.ComponentType`. - It offers flexibility in defining the appearance and behavior of your page. - -`ExamplePage` in the example above can be defined in `page.tsx`: - -```typescript -import { Renderer } from "@k8slens/extensions"; -import React from "react"; - -export class ExamplePage extends React.Component<{ - extension: LensRendererExtension; -}> { - render() { - return ( -
-

Hello world!

-
- ); - } -} -``` - -Note that the `ExamplePage` class defines the `extension` property. -This allows the `ExampleExtension` object to be passed in the cluster page definition in the React style. -This way, `ExamplePage` can access all `ExampleExtension` subclass data. - -The above example shows how to create a cluster page, but not how to make that page available to the Lens user. -Use `clusterPageMenus`, covered in the next section, to add cluster pages to the Lens UI. - -### `clusterPageMenus` - -`clusterPageMenus` allows you to add cluster page menu items to the secondary left nav, below Lens's standard cluster menus like **Workloads**, **Custom Resources**, etc. - -By expanding on the above example, you can add a cluster page menu item to the `ExampleExtension` definition: - -```typescript -import { Renderer } from "@k8slens/extensions"; -import { ExampleIcon, ExamplePage } from "./page"; -import React from "react"; - -export default class ExampleExtension extends Renderer.LensExtension { - clusterPages = [ - { - id: "hello", - components: { - Page: () => , - }, - }, - ]; - - clusterPageMenus = [ - { - target: { pageId: "hello" }, - title: "Hello World", - components: { - Icon: ExampleIcon, - }, - }, - ]; -} -``` - -`clusterPageMenus` is an array of objects that satisfy the `ClusterPageMenuRegistration` interface. -This element defines how the cluster page menu item will appear and what it will do when you click it. -The properties of the `clusterPageMenus` array objects are defined as follows: - -- `target` links to the relevant cluster page using `pageId`. -- `pageId` takes the value of the relevant cluster page's `id` property. -- `title` sets the name of the cluster page menu item that will appear in the left side menu. -- `components` is used to set an icon that appears to the left of the `title` text in the left side menu. - -The above example creates a menu item that reads **Hello World**. -When users click **Hello World**, the cluster dashboard will show the contents of `Example Page`. - -This example requires the definition of another React-based component, `ExampleIcon`, which has been added to `page.tsx`, as follows: - -```typescript -import { Renderer } from "@k8slens/extensions"; -import React from "react"; - -type IconProps = Renderer.Component.IconProps; - -const { - Component: { Icon }, -} = Renderer; - -export function ExampleIcon(props: IconProps) { - return ; -} - -export class ExamplePage extends React.Component<{ - extension: Renderer.LensExtension; -}> { - render() { - return ( -
-

Hello world!

-
- ); - } -} -``` - -Lens includes various built-in components available for extension developers to use. -One of these is the `Renderer.Component.Icon`, introduced in `ExampleIcon`, which you can use to access any of the [icons](https://material.io/resources/icons/) available at [Material Design](https://material.io). -The properties that `Renderer.Component.Icon` uses are defined as follows: - -- `material` takes the name of the icon you want to use. -- `tooltip` sets the text you want to appear when a user hovers over the icon. - -`clusterPageMenus` can also be used to define sub menu items, so that you can create groups of cluster pages. -The following example groups two sub menu items under one parent menu item: - -```typescript -import { Renderer } from "@k8slens/extensions"; -import { ExampleIcon, ExamplePage } from "./page"; -import React from "react"; - -export default class ExampleExtension extends Renderer.LensExtension { - clusterPages = [ - { - id: "hello", - components: { - Page: () => , - }, - }, - { - id: "bonjour", - components: { - Page: () => , - }, - }, - ]; - - clusterPageMenus = [ - { - id: "example", - title: "Greetings", - components: { - Icon: ExampleIcon, - }, - }, - { - parentId: "example", - target: { pageId: "hello" }, - title: "Hello World", - components: { - Icon: ExampleIcon, - }, - }, - { - parentId: "example", - target: { pageId: "bonjour" }, - title: "Bonjour le monde", - components: { - Icon: ExampleIcon, - }, - }, - ]; -} -``` - -The above defines two cluster pages and three cluster page menu objects. -The cluster page definitions are straightforward. -The three cluster page menu objects include one parent menu item and two sub menu items. -The first cluster page menu object defines the parent of a foldout submenu. -Setting the `id` field in a cluster page menu definition implies that it is defining a foldout submenu. -Also note that the `target` field is not specified (it is ignored if the `id` field is specified). -This cluster page menu object specifies the `title` and `components` fields, which are used in displaying the menu item in the cluster dashboard sidebar. -Initially the submenu is hidden. -Activating this menu item toggles on and off the appearance of the submenu below it. -The remaining two cluster page menu objects define the contents of the submenu. -A cluster page menu object is defined to be a submenu item by setting the `parentId` field to the id of the parent of a foldout submenu, `"example"` in this case. - -This is what the example could look like, including how the menu item will appear in the secondary left nav: - -![Cluster Page Menus](images/clusterpagemenus.png) - -### `globalPages` - -Global pages are independent of the cluster dashboard and can fill the entire Lens UI. -Their primary use is to display information and provide functionality across clusters (or catalog entities), including customized data and functionality unique to your extension. - -Unlike cluster pages, users can trigger global pages even when there is no active cluster (or catalog entity). - -The following example defines a `Renderer.LensExtension` subclass with a single global page definition: - -```typescript -import { Renderer } from "@k8slens/extensions"; -import { HelpPage } from "./page"; -import React from "react"; - -export default class HelpExtension extends Renderer.LensExtension { - globalPages = [ - { - id: "help", - components: { - Page: () => , - }, - }, - ]; -} -``` - -`globalPages` is an array of objects that satisfy the `PageRegistration` interface. -The properties of the `globalPages` array objects are defined as follows: - -- `id` is a string that identifies the page. -- `components` matches the `PageComponents` interface for which there is one field, `Page`. -- `Page` is of type `React.ComponentType`. - It offers flexibility in defining the appearance and behavior of your page. - -`HelpPage` in the example above can be defined in `page.tsx`: - -```typescript -import { Renderer } from "@k8slens/extensions"; -import React from "react"; - -export class HelpPage extends React.Component<{ - extension: LensRendererExtension; -}> { - render() { - return ( -
-

Help yourself

-
- ); - } -} -``` - -Note that the `HelpPage` class defines the `extension` property. -This allows the `HelpExtension` object to be passed in the global page definition in the React-style. -This way, `HelpPage` can access all `HelpExtension` subclass data. - -This example code shows how to create a global page, but not how to make that page available to the Lens user. -Global pages are typically made available in the following ways: - -- To add global pages to the top menu bar, see [`appMenus`](../main-extension#appmenus) in the Main Extension guide. -- To add global pages as an interactive element in the blue status bar along the bottom of the Lens UI, see [`statusBarItems`](#statusbaritems). -- To add global pages to the Welcome Page, see [`welcomeMenus`](#welcomemenus). - -### `welcomeMenus` - -### `appPreferences` - -The Lens **Preferences** page is a built-in global page. -You can use Lens extensions to add custom preferences to the Preferences page, providing a single location for users to configure global options. - -The following example demonstrates adding a custom preference: - -```typescript -import { Renderer } from "@k8slens/extensions"; -import { - ExamplePreferenceHint, - ExamplePreferenceInput, -} from "./src/example-preference"; -import { observable } from "mobx"; -import React from "react"; - -export default class ExampleRendererExtension extends Renderer.LensExtension { - @observable preference = { enabled: false }; - - appPreferences = [ - { - title: "Example Preferences", - components: { - Input: () => , - Hint: () => , - }, - }, - ]; -} -``` - -`appPreferences` is an array of objects that satisfies the `AppPreferenceRegistration` interface. -The properties of the `appPreferences` array objects are defined as follows: - -- `title` sets the heading text displayed on the Preferences page. -- `components` specifies two `React.Component` objects that define the interface for the preference. - - `Input` specifies an interactive input element for the preference. - - `Hint` provides descriptive information for the preference, shown below the `Input` element. - -!!! note -Note that the input and the hint can be comprised of more sophisticated elements, according to the needs of the extension. - -`ExamplePreferenceInput` expects its React props to be set to an `ExamplePreferenceProps` instance. -This is how `ExampleRendererExtension` handles the state of the preference input. -`ExampleRendererExtension` has a `preference` field, which you will add to `ExamplePreferenceInput`. - -In this example `ExamplePreferenceInput`, `ExamplePreferenceHint`, and `ExamplePreferenceProps` are defined in `./src/example-preference.tsx` as follows: - -```typescript -import { Renderer } from "@k8slens/extensions"; -import { makeObservable } from "mobx"; -import { observer } from "mobx-react"; -import React from "react"; - -const { - Component: { Checkbox }, -} = Renderer; - -export class ExamplePreferenceProps { - preference: { - enabled: boolean; - }; -} - -@observer -export class ExamplePreferenceInput extends React.Component { - public constructor() { - super({ preference: { enabled: false } }); - makeObservable(this); - } - - render() { - const { preference } = this.props; - return ( - { - preference.enabled = v; - }} - /> - ); - } -} - -export class ExamplePreferenceHint extends React.Component { - render() { - return This is an example of an appPreference for extensions.; - } -} -``` - -`ExamplePreferenceInput` implements a simple checkbox using Lens's `Renderer.Component.Checkbox` using the following properties: - -- `label` sets the text that displays next to the checkbox. -- `value` is initially set to `preference.enabled`. -- `onChange` is a function that responds when the state of the checkbox changes. - -`ExamplePreferenceInput` is defined with the `ExamplePreferenceProps` React props. -This is an object with the single `enabled` property. -It is used to indicate the state of the preference, and it is bound to the checkbox state in `onChange`. - -`ExamplePreferenceHint` is a simple text span. - -The above example introduces the decorators `makeObservable` and `observer` from the [`mobx`](https://mobx.js.org/README.html) and [`mobx-react`](https://github.com/mobxjs/mobx-react#mobx-react) packages. -`mobx` simplifies state management. -Without it, this example would not visually update the checkbox properly when the user activates it. -[Lens uses `mobx`](../working-with-mobx) extensively for state management of its own UI elements. -We recommend that extensions rely on it, as well. -Alternatively, you can use React's state management, though `mobx` is typically simpler to use. - -Note that you can manage an extension's state data using an `ExtensionStore` object, which conveniently handles persistence and synchronization. -To simplify this guide, the example above defines a `preference` field in the `ExampleRendererExtension` class definition to hold the extension's state. -However, we recommend that you manage your extension's state data using [`ExtensionStore`](../stores#extensionstore). - -### `topBarItems` - -### `statusBarItems` - -The status bar is the blue strip along the bottom of the Lens UI. -`statusBarItems` are `React.ReactNode` types. -They can be used to display status information, or act as links to global pages as well as external pages. - -The following example adds a `statusBarItems` definition and a `globalPages` definition to a `LensRendererExtension` subclass. -It configures the status bar item to navigate to the global page upon activation (normally a mouse click): - -```typescript -import { Renderer } from "@k8slens/extensions"; -import { HelpIcon, HelpPage } from "./page"; -import React from "react"; - -export default class HelpExtension extends Renderer.LensExtension { - globalPages = [ - { - id: "help", - components: { - Page: () => , - }, - }, - ]; - - statusBarItems = [ - { - components: { - Item: () => ( -
this.navigate("help")} - > - - My Status Bar Item -
- ), - }, - }, - ]; -} -``` - -The properties of the `statusBarItems` array objects are defined as follows: - -- `Item` specifies the `React.Component` that will be shown on the status bar. - By default, items are added starting from the right side of the status bar. - Due to limited space in the status bar, `Item` will typically specify only an icon or a short string of text. - The example above reuses the `HelpIcon` from the [`globalPageMenus` guide](#globalpagemenus). -- `onClick` determines what the `statusBarItem` does when it is clicked. - In the example, `onClick` is set to a function that calls the `LensRendererExtension` `navigate()` method. - `navigate` takes the `id` of the associated global page as a parameter. - Thus, clicking the status bar item activates the associated global pages. - -### `kubeObjectMenuItems` - -An extension can add custom menu items (`kubeObjectMenuItems`) for specific Kubernetes resource kinds and apiVersions. -`kubeObjectMenuItems` appear under the vertical ellipsis for each listed resource in the cluster dashboard: - -![List](images/kubeobjectmenuitem.png) - -They also appear on the title bar of the details page for specific resources: - -![Details](images/kubeobjectmenuitemdetail.png) - -The following example shows how to add a `kubeObjectMenuItems` for namespace resources with an associated action: - -```typescript -import React from "react"; -import { Renderer } from "@k8slens/extensions"; -import { NamespaceMenuItem } from "./src/namespace-menu-item"; - -type KubeObjectMenuProps = Renderer.Component.KubeObjectMenuProps; -type Namespace = Renderer.K8sApi.Namespace; - -export default class ExampleExtension extends Renderer.LensExtension { - kubeObjectMenuItems = [ - { - kind: "Namespace", - apiVersions: ["v1"], - components: { - MenuItem: (props: KubeObjectMenuProps) => ( - - ), - }, - }, - ]; -} -``` - -`kubeObjectMenuItems` is an array of objects matching the `KubeObjectMenuRegistration` interface. -The example above adds a menu item for namespaces in the cluster dashboard. -The properties of the `kubeObjectMenuItems` array objects are defined as follows: - -- `kind` specifies the Kubernetes resource type the menu item will apply to. -- `apiVersion` specifies the Kubernetes API version number to use with the resource type. -- `components` defines the menu item's appearance and behavior. -- `MenuItem` provides a function that returns a `React.Component` given a set of menu item properties. - In this example a `NamespaceMenuItem` object is returned. - -`NamespaceMenuItem` is defined in `./src/namespace-menu-item.tsx`: - -```typescript -import React from "react"; -import { Renderer } from "@k8slens/extensions"; - -const { - Component: { terminalStore, MenuItem, Icon }, - Navigation, -} = Renderer; - -type KubeObjectMenuProps = Renderer.Component.KubeObjectMenuProps; -type Namespace = Renderer.K8sApi.Namespace; - -export function NamespaceMenuItem(props: KubeObjectMenuProps) { - const { object: namespace, toolbar } = props; - if (!namespace) return null; - - const namespaceName = namespace.getName(); - - const sendToTerminal = (command: string) => { - terminalStore.sendCommand(command, { - enter: true, - newTab: true, - }); - Navigation.hideDetails(); - }; - - const getPods = () => { - sendToTerminal(`kubectl get pods -n ${namespaceName}`); - }; - - return ( - - - Get Pods - - ); -} -``` - -`NamespaceMenuItem` returns a `Renderer.Component.MenuItem` which defines the menu item's appearance and its behavior when activated via the `onClick` property. -In the example, `getPods()` opens a terminal tab and runs `kubectl` to get a list of pods running in the current namespace. - -The name of the namespace is retrieved from `props` passed into `NamespaceMenuItem()`. -`namespace` is the `props.object`, which is of type `Renderer.K8sApi.Namespace`. -`Renderer.K8sApi.Namespace` is the API for accessing namespaces. -The current namespace in this example is simply given by `namespace.getName()`. -Thus, `kubeObjectMenuItems` afford convenient access to the specific resource selected by the user. - -### `kubeObjectDetailItems` - -An extension can add custom details (`kubeObjectDetailItems`) for specified Kubernetes resource kinds and apiVersions. -These custom details appear on the details page for a specific resource, such as a Namespace as shown here: - -![Details](images/kubeobjectdetailitem.png) - -The following example shows how to use `kubeObjectDetailItems` to add a tabulated list of pods to the Namespace resource details page: - -```typescript -import React from "react"; -import { Renderer } from "@k8slens/extensions"; -import { NamespaceDetailsItem } from "./src/namespace-details-item"; - -type KubeObjectMenuProps = Renderer.Component.KubeObjectMenuProps; -type KubeObjectDetailsProps = Renderer.Component.KubeObjectDetailsProps; -type Namespace = Renderer.K8sApi.Namespace; - -export default class ExampleExtension extends Renderer.LensExtension { - kubeObjectDetailItems = [ - { - kind: "Namespace", - apiVersions: ["v1"], - priority: 10, - components: { - Details: (props: KubeObjectDetailsProps) => ( - - ), - }, - }, - ]; -} -``` - -`kubeObjectDetailItems` is an array of objects matching the `KubeObjectDetailRegistration` interface. -This example above adds a detail item for namespaces in the cluster dashboard. -The properties of the `kubeObjectDetailItems` array objects are defined as follows: - -- `kind` specifies the Kubernetes resource type the detail item will apply to. -- `apiVersion` specifies the Kubernetes API version number to use with the resource type. -- `components` defines the detail item's appearance and behavior. -- `Details` provides a function that returns a `React.Component` given a set of detail item properties. - In this example a `NamespaceDetailsItem` object is returned. - -`NamespaceDetailsItem` is defined in `./src/namespace-details-item.tsx`: - -```typescript -import { Renderer } from "@k8slens/extensions"; -import { PodsDetailsList } from "./pods-details-list"; -import React from "react"; -import { observable } from "mobx"; -import { observer } from "mobx-react"; - -const { - K8sApi: { podsApi }, - Component: { DrawerTitle }, -} = Renderer; - -type KubeObjectMenuProps = Renderer.Component.KubeObjectMenuProps; -type Namespace = Renderer.K8sApi.Namespace; -type Pod = Renderer.K8sApi.Pod; - -@observer -export class NamespaceDetailsItem extends React.Component< - KubeObjectDetailsProps -> { - @observable private pods: Pod[]; - - async componentDidMount() { - const namespace = this.props.object.getName(); - - this.pods = await podsApi.list({ namespace }); - } - - render() { - return ( -
- Pods - -
- ); - } -} -``` - -Since `NamespaceDetailsItem` extends `React.Component>`, it can access the current namespace object (type `Namespace`) through `this.props.object`. -You can query this object for many details about the current namespace. -In the example above, `componentDidMount()` gets the namespace's name using the `Namespace` `getName()` method. -Use the namespace's name to limit the list of pods only to those in the relevant namespace. -To get this list of pods, this example uses the Kubernetes pods API `podsApi.list()` method. -The `podsApi` is automatically configured for the active cluster. - -Note that `podsApi.list()` is an asynchronous method. -Getting the pods list should occur prior to rendering the `NamespaceDetailsItem`. -It is a common technique in React development to await async calls in `componentDidMount()`. -However, `componentDidMount()` is called right after the first call to `render()`. -In order to effect a subsequent `render()` call, React must be made aware of a state change. -Like in the [`appPreferences` guide](#apppreferences), [`mobx`](https://mobx.js.org/README.html) and [`mobx-react`](https://github.com/mobxjs/mobx-react#mobx-react) are used to ensure `NamespaceDetailsItem` renders when the pods list updates. -This is done simply by marking the `pods` field as an `observable` and the `NamespaceDetailsItem` class itself as an `observer`. - -Finally, the `NamespaceDetailsItem` renders using the `render()` method. -Details are placed in drawers, and using `Renderer.Component.DrawerTitle` provides a separator from details above this one. -Multiple details in a drawer can be placed in `` elements for further separation, if desired. -The rest of this example's details are defined in `PodsDetailsList`, found in `./pods-details-list.tsx`: - -```typescript -import React from "react"; -import { Renderer } from "@k8slens/extensions"; - -const { - Component: { TableHead, TableRow, TableCell, Table }, -} = Renderer; - -type Pod = Renderer.K8sApi.Pod; - -interface PodsDetailsListProps { - pods?: Pod[]; -} - -export class PodsDetailsList extends React.Component { - getTableRow = (pod: Pod) => { - return ( - - {pods[index].getName()} - {pods[index].getAge()} - {pods[index].getStatus()} - - ); - }; - - render() { - const { pods } = this.props; - - if (!pods?.length) { - return null; - } - - return ( -
- - - Name - Age - Status - - {pods.map(this.getTableRow)} -
-
- ); - } -} -``` - -`PodsDetailsList` produces a simple table showing a list of the pods found in this namespace: - -![DetailsWithPods](images/kubeobjectdetailitemwithpods.png) - -Obtain the name, age, and status for each pod using the `Renderer.K8sApi.Pod` methods. -Construct the table using the `Renderer.Component.Table` and related elements. - -For each pod the name, age, and status are obtained using the `Renderer.K8sApi.Pod` methods. -The table is constructed using the `Renderer.Component.Table` and related elements. -See [Component documentation](https://api-docs.k8slens.dev/latest/extensions/api/modules/Renderer.Component/) for further details. - -### `kubeObjectStatusTexts` - -### `kubeWorkloadsOverviewItems` - -### `entitySettings` - -### `catalogEntityDetailItems` - -### `commandPaletteCommands` - -### `protocolHandlers` - -See the [Protocol Handlers Guide](protocol-handlers.md) diff --git a/docs/extensions/guides/resource-stack.md b/docs/extensions/guides/resource-stack.md deleted file mode 100644 index 3c3111d5a4..0000000000 --- a/docs/extensions/guides/resource-stack.md +++ /dev/null @@ -1,236 +0,0 @@ -# Resource Stack (Cluster Feature) - -A cluster feature is a set of Kubernetes resources that can be applied to and managed within the active cluster. -The `Renderer.K8sApi.ResourceStack` class provides the functionality to input and apply kubernetes resources to a cluster. -It is up to the extension developer to manage the life cycle of the resource stack. -It could be applied automatically to a cluster by the extension, or the end-user could be required to install it. - -The code examples in this section show how to create a resource stack, and define a cluster feature that is configurable from the cluster **Settings** page. - -!!! info - To access the cluster **Settings** page, right-click the relevant cluster in the left side menu and click **Settings**. - -The resource stack in this example consists of a single kubernetes resource: - -```yaml -apiVersion: v1 -kind: Pod -metadata: - name: example-pod -spec: - containers: - - name: example-pod - image: nginx -``` - -It is simply a pod named `example-pod`, running nginx. Assume this content is in the file `../resources/example-pod.yml`. - -The following code sample shows how to use the `Renderer.K8sApi.ResourceStack` to manage installing and uninstalling this resource stack: - -```typescript -import { Renderer, Common } from "@k8slens/extensions"; -import * as path from "path"; - -const { - K8sApi: { - ResourceStack, - forCluster, - Pod, - } -} = Renderer; - -type ResourceStack = Renderer.K8sApi.ResourceStack; -type Pod = Renderer.K8sApi.Pod; -type KubernetesCluster = Common.Catalog.KubernetesCluster; - -export class ExampleClusterFeature { - protected stack: ResourceStack; - - constructor(protected cluster: KubernetesCluster) { - this.stack = new ResourceStack(cluster, "example-resource-stack"); - } - - get resourceFolder() { - return path.join(__dirname, "../resources/"); - } - - install(): Promise { - console.log("installing example-pod"); - return this.stack.kubectlApplyFolder(this.resourceFolder); - } - - async isInstalled(): Promise { - try { - const podApi = forCluster(this.cluster, Pod); - const examplePod = await podApi.get({name: "example-pod", namespace: "default"}); - - if (examplePod?.kind) { - console.log("found example-pod"); - return true; - } - } catch(e) { - console.log("Error getting example-pod:", e); - } - console.log("didn't find example-pod"); - - return false; - } - - async uninstall(): Promise { - console.log("uninstalling example-pod"); - return this.stack.kubectlDeleteFolder(this.resourceFolder); - } -} -``` - -The `ExampleClusterFeature` class constructor takes a `Common.Catalog.KubernetesCluster` argument. -This is the cluster that the resource stack will be applied to, and the constructor instantiates a `Renderer.K8sApi.ResourceStack` as such. -`ExampleClusterFeature` implements an `install()` method which simply invokes the `kubectlApplyFolder()` method of the `Renderer.K8sApi.ResourceStack` class. -`kubectlApplyFolder()` applies to the cluster all kubernetes resources found in the folder passed to it, in this case `../resources`. -Similarly, `ExampleClusterFeature` implements an `uninstall()` method which simply invokes the `kubectlDeleteFolder()` method of the `Renderer.K8sApi.ResourceStack` class. -`kubectlDeleteFolder()` tries to delete from the cluster all kubernetes resources found in the folder passed to it, again in this case `../resources`. - -`ExampleClusterFeature` also implements an `isInstalled()` method, which demonstrates how you can utilize the kubernetes api to inspect the resource stack status. -`isInstalled()` simply tries to find a pod named `example-pod`, as a way to determine if the pod is already installed. -This method can be useful in creating a context-sensitive UI for installing/uninstalling the feature, as demonstrated in the next sample code. - -To allow the end-user to control the life cycle of this cluster feature the following code sample shows how to implement a user interface based on React and custom Lens UI components: - -```typescript - import React from "react"; - import { Common, Renderer } from "@k8slens/extensions"; - import { observer } from "mobx-react"; - import { computed, observable, makeObservable } from "mobx"; - import { ExampleClusterFeature } from "./example-cluster-feature"; - - const { - Component: { - SubTitle, Button, - } - } = Renderer; - - interface ExampleClusterFeatureSettingsProps { - cluster: Common.Catalog.KubernetesCluster; - } - - @observer - export class ExampleClusterFeatureSettings extends React.Component { - constructor(props: ExampleClusterFeatureSettingsProps) { - super(props); - makeObservable(this); - } - - @observable installed = false; - @observable inProgress = false; - - feature: ExampleClusterFeature; - - async componentDidMount() { - this.feature = new ExampleClusterFeature(this.props.cluster); - - await this.updateFeatureState(); - } - - async updateFeatureState() { - this.installed = await this.feature.isInstalled(); - } - - async save() { - this.inProgress = true; - - try { - if (this.installed) { - await this.feature.uninstall(); - } else { - await this.feature.install(); - } - } finally { - this.inProgress = false; - - await this.updateFeatureState(); - } - } - - @computed get buttonLabel() { - if (this.inProgress && this.installed) return "Uninstalling ..."; - if (this.inProgress) return "Applying ..."; - - if (this.installed) { - return "Uninstall"; - } - - return "Apply"; - } - - render() { - return ( - <> -
- -
- - ); - } -} -``` - -The `ExampleClusterFeatureSettings` class extends `React.Component` and simply renders a subtitle and a button. -`ExampleClusterFeatureSettings` takes the cluster as a prop and when the React component has mounted the `ExampleClusterFeature` is instantiated using this cluster (in `componentDidMount()`). -The rest of the logic concerns the button appearance and action, based on the `ExampleClusterFeatureSettings` fields `installed` and `inProgress`. -The `installed` value is of course determined using the aforementioned `ExampleClusterFeature` method `isInstalled()`. -The `inProgress` value is true while waiting for the feature to be installed (or uninstalled). - -Note that the button is a `Renderer.Component.Button` element and this example takes advantage of its `waiting` prop to show a "waiting" animation while the install (or uninstall) is in progress. -Using elements from `Renderer.Component` is encouraged, to take advantage of their built-in properties, and to ensure a common look and feel. - -Also note that [MobX 6](https://mobx.js.org/README.html) is used for state management, ensuring that the UI is rerendered when state has changed. -The `ExampleClusterFeatureSettings` class is marked as an `@observer`, and its constructor must call `makeObservable()`. -As well, the `installed` and `inProgress` fields are marked as `@observable`, ensuring that the button gets rerendered any time these fields change. - -Finally, `ExampleClusterFeatureSettings` needs to be connected to the extension, and would typically appear on the cluster **Settings** page via a `Renderer.LensExtension.entitySettings` entry. -The `ExampleExtension` would look like this: - -```typescript -import { Common, Renderer } from "@k8slens/extensions"; -import { ExampleClusterFeatureSettings } from "./src/example-cluster-feature-settings" -import React from "react" - -export default class ExampleExtension extends Renderer.LensExtension { - entitySettings = [ - { - apiVersions: ["entity.k8slens.dev/v1alpha1"], - kind: "KubernetesCluster", - title: "Example Cluster Feature", - priority: 5, - components: { - View: ({ entity = null }: { entity: Common.Catalog.KubernetesCluster}) => ( - - ) - } - } - ]; - -} -``` - -An entity setting is added to the `entitySettings` array field of the `Renderer.LensExtension` class. -Because Lens's catalog can contain different kinds of entities, the kind must be identified. -For more details about the catalog see the [Catalog Guide](catalog.md). -Clusters are a built-in kind, so the `apiVersions` and `kind` fields should be set as above. -The `title` is shown as a navigation item on the cluster **Settings** page and the `components.View` is displayed when the navigation item is clicked on. -The `components.View` definition above shows how the `ExampleClusterFeatureSettings` element is included, and how its `cluster` prop is set. -`priority` determines the order of the entity settings, the higher the number the higher in the navigation panel the setting is placed. The default value is 50. - -The final result looks like this: - -![Cluster Feature Settings](images/clusterfeature.png) - -`ExampleClusterFeature` and `ExampleClusterFeatureSettings` demonstrate a cluster feature for a simple resource stack. -In practice a resource stack can include many resources, and require more sophisticated life cycle management (upgrades, partial installations, etc.) -Using `Renderer.K8sApi.ResourceStack` and `entitySettings` it is possible to implement solutions for more complex cluster features. -The **Lens Metrics** setting (on the cluster **Settings** page) is a good example of an advanced solution. diff --git a/docs/extensions/guides/stores.md b/docs/extensions/guides/stores.md deleted file mode 100644 index 8b31548a32..0000000000 --- a/docs/extensions/guides/stores.md +++ /dev/null @@ -1,169 +0,0 @@ -# Stores - -Stores are components that persist and synchronize state data. Lens uses a number of stores to maintain various kinds of state information, including: - -* The `ClusterStore` manages cluster state data (such as cluster details), and it tracks which cluster is active. -* The `WorkspaceStore` manages workspace state data (such as the workspace name), and and it tracks which clusters belong to a given workspace. -* The `ExtensionStore` manages custom extension state data. - -This guide focuses on the `ExtensionStore`. - -## ExtensionStore - -Extension developers can create their own store for managing state data by extending the `ExtensionStore` class. -This guide shows how to create a store for the [`appPreferences`](../renderer-extension#apppreferences) guide example, which demonstrates how to add a custom preference to the **Preferences** page. -The preference is a simple boolean that indicates whether or not something is enabled. -However, in the example, the enabled state is not stored anywhere, and it reverts to the default when Lens is restarted. - -`Store.ExtensionStore`'s child class will need to be created before being used. -It is recommended to call the inherited static method `getInstanceOrCreate()` only in one place, generally within you extension's `onActivate()` method. -It is also recommenced to delete the instance, using the inherited static method `resetInstance()`, in your extension's `onDeactivate()` method. -Everywhere else in your code you should use the `getInstance()` static method. -This is so that your data is kept up to date and not persisted longer than expected. - -The following example code creates a store for the `appPreferences` guide example: - -``` typescript -import { Common } from "@k8slens/extensions"; -import { observable, makeObservable } from "mobx"; - -export type ExamplePreferencesModel = { - enabled: boolean; -}; - -export class ExamplePreferencesStore extends Common.Store.ExtensionStore { - - @observable enabled = false; - - private constructor() { - super({ - configName: "example-preferences-store", - defaults: { - enabled: false - } - }); - makeObservable(this); - } - - protected fromStore({ enabled }: ExamplePreferencesModel): void { - this.enabled = enabled; - } - - toJSON(): ExamplePreferencesModel { - return { - enabled: this.enabled - }; - } -} -``` - -First, our example defines the extension's data model using the simple `ExamplePreferencesModel` type. -This has a single field, `enabled`, which represents the preference's state. -`ExamplePreferencesStore` extends `Store.ExtensionStore`, which is based on the `ExamplePreferencesModel`. -The `enabled` field is added to the `ExamplePreferencesStore` class to hold the "live" or current state of the preference. -Note the use of the `observable` decorator on the `enabled` field. -The [`appPreferences`](../renderer-extension#apppreferences) guide example uses [MobX](https://mobx.js.org/README.html) for the UI state management, ensuring the checkbox updates when it's activated by the user. - -Next, our example implements the constructor and two abstract methods. -The constructor specifies the name of the store (`"example-preferences-store"`) and the default (initial) value for the preference state (`enabled: false`). -Lens internals call the `fromStore()` method when the store loads. -It gives the extension the opportunity to retrieve the stored state data values based on the defined data model. -The `enabled` field of the `ExamplePreferencesStore` is set to the value from the store whenever `fromStore()` is invoked. -The `toJSON()` method is complementary to `fromStore()`. -It is called when the store is being saved. -`toJSON()` must provide a JSON serializable object, facilitating its storage in JSON format. - -Finally, `ExamplePreferencesStore` is created by calling `ExamplePreferencesStore.getInstanceOrCreate()`, and exported for use by other parts of the extension. -Note that `ExamplePreferencesStore` is a singleton. -Calling this function will create an instance if one has not been made before. -Through normal use you should call `ExamplePreferencesStore.getInstance()` as that will throw an error if an instance does not exist. -This provides some logical safety in that it limits where a new instance can be created. -Thus it prevents an instance from being created when the constructor args are not present at the call site. - -If you are doing some cleanup it is recommended to call `ExamplePreferencesStore.getInstance(false)` which returns `undefined` instead of throwing when there is no instance. - -The following example code, modified from the [`appPreferences`](../renderer-extension#apppreferences) guide demonstrates how to use the extension store. -`ExamplePreferencesStore` must be loaded in the main process, where loaded stores are automatically saved when exiting Lens. -This can be done in `./main.ts`: - -``` typescript -import { Main } from "@k8slens/extensions"; -import { ExamplePreferencesStore } from "./src/example-preference-store"; - -export default class ExampleMainExtension extends Main.LensExtension { - async onActivate() { - await ExamplePreferencesStore.getInstanceOrCreate().loadExtension(this); - } -} -``` - -Here, `ExamplePreferencesStore` loads with `ExamplePreferencesStore.getInstanceOrCreate().loadExtension(this)`, which is conveniently called from the `onActivate()` method of `ExampleMainExtension`. -Similarly, `ExamplePreferencesStore` must load in the renderer process where the `appPreferences` are handled. -This can be done in `./renderer.ts`: - -``` typescript -import { Renderer } from "@k8slens/extensions"; -import { ExamplePreferenceHint, ExamplePreferenceInput } from "./src/example-preference"; -import { ExamplePreferencesStore } from "./src/example-preference-store"; -import React from "react"; - -export default class ExampleRendererExtension extends Renderer.LensExtension { - - async onActivate() { - await ExamplePreferencesStore.getInstanceOrCreate().loadExtension(this); - } - - appPreferences = [ - { - title: "Example Preferences", - components: { - Input: () => , - Hint: () => - } - } - ]; -} -``` - -Again, `ExamplePreferencesStore.getInstanceOrCreate().loadExtension(this)` is called to load `ExamplePreferencesStore`, this time from the `onActivate()` method of `ExampleRendererExtension`. - -`ExamplePreferenceInput` is defined in `./src/example-preference.tsx`: - -``` typescript -import { Renderer } from "@k8slens/extensions"; -import { observer } from "mobx-react"; -import React from "react"; -import { ExamplePreferencesStore } from "./example-preference-store"; - -const { - Component: { - Checkbox, - }, -} = Renderer; - -@observer -export class ExamplePreferenceInput extends React.Component { - - render() { - return ( - { ExamplePreferencesStore.getInstance().enabled = v; }} - /> - ); - } -} - -export class ExamplePreferenceHint extends React.Component { - render() { - return ( - This is an example of an appPreference for extensions. - ); - } -} -``` - -The only change here is that `ExamplePreferenceProps` defines its `preference` field as an `ExamplePreferencesStore` type. -Everything else works as before, except that now the `enabled` state persists across Lens restarts because it is managed by the -`ExamplePreferencesStore`. diff --git a/docs/extensions/guides/working-with-mobx.md b/docs/extensions/guides/working-with-mobx.md deleted file mode 100644 index 41ddc487a6..0000000000 --- a/docs/extensions/guides/working-with-mobx.md +++ /dev/null @@ -1,26 +0,0 @@ -# Working with MobX - -## Introduction - -Lens uses MobX on top of React's state management system. -The result is a more declarative state management style, rather than React's native `setState` mechanism. - -You can review how React handles state management [here](https://reactjs.org/docs/faq-state.html). - -The following is a quick overview: - -* `React.Component` is generic with respect to both `props` and `state` (which default to the empty object type). -* `props` should be considered read-only from the point of view of the component, and it is the mechanism for passing in arguments to a component. -* `state` is a component's internal state, and can be read by accessing the super-class field `state`. -* `state` **must** be updated using the `setState` parent method which merges the new data with the old state. -* React does some optimizations around re-rendering components after quick successions of `setState` calls. - -## How MobX Works: - -MobX is a package that provides an abstraction over React's state management system. The three main concepts are: - -* `observable` is a marker for data stored in the component's `state`. -* `action` is a function that modifies any `observable` data. -* `computed` is a marker for data that is derived from `observable` data, but that is not actually stored. Think of this as computing `isEmpty` rather than an observable field called `count`. - -Further reading is available on the [MobX website](https://mobx.js.org/the-gist-of-mobx.html). diff --git a/docs/extensions/testing-and-publishing/bundling.md b/docs/extensions/testing-and-publishing/bundling.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/extensions/testing-and-publishing/publishing.md b/docs/extensions/testing-and-publishing/publishing.md deleted file mode 100644 index 9ea33c4e19..0000000000 --- a/docs/extensions/testing-and-publishing/publishing.md +++ /dev/null @@ -1,46 +0,0 @@ -# Publishing Extensions - -To be able to easily share extensions with users they need to be published somewhere. -Lens currently only supports installing extensions from NPM tarballs. -All hosted extensions must, therefore, be retrievable in a NPM tarball. - -## Places To Host Your Extension - -We recommend to host your extension somewhere on the web so that it is easy for people to search for and download it. -We recommend either hosting it as an NPM package on https://www.npmjs.com or through GitHub releases. -We recommend against using GitHub packages (https://github.com/features/packages) as it requires a GitHub token to access the package. - -### Publishing via NPM - -This is the easiest method of publishing as NPM comes built in with mechanism to get a link to download the package as a tarball. -Once you have set up an account with NPM (https://www.npmjs.com/signup) and logged in with their CLI (`npm login`) you will be ready to publish. - -* Run `npm version ` to bump the version of your extension by the appropriate amount. -* Run `npm publish` to publish your extension to NPM -* Run `git push && git push --tags` to push the commit that NPM creates to your git remote. - -It is probably a good idea to put into your README.md the following instructions for your users to get the tarball download link. - -```bash -npm view dist.tarball -``` - -This will output the link that they will need to give to Lens to install your extension. - -### Publish via GitHub Releases - -Another method of publishing your extensions is to do so with the releases mechanism built into GitHub. -We recommend reading [GitHub's Releases Documentation](https://docs.github.com/en/free-pro-team@latest/github/administering-a-repository/managing-releases-in-a-repository) for how to actually do the steps of a release. -The following will be a quick walk through on how to make the tarball which will be the released file. - -### Making a NPM Tarball of Your Extension - -While this is necessary for hosting on GitHub releases, this is also the means for creating a tarball if you plan on hosting on a different file hosting platform. - -Say you have your project folder at `~/my-extension/` and you want to create an NPM package we need to do the following within your git repo: - -``` -npm pack -``` - -This will create a NPM tarball that can be hosted on GitHub Releases or any other publicly available file hosting service. diff --git a/docs/extensions/testing-and-publishing/testing.md b/docs/extensions/testing-and-publishing/testing.md deleted file mode 100644 index cd51cbe3b0..0000000000 --- a/docs/extensions/testing-and-publishing/testing.md +++ /dev/null @@ -1,101 +0,0 @@ -# Testing Extensions - -## Renderer Process Unit Testing - -UI components in the extension's renderer process are based on React/ReactDOM. -These components can be tested by popular React testing tools like [React Testing Library](https://github.com/testing-library/react-testing-library). - -If you are using the [Yeoman Lens Extension Generator](https://github.com/lensapp/generator-lens-ext) to scaffold extension project then the testing environment for render process is already set up for you. -Just use `npm start` or `yarn test` to run the tests. - -For example, I have a component `GlobalPageMenuIcon` and want to test if `props.navigate` is called when user clicks the icon. - -My component `GlobalPageMenuIcon` - -```typescript -import React from "react" -import { Renderer } from "@k8slens/extensions"; - -const { - Component: { - Icon, - }, -} = Renderer; - -const GlobalPageMenuIcon = ({ navigate }: { navigate?: () => void }): JSX.Element => ( - navigate()} - data-testid="global-page-menu-icon" - /> -) -``` - -The test - -```js -import React from "react" -import { render, screen, fireEvent } from "@testing-library/react"; - -import GlobalPageMenuIcon from "./GlobalPageMenuIcon"; - -test("click called navigate()", () => { - const navigate = jest.fn(); - render(); - fireEvent.click(screen.getByTestId("global-page-menu-icon")); - expect(navigate).toHaveBeenCalled(); - }); -``` - -In the example we used [React Testing Library](https://github.com/testing-library/react-testing-library) but any React testing framework can be used to test renderer process UI components. - -There are more example tests in the generator's [template](https://github.com/lensapp/generator-lens-ext/tree/main/generators/app/templates/ext-ts/components). -Extend your tests based on the examples. - -## Main Process Unit Testing - -Code in the extension's main process consists of normal JavaScript files that have access to extension api, you can write unit tests using any testing framework. - -If you are using the [Yeoman Lens Extension Generator](https://github.com/lensapp/generator-lens-ext) to scaffold your extension project then the [Jest](https://jestjs.io/) testing environment is set up for you. -Just use `npm start` or `yarn test` to run the tests. - -## Tips - -### Console.log - -Extension developers might find `console.log()` useful for printing out information and errors from extensions. -To use `console.log()`, note that Lens is based on Electron, and that Electron has two types of processes: [Main and Renderer](https://www.electronjs.org/docs/tutorial/quick-start#main-and-renderer-processes). - -### Renderer Process Logs - -In the Renderer process, `console.log()` is printed in the Console in Developer Tools (**View** > **Toggle Developer Tools**). - -### Main Process Logs - -Viewing the logs from the Main process is a little trickier, since they cannot be printed using Developer Tools. - -#### macOS - -On macOS, view the Main process logs by running Lens from the terminal: - -```bash -/Applications/Lens.app/Contents/MacOS/Lens -``` - -You can also use [Console.app](https://support.apple.com/en-gb/guide/console/welcome/mac) to view the Main process logs. - -#### Linux - -On Linux, you can access the Main process logs using the Lens PID. -First get the PID: - -```bash -ps aux | grep Lens | grep -v grep -``` - -Then get the Main process logs using the PID: - -```bash -tail -f /proc/[pid]/fd/1 # stdout (console.log) -tail -f /proc/[pid]/fd/2 # stdout (console.error) -``` diff --git a/docs/extensions/typedoc-readme.md.tpl b/docs/extensions/typedoc-readme.md.tpl deleted file mode 100644 index 0f83a467a1..0000000000 --- a/docs/extensions/typedoc-readme.md.tpl +++ /dev/null @@ -1,7 +0,0 @@ -# Extension API Reference - -## APIs - -- [Common](modules/Common.md) -- [Main](modules/Main.md) -- [Renderer](modules/Renderer.md) diff --git a/docs/extensions/usage/README.md b/docs/extensions/usage/README.md deleted file mode 100644 index 02b2db223a..0000000000 --- a/docs/extensions/usage/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# Using Extensions - -The features that Lens includes out-of-the-box are just the start. -Lens extensions let you add new features to your installation to support your workflow. -Rich extensibility model lets extension authors plug directly into the Lens UI and contribute functionality through the same APIs used by Lens itself. -The start using Lens Extensions go to **File** (or **Lens** on macOS) > **Extensions** in the application menu. -This is the `Extensions` management page where all the management of the extensions you want to use is done. - -![Extensions](images/extensions.png) - -## Installing an Extension - -There are three ways to install extensions. -If you have the extension as a `.tgz` file then dragging and dropping it in the extension management page will install it for you. -If it is hosted on the web, you can paste the URL and click `Install` and Lens will download and install it. -The third way is to move the extension into your `~/.k8slens/extensions` (or `C:\Users\\.k8slens\extensions`) folder and Lens will automatically detect it and install the extension. - -## Enabling or Disabling an Extension - -Go to the extension management page and click either the `Enable` or `Disable` buttons. -Extensions will be enabled by default when you first install them. -A disabled extension is not loaded by Lens and is not run. - -## Uninstalling an Extension - -If, for whatever reason, you wish to remove the installation of an extension simple click the `Uninstall` button. This will remove all the files that Lens would need to run the extension. diff --git a/docs/extensions/usage/images/extensions.png b/docs/extensions/usage/images/extensions.png deleted file mode 100644 index 5deb8e4bd2..0000000000 Binary files a/docs/extensions/usage/images/extensions.png and /dev/null differ diff --git a/docs/img/favicon.ico b/docs/img/favicon.ico deleted file mode 100644 index 19b2de71d1..0000000000 Binary files a/docs/img/favicon.ico and /dev/null differ diff --git a/docs/img/lens-intro-video-screenshot.png b/docs/img/lens-intro-video-screenshot.png deleted file mode 100644 index 2c5467b3f0..0000000000 Binary files a/docs/img/lens-intro-video-screenshot.png and /dev/null differ diff --git a/docs/img/lens-logo-icon.svg b/docs/img/lens-logo-icon.svg deleted file mode 100644 index ede39244e5..0000000000 --- a/docs/img/lens-logo-icon.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/docs/img/play.svg b/docs/img/play.svg deleted file mode 100644 index a94d6e88ab..0000000000 --- a/docs/img/play.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css deleted file mode 100644 index 3f7e4560d7..0000000000 --- a/docs/stylesheets/extra.css +++ /dev/null @@ -1,115 +0,0 @@ -:root { - --md-primary-fg-color: #3d90ce; - --md-accent-fg-color: #3d90ce; -} - -:root > * { - /* Footer */ - --md-footer-bg-color: #e8e8e8; - --md-footer-bg-color--dark: #cccdcf; - --md-footer-fg-color: #3d90ce; - --md-footer-fg-color--light: #fff; - - /* Background */ - --md-default-bg-color: #f1f1f1; -} - -[data-md-color-scheme="slate"] { - /* Footer */ - --md-footer-bg-color: #2e3136; - --md-footer-bg-color--dark: #262b2f; - --md-footer-fg-color: #3d90ce; - --md-footer-fg-color--light: #fff; - - /* Background */ - --md-default-bg-color: #1e2124; -} - -.md-version__list { - overflow: auto; -} - -.md-header-nav__title { - margin-left: 0; -} - -.md-header__title { - margin-left: 0; -} - -ul.video-list { - counter-reset: section; - list-style: none; - padding-left: 0; - position:relative -} - -ul.video-list .video:not(:last-of-type) a { - border-bottom:2px solid #e6e6e6 -} - -ul.video-list a { - position: relative; - padding: 2rem 2rem 2rem 4.2rem; - display: block; - box-sizing:border-box -} - -ul.video-list a .info { - padding-top:0.25rem -} - -ul.video-list a .info::before { - counter-increment: section; - content: counter(section); - position: absolute; - left: 1.5rem; - color:black -} - -ul.video-list a .info > p, ul.video-list a .info > span { - color:black -} - -ul.video-list a .info .title { - margin-top: 0; - margin-bottom:0.7rem -} - -ul.video-list a .info .description { - margin-bottom: 1rem; - -} - -ul.video-list a .info .duration, ul.video-list a .info .duration span { - color: #6e6e6e; - -} - -ul.video-list a:hover, ul.video-list a:focus { - text-decoration:none -} - -ul.video-list a:hover { - background:#f2f2f2 -} - -ul.video-list a:hover::after { - content: ''; - display: block; - width: 6rem; - height: 6rem; - position: absolute; - background: url("/img/play.svg"); - background-size: 6rem; - top: 3rem; - left:8.6rem -} - -ul.video-list .thumb { - max-height: 8.2rem; - padding-right: 2rem; - position: relative; - float:left -} - diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index d5496e2efc..0000000000 --- a/jest.config.js +++ /dev/null @@ -1,4 +0,0 @@ -const { monorepoRootConfig } = require("@k8slens/jest"); - -module.exports = monorepoRootConfig(__dirname); - diff --git a/jsonnet/lens/custom-prometheus.jsonnet b/jsonnet/lens/custom-prometheus.jsonnet deleted file mode 100644 index 10384fdaa5..0000000000 --- a/jsonnet/lens/custom-prometheus.jsonnet +++ /dev/null @@ -1,48 +0,0 @@ -{ - // Add Lens metric relabelings for custom prometheus instances installed with kube-prometheus - // https://github.com/lensapp/lens/blob/master/troubleshooting/custom-prometheus.md - nodeExporter+:: { - serviceMonitor+: { - spec+: { - endpoints: std.map(function(endpoint) - if endpoint.port == "https" then - endpoint { - relabelings+: [ - { - action: 'replace', - regex: '(.*)', - replacement: '$1', - sourceLabels: ['__meta_kubernetes_pod_node_name'], - targetLabel: 'kubernetes_node', - } - ], - } - else - endpoint, - super.endpoints - ), - }, - }, - }, - kubernetesControlPlane+:: { - serviceMonitorKubelet+: { - spec+: { - endpoints: std.map(function(endpoint) - if endpoint.port == "https-metrics" then - endpoint { - metricRelabelings+: [ - { - action: 'replace', - sourceLabels: ['node'], - targetLabel: 'instance', - }, - ], - } - else - endpoint, - super.endpoints - ), - }, - }, - }, -} diff --git a/lerna.json b/lerna.json deleted file mode 100644 index 763305ca69..0000000000 --- a/lerna.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "useWorkspaces": true, - "version": "independent", - "npmClient": "npm", - "npmClientArgs": [ - "--network-timeout=100000" - ] -} diff --git a/license-header b/license-header deleted file mode 100644 index 6d09e493b8..0000000000 --- a/license-header +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index 401bd7b12f..0000000000 --- a/mkdocs.yml +++ /dev/null @@ -1,93 +0,0 @@ -site_name: Lens Extension Development -site_description: Documentation for Lens Extension Development and API. -site_author: Mirantis, Inc. -site_url: https://api-docs.k8slens.dev -docs_dir: docs/ -repo_name: GitHub -repo_url: https://github.com/lensapp/lens -copyright: Copyright © 2021 Mirantis Inc. - All rights reserved. -edit_uri: "" -nav: - - Overview: README.md - - Getting Started: - - Overview: extensions/get-started/overview.md - - Your First Extension: extensions/get-started/your-first-extension.md - - Extension Anatomy: extensions/get-started/anatomy.md - - Wrapping Up: extensions/get-started/wrapping-up.md - - Extension Capabilities: - - Common Capabilities: extensions/capabilities/common-capabilities.md - - Styling: extensions/capabilities/styling.md - - Extension Guides: - - Overview: extensions/guides/README.md - - Generator: extensions/guides/generator.md - - Main Extension: extensions/guides/main-extension.md - - Renderer Extension: extensions/guides/renderer-extension.md - - Catalog: extensions/guides/catalog.md - - Resource Stack: extensions/guides/resource-stack.md - - Extending KubernetesCluster: extensions/guides/extending-kubernetes-cluster.md - - Stores: extensions/guides/stores.md - - Working with MobX: extensions/guides/working-with-mobx.md - - Protocol Handlers: extensions/guides/protocol-handlers.md - - IPC: extensions/guides/ipc.md - - Testing and Publishing: - - Testing Extensions: extensions/testing-and-publishing/testing.md - - Publishing Extensions: extensions/testing-and-publishing/publishing.md - - API Reference: extensions/api/README.md -theme: - name: "material" - highlightjs: true - language: "en" - custom_dir: docs/custom_theme - favicon: img/favicon.ico - logo: img/lens-logo-icon.svg - palette: - - scheme: slate - toggle: - icon: material/toggle-switch-off-outline - name: Switch to dark mode - - scheme: default - toggle: - icon: material/toggle-switch - name: Switch to light mode - features: - - toc.autohide - - search.suggest - - search.highlight - - content.code.copy - -extra_css: - - stylesheets/extra.css - -plugins: - - search - -markdown_extensions: - - pymdownx.highlight: {} - - pymdownx.superfences: {} - - pymdownx.inlinehilite: {} - - toc: - permalink: "#" - toc_depth: 3 - - admonition: {} - - pymdownx.details: {} - -extra: - generator: false - social: - - icon: fontawesome/brands/github - link: https://github.com/lensapp/lens - name: Lens on GitHub - - icon: fontawesome/brands/twitter - link: https://twitter.com/k8slens - name: Lens on Twitter - - icon: fontawesome/brands/discourse - link: https://forums.k8slens.dev/ - name: Lens Forums - - icon: fontawesome/solid/link - link: https://k8slens.dev/ - name: Lens Website - version: - provider: mike - analytics: - provider: google - property: UA-159377374-2 diff --git a/mkdocs/Dockerfile b/mkdocs/Dockerfile deleted file mode 100644 index 81a82d3443..0000000000 --- a/mkdocs/Dockerfile +++ /dev/null @@ -1,35 +0,0 @@ -ARG PYTHON_VERSION=3.8.1-alpine3.11 - -FROM python:${PYTHON_VERSION} as builder - -ENV PYTHONUNBUFFERED 1 - -# Set build directory -WORKDIR /wheels - -# Copy files necessary -COPY ./requirements.txt . - -# Perform build and cleanup artifacts -RUN \ - apk add --no-cache \ - git \ - git-fast-import \ - && apk add --no-cache --virtual .build gcc musl-dev \ - && python -m pip install --upgrade pip \ - && pip install -r requirements.txt \ - && apk del .build gcc musl-dev \ - && rm -rf /usr/local/lib/python3.8/site-packages/mkdocs/themes/*/* \ - && rm -rf /tmp/* - - - -# Set final MkDocs working directory -WORKDIR /docs - -# Expose MkDocs development server port -EXPOSE 8000 - -# Start development server by default -ENTRYPOINT ["mkdocs"] -CMD ["serve", "--dev-addr=0.0.0.0:8000"] diff --git a/mkdocs/requirements.txt b/mkdocs/requirements.txt deleted file mode 100644 index f02159cf62..0000000000 --- a/mkdocs/requirements.txt +++ /dev/null @@ -1,8 +0,0 @@ -# Direct dependencies -mkdocs>=1.2 -Pygments>=2.4 -markdown>=3.2 -pymdown-extensions>=7.0 -mkdocs-material-extensions>=1.0 -mkdocs-git-revision-date-localized-plugin>=0.7.3 -mkdocs-material>=7.1.8 diff --git a/nx.json b/nx.json deleted file mode 100644 index 3950ff391f..0000000000 --- a/nx.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "tasksRunnerOptions": { - "default": { - "runner": "nx/tasks-runners/default", - "options": { - "cacheableOperations": [ - "build" - ] - } - } - }, - "targetDefaults": { - "build": { - "dependsOn": [ - "^build" - ] - }, - "build:app": { - "dependsOn": [ - "^build" - ] - }, - "test:integration": { - "dependsOn": [ - "^build" - ] - }, - "build:docs": { - "dependsOn": [ - "^build" - ] - }, - "lint": { - "dependsOn": [ - "^build" - ] - }, - "test:unit": { - "dependsOn": [ - "^build" - ] - } - } -} diff --git a/open-lens/.gitignore b/open-lens/.gitignore deleted file mode 100644 index c465bfc76f..0000000000 --- a/open-lens/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -static/build -binaries/ -*.mjs -*.mjs.map diff --git a/open-lens/CHANGELOG.md b/open-lens/CHANGELOG.md deleted file mode 100644 index 6de097437b..0000000000 --- a/open-lens/CHANGELOG.md +++ /dev/null @@ -1,434 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -# 6.5.0 (2023-05-26) - - - -# 6.5.0-alpha.16 (2023-05-25) - - -### Bug Fixes - -* Make application size not blow up by consolidating dependencies in core package to peerDependencies ([738985c](https://github.com/lensapp/lens/commit/738985c9b7406ef0722c3994c560f0337e3c5b7c)) - - - -# 6.5.0-alpha.15 (2023-05-23) - - - -# 6.5.0-alpha.14 (2023-05-23) - - -### Reverts - -* Revert "chore: Extract sidebar item injection token into separate package" ([8f4aa49](https://github.com/lensapp/lens/commit/8f4aa497cc54655f83813d57c224f77dd1472141)) -* Revert "chore: Update integration tests to new testid format" ([be1fbcf](https://github.com/lensapp/lens/commit/be1fbcf8c3642fbf5a5ee06c3b03ac1756e4b1dd)) -* Revert "chore: Improve title formatting for Horizontal/Vertical Pod Autoscalers" ([d4c12be](https://github.com/lensapp/lens/commit/d4c12becfc9020009d64f48e4c8f9dd3b7725bb6)) -* Revert "chore: Fix integration tests failing due to helm testid's changing" ([96b7ecb](https://github.com/lensapp/lens/commit/96b7ecbaddedd45cc667cc2d6c25fdc0813557ec)) - - - -# 6.5.0-alpha.13 (2023-05-16) - - -### Bug Fixes - -* Copy fonts from @k8slens/core to open-lens correctly ([33a9f3e](https://github.com/lensapp/lens/commit/33a9f3ea3501c04738c8d74b82725bbe83e148bb)) - - - -# 6.5.0-alpha.12 (2023-05-16) - - - -# 6.5.0-alpha.11 (2023-05-11) - - -### Bug Fixes - -* Add missing styles to fix terminal resizing ([6902851](https://github.com/lensapp/lens/commit/6902851026e74428f515fc5f3e01e6dc8a4c2d50)) - - - - - -# 6.5.0-alpha.17 (2023-05-25) - - -### Bug Fixes - -* Make application size not blow up by consolidating dependencies in core package to peerDependencies ([738985c](https://github.com/lensapp/lens/commit/738985c9b7406ef0722c3994c560f0337e3c5b7c)) - - - -# 6.5.0-alpha.15 (2023-05-23) - - - -# 6.5.0-alpha.14 (2023-05-23) - - -### Reverts - -* Revert "chore: Extract sidebar item injection token into separate package" ([8f4aa49](https://github.com/lensapp/lens/commit/8f4aa497cc54655f83813d57c224f77dd1472141)) -* Revert "chore: Update integration tests to new testid format" ([be1fbcf](https://github.com/lensapp/lens/commit/be1fbcf8c3642fbf5a5ee06c3b03ac1756e4b1dd)) -* Revert "chore: Improve title formatting for Horizontal/Vertical Pod Autoscalers" ([d4c12be](https://github.com/lensapp/lens/commit/d4c12becfc9020009d64f48e4c8f9dd3b7725bb6)) -* Revert "chore: Fix integration tests failing due to helm testid's changing" ([96b7ecb](https://github.com/lensapp/lens/commit/96b7ecbaddedd45cc667cc2d6c25fdc0813557ec)) - - - -# 6.5.0-alpha.13 (2023-05-16) - - -### Bug Fixes - -* Copy fonts from @k8slens/core to open-lens correctly ([33a9f3e](https://github.com/lensapp/lens/commit/33a9f3ea3501c04738c8d74b82725bbe83e148bb)) - - - -# 6.5.0-alpha.12 (2023-05-16) - - - -# 6.5.0-alpha.11 (2023-05-11) - - -### Bug Fixes - -* Add missing styles to fix terminal resizing ([6902851](https://github.com/lensapp/lens/commit/6902851026e74428f515fc5f3e01e6dc8a4c2d50)) - - - - - -# 6.5.0-alpha.16 (2023-05-23) - - - -# 6.5.0-alpha.14 (2023-05-23) - - -### Reverts - -* Revert "chore: Extract sidebar item injection token into separate package" ([8f4aa49](https://github.com/lensapp/lens/commit/8f4aa497cc54655f83813d57c224f77dd1472141)) -* Revert "chore: Update integration tests to new testid format" ([be1fbcf](https://github.com/lensapp/lens/commit/be1fbcf8c3642fbf5a5ee06c3b03ac1756e4b1dd)) -* Revert "chore: Improve title formatting for Horizontal/Vertical Pod Autoscalers" ([d4c12be](https://github.com/lensapp/lens/commit/d4c12becfc9020009d64f48e4c8f9dd3b7725bb6)) -* Revert "chore: Fix integration tests failing due to helm testid's changing" ([96b7ecb](https://github.com/lensapp/lens/commit/96b7ecbaddedd45cc667cc2d6c25fdc0813557ec)) - - - -# 6.5.0-alpha.13 (2023-05-16) - - -### Bug Fixes - -* Copy fonts from @k8slens/core to open-lens correctly ([33a9f3e](https://github.com/lensapp/lens/commit/33a9f3ea3501c04738c8d74b82725bbe83e148bb)) - - - -# 6.5.0-alpha.12 (2023-05-16) - - - -# 6.5.0-alpha.11 (2023-05-11) - - -### Bug Fixes - -* Add missing styles to fix terminal resizing ([6902851](https://github.com/lensapp/lens/commit/6902851026e74428f515fc5f3e01e6dc8a4c2d50)) - - - - - -# 6.5.0-alpha.15 (2023-05-23) - - - -# 6.5.0-alpha.14 (2023-05-23) - - -### Reverts - -* Revert "chore: Extract sidebar item injection token into separate package" ([8f4aa49](https://github.com/lensapp/lens/commit/8f4aa497cc54655f83813d57c224f77dd1472141)) -* Revert "chore: Update integration tests to new testid format" ([be1fbcf](https://github.com/lensapp/lens/commit/be1fbcf8c3642fbf5a5ee06c3b03ac1756e4b1dd)) -* Revert "chore: Improve title formatting for Horizontal/Vertical Pod Autoscalers" ([d4c12be](https://github.com/lensapp/lens/commit/d4c12becfc9020009d64f48e4c8f9dd3b7725bb6)) -* Revert "chore: Fix integration tests failing due to helm testid's changing" ([96b7ecb](https://github.com/lensapp/lens/commit/96b7ecbaddedd45cc667cc2d6c25fdc0813557ec)) - - - -# 6.5.0-alpha.13 (2023-05-16) - - -### Bug Fixes - -* Copy fonts from @k8slens/core to open-lens correctly ([33a9f3e](https://github.com/lensapp/lens/commit/33a9f3ea3501c04738c8d74b82725bbe83e148bb)) - - - -# 6.5.0-alpha.12 (2023-05-16) - - - -# 6.5.0-alpha.11 (2023-05-11) - - -### Bug Fixes - -* Add missing styles to fix terminal resizing ([6902851](https://github.com/lensapp/lens/commit/6902851026e74428f515fc5f3e01e6dc8a4c2d50)) - - - - - -# 6.5.0-alpha.13 (2023-05-16) - - -### Bug Fixes - -* Copy fonts from @k8slens/core to open-lens correctly ([33a9f3e](https://github.com/lensapp/lens/commit/33a9f3ea3501c04738c8d74b82725bbe83e148bb)) - - - -# 6.5.0-alpha.12 (2023-05-16) - - - -# 6.5.0-alpha.11 (2023-05-11) - - -### Bug Fixes - -* Add missing styles to fix terminal resizing ([6902851](https://github.com/lensapp/lens/commit/6902851026e74428f515fc5f3e01e6dc8a4c2d50)) - - - - - -# 6.5.0-alpha.12 (2023-05-16) - - - -# 6.5.0-alpha.11 (2023-05-11) - - -### Bug Fixes - -* Add missing styles to fix terminal resizing ([6902851](https://github.com/lensapp/lens/commit/6902851026e74428f515fc5f3e01e6dc8a4c2d50)) - - - - - -# 6.5.0-alpha.11 (2023-05-11) - - -### Bug Fixes - -* Add missing styles to fix terminal resizing ([6902851](https://github.com/lensapp/lens/commit/6902851026e74428f515fc5f3e01e6dc8a4c2d50)) - - - - - -# 6.5.0-alpha.10 (2023-05-09) - - - -# 6.5.0-alpha.9 (2023-05-04) - - -### Bug Fixes - -* Add new packages to open-lens to fix build ([f2f6cc5](https://github.com/lensapp/lens/commit/f2f6cc500c38cdeb4d6e8bd1da16e36c61a07aea)) -* Disable cycle detection due to bug in ogre-tools ([d4e8b48](https://github.com/lensapp/lens/commit/d4e8b48b4a166e2aabeab76355765d78a445c43c)) -* Fix generating tray icons and downloading binaries on windows ([289d62c](https://github.com/lensapp/lens/commit/289d62caaadcf4899719c6a8b8c2ee4b7e725e9c)) -* Fix paths provided as parameters to workspace scripts ([d5acd57](https://github.com/lensapp/lens/commit/d5acd57584887f8eed544650761ef4408481a6a2)) -* Readd run-script-os to open-lens to fix build:app ([430beba](https://github.com/lensapp/lens/commit/430bebaa6f90941d0b7e2c88d59aaac0a9260d7f)) -* Revise paths for generating tray icons ([58b8b4f](https://github.com/lensapp/lens/commit/58b8b4f1f9113aaedb136ebbf00c568abea0173c)) - - -### Features - -* Compute the kubectl download version map at build time ([0bd7b1f](https://github.com/lensapp/lens/commit/0bd7b1fe92a173379c8a5a1ab7e13cf9e4f8223b)) - - - -# 6.5.0-alpha.6 (2023-04-12) - - - -# 6.5.0-alpha.5 (2023-04-12) - - - -# 6.5.0-alpha.4 (2023-04-12) - - -### Bug Fixes - -* remove platform specific injectable file names ([9b0318b](https://github.com/lensapp/lens/commit/9b0318b493fe2e49a34b8a4cb3d0bef1600759b8)) - - -### Features - -* Allow built versions to specify an environment ([#7495](https://github.com/lensapp/lens/issues/7495)) ([128b05d](https://github.com/lensapp/lens/commit/128b05d4d46344a511398f654865c133c6e36514)) - - - -# 6.5.0-alpha.3 (2023-03-15) - - - -# 6.5.0-alpha.2 (2023-03-14) - - - -# 6.5.0-alpha.1 (2023-03-14) - - - -# 6.4.0-beta.13 (2023-02-03) - - - -# 6.4.0-beta.12 (2023-02-01) - - - -# 6.4.0-beta.11 (2023-02-01) - - - -# 6.4.0-beta.10 (2023-01-27) - - - -# 6.4.0-beta.9 (2023-01-27) - - - -# 6.4.0-beta.8 (2023-01-27) - - - -# 6.4.0-beta.7 (2023-01-27) - - - -# 6.4.0-beta.6 (2023-01-26) - - - -# 6.4.0-beta.5 (2023-01-26) - - - -# 6.4.0-beta.4 (2023-01-26) - - - -# 6.4.0-beta.3 (2023-01-26) - - - - - -# 6.5.0-alpha.9 (2023-05-04) - - -### Bug Fixes - -* Add new packages to open-lens to fix build ([f2f6cc5](https://github.com/lensapp/lens/commit/f2f6cc500c38cdeb4d6e8bd1da16e36c61a07aea)) -* Disable cycle detection due to bug in ogre-tools ([d4e8b48](https://github.com/lensapp/lens/commit/d4e8b48b4a166e2aabeab76355765d78a445c43c)) -* Fix generating tray icons and downloading binaries on windows ([289d62c](https://github.com/lensapp/lens/commit/289d62caaadcf4899719c6a8b8c2ee4b7e725e9c)) -* Fix paths provided as parameters to workspace scripts ([d5acd57](https://github.com/lensapp/lens/commit/d5acd57584887f8eed544650761ef4408481a6a2)) -* Readd run-script-os to open-lens to fix build:app ([430beba](https://github.com/lensapp/lens/commit/430bebaa6f90941d0b7e2c88d59aaac0a9260d7f)) -* Revise paths for generating tray icons ([58b8b4f](https://github.com/lensapp/lens/commit/58b8b4f1f9113aaedb136ebbf00c568abea0173c)) - - -### Features - -* Compute the kubectl download version map at build time ([0bd7b1f](https://github.com/lensapp/lens/commit/0bd7b1fe92a173379c8a5a1ab7e13cf9e4f8223b)) - - - -# 6.5.0-alpha.6 (2023-04-12) - - - -# 6.5.0-alpha.5 (2023-04-12) - - - -# 6.5.0-alpha.4 (2023-04-12) - - -### Bug Fixes - -* remove platform specific injectable file names ([9b0318b](https://github.com/lensapp/lens/commit/9b0318b493fe2e49a34b8a4cb3d0bef1600759b8)) - - -### Features - -* Allow built versions to specify an environment ([#7495](https://github.com/lensapp/lens/issues/7495)) ([128b05d](https://github.com/lensapp/lens/commit/128b05d4d46344a511398f654865c133c6e36514)) - - - -# 6.5.0-alpha.3 (2023-03-15) - - - -# 6.5.0-alpha.2 (2023-03-14) - - - -# 6.5.0-alpha.1 (2023-03-14) - - - -# 6.4.0-beta.13 (2023-02-03) - - - -# 6.4.0-beta.12 (2023-02-01) - - - -# 6.4.0-beta.11 (2023-02-01) - - - -# 6.4.0-beta.10 (2023-01-27) - - - -# 6.4.0-beta.9 (2023-01-27) - - - -# 6.4.0-beta.8 (2023-01-27) - - - -# 6.4.0-beta.7 (2023-01-27) - - - -# 6.4.0-beta.6 (2023-01-26) - - - -# 6.4.0-beta.5 (2023-01-26) - - - -# 6.4.0-beta.4 (2023-01-26) - - - -# 6.4.0-beta.3 (2023-01-26) diff --git a/open-lens/build/entitlements.mac.plist b/open-lens/build/entitlements.mac.plist deleted file mode 100644 index 9a279dc836..0000000000 --- a/open-lens/build/entitlements.mac.plist +++ /dev/null @@ -1,12 +0,0 @@ - - - - - com.apple.security.cs.allow-jit - - com.apple.security.cs.allow-unsigned-executable-memory - - com.apple.security.cs.disable-library-validation - - - diff --git a/open-lens/build/icon.ico b/open-lens/build/icon.ico deleted file mode 100644 index af1ec205bd..0000000000 Binary files a/open-lens/build/icon.ico and /dev/null differ diff --git a/open-lens/build/icon.png b/open-lens/build/icon.png deleted file mode 100644 index 2c953f6efd..0000000000 Binary files a/open-lens/build/icon.png and /dev/null differ diff --git a/open-lens/build/icons/512x512.png b/open-lens/build/icons/512x512.png deleted file mode 100644 index e08b9f5b15..0000000000 Binary files a/open-lens/build/icons/512x512.png and /dev/null differ diff --git a/open-lens/build/icons/512x512@2x.png b/open-lens/build/icons/512x512@2x.png deleted file mode 100644 index da0aa8ae80..0000000000 Binary files a/open-lens/build/icons/512x512@2x.png and /dev/null differ diff --git a/open-lens/build/installer.nsh b/open-lens/build/installer.nsh deleted file mode 100644 index d0fe18809a..0000000000 --- a/open-lens/build/installer.nsh +++ /dev/null @@ -1,15 +0,0 @@ -!macro customInit - ; Make sure all old extensions are removed - RMDir /r "$INSTDIR\resources\extensions" - - ; Workaround for installer handing when the app directory is removed manually - ${ifNot} ${FileExists} "$INSTDIR" - DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\{${UNINSTALL_APP_KEY}}" - ${EndIf} - - ; Workaround for the old-format uninstall registry key (some people report it causes hangups, too) - ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_APP_KEY}" "QuietUninstallString" - StrCmp $0 "" proceed 0 - DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_APP_KEY}" - proceed: -!macroend \ No newline at end of file diff --git a/open-lens/build/notarize.js b/open-lens/build/notarize.js deleted file mode 100644 index f78b448aa8..0000000000 --- a/open-lens/build/notarize.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -const { notarize } = require("@electron/notarize"); - -exports.default = async function notarizing(context) { - const { electronPlatformName, appOutDir } = context; - - if (electronPlatformName !== "darwin") { - return; - } - - if (!process.env.APPLEID || !process.env.APPLEIDPASS) { - return; - } - - const appName = context.packager.appInfo.productFilename; - - return await notarize({ - appBundleId: process.env.APPBUNDLEID || "io.kontena.lens-app", - appPath: `${appOutDir}/${appName}.app`, - appleId: process.env.APPLEID, - appleIdPassword: process.env.APPLEIDPASS, - ascProvider: process.env.ASCPROVIDER, - teamId: process.env.APPLETEAMID, - tool: process.env.NOTARIZE_TOOL || "legacy", - }); -}; diff --git a/open-lens/integration/__tests__/app-preferences.tests.ts b/open-lens/integration/__tests__/app-preferences.tests.ts deleted file mode 100644 index 1d7d7029fb..0000000000 --- a/open-lens/integration/__tests__/app-preferences.tests.ts +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -/* - Cluster tests are run if there is a pre-existing minikube cluster. Before running cluster tests the TEST_NAMESPACE - namespace is removed, if it exists, from the minikube cluster. Resources are created as part of the cluster tests in the - TEST_NAMESPACE namespace. This is done to minimize destructive impact of the cluster tests on an existing minikube - cluster and vice versa. -*/ -import type { ElectronApplication, Page } from "playwright"; -import * as utils from "../helpers/utils"; - -describe("preferences page tests", () => { - let window: Page; - let cleanup: undefined | (() => Promise); - - beforeEach(async () => { - let app: ElectronApplication; - - ({ window, cleanup, app } = await utils.start()); - await utils.clickWelcomeButton(window); - - await app.evaluate(async ({ app }) => { - await app.applicationMenu - ?.getMenuItemById(process.platform === "darwin" ? "mac" : "file") - ?.submenu - ?.getMenuItemById("navigate-to-preferences") - ?.click(); - }); - }, 10*60*1000); - - afterEach(async () => { - await cleanup?.(); - }, 10*60*1000); - - it('shows "preferences" and can navigate through the tabs', async () => { - const pages = [ - { - id: "app", - header: "Application", - }, - { - id: "proxy", - header: "Proxy", - }, - { - id: "kubernetes", - header: "Kubernetes", - }, - ]; - - for (const { id, header } of pages) { - await window.click(`[data-preference-tab-link-test=${id}]`); - await window.waitForSelector(`[data-preference-page-title-test] >> text=${header}`); - } - }, 10*60*1000); - - // Skipping, but will turn it on again in the follow up PR - it.skip("ensures helm repos", async () => { - await window.click("[data-testid=kubernetes-tab]"); - await window.waitForSelector("[data-testid=repository-name]"); - await window.click("#HelmRepoSelect"); - await window.waitForSelector("div.Select__option"); - }, 10*60*1000); -}); diff --git a/open-lens/integration/__tests__/cluster-pages.tests.ts b/open-lens/integration/__tests__/cluster-pages.tests.ts deleted file mode 100644 index 30bbc79ed9..0000000000 --- a/open-lens/integration/__tests__/cluster-pages.tests.ts +++ /dev/null @@ -1,390 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -/* - Cluster tests are run if there is a pre-existing minikube cluster. Before running cluster tests the TEST_NAMESPACE - namespace is removed, if it exists, from the minikube cluster. Resources are created as part of the cluster tests in the - TEST_NAMESPACE namespace. This is done to minimize destructive impact of the cluster tests on an existing minikube - cluster and vice versa. -*/ -import * as utils from "../helpers/utils"; -import { minikubeReady } from "../helpers/minikube"; -import type { Frame, Page } from "playwright"; -import { groupBy, toPairs } from "lodash/fp"; -import { pipeline } from "@ogre-tools/fp"; -import { describeIf } from "@k8slens/test-utils"; - -const TEST_NAMESPACE = "integration-tests"; - -describeIf(minikubeReady(TEST_NAMESPACE))("Minikube based tests", () => { - let window: Page; - let cleanup: undefined | (() => Promise); - let frame: Frame; - - beforeEach(async () => { - ({ window, cleanup } = await utils.start()); - await utils.clickWelcomeButton(window); - - frame = await utils.launchMinikubeClusterFromCatalog(window); - }, 10 * 60 * 1000); - - afterEach(async () => { - await cleanup?.(); - }, 10 * 60 * 1000); - - it("shows cluster context menu in sidebar", async () => { - await frame.click(`[data-testid="sidebar-cluster-dropdown"]`); - await frame.waitForSelector(`.Menu >> text="Add to Hotbar"`); - await frame.waitForSelector(`.Menu >> text="Settings"`); - await frame.waitForSelector(`.Menu >> text="Disconnect"`); - await frame.waitForSelector(`.Menu >> text="Remove"`); - }); - - // FIXME: failed locally since metrics might already exist, cc @aleksfront - it.skip("opens cluster settings by clicking link in no-metrics area", async () => { - await frame.locator("text=Open cluster settings >> nth=0").click(); - await window.waitForSelector(`[data-testid="metrics-header"]`); - }); - - it( - "should navigate around common cluster pages", - async () => { - const scenariosByParent = pipeline( - scenarios, - groupBy("parentSidebarItemTestId"), - toPairs, - ); - - for (const [parentSidebarItemTestId, scenarios] of scenariosByParent) { - if (parentSidebarItemTestId !== "null") { - await frame.click(`[data-testid="${parentSidebarItemTestId}"]`); - } - - for (const scenario of scenarios) { - await frame.click(`[data-testid="${scenario.sidebarItemTestId}"]`); - - await frame.waitForSelector( - scenario.expectedSelector, - selectorTimeout, - ); - } - } - }, - - 10 * 60 * 1000, - ); - - it( - "should show the default namespaces", - async () => { - await navigateToNamespaces(frame); - await frame.waitForSelector("div.TableCell >> text='default'"); - await frame.waitForSelector("div.TableCell >> text='kube-system'"); - }, - 10 * 60 * 1000, - ); - - it( - `should create the ${TEST_NAMESPACE} and a pod in the namespace and then remove that pod via the context menu`, - async () => { - await navigateToNamespaces(frame); - await frame.click("button.add-button"); - await frame.waitForSelector( - "div.AddNamespaceDialog >> text='Create Namespace'", - ); - - const namespaceNameInput = await frame.waitForSelector( - ".AddNamespaceDialog input", - ); - - await namespaceNameInput.type(TEST_NAMESPACE); - await namespaceNameInput.press("Enter"); - - await frame.waitForSelector(`div.TableCell >> text=${TEST_NAMESPACE}`); - - await navigateToPods(frame); - - const namespacesSelector = await frame.waitForSelector( - ".NamespaceSelect", - ); - - await namespacesSelector.click(); - await namespacesSelector.type(TEST_NAMESPACE); - await namespacesSelector.press("Enter"); - await namespacesSelector.click(); - - await frame.click(".Icon.new-dock-tab"); - - try { - await frame.click("li.MenuItem.create-resource-tab", { - // NOTE: the following shouldn't be required, but is because without it a TypeError is thrown - // see: https://github.com/microsoft/playwright/issues/8229 - position: { - y: 0, - x: 0, - }, - }); - } catch (error) { - console.log(error); - await frame.waitForTimeout(100_000); - } - - const testPodName = "nginx-create-pod-test"; - const monacoEditor = await frame.waitForSelector(`.Dock.isOpen [data-test-id="monaco-editor"]`); - - await monacoEditor.click(); - await monacoEditor.type("apiVersion: v1", { delay: 10 }); - await monacoEditor.press("Enter", { delay: 10 }); - await monacoEditor.type("kind: Pod", { delay: 10 }); - await monacoEditor.press("Enter", { delay: 10 }); - await monacoEditor.type("metadata:", { delay: 10 }); - await monacoEditor.press("Enter", { delay: 10 }); - await monacoEditor.type(`name: ${testPodName}`, { delay: 10 }); - await monacoEditor.press("Enter", { delay: 10 }); - await monacoEditor.type(`namespace: ${TEST_NAMESPACE}`, { delay: 10 }); - await monacoEditor.press("Enter", { delay: 10 }); - await monacoEditor.press("Backspace", { delay: 10 }); - await monacoEditor.type("spec:", { delay: 10 }); - await monacoEditor.press("Enter", { delay: 10 }); - await monacoEditor.type("containers:", { delay: 10 }); - await monacoEditor.press("Enter", { delay: 10 }); - await monacoEditor.type(`- name: ${testPodName}`, { delay: 10 }); - await monacoEditor.press("Enter", { delay: 10 }); - await monacoEditor.type(" image: nginx:alpine", { delay: 10 }); - await monacoEditor.press("Enter", { delay: 10 }); - - await frame.click(".Dock .Button >> text='Create'"); - await frame.waitForSelector(`.TableCell >> text=${testPodName}`); - await frame.click(".TableRow .TableCell.menu"); - await frame.click(".MenuItem >> text=Delete"); - await frame.click("button >> text=Remove"); - await frame.waitForSelector(`.TableCell >> text=${testPodName}`, { state: "detached" }); - }, - 10 * 60 * 1000, - ); -}); - -const selectorTimeout = { timeout: 30000 }; - -const scenarios = [ - { - expectedSelector: "div[data-testid='cluster-overview-page'] div.label", - parentSidebarItemTestId: null, - sidebarItemTestId: "link-for-sidebar-item-cluster-overview", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: null, - sidebarItemTestId: "link-for-sidebar-item-nodes", - }, - - { - expectedSelector: 'h5 >> text="Overview"', - parentSidebarItemTestId: "link-for-sidebar-item-workloads", - sidebarItemTestId: "link-for-sidebar-item-workloads-overview", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-workloads", - sidebarItemTestId: "link-for-sidebar-item-pods", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-workloads", - sidebarItemTestId: "link-for-sidebar-item-deployments", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-workloads", - sidebarItemTestId: "link-for-sidebar-item-daemon-sets", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-workloads", - sidebarItemTestId: "link-for-sidebar-item-stateful-sets", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-workloads", - sidebarItemTestId: "link-for-sidebar-item-replica-sets", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-workloads", - sidebarItemTestId: "link-for-sidebar-item-jobs", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-workloads", - sidebarItemTestId: "link-for-sidebar-item-cron-jobs", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-config", - sidebarItemTestId: "link-for-sidebar-item-config-maps", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-config", - sidebarItemTestId: "link-for-sidebar-item-secrets", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-config", - sidebarItemTestId: "link-for-sidebar-item-resource-quotas", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-config", - sidebarItemTestId: "link-for-sidebar-item-limit-ranges", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-config", - sidebarItemTestId: "link-for-sidebar-item-horizontal-pod-autoscalers", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-config", - sidebarItemTestId: "link-for-sidebar-item-pod-disruption-budgets", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-network", - sidebarItemTestId: "link-for-sidebar-item-services", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-network", - sidebarItemTestId: "link-for-sidebar-item-endpoints", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-network", - sidebarItemTestId: "link-for-sidebar-item-ingresses", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-network", - sidebarItemTestId: "link-for-sidebar-item-network-policies", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-storage", - sidebarItemTestId: "link-for-sidebar-item-persistent-volume-claims", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-storage", - sidebarItemTestId: "link-for-sidebar-item-persistent-volumes", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-storage", - sidebarItemTestId: "link-for-sidebar-item-storage-classes", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: null, - sidebarItemTestId: "link-for-sidebar-item-namespaces", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: null, - sidebarItemTestId: "link-for-sidebar-item-events", - }, - - { - expectedSelector: "div.HelmCharts input", - parentSidebarItemTestId: "link-for-sidebar-item-helm", - sidebarItemTestId: "link-for-sidebar-item-helm-charts", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-helm", - sidebarItemTestId: "link-for-sidebar-item-helm-releases", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-user-management", - sidebarItemTestId: "link-for-sidebar-item-service-accounts", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-user-management", - sidebarItemTestId: "link-for-sidebar-item-cluster-roles", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-user-management", - sidebarItemTestId: "link-for-sidebar-item-roles", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-user-management", - sidebarItemTestId: "link-for-sidebar-item-cluster-role-bindings", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-user-management", - sidebarItemTestId: "link-for-sidebar-item-role-bindings", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: null, - sidebarItemTestId: "link-for-sidebar-item-custom-resources", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-config", - sidebarItemTestId: "link-for-sidebar-item-validating-webhook-configurations", - }, - - { - expectedSelector: "h5.title", - parentSidebarItemTestId: "link-for-sidebar-item-config", - sidebarItemTestId: "link-for-sidebar-item-mutating-webhook-configurations", - }, -]; - -const navigateToPods = async (frame: Frame) => { - await frame.click(`[data-testid="link-for-sidebar-item-workloads"]`); - await frame.click(`[data-testid="link-for-sidebar-item-pods"]`); -}; - -const navigateToNamespaces = async (frame: Frame) => { - await frame.click(`[data-testid="link-for-sidebar-item-namespaces"]`); -}; diff --git a/open-lens/integration/__tests__/command-palette.tests.ts b/open-lens/integration/__tests__/command-palette.tests.ts deleted file mode 100644 index 670a64c679..0000000000 --- a/open-lens/integration/__tests__/command-palette.tests.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { ElectronApplication, Page } from "playwright"; -import * as utils from "../helpers/utils"; - -describe("Lens command palette", () => { - let window: Page; - let cleanup: undefined | (() => Promise); - let app: ElectronApplication; - - beforeEach(async () => { - ({ window, cleanup, app } = await utils.start()); - await utils.clickWelcomeButton(window); - }, 10*60*1000); - - afterEach(async () => { - await cleanup?.(); - }, 10*60*1000); - - describe("menu", () => { - it("opens command dialog from menu", async () => { - await app.evaluate(async ({ app }) => { - await app.applicationMenu - ?.getMenuItemById("view") - ?.submenu?.getMenuItemById("open-command-palette") - ?.click(); - }); - await window.waitForSelector(".Select__option >> text=Hotbar: Switch"); - }, 10*60*1000); - }); -}); diff --git a/open-lens/integration/helpers/minikube.ts b/open-lens/integration/helpers/minikube.ts deleted file mode 100644 index aa87d9e5a9..0000000000 --- a/open-lens/integration/helpers/minikube.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { spawnSync } from "child_process"; - -export function minikubeReady(testNamespace: string): boolean { - // determine if minikube is running - { - const { status } = spawnSync("minikube status", { shell: true }); - - if (status !== 0) { - console.warn("minikube not running"); - - return false; - } - } - - // Remove TEST_NAMESPACE if it already exists - { - const { status } = spawnSync(`minikube kubectl -- get namespace ${testNamespace}`, { shell: true }); - - if (status === 0) { - console.warn(`Removing existing ${testNamespace} namespace`); - - const { status, stdout, stderr } = spawnSync( - `minikube kubectl -- delete namespace ${testNamespace}`, - { shell: true }, - ); - - if (status !== 0) { - console.warn(`Error removing ${testNamespace} namespace: ${stderr.toString()}`); - - return false; - } - - console.log(stdout.toString()); - } - } - - return true; -} diff --git a/open-lens/integration/helpers/utils.ts b/open-lens/integration/helpers/utils.ts deleted file mode 100644 index af7820136b..0000000000 --- a/open-lens/integration/helpers/utils.ts +++ /dev/null @@ -1,133 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { createHash } from "crypto"; -import { mkdirp, remove } from "fs-extra"; -import * as os from "os"; -import * as path from "path"; -import * as uuid from "uuid"; -import type { ElectronApplication, Frame, Page } from "playwright"; -import { _electron as electron } from "playwright"; -import { noop } from "lodash"; -import { disposer } from "@k8slens/utilities"; - -export const appPaths: Partial> = { - "win32": "./dist/win-unpacked/OpenLens.exe", - "linux": "./dist/linux-unpacked/open-lens", - "darwin": `./dist/mac${ process.arch === "arm64" ? "-arm64" : "" }/OpenLens.app/Contents/MacOS/OpenLens`, -}; - -async function getMainWindow(app: ElectronApplication, timeout = 50_000): Promise { - return new Promise((resolve, reject) => { - const cleanup = disposer(); - let stdoutBuf = ""; - - const onWindow = (page: Page) => { - console.log(`Page opened: ${page.url()}`); - - if (page.url().startsWith("https://lens.app")) { - cleanup(); - console.log(stdoutBuf); - resolve(page); - } - }; - - app.on("window", onWindow); - cleanup.push(() => app.off("window", onWindow)); - - app.on("close", cleanup); - cleanup.push(() => app.off("close", cleanup)); - - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const stdout = app.process().stdout!; - const onData = (chunk: any) => stdoutBuf += chunk.toString(); - - stdout.on("data", onData); - cleanup.push(() => stdout.off("data", onData)); - - const timeoutId = setTimeout(() => { - cleanup(); - console.log(stdoutBuf); - reject(new Error(`Lens did not open the main window within ${timeout}ms`)); - }, timeout); - - cleanup.push(() => clearTimeout(timeoutId)); - }); -} - -async function attemptStart() { - const CICD = path.join(os.tmpdir(), "lens-integration-testing", uuid.v4()); - - // Make sure that the directory is clear - await remove(CICD).catch(noop); - await mkdirp(CICD); - - const app = await electron.launch({ - args: ["--integration-testing"], // this argument turns off the blocking of quit - executablePath: appPaths[process.platform], - bypassCSP: true, - env: { - CICD, - ...process.env, - }, - timeout: 100_000, - }); - - try { - const window = await getMainWindow(app); - - return { - app, - window, - cleanup: async () => { - app.process().kill(); - await remove(CICD).catch(noop); - }, - }; - } catch (error) { - await app.close(); - await remove(CICD).catch(noop); - throw error; - } -} - -export async function start() { - // this is an attempted workaround for an issue with playwright not always getting the main window when using Electron 14.2.4 (observed on windows) - for (let i = 0; ; i++) { - try { - return await attemptStart(); - } catch (error) { - if (i === 4) { - throw error; - } - } - } -} - -export async function clickWelcomeButton(window: Page) { - await window.click("[data-testid=welcome-menu-container] li a"); -} - -function minikubeEntityId() { - return createHash("md5").update(`${path.join(os.homedir(), ".kube", "config")}:minikube`).digest("hex"); -} - -/** - * From the catalog, click the minikube entity and wait for it to connect, returning its frame - */ -export async function launchMinikubeClusterFromCatalog(window: Page): Promise { - await window.click("div.TableCell >> text='minikube'"); - - const minikubeFrame = await window.waitForSelector(`#cluster-frame-${minikubeEntityId()}`); - - const frame = await minikubeFrame.contentFrame(); - - if (!frame) { - throw new Error("No iframe for minikube found"); - } - - await frame.waitForSelector("[data-testid=cluster-sidebar]"); - - return frame; -} diff --git a/open-lens/integration/tsconfig.json b/open-lens/integration/tsconfig.json deleted file mode 100644 index 7c6e822d2c..0000000000 --- a/open-lens/integration/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "../tsconfig.json", - "include": [ - "./**/*", - ] -} diff --git a/open-lens/package.json b/open-lens/package.json deleted file mode 100644 index 838c37f897..0000000000 --- a/open-lens/package.json +++ /dev/null @@ -1,360 +0,0 @@ -{ - "name": "open-lens", - "private": true, - "productName": "OpenLens", - "description": "OpenLens - Open Source IDE for Kubernetes", - "homepage": "https://github.com/lensapp/lens", - "version": "6.5.0", - "repository": { - "type": "git", - "url": "git+https://github.com/lensapp/lens.git" - }, - "keywords": [], - "bugs": { - "url": "https://github.com/lensapp/lens/issues" - }, - "main": "static/build/main.js", - "copyright": "© 2023 OpenLens Authors", - "license": "MIT", - "author": "OpenLens Authors ", - "scripts": { - "clean": "rimraf binaries/ dist/ static/build", - "build": "cross-env NODE_ENV=production webpack --config webpack/webpack.ts --progress", - "postbuild": "npm run build:tray-icons && npm run download:binaries", - "build:app": "electron-builder --publish onTag", - "prebuild:app": "run-script-os", - "prebuild:app:default": "exit 0", - "prebuild:app:win32": "rimraf node_modules/win-ca/pem", - "start": "concurrently -i -k \"npm run dev-run -C\" npm:dev:*", - "dev-run": "nodemon --watch ./static/build/main.js --exec \"electron --remote-debugging-port=9223 --inspect .\"", - "dev:main": "cross-env NODE_ENV=development webpack --config webpack/main.ts --progress --watch", - "dev:renderer": "cross-env NODE_ENV=development ts-node ./webpack/dev-server.ts", - "test:integration": "jest -xyz --runInBand --modulePaths=[\"/integration/\"];", - "build:tray-icons": "npm run --workspace @k8slens/generate-tray-icons generate -- --output static/build/tray --input @k8slens/icon/icons/logo-lens.svg --notice-icon @k8slens/icon/icons/notice.svg --spinner-icon @k8slens/icon/icons/arrow-spinner.svg", - "download:binaries": "npm run --workspace @k8slens/ensure-binaries ensure -- --package package.json --base-dir binaries/client", - "postinstall": "electron-rebuild" - }, - "config": { - "k8sProxyVersion": "0.3.0", - "bundledKubectlVersion": "1.23.3", - "bundledHelmVersion": "3.11.0", - "sentryDsn": "", - "contentSecurityPolicy": "script-src 'unsafe-eval' 'self'; frame-src https://*.lens.app:*/; img-src * data:", - "welcomeRoute": "/welcome" - }, - "engines": { - "node": ">=16 <17" - }, - "jest": { - "collectCoverage": false, - "verbose": true, - "transform": { - "^.+\\.(t|j)sx?$": [ - "@swc/jest" - ] - } - }, - "nx": { - "targets": { - "build": { - "dependsOn": [ - "^build" - ], - "outputs": [ - "{workspaceRoot}/binaries/", - "{workspaceRoot}/build/webpack/", - "{workspaceRoot}/static/build/" - ] - }, - "build:app": { - "dependsOn": [ - "build" - ], - "outputs": [ - "{workspaceRoot}/dist/" - ] - }, - "test:integration": { - "dependsOn": [ - "build:app" - ] - } - } - }, - "build": { - "npmRebuild": false, - "electronVersion": "22.3.3", - "generateUpdatesFilesForAllChannels": true, - "files": [ - "static/**/*", - "!node_modules/@k8slens/core/node_modules/**/*", - "!node_modules/@k8slens/core/src" - ], - "afterSign": "build/notarize.js", - "extraResources": [ - "LICENSE" - ], - "linux": { - "category": "Network", - "artifactName": "${productName}-${version}.${arch}.${ext}", - "target": [ - "deb", - "rpm", - "AppImage" - ], - "extraResources": [ - { - "from": "binaries/client/linux/${arch}/kubectl", - "to": "./${arch}/kubectl" - }, - { - "from": "binaries/client/linux/${arch}/lens-k8s-proxy", - "to": "./${arch}/lens-k8s-proxy" - }, - { - "from": "binaries/client/linux/${arch}/helm", - "to": "./${arch}/helm" - } - ] - }, - "rpm": { - "fpm": [ - "--rpm-rpmbuild-define=%define _build_id_links none" - ] - }, - "mac": { - "hardenedRuntime": true, - "gatekeeperAssess": false, - "entitlements": "build/entitlements.mac.plist", - "entitlementsInherit": "build/entitlements.mac.plist", - "extraResources": [ - { - "from": "binaries/client/darwin/${arch}/kubectl", - "to": "./${arch}/kubectl" - }, - { - "from": "binaries/client/darwin/${arch}/lens-k8s-proxy", - "to": "./${arch}/lens-k8s-proxy" - }, - { - "from": "binaries/client/darwin/${arch}/helm", - "to": "./${arch}/helm" - } - ] - }, - "win": { - "target": [ - "nsis" - ], - "extraResources": [ - { - "from": "binaries/client/windows/${arch}/kubectl.exe", - "to": "./${arch}/kubectl.exe" - }, - { - "from": "binaries/client/windows/${arch}/lens-k8s-proxy.exe", - "to": "./${arch}/lens-k8s-proxy.exe" - }, - { - "from": "binaries/client/windows/${arch}/helm.exe", - "to": "./${arch}/helm.exe" - } - ] - }, - "nsis": { - "include": "build/installer.nsh", - "oneClick": false, - "allowElevation": true, - "createStartMenuShortcut": true, - "allowToChangeInstallationDirectory": true - }, - "protocols": { - "name": "Lens Protocol Handler", - "schemes": [ - "lens" - ], - "role": "Viewer" - } - }, - "dependencies": { - "@astronautlabs/jsonpath": "^1.1.0", - "@hapi/call": "^9.0.1", - "@hapi/subtext": "^7.1.0", - "@k8slens/application": "^6.5.0", - "@k8slens/application-for-electron-main": "^6.5.0", - "@k8slens/button": "^1.0.0", - "@k8slens/cluster-settings": "^6.5.0", - "@k8slens/cluster-sidebar": "^1.0.0", - "@k8slens/core": "^6.5.0", - "@k8slens/ensure-binaries": "^6.5.0", - "@k8slens/error-boundary": "^1.0.0", - "@k8slens/event-emitter": "^1.0.0", - "@k8slens/feature-core": "^6.5.0", - "@k8slens/json-api": "^1.0.0-alpha.3", - "@k8slens/keyboard-shortcuts": "^1.0.0", - "@k8slens/kube-api": "^1.0.0-alpha.1", - "@k8slens/kube-api-specifics": "^1.0.0", - "@k8slens/kube-object": "^1.0.0", - "@k8slens/kubectl-versions": "^1.0.0", - "@k8slens/legacy-extension-example": "^1.0.0", - "@k8slens/legacy-extensions": "^1.0.0", - "@k8slens/legacy-global-di": "^1.0.0", - "@k8slens/list-layout": "^1.0.0", - "@k8slens/logger": "^1.0.0", - "@k8slens/messaging": "^1.0.0", - "@k8slens/messaging-for-main": "^1.0.0", - "@k8slens/messaging-for-renderer": "^1.0.0", - "@k8slens/metrics": "^6.5.0", - "@k8slens/node-fetch": "^6.5.0", - "@k8slens/prometheus": "^1.0.0", - "@k8slens/random": "^1.0.0", - "@k8slens/react-application": "^1.0.0", - "@k8slens/resizing-anchor": "^1.0.0", - "@k8slens/resource-templates": "^1.0.0", - "@k8slens/routing": "^1.0.0", - "@k8slens/run-many": "^1.0.0", - "@k8slens/startable-stoppable": "^1.0.0", - "@k8slens/tooltip": "^1.0.0", - "@k8slens/utilities": "^1.0.0", - "@kubernetes/client-node": "^0.18.1", - "@material-ui/core": "^4.12.3", - "@material-ui/lab": "^4.0.0-alpha.60", - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "@ogre-tools/injectable-extension-for-mobx": "^17.2.0", - "@ogre-tools/injectable-react": "^17.2.0", - "@sentry/electron": "^3.0.8", - "@sentry/integrations": "^6.19.3", - "ansi_up": "^5.2.1", - "auto-bind": "^4.0.0", - "await-lock": "^2.2.2", - "byline": "^5.0.0", - "chalk": "^4.1.2", - "chart.js": "^2.9.4", - "chokidar": "^3.5.3", - "color": "^3.2.1", - "conf": "^10.2.0", - "crypto-js": "^4.1.1", - "dompurify": "^2.4.4", - "electron-devtools-installer": "^3.2.0", - "electron-updater": "^4.6.5", - "electron-window-state": "^5.0.3", - "fs-extra": "^9.0.1", - "glob-to-regexp": "^0.4.1", - "grapheme-splitter": "^1.0.4", - "handlebars": "^4.7.7", - "history": "^4.10.1", - "hpagent": "^1.2.0", - "http-proxy": "^1.18.1", - "immer": "^9.0.21", - "joi": "^17.9.1", - "js-yaml": "^4.1.0", - "lodash": "^4.17.15", - "marked": "^4.2.12", - "mobx": "^6.9.0", - "mobx-observable-history": "^2.0.3", - "mobx-react": "^7.6.0", - "mobx-utils": "^6.0.4", - "moment": "^2.29.4", - "moment-timezone": "^0.5.40", - "monaco-editor": "^0.38.0", - "node-pty": "0.10.1", - "npm": "^9.6.7", - "p-limit": "^3.1.0", - "path-to-regexp": "^6.2.0", - "proper-lockfile": "^4.1.2", - "query-string": "^7.1.3", - "randomcolor": "^0.6.2", - "react": "^17.0.2", - "react-beautiful-dnd": "^13.1.1", - "react-dom": "^17.0.2", - "react-material-ui-carousel": "^2.3.11", - "react-router": "^5.3.4", - "react-router-dom": "^5.3.4", - "react-select": "^5.7.0", - "react-select-event": "^5.5.1", - "react-table": "^7.8.0", - "react-virtualized-auto-sizer": "^1.0.7", - "react-window": "^1.8.8", - "readable-stream": "^3.6.2", - "rfc6902": "^5.0.1", - "selfsigned": "^2.1.1", - "semver": "^7.3.8", - "stoppable": "^1.1.0", - "tar": "^6.1.13", - "tcp-port-used": "^1.0.2", - "tempy": "1.0.1", - "type-fest": "^2.14.0", - "typed-emitter": "^1.4.0", - "typed-regex": "^0.0.8", - "url-parse": "^1.5.10", - "uuid": "^8.3.2", - "win-ca": "^3.5.0", - "winston": "^3.8.2", - "winston-transport-browserconsole": "^1.0.5", - "ws": "^8.12.1", - "xterm": "^4.19.0", - "xterm-addon-fit": "^0.5.0", - "xterm-link-provider": "^1.3.1" - }, - "devDependencies": { - "@electron/notarize": "^1.2.3", - "@electron/rebuild": "^3.2.10", - "@k8slens/generate-tray-icons": "^6.5.0", - "@k8slens/test-utils": "^1.0.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", - "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.53", - "@swc/jest": "^0.2.26", - "@types/byline": "^4.2.33", - "@types/chart.js": "^2.9.36", - "@types/color": "^3.0.3", - "@types/crypto-js": "^3.1.47", - "@types/lodash": "^4.14.191", - "@types/node": "^16.18.25", - "@types/proper-lockfile": "^4.1.2", - "@types/react-dom": "^17.0.16", - "@types/react-router-dom": "^5.3.3", - "@types/react-virtualized-auto-sizer": "^1.0.1", - "@types/react-window": "^1.8.5", - "@types/request-promise-native": "^1.0.18", - "@types/tar": "^6.1.4", - "@types/tcp-port-used": "^1.0.1", - "@types/url-parse": "^1.4.8", - "@types/uuid": "^8.3.4", - "@types/webpack": "^5.28.1", - "@types/webpack-env": "^1.18.0", - "@types/webpack-node-externals": "2.5.3", - "circular-dependency-plugin": "^5.2.2", - "concurrently": "^7.6.0", - "copy-webpack-plugin": "^11.0.0", - "cross-env": "^7.0.3", - "css-loader": "^6.7.2", - "electron": "^22.3.10", - "electron-builder": "^23.6.0", - "esbuild-loader": "^2.20.0", - "fork-ts-checker-webpack-plugin": "^7.3.0", - "html-webpack-plugin": "^5.5.1", - "jest": "^29.5.0", - "jest-environment-jsdom": "^28.1.3", - "jsonfile": "^6.1.0", - "mini-css-extract-plugin": "^2.7.1", - "monaco-editor-webpack-plugin": "^7.0.1", - "node-loader": "^2.0.0", - "nodemon": "^2.0.20", - "playwright": "^1.33.0", - "rimraf": "^4.4.1", - "run-script-os": "^1.1.6", - "style-loader": "^3.3.1", - "tailwindcss": "^3.3.2", - "ts-loader": "^9.4.2", - "ts-node": "^10.9.1", - "typescript": "^4.9.5", - "typescript-plugin-css-modules": "^5.0.1", - "webpack": "^5.81.0", - "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.13.3", - "webpack-node-externals": "^3.0.0" - } -} diff --git a/open-lens/src/common/application-information.injectable.ts b/open-lens/src/common/application-information.injectable.ts deleted file mode 100644 index 55efe94023..0000000000 --- a/open-lens/src/common/application-information.injectable.ts +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import packageJson from "../../package.json"; -import { applicationInformationToken } from "@k8slens/application"; - -const applicationInformationInjectable = getInjectable({ - id: "application-information", - instantiate: () => { - const { - version, - config: { - bundledHelmVersion, - bundledKubectlVersion, - contentSecurityPolicy, - k8sProxyVersion, - sentryDsn, - welcomeRoute, - }, - productName, - build, - copyright, - description, - name, - dependencies, - } = packageJson; - - return { - version, - productName, - copyright, - description, - name, - k8sProxyVersion, - bundledKubectlVersion, - bundledHelmVersion, - sentryDsn, - contentSecurityPolicy, - welcomeRoute, - updatingIsEnabled: (build as any)?.publish?.length > 0, - dependencies, - }; - }, - causesSideEffects: true, - injectionToken: applicationInformationToken, -}); - -export default applicationInformationInjectable; diff --git a/open-lens/src/common/build-environment.injectable.ts b/open-lens/src/common/build-environment.injectable.ts deleted file mode 100644 index 790b4e3fcb..0000000000 --- a/open-lens/src/common/build-environment.injectable.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { lensBuildEnvironmentInjectionToken } from "@k8slens/application"; -import { getInjectable } from "@ogre-tools/injectable"; - -const lensBuildEnvironmentInjectable = getInjectable({ - id: "lens-build-environment", - instantiate: () => "unknown", - injectionToken: lensBuildEnvironmentInjectionToken, -}); - -export default lensBuildEnvironmentInjectable; diff --git a/open-lens/src/common/example-bundled-extension.injectable.ts b/open-lens/src/common/example-bundled-extension.injectable.ts deleted file mode 100644 index 8b65c985fb..0000000000 --- a/open-lens/src/common/example-bundled-extension.injectable.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { bundledExtensionInjectionToken } from "@k8slens/legacy-extensions"; -import { getInjectable } from "@ogre-tools/injectable"; -import exampleBundledExtensionManifest from "@k8slens/legacy-extension-example/package.json"; - -const exampleBundledExtensionInjectable = getInjectable({ - id: "example-bundled-extension", - instantiate: (di) => ({ - manifest: exampleBundledExtensionManifest, - /** - * Inline `require` is needed as to delay the loading and execution of the JS file until it is needed. - * - * Futhermore there might be code that runs "during load" and shouldn't be executed until everything is - * setup for the extensions (ie globals). - */ - main: () => require("@k8slens/legacy-extension-example/main").default, - renderer: () => require("@k8slens/legacy-extension-example/renderer").default, - }), - injectionToken: bundledExtensionInjectionToken, -}); - -export default exampleBundledExtensionInjectable; diff --git a/open-lens/src/main/index.ts b/open-lens/src/main/index.ts deleted file mode 100644 index 8a90aaca46..0000000000 --- a/open-lens/src/main/index.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { autoRegister } from "@ogre-tools/injectable-extension-for-auto-registration"; -import { runInAction } from "mobx"; -import { - mainExtensionApi as Main, - commonExtensionApi as Common, - registerLensCore, -} from "@k8slens/core/main"; -import { createContainer } from "@ogre-tools/injectable"; -import { registerMobX } from "@ogre-tools/injectable-extension-for-mobx"; -import { registerFeature } from "@k8slens/feature-core"; -import { applicationFeature, startApplicationInjectionToken } from '@k8slens/application' -import { applicationFeatureForElectronMain } from '@k8slens/application-for-electron-main' -import { messagingFeatureForMain } from "@k8slens/messaging-for-main"; -import { loggerFeature } from "@k8slens/logger"; -import { randomFeature } from "@k8slens/random"; -import { kubeApiSpecificsFeature } from "@k8slens/kube-api-specifics"; -import { prometheusFeature } from "@k8slens/prometheus"; - -const environment = "main"; - -const di = createContainer(environment, { - detectCycles: false, -}); - -registerMobX(di); - -runInAction(() => { - registerLensCore(di, environment); - - registerFeature( - di, - loggerFeature, - prometheusFeature, - applicationFeature, - applicationFeatureForElectronMain, - messagingFeatureForMain, - randomFeature, - kubeApiSpecificsFeature, - ); - - try { - autoRegister({ - di, - targetModule: module, - getRequireContexts: () => [ - require.context("./", true, CONTEXT_MATCHER_FOR_NON_FEATURES), - require.context("../common", true, CONTEXT_MATCHER_FOR_NON_FEATURES), - ], - }); - } catch (err) { - console.error(err); - process.exit(1); - } -}); - -const startApplication = di.inject(startApplicationInjectionToken); - -startApplication().catch((error) => { - console.error(error); - process.exit(1); -}) - -export { - Mobx, - Pty, -} from "@k8slens/core/main"; - -export const LensExtensions = { - Main, - Common, -} diff --git a/open-lens/src/main/node-env.injectable.ts b/open-lens/src/main/node-env.injectable.ts deleted file mode 100644 index 750c918555..0000000000 --- a/open-lens/src/main/node-env.injectable.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { getInjectable } from "@ogre-tools/injectable"; -import { nodeEnvInjectionToken } from "@k8slens/core/main"; - -export const nodeEnvInjectable = getInjectable({ - id: "node-env", - instantiate: () => process.env.NODE_ENV || "development", - injectionToken: nodeEnvInjectionToken, -}); diff --git a/open-lens/src/renderer/index.ts b/open-lens/src/renderer/index.ts deleted file mode 100644 index 4f7d664520..0000000000 --- a/open-lens/src/renderer/index.ts +++ /dev/null @@ -1,95 +0,0 @@ -import "@k8slens/core/styles"; -import "@k8slens/button/styles"; -import "@k8slens/error-boundary/styles"; -import "@k8slens/tooltip/styles"; -import "@k8slens/resizing-anchor/styles"; -import "@k8slens/icon/styles"; -import "@k8slens/animate/styles"; -import "@k8slens/notifications/styles"; -import "@k8slens/spinner/styles"; - -import { runInAction } from "mobx"; -import { - rendererExtensionApi as Renderer, - commonExtensionApi as Common, - registerLensCore, - metricsFeature, -} from "@k8slens/core/renderer"; -import { autoRegister } from "@ogre-tools/injectable-extension-for-auto-registration"; -import { registerFeature } from "@k8slens/feature-core"; -import { - applicationFeature, - startApplicationInjectionToken -} from "@k8slens/application"; -import { createContainer } from "@ogre-tools/injectable"; -import { registerMobX } from "@ogre-tools/injectable-extension-for-mobx"; -import { registerInjectableReact } from "@ogre-tools/injectable-react"; -import { messagingFeatureForRenderer } from "@k8slens/messaging-for-renderer"; -import { keyboardShortcutsFeature } from "@k8slens/keyboard-shortcuts"; -import { reactApplicationFeature } from "@k8slens/react-application"; -import { routingFeature } from "@k8slens/routing"; -import { loggerFeature } from "@k8slens/logger"; -import { animateFeature } from "@k8slens/animate"; -import { clusterSidebarFeature } from "@k8slens/cluster-sidebar"; -import { randomFeature } from "@k8slens/random"; -import { kubeApiSpecificsFeature } from "@k8slens/kube-api-specifics"; -import { notificationsFeature } from "@k8slens/notifications"; - -const environment = "renderer"; - -const di = createContainer(environment, { - detectCycles: false, -}); - -runInAction(() => { - registerMobX(di); - registerInjectableReact(di); - registerLensCore(di, environment); - - registerFeature( - di, - loggerFeature, - ); - - registerFeature( - di, - applicationFeature, - messagingFeatureForRenderer, - keyboardShortcutsFeature, - reactApplicationFeature, - routingFeature, - metricsFeature, - animateFeature, - clusterSidebarFeature, - randomFeature, - kubeApiSpecificsFeature, - notificationsFeature, - ); - - autoRegister({ - di, - targetModule: module, - getRequireContexts: () => [ - require.context("./", true, CONTEXT_MATCHER_FOR_NON_FEATURES), - require.context("../common", true, CONTEXT_MATCHER_FOR_NON_FEATURES), - ], - }); -}); - -const startApplication = di.inject(startApplicationInjectionToken); - -startApplication(); - -export { - React, - ReactDOM, - ReactRouter, - ReactRouterDom, - Mobx, - MobxReact, -} from "@k8slens/core/renderer"; - -export const LensExtensions = { - Renderer, - Common, -}; diff --git a/open-lens/src/renderer/node-env.injectable.ts b/open-lens/src/renderer/node-env.injectable.ts deleted file mode 100644 index 8c50e853f1..0000000000 --- a/open-lens/src/renderer/node-env.injectable.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { getInjectable } from "@ogre-tools/injectable"; -import { nodeEnvInjectionToken } from "@k8slens/core/renderer"; - -export const nodeEnvInjectable = getInjectable({ - id: "node-env", - instantiate: () => process.env.NODE_ENV || "development", - injectionToken: nodeEnvInjectionToken, -}); diff --git a/open-lens/static/splash.html b/open-lens/static/splash.html deleted file mode 100644 index 2327ecd63f..0000000000 --- a/open-lens/static/splash.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - -
-
-
- -
OpenLens
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Loading... -
-
-
-
- - diff --git a/open-lens/tsconfig.json b/open-lens/tsconfig.json deleted file mode 100644 index cae9c9b2e0..0000000000 --- a/open-lens/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "baseUrl": ".", - "paths": { - "*": [ - "node_modules/*", - ] - }, - "plugins": [ - { - "name": "typescript-plugin-css-modules" - } - ] - }, - "include": [ - "src/**/*", - "../packages/core/types/*.d.ts" - ], - "exclude": [ - "out", - "dist", - "coverage", - "binaries", - "static" - ] -} diff --git a/open-lens/webpack/dev-server.ts b/open-lens/webpack/dev-server.ts deleted file mode 100644 index 0e437ac6b4..0000000000 --- a/open-lens/webpack/dev-server.ts +++ /dev/null @@ -1,45 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import Webpack from "webpack"; -import WebpackDevServer from "webpack-dev-server"; -import renderer from "./renderer"; -import { buildDir, webpackDevServerPort } from "./vars"; - -/** - * API docs: - * @url https://webpack.js.org/configuration/dev-server/ - * @url https://github.com/chimurai/http-proxy-middleware - */ -const compiler = Webpack(renderer); - -const server = new WebpackDevServer({ - setupExitSignals: true, - headers: { - "Access-Control-Allow-Origin": "*", - }, - allowedHosts: ".lens.app", - host: "localhost", - port: webpackDevServerPort, - static: buildDir, // aka `devServer.contentBase` in webpack@4 - hot: "only", // use HMR only without errors - liveReload: false, - devMiddleware: { - writeToDisk: true, - index: "index.html", - publicPath: "/build", - }, - proxy: { - "^/$": "/build/", - }, - client: { - overlay: false, // don't show warnings and errors on top of rendered app view - logging: "error", - }, -}, compiler); - -console.info(`[WEBPACK-DEV-SERVER]: created with options`, server.options); - -server.start(); diff --git a/open-lens/webpack/main.ts b/open-lens/webpack/main.ts deleted file mode 100644 index 277fc1b785..0000000000 --- a/open-lens/webpack/main.ts +++ /dev/null @@ -1,59 +0,0 @@ -import path from "path"; -import type webpack from "webpack"; -import { DefinePlugin } from "webpack"; -import nodeExternals from "webpack-node-externals"; -import { iconsAndImagesWebpackRules } from "./renderer"; -import { buildDir, isDevelopment, mainDir } from "./vars"; -import { platform } from "process"; - -const main: webpack.Configuration = ({ - name: "lens-app-main", - context: __dirname, - target: "electron-main", - mode: isDevelopment ? "development" : "production", - devtool: isDevelopment ? "cheap-module-source-map" : "source-map", - cache: isDevelopment ? { type: "filesystem" } : false, - entry: { - main: path.resolve(mainDir, "index.ts"), - }, - output: { - libraryTarget: "global", - path: buildDir, - }, - optimization: { - minimize: false, - }, - resolve: { - extensions: [".json", ".js", ".ts"], - }, - externals: [ - nodeExternals({ modulesFromFile: true }), - ], - module: { - parser: { - javascript: { - commonjsMagicComments: true, - }, - }, - rules: [ - { - test: /\.node$/, - use: "node-loader", - }, - { - test: /\.ts$/, - loader: "ts-loader", - options: {}, - }, - ...iconsAndImagesWebpackRules(), - ], - }, - plugins: [ - new DefinePlugin({ - CONTEXT_MATCHER_FOR_NON_FEATURES: `/\\.injectable\\.tsx?$/`, - CONTEXT_MATCHER_FOR_FEATURES: `/\\/(renderer|common)\\/.+\\.injectable\\.tsx?$/`, - }), - ], -}); - -export default main; diff --git a/open-lens/webpack/renderer.ts b/open-lens/webpack/renderer.ts deleted file mode 100644 index fd867159f9..0000000000 --- a/open-lens/webpack/renderer.ts +++ /dev/null @@ -1,200 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import path from "path"; -import type webpack from "webpack"; -import HtmlWebpackPlugin from "html-webpack-plugin"; -import MiniCssExtractPlugin from "mini-css-extract-plugin"; -import ForkTsCheckerPlugin from "fork-ts-checker-webpack-plugin"; -import MonacoWebpackPlugin from "monaco-editor-webpack-plugin"; -import CircularDependencyPlugin from "circular-dependency-plugin"; -import ReactRefreshWebpackPlugin from "@pmmmwh/react-refresh-webpack-plugin"; -import CopyPlugin from "copy-webpack-plugin"; -import type { WebpackPluginInstance } from "webpack"; -import { DefinePlugin } from "webpack"; -import { - assetsFolderName, - isDevelopment, - rendererDir, - buildDir, - htmlTemplate, - publicPath, -} from "./vars"; -import corePackageJson from "@k8slens/core/package.json"; - -const renderer: webpack.Configuration = { - target: "electron-renderer", - name: "lens-app-renderer", - mode: isDevelopment ? "development" : "production", - // https://webpack.js.org/configuration/devtool/ (see description of each option) - devtool: isDevelopment ? "cheap-module-source-map" : "source-map", - cache: isDevelopment ? { type: "filesystem" } : false, - entry: { - lens: path.resolve(rendererDir, "index.ts"), - }, - output: { - libraryTarget: "global", - globalObject: "this", - publicPath, - path: buildDir, - filename: "[name].js", - chunkFilename: "chunks/[name].js", - assetModuleFilename: `${assetsFolderName}/[name][ext][query]`, - }, - watchOptions: { - ignored: /node_modules/, // https://webpack.js.org/configuration/watch/ - }, - ignoreWarnings: [ - /Critical dependency: the request of a dependency is an expression/, - /require.extensions is not supported by webpack./, // handlebars - /\[ReactRefreshPlugin] .*?HMR.*? is not enabled/, // enabled in webpack.dev-server - ], - resolve: { - extensions: [".js", ".jsx", ".json", ".ts", ".tsx"], - }, - externals: ["npm", "win-ca"], - optimization: { - minimize: false, - }, - module: { - parser: { - javascript: { - commonjsMagicComments: true, - }, - }, - rules: [ - { - test: /\.node$/, - use: "node-loader", - }, - { - test: /\.tsx?$/, - loader: "ts-loader", - options: {}, - }, - cssModulesWebpackRule(), - ...iconsAndImagesWebpackRules(), - ...fontsLoaderWebpackRules(), - ], - }, - - plugins: [ - new DefinePlugin({ - CONTEXT_MATCHER_FOR_NON_FEATURES: `/\\.injectable\\.tsx?$/`, - CONTEXT_MATCHER_FOR_FEATURES: `/\\/(renderer|common)\\/.+\\.injectable\\.tsx?$/`, - }), - new ForkTsCheckerPlugin(), - - // see also: https://github.com/Microsoft/monaco-editor-webpack-plugin#options - new MonacoWebpackPlugin({ - // publicPath: "/", - // filename: "[name].worker.js", - languages: ["json", "yaml"], - globalAPI: isDevelopment, - }), - - new HtmlWebpackPlugin({ - filename: "index.html", - template: htmlTemplate, - inject: true, - hash: true, - templateParameters: { - assetPath: `${publicPath}${assetsFolderName}`, - }, - }), - - new CircularDependencyPlugin({ - cwd: __dirname, - exclude: /node_modules/, - failOnError: true, - }) as unknown as WebpackPluginInstance, - - new MiniCssExtractPlugin({ - filename: "[name].css", - }), - - new CopyPlugin({ - patterns: [ - { - from: path.resolve( - path.dirname(require.resolve("@k8slens/core/package.json")), - corePackageJson.exports["./fonts"] - ), - to: "fonts/[name][ext]", - }, - ], - }), - - ...(isDevelopment ? [new ReactRefreshWebpackPlugin()] : []), - ], -}; - -/** - * Import icons and image files. - * Read more about asset types: https://webpack.js.org/guides/asset-modules/ - */ -export function iconsAndImagesWebpackRules(): webpack.RuleSetRule[] { - return [ - { - test: /\.svg$/, - type: "asset/source", // exports the source code of the asset, so we get XML - }, - { - test: /\.(jpg|png|ico)$/, - type: "asset/resource", - generator: { - filename: "images/[name][ext]", - }, - }, - ]; -} - -/** - * Import custom fonts as URL. - */ -export function fontsLoaderWebpackRules(): webpack.RuleSetRule[] { - return [ - { - test: /\.(ttf|eot|woff2?)$/, - type: "asset/resource", - generator: { - filename: "fonts/[name][ext]", - }, - }, - ]; -} - -export interface CssModulesWebpackRuleOptions { - styleLoader?: string; -} - -/** - * Import CSS or SASS styles with modules support (*.module.scss) - */ -export function cssModulesWebpackRule({ - styleLoader, -}: CssModulesWebpackRuleOptions = {}): webpack.RuleSetRule { - styleLoader ??= isDevelopment ? "style-loader" : MiniCssExtractPlugin.loader; - - return { - test: /\.s?css$/, - use: [ - styleLoader, - { - loader: "css-loader", - options: { - sourceMap: isDevelopment, - modules: { - auto: /\.module\./i, // https://github.com/webpack-contrib/css-loader#auto - mode: "local", // :local(.selector) by default - localIdentName: "[name]__[local]--[hash:base64:5]", - }, - }, - }, - ], - }; -} - -export default renderer; diff --git a/open-lens/webpack/vars.ts b/open-lens/webpack/vars.ts deleted file mode 100644 index 6d5a2dcab3..0000000000 --- a/open-lens/webpack/vars.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import assert from "assert"; -import path from "path"; - -export const isDevelopment = process.env.NODE_ENV !== "production"; -export const mainDir = path.join(process.cwd(), "src", "main"); -export const buildDir = path.join(process.cwd(), "static", "build"); -export const assetsFolderName = "assets"; -export const rendererDir = path.join(process.cwd(), "src", "renderer"); -export const publicPath = "/build/"; -export const webpackDevServerPort = Number(process.env.WEBPACK_DEV_SERVER_PORT) || 9191; -export const htmlTemplate = require.resolve("@k8slens/core/template.html"); -export const sassCommonVars = require.resolve("@k8slens/core/vars.scss"); - -assert(Number.isInteger(webpackDevServerPort), "WEBPACK_DEV_SERVER_PORT environment variable must only be an integer"); diff --git a/open-lens/webpack/webpack.ts b/open-lens/webpack/webpack.ts deleted file mode 100644 index fcc6e20eae..0000000000 --- a/open-lens/webpack/webpack.ts +++ /dev/null @@ -1,4 +0,0 @@ -import main from "./main"; -import renderer from "./renderer"; - -export default [main, renderer]; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 9278ce31fd..0000000000 --- a/package-lock.json +++ /dev/null @@ -1,36010 +0,0 @@ -{ - "name": "lens-monorepo", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "lens-monorepo", - "hasInstallScript": true, - "workspaces": [ - "packages/**/*", - "open-lens" - ], - "devDependencies": { - "@ogre-tools/linkable": "^17.2.0", - "adr": "^1.4.3", - "cross-env": "^7.0.3", - "lerna": "^6.6.1", - "npm": "^9.6.7", - "rimraf": "^4.4.1" - }, - "engines": { - "npm": "^9.6.7" - } - }, - "node_modules/@adobe/css-tools": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz", - "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==" - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@astronautlabs/jsonpath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@astronautlabs/jsonpath/-/jsonpath-1.1.0.tgz", - "integrity": "sha512-I4sckUQNYEeF4w6AkujiRblVzC0jo3ja+bxKHB1M2aFiaBjevSGlBdgZ80PgCX5sj65/AhKSFN9+cT908avBlQ==", - "dependencies": { - "@types/esprima": "^4.0.2", - "@types/mkdirp": "^1.0.0", - "esprima": "1.2.2", - "static-eval": "2.0.2", - "underscore": "1.7.0" - } - }, - "node_modules/@async-fn/jest": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/@async-fn/jest/-/jest-1.6.4.tgz", - "integrity": "sha512-m3T/m6a39f5dbqFj79BGCqudkm42McgMXD7M0ZorKeqqdAbNazay7t+VDOz5qqFHO12frFbbhAB5GnFPoGADPA==", - "peerDependencies": { - "jest": ">= 24.9.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.9.tgz", - "integrity": "sha512-FUGed8kfhyWvbYug/Un/VPJD41rDIgoVVcR+FuzhzOYyRz5uED+Gd3SLZml0Uw2l2aHFb7ZgdW5mGA3G2cCCnQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", - "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helpers": "^7.21.5", - "@babel/parser": "^7.21.8", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/eslint-parser": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.8.tgz", - "integrity": "sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ==", - "peer": true, - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.11.0", - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.9.tgz", - "integrity": "sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg==", - "dependencies": { - "@babel/types": "^7.21.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "peer": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", - "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", - "peer": true, - "dependencies": { - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", - "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", - "dependencies": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", - "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", - "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "peer": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", - "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", - "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", - "peer": true, - "dependencies": { - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", - "dependencies": { - "@babel/types": "^7.21.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", - "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "peer": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", - "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", - "peer": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", - "dependencies": { - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "peer": true, - "dependencies": { - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "peer": true, - "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.9.tgz", - "integrity": "sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "peer": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz", - "integrity": "sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==", - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/plugin-syntax-decorators": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz", - "integrity": "sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.21.4.tgz", - "integrity": "sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", - "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", - "peer": true, - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", - "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/template": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "peer": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz", - "integrity": "sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-flow": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", - "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "peer": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", - "peer": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", - "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", - "peer": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-simple-access": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", - "peer": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "peer": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz", - "integrity": "sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", - "peer": true, - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", - "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", - "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "regenerator-transform": "^0.15.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz", - "integrity": "sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==", - "peer": true, - "dependencies": { - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", - "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", - "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz", - "integrity": "sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==", - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", - "@babel/plugin-proposal-async-generator-functions": "^7.20.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.21.0", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.21.5", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.21.5", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.5", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-modules-systemjs": "^7.20.11", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.21.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.21.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.21.5", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.5", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz", - "integrity": "sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-typescript": "^7.21.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "peer": true - }, - "node_modules/@babel/runtime": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", - "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", - "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/parser": "^7.21.9", - "@babel/types": "^7.21.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", - "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.5", - "@babel/types": "^7.21.5", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", - "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", - "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "devOptional": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "devOptional": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@develar/schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", - "dev": true, - "dependencies": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@develar/schema-utils/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/@develar/schema-utils/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/@develar/schema-utils/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/@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==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@electron/get": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", - "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", - "dependencies": { - "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", - "progress": "^2.0.3", - "semver": "^6.2.0", - "sumchecker": "^3.0.1" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "global-agent": "^3.0.0" - } - }, - "node_modules/@electron/get/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@electron/get/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@electron/get/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@electron/get/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@electron/notarize": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.3.tgz", - "integrity": "sha512-9oRzT56rKh5bspk3KpAVF8lPKHYQrBnRwcgiOeR0hdilVEQmszDaAu0IPCPrwwzJN0ugNs0rRboTreHMt/6mBQ==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.1" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@electron/rebuild": { - "version": "3.2.13", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.2.13.tgz", - "integrity": "sha512-DH9Ol4JCnHDYVOD0fKWq+Qqbn/0WU1O6QR0mIpMXEVU4YFM4PlaqNC9K36mGShNBxxGFotZCMDrB1wl/iHM12g==", - "dev": true, - "dependencies": { - "@malept/cross-spawn-promise": "^2.0.0", - "chalk": "^4.0.0", - "debug": "^4.1.1", - "detect-libc": "^2.0.1", - "fs-extra": "^10.0.0", - "got": "^11.7.0", - "node-abi": "^3.0.0", - "node-api-version": "^0.1.4", - "node-gyp": "^9.0.0", - "ora": "^5.1.0", - "semver": "^7.3.5", - "tar": "^6.0.5", - "yargs": "^17.0.1" - }, - "bin": { - "electron-rebuild": "lib/cli.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/@electron/rebuild/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@electron/universal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.2.1.tgz", - "integrity": "sha512-7323HyMh7KBAl/nPDppdLsC87G6RwRU02dy5FPeGB1eS7rUePh55+WNWiDPLhFQqqVPHzh77M69uhmoT8XnwMQ==", - "dev": true, - "dependencies": { - "@malept/cross-spawn-promise": "^1.1.0", - "asar": "^3.1.0", - "debug": "^4.3.1", - "dir-compare": "^2.4.0", - "fs-extra": "^9.0.1", - "minimatch": "^3.0.4", - "plist": "^3.0.4" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/@electron/universal/node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", - "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" - }, - "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/@emotion/babel-plugin/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", - "dependencies": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "node_modules/@emotion/react": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.0.tgz", - "integrity": "sha512-ZSK3ZJsNkwfjT3JpDAWJZlrGD81Z3ytNDsxw1LKq1o+xkmO5pnWfr6gmCC8gHEFf3nSSX/09YrG67jybNPxSUw==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.2", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", - "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", - "dependencies": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/serialize/node_modules/@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" - }, - "node_modules/@emotion/serialize/node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "node_modules/@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" - }, - "node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" - }, - "node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.2", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/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==" - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", - "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.6.tgz", - "integrity": "sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg==" - }, - "node_modules/@floating-ui/dom": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.8.tgz", - "integrity": "sha512-XLwhYV90MxiHDq6S0rzFZj00fnDM+A1R9jhSioZoMsa7G0Q0i+Q4x40ajR8FHSdYDE1bgjG45mIWe6jtv9UPmg==", - "dependencies": { - "@floating-ui/core": "^1.2.6" - } - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "node_modules/@hapi/b64": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@hapi/b64/-/b64-5.0.0.tgz", - "integrity": "sha512-ngu0tSEmrezoiIaNGG6rRvKOUkUuDdf4XTPnONHGYfSGRmDqPZX5oJL6HAdKTo1UQHECbdB4OzhWrfgVppjHUw==", - "dependencies": { - "@hapi/hoek": "9.x.x" - } - }, - "node_modules/@hapi/b64/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@hapi/boom": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-10.0.1.tgz", - "integrity": "sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA==", - "dependencies": { - "@hapi/hoek": "^11.0.2" - } - }, - "node_modules/@hapi/bourne": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.1.0.tgz", - "integrity": "sha512-i1BpaNDVLJdRBEKeJWkVO6tYX6DMFBuwMhSuWqLsY4ufeTKGVuV5rBsUhxPayXqnnWHgXUAmWK16H/ykO5Wj4Q==" - }, - "node_modules/@hapi/call": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@hapi/call/-/call-9.0.1.tgz", - "integrity": "sha512-uPojQRqEL1GRZR4xXPqcLMujQGaEpyVPRyBlD8Pp5rqgIwLhtveF9PkixiKru2THXvuN8mUrLeet5fqxKAAMGg==", - "dependencies": { - "@hapi/boom": "^10.0.1", - "@hapi/hoek": "^11.0.2" - } - }, - "node_modules/@hapi/content": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@hapi/content/-/content-5.0.2.tgz", - "integrity": "sha512-mre4dl1ygd4ZyOH3tiYBrOUBzV7Pu/EOs8VLGf58vtOEECWed8Uuw6B4iR9AN/8uQt42tB04qpVaMyoMQh0oMw==", - "dependencies": { - "@hapi/boom": "9.x.x" - } - }, - "node_modules/@hapi/content/node_modules/@hapi/boom": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", - "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", - "dependencies": { - "@hapi/hoek": "9.x.x" - } - }, - "node_modules/@hapi/content/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@hapi/file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@hapi/file/-/file-2.0.0.tgz", - "integrity": "sha512-WSrlgpvEqgPWkI18kkGELEZfXr0bYLtr16iIN4Krh9sRnzBZN6nnWxHFxtsnP684wueEySBbXPDg/WfA9xJdBQ==" - }, - "node_modules/@hapi/hoek": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-11.0.2.tgz", - "integrity": "sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw==" - }, - "node_modules/@hapi/nigel": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@hapi/nigel/-/nigel-4.0.2.tgz", - "integrity": "sha512-ht2KoEsDW22BxQOEkLEJaqfpoKPXxi7tvabXy7B/77eFtOyG5ZEstfZwxHQcqAiZhp58Ae5vkhEqI03kawkYNw==", - "dependencies": { - "@hapi/hoek": "^9.0.4", - "@hapi/vise": "^4.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@hapi/nigel/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@hapi/pez": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/pez/-/pez-5.1.0.tgz", - "integrity": "sha512-YfB0btnkLB3lb6Ry/1KifnMPBm5ZPfaAHWFskzOMAgDgXgcBgA+zjpIynyEiBfWEz22DBT8o1e2tAaBdlt8zbw==", - "dependencies": { - "@hapi/b64": "5.x.x", - "@hapi/boom": "9.x.x", - "@hapi/content": "^5.0.2", - "@hapi/hoek": "9.x.x", - "@hapi/nigel": "4.x.x" - } - }, - "node_modules/@hapi/pez/node_modules/@hapi/boom": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", - "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", - "dependencies": { - "@hapi/hoek": "9.x.x" - } - }, - "node_modules/@hapi/pez/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@hapi/subtext": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@hapi/subtext/-/subtext-7.1.0.tgz", - "integrity": "sha512-n94cU6hlvsNRIpXaROzBNEJGwxC+HA69q769pChzej84On8vsU14guHDub7Pphr/pqn5b93zV3IkMPDU5AUiXA==", - "dependencies": { - "@hapi/boom": "9.x.x", - "@hapi/bourne": "2.x.x", - "@hapi/content": "^5.0.2", - "@hapi/file": "2.x.x", - "@hapi/hoek": "9.x.x", - "@hapi/pez": "^5.1.0", - "@hapi/wreck": "17.x.x" - } - }, - "node_modules/@hapi/subtext/node_modules/@hapi/boom": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", - "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", - "dependencies": { - "@hapi/hoek": "9.x.x" - } - }, - "node_modules/@hapi/subtext/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@hapi/topo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@hapi/topo/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@hapi/vise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@hapi/vise/-/vise-4.0.0.tgz", - "integrity": "sha512-eYyLkuUiFZTer59h+SGy7hUm+qE9p+UemePTHLlIWppEd+wExn3Df5jO04bFQTm7nleF5V8CtuYQYb+VFpZ6Sg==", - "dependencies": { - "@hapi/hoek": "9.x.x" - } - }, - "node_modules/@hapi/vise/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@hapi/wreck": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@hapi/wreck/-/wreck-17.2.0.tgz", - "integrity": "sha512-pJ5kjYoRPYDv+eIuiLQqhGon341fr2bNIYZjuotuPJG/3Ilzr/XtI+JAp0A86E2bYfsS3zBPABuS2ICkaXFT8g==", - "dependencies": { - "@hapi/boom": "9.x.x", - "@hapi/bourne": "2.x.x", - "@hapi/hoek": "9.x.x" - } - }, - "node_modules/@hapi/wreck/node_modules/@hapi/boom": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", - "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", - "dependencies": { - "@hapi/hoek": "9.x.x" - } - }, - "node_modules/@hapi/wreck/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" - }, - "node_modules/@hutson/parse-repository-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", - "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", - "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", - "dependencies": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", - "dependencies": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.5.0", - "jest-config": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-resolve-dependencies": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "jest-watcher": "^29.5.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", - "dependencies": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/@jest/create-cache-key-function": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz", - "integrity": "sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ==", - "dev": true, - "dependencies": { - "@jest/types": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/create-cache-key-function/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/create-cache-key-function/node_modules/@types/yargs": { - "version": "16.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", - "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/environment": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", - "dependencies": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "jest-mock": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", - "dependencies": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", - "dependencies": { - "jest-get-type": "^29.4.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", - "dependencies": { - "@jest/types": "^29.5.0", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/types": "^29.5.0", - "jest-mock": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", - "dependencies": { - "@sinclair/typebox": "^0.25.16" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", - "dependencies": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", - "dependencies": { - "@jest/test-result": "^29.5.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", - "dependencies": { - "@jest/schemas": "^29.4.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "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==", - "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==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", - "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==" - }, - "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==", - "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==" - }, - "node_modules/@k8slens/animate": { - "resolved": "packages/ui-components/animate", - "link": true - }, - "node_modules/@k8slens/application": { - "resolved": "packages/technical-features/application/agnostic", - "link": true - }, - "node_modules/@k8slens/application-for-electron-main": { - "resolved": "packages/technical-features/application/electron-main", - "link": true - }, - "node_modules/@k8slens/button": { - "resolved": "packages/ui-components/button", - "link": true - }, - "node_modules/@k8slens/cluster-settings": { - "resolved": "packages/cluster-settings", - "link": true - }, - "node_modules/@k8slens/cluster-sidebar": { - "resolved": "packages/cluster-sidebar", - "link": true - }, - "node_modules/@k8slens/computed-channel": { - "resolved": "packages/technical-features/messaging/computed-channel", - "link": true - }, - "node_modules/@k8slens/core": { - "resolved": "packages/core", - "link": true - }, - "node_modules/@k8slens/ensure-binaries": { - "resolved": "packages/ensure-binaries", - "link": true - }, - "node_modules/@k8slens/error-boundary": { - "resolved": "packages/ui-components/error-boundary", - "link": true - }, - "node_modules/@k8slens/eslint-config": { - "resolved": "packages/infrastructure/eslint-config", - "link": true - }, - "node_modules/@k8slens/event-emitter": { - "resolved": "packages/utility-features/event-emitter", - "link": true - }, - "node_modules/@k8slens/extensions": { - "resolved": "packages/extension-api", - "link": true - }, - "node_modules/@k8slens/feature-core": { - "resolved": "packages/technical-features/feature-core", - "link": true - }, - "node_modules/@k8slens/generate-tray-icons": { - "resolved": "packages/generate-tray-icons", - "link": true - }, - "node_modules/@k8slens/icon": { - "resolved": "packages/ui-components/icon", - "link": true - }, - "node_modules/@k8slens/jest": { - "resolved": "packages/infrastructure/jest", - "link": true - }, - "node_modules/@k8slens/json-api": { - "resolved": "packages/utility-features/json-api", - "link": true - }, - "node_modules/@k8slens/keyboard-shortcuts": { - "resolved": "packages/business-features/keyboard-shortcuts", - "link": true - }, - "node_modules/@k8slens/kube-api": { - "resolved": "packages/utility-features/kube-api", - "link": true - }, - "node_modules/@k8slens/kube-api-specifics": { - "resolved": "packages/utility-features/kube-api-specifics", - "link": true - }, - "node_modules/@k8slens/kube-object": { - "resolved": "packages/kube-object", - "link": true - }, - "node_modules/@k8slens/kubectl-versions": { - "resolved": "packages/kubectl-versions", - "link": true - }, - "node_modules/@k8slens/legacy-extension-example": { - "resolved": "packages/legacy-extension-example", - "link": true - }, - "node_modules/@k8slens/legacy-extensions": { - "resolved": "packages/technical-features/application/legacy-extensions", - "link": true - }, - "node_modules/@k8slens/legacy-global-di": { - "resolved": "packages/legacy-global-di", - "link": true - }, - "node_modules/@k8slens/list-layout": { - "resolved": "packages/list-layout", - "link": true - }, - "node_modules/@k8slens/logger": { - "resolved": "packages/logger", - "link": true - }, - "node_modules/@k8slens/messaging": { - "resolved": "packages/technical-features/messaging/agnostic", - "link": true - }, - "node_modules/@k8slens/messaging-fake-bridge": { - "resolved": "packages/technical-features/messaging/message-bridge-fake", - "link": true - }, - "node_modules/@k8slens/messaging-for-main": { - "resolved": "packages/technical-features/messaging/electron/main", - "link": true - }, - "node_modules/@k8slens/messaging-for-renderer": { - "resolved": "packages/technical-features/messaging/electron/renderer", - "link": true - }, - "node_modules/@k8slens/metrics": { - "resolved": "packages/metrics", - "link": true - }, - "node_modules/@k8slens/node-fetch": { - "resolved": "packages/node-fetch", - "link": true - }, - "node_modules/@k8slens/notifications": { - "resolved": "packages/ui-components/notifications", - "link": true - }, - "node_modules/@k8slens/prometheus": { - "resolved": "packages/technical-features/prometheus", - "link": true - }, - "node_modules/@k8slens/random": { - "resolved": "packages/random-id", - "link": true - }, - "node_modules/@k8slens/react-application": { - "resolved": "packages/technical-features/react-application", - "link": true - }, - "node_modules/@k8slens/react-testing-library-discovery": { - "resolved": "packages/utility-features/react-testing-library-discovery", - "link": true - }, - "node_modules/@k8slens/release-tool": { - "resolved": "packages/release-tool", - "link": true - }, - "node_modules/@k8slens/resizing-anchor": { - "resolved": "packages/ui-components/resizing-anchor", - "link": true - }, - "node_modules/@k8slens/resource-templates": { - "resolved": "packages/resource-templates", - "link": true - }, - "node_modules/@k8slens/routing": { - "resolved": "packages/routing", - "link": true - }, - "node_modules/@k8slens/run-many": { - "resolved": "packages/utility-features/run-many", - "link": true - }, - "node_modules/@k8slens/semver": { - "resolved": "packages/semver", - "link": true - }, - "node_modules/@k8slens/spinner": { - "resolved": "packages/ui-components/spinner", - "link": true - }, - "node_modules/@k8slens/startable-stoppable": { - "resolved": "packages/utility-features/startable-stoppable", - "link": true - }, - "node_modules/@k8slens/test-utils": { - "resolved": "packages/utility-features/test-utils", - "link": true - }, - "node_modules/@k8slens/tooltip": { - "resolved": "packages/ui-components/tooltip", - "link": true - }, - "node_modules/@k8slens/typescript": { - "resolved": "packages/infrastructure/typescript", - "link": true - }, - "node_modules/@k8slens/utilities": { - "resolved": "packages/utility-features/utilities", - "link": true - }, - "node_modules/@k8slens/webpack": { - "resolved": "packages/infrastructure/webpack", - "link": true - }, - "node_modules/@kubernetes/client-node": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.18.1.tgz", - "integrity": "sha512-F3JiK9iZnbh81O/da1tD0h8fQMi/MDttWc/JydyUVnjPEom55wVfnpl4zQ/sWD4uKB8FlxYRPiLwV2ZXB+xPKw==", - "dependencies": { - "@types/js-yaml": "^4.0.1", - "@types/node": "^18.11.17", - "@types/request": "^2.47.1", - "@types/ws": "^8.5.3", - "byline": "^5.0.0", - "isomorphic-ws": "^5.0.0", - "js-yaml": "^4.1.0", - "jsonpath-plus": "^7.2.0", - "request": "^2.88.0", - "rfc4648": "^1.3.0", - "stream-buffers": "^3.0.2", - "tar": "^6.1.11", - "tmp-promise": "^3.0.2", - "tslib": "^2.4.1", - "underscore": "^1.13.6", - "ws": "^8.11.0" - }, - "optionalDependencies": { - "openid-client": "^5.3.0" - } - }, - "node_modules/@kubernetes/client-node/node_modules/@types/node": { - "version": "18.16.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.14.tgz", - "integrity": "sha512-+ImzUB3mw2c5ISJUq0punjDilUQ5GnUim0ZRvchHIWJmOC0G+p0kzhXBqj6cDjK0QdPFwzrHWgrJp3RPvCG5qg==" - }, - "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/@lerna/child-process": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-6.6.2.tgz", - "integrity": "sha512-QyKIWEnKQFnYu2ey+SAAm1A5xjzJLJJj3bhIZd3QKyXKKjaJ0hlxam/OsWSltxTNbcyH1jRJjC6Cxv31usv0Ag==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "execa": "^5.0.0", - "strong-log-transformer": "^2.1.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - } - }, - "node_modules/@lerna/child-process/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/@lerna/child-process/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/@lerna/child-process/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/@lerna/child-process/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/@lerna/create": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/@lerna/create/-/create-6.6.2.tgz", - "integrity": "sha512-xQ+1Y7D+9etvUlE+unhG/TwmM6XBzGIdFBaNoW8D8kyOa9M2Jf3vdEtAxVa7mhRz66CENfhL/+I/QkVaa7pwbQ==", - "dev": true, - "dependencies": { - "@lerna/child-process": "6.6.2", - "dedent": "^0.7.0", - "fs-extra": "^9.1.0", - "init-package-json": "^3.0.2", - "npm-package-arg": "8.1.1", - "p-reduce": "^2.1.0", - "pacote": "15.1.1", - "pify": "^5.0.0", - "semver": "^7.3.4", - "slash": "^3.0.0", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0", - "yargs-parser": "20.2.4" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - } - }, - "node_modules/@lerna/create/node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@lerna/legacy-package-management": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/@lerna/legacy-package-management/-/legacy-package-management-6.6.2.tgz", - "integrity": "sha512-0hZxUPKnHwehUO2xC4ldtdX9bW0W1UosxebDIQlZL2STnZnA2IFmIk2lJVUyFW+cmTPQzV93jfS0i69T9Z+teg==", - "dev": true, - "dependencies": { - "@npmcli/arborist": "6.2.3", - "@npmcli/run-script": "4.1.7", - "@nrwl/devkit": ">=15.5.2 < 16", - "@octokit/rest": "19.0.3", - "byte-size": "7.0.0", - "chalk": "4.1.0", - "clone-deep": "4.0.1", - "cmd-shim": "5.0.0", - "columnify": "1.6.0", - "config-chain": "1.1.12", - "conventional-changelog-core": "4.2.4", - "conventional-recommended-bump": "6.1.0", - "cosmiconfig": "7.0.0", - "dedent": "0.7.0", - "dot-prop": "6.0.1", - "execa": "5.0.0", - "file-url": "3.0.0", - "find-up": "5.0.0", - "fs-extra": "9.1.0", - "get-port": "5.1.1", - "get-stream": "6.0.0", - "git-url-parse": "13.1.0", - "glob-parent": "5.1.2", - "globby": "11.1.0", - "graceful-fs": "4.2.10", - "has-unicode": "2.0.1", - "inquirer": "8.2.4", - "is-ci": "2.0.0", - "is-stream": "2.0.0", - "libnpmpublish": "7.1.4", - "load-json-file": "6.2.0", - "make-dir": "3.1.0", - "minimatch": "3.0.5", - "multimatch": "5.0.0", - "node-fetch": "2.6.7", - "npm-package-arg": "8.1.1", - "npm-packlist": "5.1.1", - "npm-registry-fetch": "14.0.3", - "npmlog": "6.0.2", - "p-map": "4.0.0", - "p-map-series": "2.1.0", - "p-queue": "6.6.2", - "p-waterfall": "2.1.1", - "pacote": "15.1.1", - "pify": "5.0.0", - "pretty-format": "29.4.3", - "read-cmd-shim": "3.0.0", - "read-package-json": "5.0.1", - "resolve-from": "5.0.0", - "semver": "7.3.8", - "signal-exit": "3.0.7", - "slash": "3.0.0", - "ssri": "9.0.1", - "strong-log-transformer": "2.1.0", - "tar": "6.1.11", - "temp-dir": "1.0.0", - "tempy": "1.0.0", - "upath": "2.0.1", - "uuid": "8.3.2", - "write-file-atomic": "4.0.1", - "write-pkg": "4.0.0", - "yargs": "16.2.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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/@lerna/legacy-package-management/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/@lerna/legacy-package-management/node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/execa": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", - "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", - "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/@lerna/legacy-package-management/node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@lerna/legacy-package-management/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/@lerna/legacy-package-management/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/@lerna/legacy-package-management/node_modules/get-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", - "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/@lerna/legacy-package-management/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/inquirer/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/@lerna/legacy-package-management/node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/make-fetch-happen/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/@lerna/legacy-package-management/node_modules/make-fetch-happen/node_modules/ssri": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", - "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/minipass-fetch/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/@lerna/legacy-package-management/node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/@lerna/legacy-package-management/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/npm-registry-fetch": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.3.tgz", - "integrity": "sha512-YaeRbVNpnWvsGOjX2wk5s85XJ7l1qQBGAp724h8e2CZFFhMSuw9enom7K1mWVUtvXO1uUSFIAPofQK0pPN0ZcA==", - "dev": true, - "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^4.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/npm-registry-fetch/node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@lerna/legacy-package-management/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/@lerna/legacy-package-management/node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/pretty-format": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.4.3.tgz", - "integrity": "sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/@lerna/legacy-package-management/node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/tar/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/@lerna/legacy-package-management/node_modules/tempy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.0.tgz", - "integrity": "sha512-eLXG5B1G0mRPHmgH2WydPl5v4jH35qEn3y/rA/aahKhIa91Pn119SsU7n7v/433gtT9ONzC8ISvNHIh2JSTm0w==", - "dev": true, - "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/tempy/node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/@lerna/legacy-package-management/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", - "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/@lerna/legacy-package-management/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/write-file-atomic": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", - "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/@lerna/legacy-package-management/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@lerna/legacy-package-management/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@malept/cross-spawn-promise": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", - "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/@malept/flatpak-bundler": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz", - "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "fs-extra": "^9.0.0", - "lodash": "^4.17.15", - "tmp-promise": "^3.0.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@material-ui/core": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", - "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.5", - "@material-ui/system": "^4.12.2", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0", - "react-transition-group": "^4.4.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/icons": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/icons/-/icons-4.11.3.tgz", - "integrity": "sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.4.4" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@material-ui/core": "^4.0.0", - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/lab": { - "version": "4.0.0-alpha.61", - "resolved": "https://registry.npmjs.org/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz", - "integrity": "sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@material-ui/core": "^4.12.1", - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/styles": { - "version": "4.11.5", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", - "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.5.1", - "jss-plugin-camel-case": "^10.5.1", - "jss-plugin-default-unit": "^10.5.1", - "jss-plugin-global": "^10.5.1", - "jss-plugin-nested": "^10.5.1", - "jss-plugin-props-sort": "^10.5.1", - "jss-plugin-rule-value-function": "^10.5.1", - "jss-plugin-vendor-prefixer": "^10.5.1", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/system": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", - "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "csstype": "^2.5.2", - "prop-types": "^15.7.2" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/material-ui" - }, - "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", - "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", - "peerDependencies": { - "@types/react": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/utils": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", - "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", - "dependencies": { - "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/@mole-inc/bin-wrapper": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@mole-inc/bin-wrapper/-/bin-wrapper-8.0.1.tgz", - "integrity": "sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA==", - "dev": true, - "dependencies": { - "bin-check": "^4.1.0", - "bin-version-check": "^5.0.0", - "content-disposition": "^0.5.4", - "ext-name": "^5.0.0", - "file-type": "^17.1.6", - "filenamify": "^5.0.2", - "got": "^11.8.5", - "os-filter-obj": "^2.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "peer": true, - "dependencies": { - "eslint-scope": "5.1.1" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@npmcli/arborist": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-6.2.3.tgz", - "integrity": "sha512-lpGOC2ilSJXcc2zfW9QtukcCTcMbl3fVI0z4wvFB2AFIl0C+Q6Wv7ccrpdrQa8rvJ1ZVuc6qkX7HVTyKlzGqKA==", - "dev": true, - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/installed-package-contents": "^2.0.0", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^5.0.0", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^3.0.0", - "@npmcli/query": "^3.0.0", - "@npmcli/run-script": "^6.0.0", - "bin-links": "^4.0.1", - "cacache": "^17.0.4", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.0", - "json-stringify-nice": "^1.1.4", - "minimatch": "^6.1.6", - "nopt": "^7.0.0", - "npm-install-checks": "^6.0.0", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-registry-fetch": "^14.0.3", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "parse-conflict-json": "^3.0.0", - "proc-log": "^3.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^10.0.1", - "treeverse": "^3.0.0", - "walk-up-path": "^1.0.0" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", - "dev": true, - "dependencies": { - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/@npmcli/run-script": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", - "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", - "dev": true, - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/are-we-there-yet": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.0.tgz", - "integrity": "sha512-nSXlV+u3vtVjRgihdTzbfWYzxPWGo424zPgQbHD0ZqIla3jqYAewDcvee0Ua2hjS5IfTAmjGlx1Jf0PKwjZDEw==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/@npmcli/arborist/node_modules/gauge": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-5.0.1.tgz", - "integrity": "sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^4.0.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@npmcli/arborist/node_modules/minimatch": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz", - "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/arborist/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/@npmcli/arborist/node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/npmlog": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-7.0.1.tgz", - "integrity": "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/readable-stream": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.0.tgz", - "integrity": "sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg==", - "dev": true, - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/signal-exit": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", - "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/arborist/node_modules/ssri": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", - "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", - "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/arborist/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.4.tgz", - "integrity": "sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg==", - "dev": true, - "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", - "dev": true, - "dependencies": { - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@npmcli/git/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", - "dev": true, - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "lib/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/map-workspaces": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz", - "integrity": "sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==", - "dev": true, - "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/map-workspaces/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@npmcli/map-workspaces/node_modules/glob": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz", - "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==", - "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" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/map-workspaces/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==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/map-workspaces/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==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@npmcli/metavuln-calculator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.1.tgz", - "integrity": "sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q==", - "dev": true, - "dependencies": { - "cacache": "^17.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^15.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/move-file/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/@npmcli/name-from-folder": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", - "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", - "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/package-json": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-3.1.0.tgz", - "integrity": "sha512-qNPy6Yf9ruFST99xcrl5EWAvrb7qFrwgVbwdzcTJlIgxbArKOq5e/bgZ6rTL1X9hDgAdPbvL8RWx/OTLSB0ToA==", - "dev": true, - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@npmcli/package-json/node_modules/glob": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz", - "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==", - "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" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/package-json/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==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/package-json/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==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", - "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", - "dev": true, - "dependencies": { - "infer-owner": "^1.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.0.0.tgz", - "integrity": "sha512-MFNDSJNgsLZIEBVZ0Q9w9K7o07j5N4o4yjtdz2uEpuCZlXGMuPENiRaFYk0vRqAA64qVuUQwC05g27fRtfUgnA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@npmcli/run-script": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.1.7.tgz", - "integrity": "sha512-WXr/MyM4tpKA4BotB81NccGAv8B48lNH0gRoILucbcAhTQXLCoi6HflMV3KdXubIqvP9SuLsFn68Z7r4jl+ppw==", - "dev": true, - "dependencies": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/run-script/node_modules/@npmcli/node-gyp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", - "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/run-script/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/@npmcli/run-script/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "node_modules/@npmcli/run-script/node_modules/read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nrwl/cli": { - "version": "15.9.4", - "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.9.4.tgz", - "integrity": "sha512-FoiGFCLpb/r4HXCM3KYqT0xteP+MRV6bIHjz3bdPHIDLmBNQQnRRaV2K47jtJ6zjh1eOU5UHKyDtDDYf80Idpw==", - "dev": true, - "dependencies": { - "nx": "15.9.4" - } - }, - "node_modules/@nrwl/devkit": { - "version": "15.9.4", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.9.4.tgz", - "integrity": "sha512-mUX1kXTuPMdTzFxIzH+MsSNvdppOmstPDOEtiGFZJTuJ625ki0HhNJILO3N2mJ7MeMrLqIlAiNdvelQaObxYsQ==", - "dev": true, - "dependencies": { - "ejs": "^3.1.7", - "ignore": "^5.0.4", - "semver": "7.3.4", - "tmp": "~0.2.1", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "nx": ">= 14.1 <= 16" - } - }, - "node_modules/@nrwl/devkit/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/@nrwl/devkit/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/@nrwl/devkit/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nrwl/devkit/node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/@nrwl/devkit/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@nrwl/nx-darwin-arm64": { - "version": "15.9.4", - "resolved": "https://registry.npmjs.org/@nrwl/nx-darwin-arm64/-/nx-darwin-arm64-15.9.4.tgz", - "integrity": "sha512-XnvrnT9BJsgThY/4xUcYtE077ERq/img8CkRj7MOOBNOh0/nVcR4LGbBKDHtwE3HPk0ikyS/SxRyNa9msvi3QQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/nx-darwin-x64": { - "version": "15.9.4", - "resolved": "https://registry.npmjs.org/@nrwl/nx-darwin-x64/-/nx-darwin-x64-15.9.4.tgz", - "integrity": "sha512-WKSfSlpVMLchpXkax0geeUNyhvNxwO7qUz/s0/HJWBekt8fizwKDwDj1gP7fOu+YWb/tHiSscbR1km8PtdjhQw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/nx-linux-arm-gnueabihf": { - "version": "15.9.4", - "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-15.9.4.tgz", - "integrity": "sha512-a/b4PP7lP/Cgrh0LjC4O2YTt5pyf4DQTGtuE8qlo8o486UiofCtk4QGJX72q80s23L0ejCaKY2ULKx/3zMLjuA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/nx-linux-arm64-gnu": { - "version": "15.9.4", - "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-15.9.4.tgz", - "integrity": "sha512-ibBV8fMhSfLVd/2WzcDuUm32BoZsattuKkvMmOoyU6Pzoznc3AqyDjJR4xCIoAn5Rf+Nu1oeQONr5FAtb1Ugow==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/nx-linux-arm64-musl": { - "version": "15.9.4", - "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-arm64-musl/-/nx-linux-arm64-musl-15.9.4.tgz", - "integrity": "sha512-iIjvVYd7+uM4jVD461+PvU5XTALgSvJOODUaMRGOoDl0KlMuTe6pQZlw0eXjl5rcTd6paKaVFWT5j6awr8kj7w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/nx-linux-x64-gnu": { - "version": "15.9.4", - "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-x64-gnu/-/nx-linux-x64-gnu-15.9.4.tgz", - "integrity": "sha512-q4OyH72mdrE4KellBWtwpr5EwfxHKNoFP9//7FAILO68ROh0rpMd7YQMlTB7T04UEUHjKEEsFGTlVXIee3Viwg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/nx-linux-x64-musl": { - "version": "15.9.4", - "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-x64-musl/-/nx-linux-x64-musl-15.9.4.tgz", - "integrity": "sha512-67+/XNMR1CgLPyeGX8jqSG6l8yYD0iiwUgcu1Vaxq6N05WwnqVisIW8XzLSRUtKt4WyVQgOWk3aspImpMVOG3Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/nx-win32-arm64-msvc": { - "version": "15.9.4", - "resolved": "https://registry.npmjs.org/@nrwl/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-15.9.4.tgz", - "integrity": "sha512-2rEsq3eOGVCYpYJn2tTJkOGNJm/U8rP/FmqtZXYa6VJv/00XP3Gl00IXFEDaYV6rZo7SWqLxtEPUbjK5LwPzZA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/nx-win32-x64-msvc": { - "version": "15.9.4", - "resolved": "https://registry.npmjs.org/@nrwl/nx-win32-x64-msvc/-/nx-win32-x64-msvc-15.9.4.tgz", - "integrity": "sha512-bogVju4Z/hy1jbppqaTNbmV1R4Kg0R5fKxXAXC2LaL7FL0dup31wPumdV+mXttXBNOBDjV8V/Oz1ZqdmxpOJUw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nrwl/tao": { - "version": "15.9.4", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.9.4.tgz", - "integrity": "sha512-m90iz8UsXx1rgPm1dxsBQjSrCViWYZIrp8bpwjSCW24j3kifyilYSXGuKaRwZwUn7eNmH/kZcI9/8qeGIPF4Sg==", - "dev": true, - "dependencies": { - "nx": "15.9.4" - }, - "bin": { - "tao": "index.js" - } - }, - "node_modules/@octokit/auth-token": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz", - "integrity": "sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/core": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.1.tgz", - "integrity": "sha512-tEDxFx8E38zF3gT7sSMDrT1tGumDgsw5yPG6BBh/X+5ClIQfMH/Yqocxz1PnHx6CHyF6pxmovUTOfZAUvQ0Lvw==", - "dev": true, - "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/endpoint": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz", - "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/graphql": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", - "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", - "dev": true, - "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^9.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/openapi-types": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-17.2.0.tgz", - "integrity": "sha512-MazrFNx4plbLsGl+LFesMo96eIXkFgEtaKbnNpdh4aQ0VM10aoylFsTYP1AEjkeoRNZiiPe3T6Gl2Hr8dJWdlQ==", - "dev": true - }, - "node_modules/@octokit/plugin-enterprise-rest": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", - "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-3.1.0.tgz", - "integrity": "sha512-+cfc40pMzWcLkoDcLb1KXqjX0jTGYXjKuQdFQDc6UAknISJHnZTiBqld6HDwRJvD4DsouDKrWXNbNV0lE/3AXA==", - "dev": true, - "dependencies": { - "@octokit/types": "^6.41.0" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=4" - } - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", - "dev": true - }, - "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.8.1.tgz", - "integrity": "sha512-QrlaTm8Lyc/TbU7BL/8bO49vp+RZ6W3McxxmmQTgYxf2sWkO8ZKuj4dLhPNJD6VCUW1hetCmeIM0m6FTVpDiEg==", - "dev": true, - "dependencies": { - "@octokit/types": "^8.1.1", - "deprecation": "^2.3.1" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz", - "integrity": "sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw==", - "dev": true - }, - "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-8.2.1.tgz", - "integrity": "sha512-8oWMUji8be66q2B9PmEIUyQm00VPDPun07umUWSaCwxmeaquFBro4Hcc3ruVoDo3zkQyZBlRvhIMEYS3pBhanw==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^14.0.0" - } - }, - "node_modules/@octokit/request": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.5.tgz", - "integrity": "sha512-z83E8UIlPNaJUsXpjD8E0V5o/5f+vJJNbNcBwVZsX3/vC650U41cOkTLjq4PKk9BYonQGOnx7N17gvLyNjgGcQ==", - "dev": true, - "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", - "dev": true, - "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/rest": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.3.tgz", - "integrity": "sha512-5arkTsnnRT7/sbI4fqgSJ35KiFaN7zQm0uQiQtivNQLI8RQx8EHwJCajcTUwmaCMNDg7tdCvqAnc7uvHHPxrtQ==", - "dev": true, - "dependencies": { - "@octokit/core": "^4.0.0", - "@octokit/plugin-paginate-rest": "^3.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/@octokit/types": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.3.tgz", - "integrity": "sha512-MMeLdHyFIALioycq+LFcA71v0S2xpQUX2cw6pPbHQjaibcHYwLnmK/kMZaWuGfGfjBJZ3wRUq+dOaWsvrPJVvA==", - "dev": true, - "dependencies": { - "@octokit/openapi-types": "^17.2.0" - } - }, - "node_modules/@ogre-tools/fp": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@ogre-tools/fp/-/fp-17.2.0.tgz", - "integrity": "sha512-FF2v/jlQkyVYtborPGq3AS8dK+Fah1f01lajtqd7tW85IwJk0ut7B69o3OA78SvHzNkkFy6y7BmfmVZQ+DkdtA==", - "peerDependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/@ogre-tools/injectable": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@ogre-tools/injectable/-/injectable-17.2.0.tgz", - "integrity": "sha512-foBG+lZvlSfoL3hwkyLFHcpfiXuBzsRLcqI7YuKvY//9Wz3DhXXlafF8s6vUDmVl8AQ2pODfDEe36X2WTrqMdg==", - "peerDependencies": { - "@ogre-tools/fp": "^16 || ^17", - "lodash": "^4.17.21" - } - }, - "node_modules/@ogre-tools/injectable-extension-for-auto-registration": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@ogre-tools/injectable-extension-for-auto-registration/-/injectable-extension-for-auto-registration-17.2.0.tgz", - "integrity": "sha512-G3YfbbaqYnJcAejPjRw1KLEdYQnE1OVqVMthLUCamG3iOaRE/QvQ4IPKO4zJH+v5JpTZjxmfYcn/z4dPdx65wA==", - "peerDependencies": { - "@ogre-tools/fp": "^16 || ^17", - "@ogre-tools/injectable": "^16 || ^17", - "lodash": "^4.17.21" - } - }, - "node_modules/@ogre-tools/injectable-extension-for-mobx": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@ogre-tools/injectable-extension-for-mobx/-/injectable-extension-for-mobx-17.2.0.tgz", - "integrity": "sha512-o+VJn8c10P5mYJBwq/3LQQqpcZ5cP3tY+Gmru0xv2VYUGN4+2kye9mlXfZ6eisQ2IMVImRFx/qJxYLCLNNPZMw==", - "peerDependencies": { - "@ogre-tools/fp": "^16 || ^17", - "@ogre-tools/injectable": "^16 || ^17", - "lodash": "^4.17.21", - "mobx": "^6.3.0" - } - }, - "node_modules/@ogre-tools/injectable-react": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@ogre-tools/injectable-react/-/injectable-react-17.2.0.tgz", - "integrity": "sha512-pAZZKnXCFxPlNhGxWeFmX8xbbR1YJUmNZGNHt0mvjfujLnRsITSlA7AwFFB+UghpDPXi0aY48NRnq8KB3/nkrg==", - "peerDependencies": { - "@ogre-tools/fp": "^16 || ^17", - "@ogre-tools/injectable": "^16 || ^17", - "lodash": "^4.17.21", - "mobx": "^6.3.0", - "mobx-react": "^7.2.0", - "react": "^17 || ^18", - "react-dom": "^17 || ^18" - } - }, - "node_modules/@ogre-tools/linkable": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/@ogre-tools/linkable/-/linkable-17.2.0.tgz", - "integrity": "sha512-s0YoTV2JjhwF6+vlkHAXmhTEL1c+r+hBwbdTO2GnE+sqjtN1prASASlkyF/ZUwBNBjv02SbBKtM1Jy++N91Wyg==", - "dependencies": { - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "fast-glob": "^3.2.12", - "fs-extra": "^9.0.1", - "lodash": "^4.17.21", - "yalc": "^1.0.0-pre.53" - }, - "bin": { - "linkable": "bin/linkable", - "linkable-push": "bin/linkable-push" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", - "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^3.2.1", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher/node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.0.tgz", - "integrity": "sha512-2OCURAmRtdlL8iUDTypMrrxfwe8frXTeXaxGsVOaYtc/wrUyk8Z/0OBetM7cdlsy7ZFWlMX72VogKeh+A4Xcjw==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "fast-glob": "^3.2.12", - "is-glob": "^4.0.3", - "open": "^9.1.0", - "picocolors": "^1.0.0", - "tslib": "^2.5.0" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@pkgr/utils/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@pkgr/utils/node_modules/open": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", - "dev": true, - "dependencies": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", - "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", - "dev": true, - "dependencies": { - "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", - "core-js-pure": "^3.23.3", - "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", - "html-entities": "^2.1.0", - "loader-utils": "^2.0.4", - "schema-utils": "^3.0.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "@types/webpack": "4.x || 5.x", - "react-refresh": ">=0.10.0 <1.0.0", - "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <4.0.0", - "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x", - "webpack-hot-middleware": "2.x", - "webpack-plugin-serve": "0.x || 1.x" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - }, - "sockjs-client": { - "optional": true - }, - "type-fest": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - }, - "webpack-hot-middleware": { - "optional": true - }, - "webpack-plugin-serve": { - "optional": true - } - } - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.0.tgz", - "integrity": "sha512-IthPJsJR85GhOkp3Hvp8zFOPK5ynKn6STyHa/WZpioK7E1aYDiBzpqQPrngc14DszIUkIrdd3k9Iu0XSzlP/1w==", - "peer": true - }, - "node_modules/@sentry/browser": { - "version": "6.19.2", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.19.2.tgz", - "integrity": "sha512-5VC44p5Vu2eJhVT39nLAJFgha5MjHDYCyZRR1ieeZt3a++otojPGBBAKNAtrEMGV+A2Z9AoneD6ZnDVlyb3GKg==", - "dependencies": { - "@sentry/core": "6.19.2", - "@sentry/types": "6.19.2", - "@sentry/utils": "6.19.2", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/browser/node_modules/@sentry/types": { - "version": "6.19.2", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.2.tgz", - "integrity": "sha512-XO5qmVBdTs+7PdCz7fAwn1afWxSnRE2KLBFg5/vOdKosPSSHsSHUURSkxiEZc2QsR+JpRB4AeQ26AkIRX38qTg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/browser/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/core": { - "version": "6.19.2", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.2.tgz", - "integrity": "sha512-yu1R3ewBT4udmB4v7sc4biQZ0Z0rfB9+TzB5ZKoCftbe6kqXjFMMaFRYNUF9HicVldKAsBktgkWw3+yfqGkw/A==", - "dependencies": { - "@sentry/hub": "6.19.2", - "@sentry/minimal": "6.19.2", - "@sentry/types": "6.19.2", - "@sentry/utils": "6.19.2", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/core/node_modules/@sentry/types": { - "version": "6.19.2", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.2.tgz", - "integrity": "sha512-XO5qmVBdTs+7PdCz7fAwn1afWxSnRE2KLBFg5/vOdKosPSSHsSHUURSkxiEZc2QsR+JpRB4AeQ26AkIRX38qTg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/electron": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@sentry/electron/-/electron-3.0.8.tgz", - "integrity": "sha512-D330t0rRswAYreFtzIICD5uQH7Wp2e7g6GEFTGisTouHY9+qSu7q9J/hGe5Vase5cY5277/YmUaUKRrVxj/2DQ==", - "dependencies": { - "@sentry/browser": "6.19.2", - "@sentry/core": "6.19.2", - "@sentry/node": "6.19.2", - "@sentry/types": "6.19.2", - "@sentry/utils": "6.19.2", - "deepmerge": "^4.2.2", - "tslib": "^2.3.1" - } - }, - "node_modules/@sentry/electron/node_modules/@sentry/types": { - "version": "6.19.2", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.2.tgz", - "integrity": "sha512-XO5qmVBdTs+7PdCz7fAwn1afWxSnRE2KLBFg5/vOdKosPSSHsSHUURSkxiEZc2QsR+JpRB4AeQ26AkIRX38qTg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/hub": { - "version": "6.19.2", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.2.tgz", - "integrity": "sha512-W7KCgNBgdBIMagOxy5J5KQPe+maYxSqfE8a5ncQ3R8BcZDQEKnkW/1FplNbfRLZqA/tL/ndKb7pTPqVtzsbARw==", - "dependencies": { - "@sentry/types": "6.19.2", - "@sentry/utils": "6.19.2", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/hub/node_modules/@sentry/types": { - "version": "6.19.2", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.2.tgz", - "integrity": "sha512-XO5qmVBdTs+7PdCz7fAwn1afWxSnRE2KLBFg5/vOdKosPSSHsSHUURSkxiEZc2QsR+JpRB4AeQ26AkIRX38qTg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/hub/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/integrations": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-6.19.7.tgz", - "integrity": "sha512-yNeeFyuygJaV7Mdc5qWuDa13xVj5mVdECaaw2Xs4pfeHaXmRfRzZY17N8ypWFegKWxKBHynyQRMD10W5pBwJvA==", - "dependencies": { - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "localforage": "^1.8.1", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/integrations/node_modules/@sentry/utils": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", - "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", - "dependencies": { - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/integrations/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/minimal": { - "version": "6.19.2", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.2.tgz", - "integrity": "sha512-ClwxKm77iDHET7kpzv1JvzDx1er5DoNu+EUjst0kQzARIrXvu9xuZuE2/CnBWycQWqw8o3HoGoKz65uIhsUCzQ==", - "dependencies": { - "@sentry/hub": "6.19.2", - "@sentry/types": "6.19.2", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/minimal/node_modules/@sentry/types": { - "version": "6.19.2", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.2.tgz", - "integrity": "sha512-XO5qmVBdTs+7PdCz7fAwn1afWxSnRE2KLBFg5/vOdKosPSSHsSHUURSkxiEZc2QsR+JpRB4AeQ26AkIRX38qTg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/minimal/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/node": { - "version": "6.19.2", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-6.19.2.tgz", - "integrity": "sha512-Z1qREpTpYHxaeWjc1zMUk8ZTAp1WbxMiI2TVNc+a14DVT19Z2xNXb06MiRfeLgNc9lVGdmzR62dPmMBjVgPJYg==", - "dependencies": { - "@sentry/core": "6.19.2", - "@sentry/hub": "6.19.2", - "@sentry/types": "6.19.2", - "@sentry/utils": "6.19.2", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/node/node_modules/@sentry/types": { - "version": "6.19.2", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.2.tgz", - "integrity": "sha512-XO5qmVBdTs+7PdCz7fAwn1afWxSnRE2KLBFg5/vOdKosPSSHsSHUURSkxiEZc2QsR+JpRB4AeQ26AkIRX38qTg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/node/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/types": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", - "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils": { - "version": "6.19.2", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.2.tgz", - "integrity": "sha512-2DQQ2OJaxjtyxGq5FmMlqb6hptsqMs2xoBiVRMkTS/rvyTrk1oQdKZ8ePwjtgX3nJ728ni3IXIyXV+vfGp4EBw==", - "dependencies": { - "@sentry/types": "6.19.2", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils/node_modules/@sentry/types": { - "version": "6.19.2", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.2.tgz", - "integrity": "sha512-XO5qmVBdTs+7PdCz7fAwn1afWxSnRE2KLBFg5/vOdKosPSSHsSHUURSkxiEZc2QsR+JpRB4AeQ26AkIRX38qTg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@side/jest-runtime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@side/jest-runtime/-/jest-runtime-1.1.0.tgz", - "integrity": "sha512-KikALXowNWyOxn/zdy4AUgkYq/1hASkOEEP0+bcCDv5L3KJNwDw8kmzBcx7sljnwV8yi2cLGzt9QH9EjwA9TKg==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "@jest/transform": ">=28", - "jest": ">=28", - "jest-runtime": ">=28" - } - }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/address/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" - }, - "node_modules/@sigstore/protobuf-specs": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", - "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==" - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.2.0.tgz", - "integrity": "sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg==", - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/@swc/cli": { - "version": "0.1.62", - "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.1.62.tgz", - "integrity": "sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==", - "dev": true, - "dependencies": { - "@mole-inc/bin-wrapper": "^8.0.1", - "commander": "^7.1.0", - "fast-glob": "^3.2.5", - "semver": "^7.3.8", - "slash": "3.0.0", - "source-map": "^0.7.3" - }, - "bin": { - "spack": "bin/spack.js", - "swc": "bin/swc.js", - "swcx": "bin/swcx.js" - }, - "engines": { - "node": ">= 12.13" - }, - "peerDependencies": { - "@swc/core": "^1.2.66", - "chokidar": "^3.5.1" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } - } - }, - "node_modules/@swc/core": { - "version": "1.3.59", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.59.tgz", - "integrity": "sha512-ZBw31zd2E5SXiodwGvjQdx5ZC90b2uyX/i2LeMMs8LKfXD86pfOfQac+JVrnyEKDhASXj9icgsF9NXBhaMr3Kw==", - "dev": true, - "hasInstallScript": true, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.3.59", - "@swc/core-darwin-x64": "1.3.59", - "@swc/core-linux-arm-gnueabihf": "1.3.59", - "@swc/core-linux-arm64-gnu": "1.3.59", - "@swc/core-linux-arm64-musl": "1.3.59", - "@swc/core-linux-x64-gnu": "1.3.59", - "@swc/core-linux-x64-musl": "1.3.59", - "@swc/core-win32-arm64-msvc": "1.3.59", - "@swc/core-win32-ia32-msvc": "1.3.59", - "@swc/core-win32-x64-msvc": "1.3.59" - }, - "peerDependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.3.59", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.59.tgz", - "integrity": "sha512-AnqWFBgEKHP0jb4iZqx7eVQT9/rX45+DE4Ox7GpwCahUKxxrsDLyXzKhwLwQuAjUvtu5JcSB77szKpPGDM49fQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.3.59", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.59.tgz", - "integrity": "sha512-iqDs+yii9mOsmpJez82SEi4d4prWDRlapHxKnDVJ0x1AqRo41vIq8t3fujrvCHYU5VQgOYGh4ooXQpaP2H3B2A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.3.59", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.59.tgz", - "integrity": "sha512-PB0PP+SgkCSd/kYmltnPiGv42cOSaih1OjXCEjxvNwUFEmWqluW6uGdWaNiR1LoYMxhcHZTc336jL2+O3l6p0Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.3.59", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.59.tgz", - "integrity": "sha512-Ol/JPszWZ+OZ44FOdJe35TfJ1ckG4pYaisZJ4E7PzfwfVe2ygX85C5WWR4e5L0Y1zFvzpcI7gdyC2wzcXk4Cig==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.3.59", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.59.tgz", - "integrity": "sha512-PtTTtGbj9GiY5gJdoSFL2A0vL6BRaS1haAhp6g3hZvLDkTTg+rJURmzwBMMjaQlnGC62x/lLf6MoszHG/05//Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.3.59", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.59.tgz", - "integrity": "sha512-XBW9AGi0YsIN76IfesnDSBn/5sjR69J75KUNte8sH6seYlHJ0/kblqUMbUcfr0CiGoJadbzAZeKZZmfN7EsHpg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.3.59", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.59.tgz", - "integrity": "sha512-Cy5E939SdWPQ34cg6UABNO0RyEe0FuWqzZ/GLKtK11Ir4fjttVlucZiY59uQNyUVUc8T2qE0VBFCyD/zYGuHtg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.3.59", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.59.tgz", - "integrity": "sha512-z5ZJxizRvRoSAaevRIi3YjQh74OFWEIhonSDWNdqDL7RbjEivcatYcG7OikH6s+rtPhOcwNm3PbGV2Prcgh/gg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.3.59", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.59.tgz", - "integrity": "sha512-vxpsn+hrKAhi5YusQfB/JXUJJVX40rIRE/L49ilBEqdbH8Khkoego6AD+2vWqTdJcUHo1WiAIAEZ0rTsjyorLQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.3.59", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.59.tgz", - "integrity": "sha512-Ris/cJbURylcLwqz4RZUUBCEGsuaIHOJsvf69W5pGKHKBryVoOTNhBKpo3Km2hoAi5qFQ/ou0trAT4hBsVPZvQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/jest": { - "version": "0.2.26", - "resolved": "https://registry.npmjs.org/@swc/jest/-/jest-0.2.26.tgz", - "integrity": "sha512-7lAi7q7ShTO3E5Gt1Xqf3pIhRbERxR1DUxvtVa9WKzIB+HGQ7wZP5sYx86zqnaEoKKGhmOoZ7gyW0IRu8Br5+A==", - "dev": true, - "dependencies": { - "@jest/create-cache-key-function": "^27.4.2", - "jsonc-parser": "^3.2.0" - }, - "engines": { - "npm": ">= 7.0.0" - }, - "peerDependencies": { - "@swc/core": "*" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@testing-library/dom": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.0.tgz", - "integrity": "sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "^5.0.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.4.4", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "5.16.5", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz", - "integrity": "sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==", - "dependencies": { - "@adobe/css-tools": "^4.0.1", - "@babel/runtime": "^7.9.2", - "@types/testing-library__jest-dom": "^5.9.1", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", - "lodash": "^4.17.15", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=8", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/react": { - "version": "12.1.5", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-12.1.5.tgz", - "integrity": "sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^8.0.0", - "@types/react-dom": "<18.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": "<18.0.0", - "react-dom": "<18.0.0" - } - }, - "node_modules/@testing-library/user-event": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", - "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "dev": true - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "devOptional": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "devOptional": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "devOptional": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "devOptional": true - }, - "node_modules/@tufjs/canonical-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", - "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", - "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", - "dev": true, - "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@tufjs/models/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@tufjs/models/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==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", - "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==" - }, - "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.5.tgz", - "integrity": "sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==", - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "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/byline": { - "version": "4.2.33", - "resolved": "https://registry.npmjs.org/@types/byline/-/byline-4.2.33.tgz", - "integrity": "sha512-LJYez7wrWcJQQDknqZtrZuExMGP0IXmPl1rOOGDqLbu+H7UNNRfKNuSxCBcQMLH1EfjeWidLedC/hCc5dDfBog==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==" - }, - "node_modules/@types/chart.js": { - "version": "2.9.37", - "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.37.tgz", - "integrity": "sha512-9bosRfHhkXxKYfrw94EmyDQcdjMaQPkU1fH2tDxu8DWXxf1mjzWQAV4laJF51ZbC2ycYwNDvIm1rGez8Bug0vg==", - "dev": true, - "dependencies": { - "moment": "^2.10.2" - } - }, - "node_modules/@types/circular-dependency-plugin": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@types/circular-dependency-plugin/-/circular-dependency-plugin-5.0.5.tgz", - "integrity": "sha512-JU1sYQWNbUluWHseLUfokakx18+BXRA9Bxji56hdY5NW0nvrJSJd4SNAl0Btpm5ima9BnUkoGEcW/2PH1QuWQA==", - "dev": true, - "dependencies": { - "@types/node": "*", - "webpack": "^5.1.0" - } - }, - "node_modules/@types/cli-progress": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/@types/cli-progress/-/cli-progress-3.11.0.tgz", - "integrity": "sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/color": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/color/-/color-3.0.3.tgz", - "integrity": "sha512-X//qzJ3d3Zj82J9sC/C18ZY5f43utPbAJ6PhYt/M7uG6etcF6MRpKdN880KBy43B0BMzSfeT96MzrsNjFI3GbA==", - "dev": true, - "dependencies": { - "@types/color-convert": "*" - } - }, - "node_modules/@types/color-convert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/color-convert/-/color-convert-2.0.0.tgz", - "integrity": "sha512-m7GG7IKKGuJUXvkZ1qqG3ChccdIM/qBBo913z+Xft0nKCX4hAU/IxKwZBU4cpRZ7GS5kV4vOblUkILtSShCPXQ==", - "dev": true, - "dependencies": { - "@types/color-name": "*" - } - }, - "node_modules/@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", - "dev": true - }, - "node_modules/@types/command-line-args": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.0.tgz", - "integrity": "sha512-UuKzKpJJ/Ief6ufIaIzr3A/0XnluX7RvFgwkV89Yzvm77wCh1kFaFmqN8XEnGcN62EuHdedQjEMb8mYxFLGPyA==", - "dev": true - }, - "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/crypto-js": { - "version": "3.1.47", - "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-3.1.47.tgz", - "integrity": "sha512-eI6gvpcGHLk3dAuHYnRCAjX+41gMv1nz/VP55wAe5HtmAKDOoPSfr3f6vkMc08ov1S0NsjvUBxDtHHxqQY1LGA==", - "dev": true - }, - "node_modules/@types/debug": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", - "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", - "dev": true, - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/dompurify": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.4.0.tgz", - "integrity": "sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg==", - "dev": true, - "dependencies": { - "@types/trusted-types": "*" - } - }, - "node_modules/@types/electron-devtools-installer": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@types/electron-devtools-installer/-/electron-devtools-installer-2.2.2.tgz", - "integrity": "sha512-8o2XkyAw2HZoVD5KpIoUJmEgZ7BPVv33p7rY1jmn/wJUbugtQUc44vNMDTguUNUGiLv+oqgtyYmiYctHDZEzdQ==", - "dev": true - }, - "node_modules/@types/eslint": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.0.tgz", - "integrity": "sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==", - "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==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/esprima": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/esprima/-/esprima-4.0.3.tgz", - "integrity": "sha512-jo14dIWVVtF0iMsKkYek6++4cWJjwpvog+rchLulwgFJGTXqIeTdCOvY0B3yMLTaIwMcKCdJ6mQbSR6wYHy98A==", - "dependencies": { - "@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==" - }, - "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/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-S0mIukll6fbF0tvrKic/jj+jI8SHoSvGU+Cs95b/jzZEnBYCbj+7aJtQ9yeABuK3xP1okwA3jEH9qIRayijnvQ==", - "dev": true - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/gunzip-maybe": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@types/gunzip-maybe/-/gunzip-maybe-1.4.0.tgz", - "integrity": "sha512-dFP9GrYAR9KhsjTkWJ8q8Gsfql75YIKcg9DuQOj/IrlPzR7W+1zX+cclw1McV82UXAQ+Lpufvgk3e9bC8+HzgA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/hapi__call": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@types/hapi__call/-/hapi__call-9.0.0.tgz", - "integrity": "sha512-WJlvjk4i7uLhALYJfWMdhW58B4OphXuE0Ob4DZFwc0zqC5fnM9Wjgk3B1fd/C6jEKnM9Y1Pzz8QeSrUJ1mue5A==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/hapi__subtext": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@types/hapi__subtext/-/hapi__subtext-7.0.0.tgz", - "integrity": "sha512-CwZZpuf7qXj/JKeMhFkiJQDupf7PhjZcHQ0RaeetAyxoR7vDN6kmQcGMZKEG5VTvlS/JfZGNIkq7F7nd/K+j+g==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/history": { - "version": "4.7.11", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" - }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", - "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "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-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" - }, - "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/inquirer": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.3.tgz", - "integrity": "sha512-CzNkWqQftcmk2jaCWdBTf9Sm7xSw4rkI1zpU/Udw3HX5//adEZUIm9STtoRP1qgWj0CWQtJ9UTvqmO2NNjhMJw==", - "dev": true, - "dependencies": { - "@types/through": "*", - "rxjs": "^7.2.0" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.1.tgz", - "integrity": "sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ==", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/jest/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@types/jest/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", - "dependencies": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/@types/js-yaml": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", - "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" - }, - "node_modules/@types/jsdom": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", - "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", - "dependencies": { - "@types/node": "*", - "@types/tough-cookie": "*", - "parse5": "^7.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/lodash": { - "version": "4.14.194", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", - "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==", - "dev": true - }, - "node_modules/@types/marked": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.1.tgz", - "integrity": "sha512-vSSbKZFbNktrQ15v7o1EaH78EbWV+sPQbPjHG+Cp8CaNcPFUEfjZ0Iml/V0bFDwsTlYe8o6XC5Hfdp91cqPV2g==", - "dev": true - }, - "node_modules/@types/md5-file": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/md5-file/-/md5-file-4.0.2.tgz", - "integrity": "sha512-8gacRfEqLrmZ6KofpFfxyjsm/LYepeWUWUJGaf5A9W9J5B2/dRZMdkDqFDL6YDa9IweH12IO76jO7mpsK2B3wg==", - "dev": true - }, - "node_modules/@types/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@types/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-eSkOeBPwr0godOTPV4hQTzXZElnpyHhhCCscrcN6teFLbSPC8Xyb/rxsU2r6tg+eNzIuVX4miav3KhY6NUpgMw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "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/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true, - "optional": true - }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "node_modules/@types/mkdirp": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.2.tgz", - "integrity": "sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/mock-fs": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@types/mock-fs/-/mock-fs-4.13.1.tgz", - "integrity": "sha512-m6nFAJ3lBSnqbvDZioawRvpLXSaPyn52Srf7OfzjubYbYX8MTUdIgDxQl0wEapm4m/pNYSd9TXocpQ0TvZFlYA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "16.18.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.32.tgz", - "integrity": "sha512-zpnXe4dEz6PrWz9u7dqyRoq9VxwCvoXRPy/ewhmMa1CgEyVmtL1NJPQ2MX+4pf97vetquVKkpiMx0MwI8pjNOw==" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "node_modules/@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "dev": true - }, - "node_modules/@types/plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*", - "xmlbuilder": ">=11.0.1" - } - }, - "node_modules/@types/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-0VLab/pcLTLcfbxi6THSIMVYcw9hEUBGvjwwaGpW77mMgRXfGF+a76t7BxTGyLh1y68tBvrffp8UWnqvm76+yg==", - "dev": true, - "dependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/@types/postcss-modules-scope": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/postcss-modules-scope/-/postcss-modules-scope-3.0.1.tgz", - "integrity": "sha512-LNkp3c4ML9EQj2dgslp4i80Jxj72YK3HjYzrTn6ftUVylW1zaKFGqrMlNIyqBmPWmIhZ/Y5r0Y4T49Hk1IuDUg==", - "dev": true, - "dependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "node_modules/@types/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@types/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-kd4LMvcnpYkspDcp7rmXKedn8iJSCoa331zRRamUp5oanKt/CefbEGPQP7G89enz7sKD4bvsr8mHSsC8j5WOvA==", - "dev": true, - "dependencies": { - "@types/retry": "*" - } - }, - "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/randomcolor": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@types/randomcolor/-/randomcolor-0.5.7.tgz", - "integrity": "sha512-LPcG96dGYRCsXlk1fslUNIg6ebEi+bKNyn84uBL/pu2cRSf5i/djD3ArJZOyzszVMVV/DB87va6pMZP+tRSl/w==", - "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/react": { - "version": "17.0.59", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.59.tgz", - "integrity": "sha512-gSON5zWYIGyoBcycCE75E9+r6dCC2dHdsrVkOEiIYNU5+Q28HcBAuqvDuxHcCbMfHBHdeT5Tva/AFn3rnMKE4g==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-beautiful-dnd": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.4.tgz", - "integrity": "sha512-4bIBdzOr0aavN+88q3C7Pgz+xkb7tz3whORYrmSj77wfVEMfiWiooIwVWFR7KM2e+uGTe5BVrXqSfb0aHeflJA==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-dom": { - "version": "17.0.20", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.20.tgz", - "integrity": "sha512-4pzIjSxDueZZ90F52mU3aPoogkHIoSIDG+oQ+wQK7Cy2B9S+MvOqY0uEA/qawKz381qrEDkvpwyt8Bm31I8sbA==", - "dependencies": { - "@types/react": "^17" - } - }, - "node_modules/@types/react-redux": { - "version": "7.1.25", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.25.tgz", - "integrity": "sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==", - "dependencies": { - "@types/hoist-non-react-statics": "^3.3.0", - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0", - "redux": "^4.0.0" - } - }, - "node_modules/@types/react-router": { - "version": "5.1.20", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", - "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", - "dev": true, - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*" - } - }, - "node_modules/@types/react-router-dom": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", - "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "dev": true, - "dependencies": { - "@types/history": "^4.7.11", - "@types/react": "*", - "@types/react-router": "*" - } - }, - "node_modules/@types/react-table": { - "version": "7.7.14", - "resolved": "https://registry.npmjs.org/@types/react-table/-/react-table-7.7.14.tgz", - "integrity": "sha512-TYrv7onCiakaG1uAu/UpQ9FojNEt/4/ht87EgJQaEGFoWV606ZLWUZAcUHzMxgc3v1mywP1cDyz3qB4ho3hWOw==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", - "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-virtualized-auto-sizer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz", - "integrity": "sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-window": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.5.tgz", - "integrity": "sha512-V9q3CvhC9Jk9bWBOysPGaWy/Z0lxYcTXLtLipkt2cnRj1JOSFNF7wqGpkScSXMgBwC+fnVRg/7shwgddBG5ICw==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react/node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "node_modules/@types/readable-stream": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", - "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "safe-buffer": "~5.1.1" - } - }, - "node_modules/@types/request": { - "version": "2.48.8", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", - "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", - "dependencies": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.0" - } - }, - "node_modules/@types/request-promise-native": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/@types/request-promise-native/-/request-promise-native-1.0.18.tgz", - "integrity": "sha512-tPnODeISFc/c1LjWyLuZUY+Z0uLB3+IMfNoQyDEi395+j6kTFTTRAqjENjoPJUid4vHRGEozoTrcTrfZM+AcbA==", - "dev": true, - "dependencies": { - "@types/request": "*" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "dev": true - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" - }, - "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==" - }, - "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.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", - "dev": true, - "dependencies": { - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sharp": { - "version": "0.31.1", - "resolved": "https://registry.npmjs.org/@types/sharp/-/sharp-0.31.1.tgz", - "integrity": "sha512-5nWwamN9ZFHXaYEincMSuza8nNfOof8nmO+mcI+Agx1uMUk4/pQnNIcix+9rLPXzKrm1pS34+6WRDbDV0Jn7ag==", - "dev": true, - "dependencies": { - "@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/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" - }, - "node_modules/@types/stoppable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/stoppable/-/stoppable-1.1.1.tgz", - "integrity": "sha512-b8N+fCADRIYYrGZOcmOR8ZNBOqhktWTB/bMUl5LvGtT201QKJZOOH5UsFyI3qtteM6ZAJbJqZoBcLqqxKIwjhw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/tar": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@types/tar/-/tar-6.1.5.tgz", - "integrity": "sha512-qm2I/RlZij5RofuY7vohTpYNaYcrSQlN2MyjucQc7ZweDwaEWkdN/EeNh6e9zjK6uEm6PwjdMXkcj05BxZdX1Q==", - "dev": true, - "dependencies": { - "@types/node": "*", - "minipass": "^4.0.0" - } - }, - "node_modules/@types/tar-stream": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@types/tar-stream/-/tar-stream-2.2.2.tgz", - "integrity": "sha512-1AX+Yt3icFuU6kxwmPakaiGrJUwG44MpuiqPg4dSolRFk6jmvs4b3IbUol9wKDLIgU76gevn3EwE8y/DkSJCZQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/tcp-port-used": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/tcp-port-used/-/tcp-port-used-1.0.1.tgz", - "integrity": "sha512-6pwWTx8oUtWvsiZUCrhrK/53MzKVLnuNSSaZILPy3uMes9QnTrLMar9BDlJArbMOjDcjb3QXFk6Rz8qmmuySZw==", - "dev": true - }, - "node_modules/@types/testing-library__jest-dom": { - "version": "5.14.5", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz", - "integrity": "sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==", - "dependencies": { - "@types/jest": "*" - } - }, - "node_modules/@types/through": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", - "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" - }, - "node_modules/@types/triple-beam": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz", - "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==" - }, - "node_modules/@types/trusted-types": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", - "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", - "dev": true - }, - "node_modules/@types/url-parse": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/@types/url-parse/-/url-parse-1.4.8.tgz", - "integrity": "sha512-zqqcGKyNWgTLFBxmaexGUKQyWqeG7HjXj20EuQJSJWwXe54BjX0ihIo5cJB9yAQzH8dNugJ9GvkBYMjPXs/PJw==", - "dev": true - }, - "node_modules/@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true - }, - "node_modules/@types/verror": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.6.tgz", - "integrity": "sha512-NNm+gdePAX1VGvPcGZCDKQZKYSiAWigKhKaz5KF94hG6f2s8de9Ow5+7AbXoeKxL8gavZfk4UquSAygOF2duEQ==", - "dev": true, - "optional": true - }, - "node_modules/@types/webpack": { - "version": "5.28.1", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.1.tgz", - "integrity": "sha512-qw1MqGZclCoBrpiSe/hokSgQM/su8Ocpl3L/YHE0L6moyaypg4+5F7Uzq7NgaPKPxUxUbQ4fLPLpDWdR27bCZw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "tapable": "^2.2.0", - "webpack": "^5" - } - }, - "node_modules/@types/webpack-env": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.0.tgz", - "integrity": "sha512-56/MAlX5WMsPVbOg7tAxnYvNYMMWr/QJiIp6BxVSW3JJXUVzzOn64qW8TzQyMSqSUFM2+PVI4aUHcHOzIz/1tg==" - }, - "node_modules/@types/webpack-node-externals": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@types/webpack-node-externals/-/webpack-node-externals-2.5.3.tgz", - "integrity": "sha512-A9JxaR8QXoYT95egET4AmCFuChyTlP8d18ZAnmSHuIMsFdS7QlCQQ8pmN/+FHgLIkm+ViE/VngltT5avLACY9A==", - "dev": true, - "dependencies": { - "@types/node": "*", - "webpack": "^5" - } - }, - "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.24", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", - "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" - }, - "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.7.tgz", - "integrity": "sha512-BL+jYxUFIbuYwy+4fF86k5vdT9lT0CNJ6HtwrIvGh0PhH8s0yy5rjaKH2fDCrz5ITHy07WCzVGNvAmjJh4IJFA==", - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/type-utils": "5.59.7", - "@typescript-eslint/utils": "5.59.7", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.59.7.tgz", - "integrity": "sha512-jqM0Cjfvta/sBlY1MxdXYv853/dJUC2wmUWnKoG2srwp0njNGQ6Zu/XLWoRFiLvocQbzBbpHkPFwKgC2UqyovA==", - "peer": true, - "dependencies": { - "@typescript-eslint/utils": "5.59.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.7.tgz", - "integrity": "sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ==", - "dependencies": { - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/typescript-estree": "5.59.7", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.7.tgz", - "integrity": "sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ==", - "dependencies": { - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/visitor-keys": "5.59.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.7.tgz", - "integrity": "sha512-ozuz/GILuYG7osdY5O5yg0QxXUAEoI4Go3Do5xeu+ERH9PorHBPSdvD3Tjp2NN2bNLh1NJQSsQu2TPu/Ly+HaQ==", - "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.7", - "@typescript-eslint/utils": "5.59.7", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.7.tgz", - "integrity": "sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.7.tgz", - "integrity": "sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==", - "dependencies": { - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/visitor-keys": "5.59.7", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.7.tgz", - "integrity": "sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/typescript-estree": "5.59.7", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.7.tgz", - "integrity": "sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ==", - "dependencies": { - "@typescript-eslint/types": "5.59.7", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "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==", - "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==" - }, - "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==" - }, - "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==" - }, - "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==", - "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==" - }, - "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==", - "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==", - "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==", - "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==" - }, - "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==", - "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==", - "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==", - "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==", - "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==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "peerDependencies": { - "webpack-cli": "4.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==" - }, - "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==" - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "node_modules/@yarnpkg/parsers": { - "version": "3.0.0-rc.44", - "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.44.tgz", - "integrity": "sha512-UVAt9Icc8zfGXioeYJ8XMoSTxOYVmlal2TRNxy9Uh91taS72kQFalK7LpIslcvEBKy4XtarmfIwcFIU3ZY64lw==", - "dev": true, - "dependencies": { - "js-yaml": "^3.10.0", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=14.15.0" - } - }, - "node_modules/@yarnpkg/parsers/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@yarnpkg/parsers/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@yarnpkg/parsers/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@yarnpkg/parsers/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/@zkochan/js-yaml": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", - "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/7zip-bin": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz", - "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==", - "dev": true - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" - }, - "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", - "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", - "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, - "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==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", - "dev": true - }, - "node_modules/adr": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/adr/-/adr-1.4.5.tgz", - "integrity": "sha512-CksA+gh5K4P63R4B0rbH/ILumBLBRN7x4/MAh6GEurDjb8LKpUGeqf7Ux/60luhTpMugkyFc6Gr6EsCQy9VI4g==", - "dev": true, - "dependencies": { - "colors": "^1.3.3", - "commander": "^5.1.0", - "find-in-files": "^0.5.0", - "inquirer": "^7.1.0", - "lru-cache": "^5.1.1", - "markdown": "^0.5.0", - "markdown-toc": "^1.2.0", - "mkdirp": "^1.0.4", - "moment": "^2.24.0", - "open-in-editor": "^2.2.0", - "remarkable": "^2.0.1", - "sharp": "^0.30.4", - "table": "^5.4.1", - "tslib": "^2.0.0", - "walk": "^2.3.14", - "walk-sync": "^2.1.0" - }, - "bin": { - "adr": "build/main/cli.js" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/adr/node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/adr/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/adr/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/adr/node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/adr/node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/adr/node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/adr/node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/adr/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/adr/node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", - "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", - "dev": true, - "dependencies": { - "debug": "^4.1.0", - "depd": "^2.0.0", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "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": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "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==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi_up": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/ansi_up/-/ansi_up-5.2.1.tgz", - "integrity": "sha512-5bz5T/7FRmlxA37zDXhG6cAwlcZtfnmNLDJra66EEIT3kYlw5aPJdbkJEhm59D6kA4Wi5ict6u6IDYHJaQlH+g==", - "engines": { - "node": "*" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==", - "dev": true, - "dependencies": { - "ansi-wrap": "0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", - "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", - "dev": true - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "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==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/app-builder-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", - "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", - "dev": true - }, - "node_modules/app-builder-lib": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-23.6.0.tgz", - "integrity": "sha512-dQYDuqm/rmy8GSCE6Xl/3ShJg6Ab4bZJMT8KaTKGzT436gl1DN4REP3FCWfXoh75qGTJ+u+WsdnnpO9Jl8nyMA==", - "dev": true, - "dependencies": { - "@develar/schema-utils": "~2.6.5", - "@electron/universal": "1.2.1", - "@malept/flatpak-bundler": "^0.4.0", - "7zip-bin": "~5.1.1", - "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "23.6.0", - "builder-util-runtime": "9.1.1", - "chromium-pickle-js": "^0.2.0", - "debug": "^4.3.4", - "ejs": "^3.1.7", - "electron-osx-sign": "^0.6.0", - "electron-publish": "23.6.0", - "form-data": "^4.0.0", - "fs-extra": "^10.1.0", - "hosted-git-info": "^4.1.0", - "is-ci": "^3.0.0", - "isbinaryfile": "^4.0.10", - "js-yaml": "^4.1.0", - "lazy-val": "^1.0.5", - "minimatch": "^3.1.2", - "read-config-file": "6.2.0", - "sanitize-filename": "^1.6.3", - "semver": "^7.3.7", - "tar": "^6.1.11", - "temp-file": "^3.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/app-builder-lib/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/app-builder-lib/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "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/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "engines": { - "node": ">=6" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", - "dev": true, - "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/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asar": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/asar/-/asar-3.2.0.tgz", - "integrity": "sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==", - "deprecated": "Please use @electron/asar moving forward. There is no API change, just a package name change", - "dev": true, - "dependencies": { - "chromium-pickle-js": "^0.2.0", - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - }, - "bin": { - "asar": "bin/asar.js" - }, - "engines": { - "node": ">=10.12.0" - }, - "optionalDependencies": { - "@types/glob": "^7.1.1" - } - }, - "node_modules/asar/node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "peer": true - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "node_modules/async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atomically": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/atomically/-/atomically-1.7.0.tgz", - "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==", - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/auto-bind": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", - "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/autolinker": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.16.2.tgz", - "integrity": "sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==", - "dev": true, - "dependencies": { - "tslib": "^2.3.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/await-lock": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", - "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, - "node_modules/axe-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.1.tgz", - "integrity": "sha512-sCXXUhA+cljomZ3ZAwb8i1p3oOlkABzPy08ZDAoGcYuvtBPlQ1Ytde129ArXyHWDhfeewq7rlx9F+cUx2SSlkg==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", - "dev": true, - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axios/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", - "peer": true, - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" - }, - "node_modules/babel-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", - "dependencies": { - "@jest/transform": "^29.5.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.5.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", - "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "peer": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "peer": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", - "peer": true - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", - "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", - "dependencies": { - "babel-plugin-jest-hoist": "^29.5.0", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-react-app": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", - "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", - "peer": true, - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-decorators": "^7.16.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-transform-flow-strip-types": "^7.16.0", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.4", - "@babel/preset-env": "^7.16.4", - "@babel/preset-react": "^7.16.0", - "@babel/preset-typescript": "^7.16.0", - "@babel/runtime": "^7.16.3", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/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/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/before-after-hook": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", - "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", - "dev": true - }, - "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/bin-check": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", - "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", - "dev": true, - "dependencies": { - "execa": "^0.7.0", - "executable": "^4.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/bin-links": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.1.tgz", - "integrity": "sha512-bmFEM39CyX336ZGGRsGPlc6jZHriIoHacOQcTt72MktIjpPhZoP4te2jOyUXF3BLILmJ8aNLncoPVeIIFlrDeA==", - "dev": true, - "dependencies": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/bin-links/node_modules/cmd-shim": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.1.tgz", - "integrity": "sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/bin-links/node_modules/read-cmd-shim": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", - "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/bin-links/node_modules/signal-exit": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", - "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/bin-links/node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/bin-version": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-6.0.0.tgz", - "integrity": "sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "find-versions": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bin-version-check": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-5.0.0.tgz", - "integrity": "sha512-Q3FMQnS5eZmrBGqmDXLs4dbAn/f+52voP6ykJYmweSA60t6DyH4UTSwZhtbK5UH+LBoWvDljILUQMLRUtsynsA==", - "dev": true, - "dependencies": { - "bin-version": "^6.0.0", - "semver": "^7.3.5", - "semver-truncate": "^2.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bin-version/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/bin-version/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/bin-version/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/bin-version/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/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.5" - } - }, - "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/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/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/body-parser/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/body-parser/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/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/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "optional": true - }, - "node_modules/bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dev": true, - "dependencies": { - "big-integer": "^1.6.44" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", - "dependencies": { - "pako": "~0.2.0" - } - }, - "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha512-tcBWO2Dl4e7Asr9hTGcpVrCe+F7DubpmqWCTbj4FHLmjqO2hIaC383acQubWtRJhdceqs5uBHs6Es+Sk//RKiQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "dev": true - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/builder-util": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-23.6.0.tgz", - "integrity": "sha512-QiQHweYsh8o+U/KNCZFSvISRnvRctb8m/2rB2I1JdByzvNKxPeFLlHFRPQRXab6aYeXc18j9LpsDLJ3sGQmWTQ==", - "dev": true, - "dependencies": { - "@types/debug": "^4.1.6", - "@types/fs-extra": "^9.0.11", - "7zip-bin": "~5.1.1", - "app-builder-bin": "4.0.0", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.1.1", - "chalk": "^4.1.1", - "cross-spawn": "^7.0.3", - "debug": "^4.3.4", - "fs-extra": "^10.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-ci": "^3.0.0", - "js-yaml": "^4.1.0", - "source-map-support": "^0.5.19", - "stat-mode": "^1.0.0", - "temp-file": "^3.4.0" - } - }, - "node_modules/builder-util-runtime": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.1.1.tgz", - "integrity": "sha512-azRhYLEoDvRDR8Dhis4JatELC/jUvYjm4cVSj7n9dauGTOM2eeNn9KS0z6YA6oDsjI1xphjNbY6PZZeHPzzqaw==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/builder-util/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/bundle-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", - "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", - "dev": true, - "dependencies": { - "run-applescript": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/byte-size": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-7.0.0.tgz", - "integrity": "sha512-NNiBxKgxybMBtWdmvx7ZITJi4ZG+CYUgwOSZTfqB1qogkRHrhbQE/R2r5Fh94X+InN5MCYz6SvB/ejHMj/HbsQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "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/cacache": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.3.tgz", - "integrity": "sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz", - "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==", - "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" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/cacache/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==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/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/cacache/node_modules/ssri": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", - "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/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/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys/node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001489", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz", - "integrity": "sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==", - "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/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "node_modules/chart.js": { - "version": "2.9.4", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-2.9.4.tgz", - "integrity": "sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A==", - "dependencies": { - "chartjs-color": "^2.1.0", - "moment": "^2.10.2" - } - }, - "node_modules/chartjs-color": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz", - "integrity": "sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==", - "dependencies": { - "chartjs-color-string": "^0.6.0", - "color-convert": "^1.9.3" - } - }, - "node_modules/chartjs-color-string": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz", - "integrity": "sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==", - "dependencies": { - "color-name": "^1.0.0" - } - }, - "node_modules/chartjs-color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/chartjs-color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "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==", - "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==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", - "dev": true - }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/circular-dependency-plugin": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", - "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", - "dev": true, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "webpack": ">=4.0.1" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==" - }, - "node_modules/clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", - "dev": true, - "dependencies": { - "chalk": "^1.1.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clap/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clap/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clap/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clap/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/clap/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clap/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.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/clean-css/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/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-progress": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", - "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", - "dependencies": { - "string-width": "^4.2.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "optional": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz", - "integrity": "sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "engines": { - "node": ">=0.8" - } - }, - "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==", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-deep/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==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cmd-shim": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-5.0.0.tgz", - "integrity": "sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==", - "dev": true, - "dependencies": { - "mkdirp-infer-owner": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/coffee-script": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", - "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", - "deprecated": "CoffeeScript on NPM has moved to \"coffeescript\" (no hyphen)", - "dev": true, - "bin": { - "cake": "bin/cake", - "coffee": "bin/coffee" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==" - }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/columnify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", - "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", - "dev": true, - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/common-ancestor-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "dev": true - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/compare-func/node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/compare-version": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz", - "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/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/compression/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/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "engines": [ - "node >= 6.0" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", - "dev": true, - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/concat-with-sourcemaps/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/concurrently": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", - "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "date-fns": "^2.29.1", - "lodash": "^4.17.21", - "rxjs": "^7.0.0", - "shell-quote": "^1.7.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", - "tree-kill": "^1.2.2", - "yargs": "^17.3.1" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/concurrently/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/conf": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/conf/-/conf-10.2.0.tgz", - "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==", - "dependencies": { - "ajv": "^8.6.3", - "ajv-formats": "^2.1.1", - "atomically": "^1.7.0", - "debounce-fn": "^4.0.0", - "dot-prop": "^6.0.1", - "env-paths": "^2.2.1", - "json-schema-typed": "^7.0.3", - "onetime": "^5.1.2", - "pkg-up": "^3.1.0", - "semver": "^7.3.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/config-chain": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", - "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "dev": true, - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "peer": 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/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "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-disposition/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/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/conventional-changelog-angular": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", - "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", - "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", - "dev": true, - "dependencies": { - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-parser": "^3.2.0", - "dateformat": "^3.0.0", - "get-pkg-repo": "^4.0.0", - "git-raw-commits": "^2.0.8", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^4.1.1", - "lodash": "^4.17.15", - "normalize-package-data": "^3.0.0", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dev": true, - "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/conventional-changelog-writer/node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser/node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/conventional-recommended-bump": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", - "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", - "dev": true, - "dependencies": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.3.4", - "conventional-commits-filter": "^2.0.7", - "conventional-commits-parser": "^3.2.0", - "git-raw-commits": "^2.0.8", - "git-semver-tags": "^4.1.1", - "meow": "^8.0.0", - "q": "^1.5.1" - }, - "bin": { - "conventional-recommended-bump": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "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/copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", - "dev": true, - "dependencies": { - "is-what": "^3.14.1" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", - "dev": true, - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "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/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/core-js-compat": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", - "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", - "peer": true, - "dependencies": { - "browserslist": "^4.21.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.2.tgz", - "integrity": "sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "optional": true, - "dependencies": { - "buffer": "^5.1.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "devOptional": true - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", - "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/css-box-model": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", - "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", - "dependencies": { - "tiny-invariant": "^1.0.6" - } - }, - "node_modules/css-loader": { - "version": "6.7.4", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.4.tgz", - "integrity": "sha512-0Y5uHtK5BswfaGJ+jrO+4pPg1msFBc0pwPIE1VqfpmVn6YbDfYfXMj8rfd7nt+4goAhJueO+H/I40VWJfcP1mQ==", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.1", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "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-vendor": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", - "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", - "dependencies": { - "@babel/runtime": "^7.8.3", - "is-in-browser": "^1.0.2" - } - }, - "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/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssfontparser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz", - "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==", - "dev": true - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" - }, - "node_modules/cssstyle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", - "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", - "dependencies": { - "rrweb-cssom": "^0.6.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "peer": true - }, - "node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/data-urls": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", - "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/debounce-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", - "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", - "dependencies": { - "mimic-fn": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" - }, - "node_modules/deep-equal": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", - "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.0", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", - "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", - "dev": true, - "dependencies": { - "bundle-name": "^3.0.0", - "default-browser-id": "^3.0.0", - "execa": "^7.1.1", - "titleize": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", - "dev": true, - "dependencies": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/default-browser/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/default-browser/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/default-browser/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/default-gateway/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/default-gateway/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/default-gateway/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/default-gateway/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/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "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/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/del": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", - "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/del/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "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/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "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-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "engines": { - "node": ">=8" - } - }, - "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==", - "devOptional": true - }, - "node_modules/diacritics-map": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/diacritics-map/-/diacritics-map-0.1.0.tgz", - "integrity": "sha512-3omnDTYrGigU0i4cJjvaKwD52B8aoqyX/NEIkukFFkogBemsIbhSa1O414fpTp5nuszJG6lvQ5vBvDVNCbSsaQ==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "devOptional": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-compare": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-2.4.0.tgz", - "integrity": "sha512-l9hmu8x/rjVC9Z2zmGzkhOEowZvW7pmYws5CWHutg8u1JgvsKWMx7Q/UODeu4djLZ4FgW5besw5yvMQnBHzuCA==", - "dev": true, - "dependencies": { - "buffer-equal": "1.0.0", - "colors": "1.0.3", - "commander": "2.9.0", - "minimatch": "3.0.4" - }, - "bin": { - "dircompare": "src/cli/dircompare.js" - } - }, - "node_modules/dir-compare/node_modules/colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/dir-compare/node_modules/commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==", - "dev": true, - "dependencies": { - "graceful-readlink": ">= 1.0.0" - }, - "engines": { - "node": ">= 0.6.x" - } - }, - "node_modules/dir-compare/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/dmg-builder": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-23.6.0.tgz", - "integrity": "sha512-jFZvY1JohyHarIAlTbfQOk+HnceGjjAdFjVn3n8xlDWKsYNqbO4muca6qXEZTfGXeQMG7TYim6CeS5XKSfSsGA==", - "dev": true, - "dependencies": { - "app-builder-lib": "23.6.0", - "builder-util": "23.6.0", - "builder-util-runtime": "9.1.1", - "fs-extra": "^10.0.0", - "iconv-lite": "^0.6.2", - "js-yaml": "^4.1.0" - }, - "optionalDependencies": { - "dmg-license": "^1.0.11" - } - }, - "node_modules/dmg-builder/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dmg-license": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", - "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "@types/plist": "^3.0.1", - "@types/verror": "^1.10.3", - "ajv": "^6.10.0", - "crc": "^3.8.0", - "iconv-corefoundation": "^1.1.7", - "plist": "^3.0.4", - "smart-buffer": "^4.0.2", - "verror": "^1.10.0" - }, - "bin": { - "dmg-license": "bin/dmg-license.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dmg-license/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, - "optional": 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/dmg-license/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, - "optional": 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/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" - }, - "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-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dom-helpers/node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "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/dom-serializer/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/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/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "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/dompurify": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", - "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==" - }, - "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/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", - "dev": true - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/duplexify/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/duplexify/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==", - "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/duplexify/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==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", - "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron": { - "version": "22.3.10", - "resolved": "https://registry.npmjs.org/electron/-/electron-22.3.10.tgz", - "integrity": "sha512-gh7PtSh+rfxHfM4dzPiEO+k1NRo07FvaK/jXG3HzuODrpTTEhC9rsE+AJGrTKQU6Nz7GorseMvnvs8PnUQPPTw==", - "hasInstallScript": true, - "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^16.11.26", - "extract-zip": "^2.0.1" - }, - "bin": { - "electron": "cli.js" - }, - "engines": { - "node": ">= 12.20.55" - } - }, - "node_modules/electron-builder": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-23.6.0.tgz", - "integrity": "sha512-y8D4zO+HXGCNxFBV/JlyhFnoQ0Y0K7/sFH+XwIbj47pqaW8S6PGYQbjoObolKBR1ddQFPt4rwp4CnwMJrW3HAw==", - "dev": true, - "dependencies": { - "@types/yargs": "^17.0.1", - "app-builder-lib": "23.6.0", - "builder-util": "23.6.0", - "builder-util-runtime": "9.1.1", - "chalk": "^4.1.1", - "dmg-builder": "23.6.0", - "fs-extra": "^10.0.0", - "is-ci": "^3.0.0", - "lazy-val": "^1.0.5", - "read-config-file": "6.2.0", - "simple-update-notifier": "^1.0.7", - "yargs": "^17.5.1" - }, - "bin": { - "electron-builder": "cli.js", - "install-app-deps": "install-app-deps.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/electron-builder/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-devtools-installer": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/electron-devtools-installer/-/electron-devtools-installer-3.2.0.tgz", - "integrity": "sha512-t3UczsYugm4OAbqvdImMCImIMVdFzJAHgbwHpkl5jmfu1izVgUcP/mnrPqJIpEeCK1uZGpt+yHgWEN+9EwoYhQ==", - "dependencies": { - "rimraf": "^3.0.2", - "semver": "^7.2.1", - "tslib": "^2.1.0", - "unzip-crx-3": "^0.2.0" - } - }, - "node_modules/electron-devtools-installer/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/electron-osx-sign": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/electron-osx-sign/-/electron-osx-sign-0.6.0.tgz", - "integrity": "sha512-+hiIEb2Xxk6eDKJ2FFlpofCnemCbjbT5jz+BKGpVBrRNT3kWTGs4DfNX6IzGwgi33hUcXF+kFs9JW+r6Wc1LRg==", - "deprecated": "Please use @electron/osx-sign moving forward. Be aware the API is slightly different", - "dev": true, - "dependencies": { - "bluebird": "^3.5.0", - "compare-version": "^0.1.2", - "debug": "^2.6.8", - "isbinaryfile": "^3.0.2", - "minimist": "^1.2.0", - "plist": "^3.0.1" - }, - "bin": { - "electron-osx-flat": "bin/electron-osx-flat.js", - "electron-osx-sign": "bin/electron-osx-sign.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/electron-osx-sign/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/electron-osx-sign/node_modules/isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "dependencies": { - "buffer-alloc": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/electron-osx-sign/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/electron-publish": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-23.6.0.tgz", - "integrity": "sha512-jPj3y+eIZQJF/+t5SLvsI5eS4mazCbNYqatv5JihbqOstIM13k0d1Z3vAWntvtt13Itl61SO6seicWdioOU5dg==", - "dev": true, - "dependencies": { - "@types/fs-extra": "^9.0.11", - "builder-util": "23.6.0", - "builder-util-runtime": "9.1.1", - "chalk": "^4.1.1", - "fs-extra": "^10.0.0", - "lazy-val": "^1.0.5", - "mime": "^2.5.2" - } - }, - "node_modules/electron-publish/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.405", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.405.tgz", - "integrity": "sha512-JdDgnwU69FMZURoesf9gNOej2Cms1XJFfLk24y1IBtnAdhTcJY/mXnokmpmxHN59PcykBP4bgUU98vLY44Lhuw==" - }, - "node_modules/electron-updater": { - "version": "4.6.5", - "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-4.6.5.tgz", - "integrity": "sha512-kdTly8O9mSZfm9fslc1mnCY+mYOeaYRy7ERa2Fed240u01BKll3aiupzkd07qKw69KvhBSzuHroIW3mF0D8DWA==", - "dependencies": { - "@types/semver": "^7.3.6", - "builder-util-runtime": "8.9.2", - "fs-extra": "^10.0.0", - "js-yaml": "^4.1.0", - "lazy-val": "^1.0.5", - "lodash.escaperegexp": "^4.1.2", - "lodash.isequal": "^4.5.0", - "semver": "^7.3.5" - } - }, - "node_modules/electron-updater/node_modules/builder-util-runtime": { - "version": "8.9.2", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.9.2.tgz", - "integrity": "sha512-rhuKm5vh7E0aAmT6i8aoSfEjxzdYEFX7zDApK+eNgOhjofnWb74d9SRJv0H/8nsgOkos0TZ4zxW0P8J4N7xQ2A==", - "dependencies": { - "debug": "^4.3.2", - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/electron-updater/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-window-state": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/electron-window-state/-/electron-window-state-5.0.3.tgz", - "integrity": "sha512-1mNTwCfkolXl3kMf50yW3vE2lZj0y92P/HYWFBrb+v2S/pCka5mdwN3cagKm458A7NjndSwijynXgcLWRodsVg==", - "dependencies": { - "jsonfile": "^4.0.0", - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/electron-window-state/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-window-state/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" - }, - "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/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", - "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/ensure-posix-path": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz", - "integrity": "sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw==", - "dev": true - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", - "dev": true, - "optional": true, - "dependencies": { - "prr": "~1.0.1" - }, - "bin": { - "errno": "cli.js" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "dev": true, - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", - "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "optional": true - }, - "node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" - } - }, - "node_modules/esbuild-loader": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/esbuild-loader/-/esbuild-loader-2.21.0.tgz", - "integrity": "sha512-k7ijTkCT43YBSZ6+fBCW1Gin7s46RrJ0VQaM8qA7lq7W+OLsGgtLyFV8470FzYi/4TeDexniTBTPTwZUnXXR5g==", - "dev": true, - "dependencies": { - "esbuild": "^0.16.17", - "joycon": "^3.0.1", - "json5": "^2.2.0", - "loader-utils": "^2.0.0", - "tapable": "^2.2.0", - "webpack-sources": "^1.4.3" - }, - "funding": { - "url": "https://github.com/privatenumber/esbuild-loader?sponsor=1" - }, - "peerDependencies": { - "webpack": "^4.40.0 || ^5.0.0" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/android-arm": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", - "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/android-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", - "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/android-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", - "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/darwin-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", - "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/darwin-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", - "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/freebsd-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", - "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/freebsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", - "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-arm": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", - "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", - "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-ia32": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", - "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-loong64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", - "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-mips64el": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", - "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-ppc64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", - "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-riscv64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", - "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-s390x": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", - "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/linux-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", - "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/netbsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", - "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/openbsd-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", - "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/sunos-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", - "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/win32-arm64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", - "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/win32-ia32": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", - "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/@esbuild/win32-x64": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", - "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-loader/node_modules/esbuild": { - "version": "0.16.17", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", - "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.16.17", - "@esbuild/android-arm64": "0.16.17", - "@esbuild/android-x64": "0.16.17", - "@esbuild/darwin-arm64": "0.16.17", - "@esbuild/darwin-x64": "0.16.17", - "@esbuild/freebsd-arm64": "0.16.17", - "@esbuild/freebsd-x64": "0.16.17", - "@esbuild/linux-arm": "0.16.17", - "@esbuild/linux-arm64": "0.16.17", - "@esbuild/linux-ia32": "0.16.17", - "@esbuild/linux-loong64": "0.16.17", - "@esbuild/linux-mips64el": "0.16.17", - "@esbuild/linux-ppc64": "0.16.17", - "@esbuild/linux-riscv64": "0.16.17", - "@esbuild/linux-s390x": "0.16.17", - "@esbuild/linux-x64": "0.16.17", - "@esbuild/netbsd-x64": "0.16.17", - "@esbuild/openbsd-x64": "0.16.17", - "@esbuild/sunos-x64": "0.16.17", - "@esbuild/win32-arm64": "0.16.17", - "@esbuild/win32-ia32": "0.16.17", - "@esbuild/win32-x64": "0.16.17" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/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==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", - "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.41.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "peer": true, - "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" - } - }, - "node_modules/eslint-config-airbnb-base/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-config-airbnb-typescript": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.0.0.tgz", - "integrity": "sha512-elNiuzD0kPAPTXjFWg+lE24nMdHMtuxgYoD30OyMD6yrW1AhFZPAg27VX7d3tzOErw+dgJTNWfRSDqEcXb4V0g==", - "peer": true, - "dependencies": { - "eslint-config-airbnb-base": "^15.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.13.0", - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.3" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", - "peer": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-config-react-app": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", - "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", - "peer": true, - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/eslint-parser": "^7.16.3", - "@rushstack/eslint-patch": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^5.5.0", - "@typescript-eslint/parser": "^5.5.0", - "babel-preset-react-app": "^10.0.1", - "confusing-browser-globals": "^1.0.11", - "eslint-plugin-flowtype": "^8.0.3", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jest": "^25.3.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.27.1", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-testing-library": "^5.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.0" - } - }, - "node_modules/eslint-config-react-app/node_modules/eslint-plugin-jest": { - "version": "25.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", - "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", - "peer": true, - "dependencies": { - "@typescript-eslint/experimental-utils": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", - "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "get-tsconfig": "^4.5.0", - "globby": "^13.1.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "synckit": "^0.8.5" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/globby": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", - "dev": true, - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-flowtype": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", - "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", - "peer": true, - "dependencies": { - "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@babel/plugin-syntax-flow": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.9", - "eslint": "^8.1.0" - } - }, - "node_modules/eslint-plugin-header": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-header/-/eslint-plugin-header-3.1.1.tgz", - "integrity": "sha512-9vlKxuJ4qf793CmeeSrZUvVClw6amtpghq3CuWcB5cUNnWHQhgcqy5eF8oVKFk1G3Y/CbchGfEaw3wiIJaNmVg==", - "dev": true, - "peerDependencies": { - "eslint": ">=7.7.0" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jest": { - "version": "27.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.1.tgz", - "integrity": "sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==", - "peer": true, - "dependencies": { - "@typescript-eslint/utils": "^5.10.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-no-unsanitized": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-4.0.2.tgz", - "integrity": "sha512-Pry0S9YmHoz8NCEMRQh7N0Yexh2MYCNPIlrV52hTmS7qXnTghWsjXouF08bgsrrZqaW9tt1ZiK3j5NEmPE+EjQ==", - "peer": true, - "peerDependencies": { - "eslint": "^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "peer": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dependencies": { - "is-core-module": "^2.9.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/eslint-plugin-react/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-security": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-security/-/eslint-plugin-security-1.7.1.tgz", - "integrity": "sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==", - "peer": true, - "dependencies": { - "safe-regex": "^2.1.1" - } - }, - "node_modules/eslint-plugin-simple-import-sort": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz", - "integrity": "sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==", - "peer": true, - "peerDependencies": { - "eslint": ">=5.0.0" - } - }, - "node_modules/eslint-plugin-testing-library": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.0.tgz", - "integrity": "sha512-ELY7Gefo+61OfXKlQeXNIDVVLPcvKTeiQOoMZG9TeuWa7Ln4dUNRv8JdRWBQI9Mbb427XGlVB1aa1QPZxBJM8Q==", - "peer": true, - "dependencies": { - "@typescript-eslint/utils": "^5.58.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0", - "npm": ">=6" - }, - "peerDependencies": { - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-unused-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", - "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", - "dependencies": { - "eslint-rule-composer": "^0.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0", - "eslint": "^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-xss": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/eslint-plugin-xss/-/eslint-plugin-xss-0.1.12.tgz", - "integrity": "sha512-L5oYaD//ZE7fKNtWUfVgYTRW19jrZlvaHe2swyFLxXQ5pwVQLivi5m92rtXd/ww8yqg4Drasqyi0hlBmhf9YQg==", - "peer": true, - "dependencies": { - "requireindex": "~1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "engines": { - "node": ">=4.0.0" - } - }, - "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==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/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==" - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", - "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", - "dev": true, - "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/execa/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/execa/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - }, - "node_modules/executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "dev": true, - "dependencies": { - "pify": "^2.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", - "dev": true, - "dependencies": { - "fill-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-range/node_modules/fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "dependencies": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-range/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/expand-range/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", - "dependencies": { - "@jest/expect-utils": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "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/express/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/express/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/express/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/express/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/express/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/express/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/ext-list": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", - "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", - "dev": true, - "dependencies": { - "mime-db": "^1.28.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ext-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", - "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", - "dev": true, - "dependencies": { - "ext-list": "^2.0.0", - "sort-keys-length": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/extract-zip/node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "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==" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "peer": true - }, - "node_modules/fast-fifo": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.2.0.tgz", - "integrity": "sha512-NcvQXt7Cky1cNau15FWy64IjuO8X0JijhTBBrJj1YlxlDfRkJXNaK9RFUjwpfDPzMdv7wB38jr53l9tkNLxnWg==" - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/fast-xml-parser": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.2.tgz", - "integrity": "sha512-DLzIPtQqmvmdq3VUKR7T6omPK/VCRNqgFlGtbESfyhcH2R4I8EzK1/K6E8PkRCK2EabWrUHK32NjYRbEFnnz0Q==", - "dev": true, - "funding": [ - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - }, - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "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/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" - }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, - "node_modules/figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", - "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-type": { - "version": "17.1.6", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.6.tgz", - "integrity": "sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==", - "dev": true, - "dependencies": { - "readable-web-to-node-stream": "^3.0.2", - "strtok3": "^7.0.0-alpha.9", - "token-types": "^5.0.0-alpha.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, - "node_modules/file-url": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/file-url/-/file-url-3.0.0.tgz", - "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/filename-reserved-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-3.0.0.tgz", - "integrity": "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/filenamify": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-5.1.1.tgz", - "integrity": "sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA==", - "dev": true, - "dependencies": { - "filename-reserved-regex": "^3.0.0", - "strip-outer": "^2.0.0", - "trim-repeated": "^2.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "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/finalhandler/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/finalhandler/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/find": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/find/-/find-0.1.7.tgz", - "integrity": "sha512-jPrupTOe/pO//3a9Ty2o4NqQCp0L46UG+swUnfFtdmtQVN8pEltKpAqR7Nuf6vWn0GBXx5w+R1MyZzqwjEIqdA==", - "dev": true, - "dependencies": { - "traverse-chain": "~0.1.0" - } - }, - "node_modules/find-in-files": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/find-in-files/-/find-in-files-0.5.0.tgz", - "integrity": "sha512-VraTc6HdtdSHmAp0yJpAy20yPttGKzyBWc7b7FPnnsX9TOgmKx0g9xajizpF/iuu4IvNK4TP0SpyBT9zAlwG+g==", - "dev": true, - "dependencies": { - "find": "^0.1.5", - "q": "^1.0.1" - } - }, - "node_modules/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-versions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-5.1.0.tgz", - "integrity": "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==", - "dev": true, - "dependencies": { - "semver-regex": "^4.0.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" - }, - "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==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/foreachasync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", - "integrity": "sha512-J+ler7Ta54FwwNcx6wQRDhTIbNeyDcARMkOcguEqnEdtm0jKvN3Li3PDAb2Du3ubJYEWfYL83XMROXdsXAXycw==", - "dev": true - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", - "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz", - "integrity": "sha512-IN+XTzusCjR5VgntYFgxbxVx3WraPRnKehBFrf00cMSrtUuW9MsG9dhL6MWpY6MkjC3wVwoujfCDgZZCQwbswA==", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "fs-extra": "^10.0.0", - "memfs": "^3.4.1", - "minimatch": "^3.0.4", - "node-abort-controller": "^3.0.1", - "schema-utils": "^3.1.1", - "semver": "^7.3.5", - "tapable": "^2.2.1" - }, - "engines": { - "node": ">=12.13.0", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "typescript": ">3.6.0", - "vue-template-compiler": "*", - "webpack": "^5.11.0" - }, - "peerDependenciesMeta": { - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "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-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs-minipass": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", - "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/fs-minipass/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/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-pkg-repo": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", - "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", - "dev": true, - "dependencies": { - "@hutson/parse-repository-url": "^3.0.0", - "hosted-git-info": "^4.0.0", - "through2": "^2.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "get-pkg-repo": "src/cli.js" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-pkg-repo/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", - "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", - "dev": true, - "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/git-raw-commits/node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", - "dev": true, - "dependencies": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-semver-tags": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", - "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", - "dev": true, - "dependencies": { - "meow": "^8.0.0", - "semver": "^6.0.0" - }, - "bin": { - "git-semver-tags": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/git-semver-tags/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/git-up": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", - "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", - "dev": true, - "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^8.1.0" - } - }, - "node_modules/git-url-parse": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", - "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", - "dev": true, - "dependencies": { - "git-up": "^7.0.0" - } - }, - "node_modules/gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.2" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "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==" - }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - }, - "node_modules/gray-matter": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz", - "integrity": "sha512-vbmvP1Fe/fxuT2QuLVcqb2BfK7upGhhbLIt9/owWEvPYrZZEkelLcq2HqzxosV+PQ67dUFLaAeNpH7C4hhICAA==", - "dev": true, - "dependencies": { - "ansi-red": "^0.1.1", - "coffee-script": "^1.12.4", - "extend-shallow": "^2.0.1", - "js-yaml": "^3.8.1", - "toml": "^2.3.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gray-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/gray-matter/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/gray-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/gray-matter/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/gulp-header": { - "version": "1.8.12", - "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz", - "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==", - "deprecated": "Removed event-stream from gulp-header", - "dev": true, - "dependencies": { - "concat-with-sourcemaps": "*", - "lodash.template": "^4.4.0", - "through2": "^2.0.0" - } - }, - "node_modules/gunzip-maybe": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", - "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", - "dependencies": { - "browserify-zlib": "^0.1.4", - "is-deflate": "^1.0.0", - "is-gzip": "^1.0.0", - "peek-stream": "^1.1.0", - "pumpify": "^1.3.3", - "through2": "^2.0.3" - }, - "bin": { - "gunzip-maybe": "bin.js" - } - }, - "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/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/har-validator/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/har-validator/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==" - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/harmony-reflect": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "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/history": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", - "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", - "dependencies": { - "@babel/runtime": "^7.1.2", - "loose-envify": "^1.2.0", - "resolve-pathname": "^3.0.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0", - "value-equal": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/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/hosted-git-info/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/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/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/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/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/hpagent": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", - "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", - "engines": { - "node": ">=14" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "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-minifier-terser/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/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/htmlparser2/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/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "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==", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "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/http-proxy-middleware/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/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/hyphenate-style-name": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", - "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" - }, - "node_modules/iconv-corefoundation": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", - "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "cli-truncate": "^2.1.0", - "node-addon-api": "^1.6.3" - }, - "engines": { - "node": "^8.11.2 || >=10" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", - "dependencies": { - "harmony-reflect": "^1.4.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "node_modules/ignore-loader": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ignore-loader/-/ignore-loader-0.1.2.tgz", - "integrity": "sha512-yOJQEKrNwoYqrWLS4DcnzM7SEQhRKis5mB+LdKKh4cPmGYlLPR0ozRzHV5jmEk2IxptqJNQA5Cc0gw8Fj12bXA==", - "dev": true - }, - "node_modules/ignore-walk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", - "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", - "dev": true, - "dependencies": { - "minimatch": "^5.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/ignore-walk/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "dev": true, - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" - }, - "node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/include-media": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/include-media/-/include-media-1.4.10.tgz", - "integrity": "sha512-TymQzKF7oWHbItEcEHOCponZ90lRr1I9QbYeD+qCxXy4Z0/pSpS4Ocz2bq3FMOERlXXrY9Sawsh9GjiObVQA6A==", - "dev": true - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/init-package-json": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-3.0.2.tgz", - "integrity": "sha512-YhlQPEjNFqlGdzrBfDNRLhvoSgX7iQRgSxgsNknRQ9ITXFT7UMfVMWhBTOh2Y+25lRnGrv5Xz8yZwQ3ACR6T3A==", - "dev": true, - "dependencies": { - "npm-package-arg": "^9.0.1", - "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/init-package-json/node_modules/hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/init-package-json/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/init-package-json/node_modules/npm-package-arg": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", - "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", - "dev": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/init-package-json/node_modules/proc-log": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", - "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/inquirer": { - "version": "9.2.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.6.tgz", - "integrity": "sha512-y71l237eJJKS4rl7sQcEUiMhrR0pB/ZnRMMTxLpjJhWL4hdWCT03a6jJnC1w6qIPSRZWEozuieGt3v7XaEJYFw==", - "dependencies": { - "ansi-escapes": "^4.3.2", - "chalk": "^5.2.0", - "cli-cursor": "^3.1.0", - "cli-width": "^4.0.0", - "external-editor": "^3.0.3", - "figures": "^5.0.0", - "lodash": "^4.17.21", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "through": "^2.3.6", - "wrap-ansi": "^6.0.1" - }, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/install": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", - "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "node_modules/ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-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==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "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==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-deflate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", - "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==" - }, - "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-electron": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", - "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==" - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-gzip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", - "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-in-browser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", - "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==" - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", - "dev": true, - "dependencies": { - "protocols": "^2.0.1" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-url": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", - "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true - }, - "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/is2": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.9.tgz", - "integrity": "sha512-rZkHeBn9Zzq52sd9IUIV3a5mfwBY+o2HePMh0wkGBM4z4qjvy2GwVxQ6nNXSfw6MmVP6gf1QIlWjiOavhM3x5g==", - "dependencies": { - "deep-is": "^0.1.3", - "ip-regex": "^4.1.0", - "is-url": "^1.2.4" - }, - "engines": { - "node": ">=v0.10.0" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isomorphic-ws": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", - "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", - "peerDependencies": { - "ws": "*" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.1.tgz", - "integrity": "sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.8.6", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.6.tgz", - "integrity": "sha512-G43Ub9IYEFfu72sua6rzooi8V8Gz2lkfk48rW20vEWCGizeaEPlKB1Kh8JIA84yQbiAEfqlPmSpGgCKKxH3rDA==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", - "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", - "import-local": "^3.0.2", - "jest-cli": "^29.5.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-canvas-mock": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.5.1.tgz", - "integrity": "sha512-IVnRiz+v4EYn3ydM/pBo8GW/J+nU/Hg5gHBQQOUQhdRyNfvHnabB8ReqARLO0p+kvQghqr4V0tA92CF3JcUSRg==", - "dev": true, - "dependencies": { - "cssfontparser": "^1.2.1", - "moo-color": "^1.0.2" - } - }, - "node_modules/jest-changed-files": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", - "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", - "dependencies": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-changed-files/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/jest-changed-files/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-changed-files/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-changed-files/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", - "pure-rand": "^6.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", - "dependencies": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-circus/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/jest-cli": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", - "dependencies": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", - "dependencies": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-config/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", - "dependencies": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/jest-docblock": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", - "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", - "dependencies": { - "@jest/types": "^29.5.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", - "dependencies": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/jest-environment-jsdom": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-28.1.3.tgz", - "integrity": "sha512-HnlGUmZRdxfCByd3GM2F100DgQOajUBzEitjGqIREcb45kGjZvRrKUdlaF6escXBdcXNl0OBh+1ZrfeZT3GnAg==", - "dev": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/jsdom": "^16.2.4", - "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3", - "jsdom": "^19.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@jest/environment": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", - "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@jest/fake-timers": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", - "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", - "dev": true - }, - "node_modules/jest-environment-jsdom/node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@types/jsdom": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.15.tgz", - "integrity": "sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/parse5": "^6.0.3", - "@types/tough-cookie": "*" - } - }, - "node_modules/jest-environment-jsdom/node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/jest-environment-jsdom/node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-environment-jsdom/node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-jsdom/node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/jest-environment-jsdom/node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-environment-jsdom/node_modules/data-urls/node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-environment-jsdom/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-environment-jsdom/node_modules/jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/jest-mock": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", - "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/jsdom": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", - "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.5.0", - "acorn-globals": "^6.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.1", - "decimal.js": "^10.3.1", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^3.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^10.0.0", - "ws": "^8.2.3", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jest-environment-jsdom/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/jest-environment-jsdom/node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/jest-environment-jsdom/node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-environment-jsdom/node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-environment-jsdom/node_modules/w3c-xmlserializer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", - "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", - "dev": true, - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-environment-jsdom/node_modules/whatwg-url": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-10.0.0.tgz", - "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", - "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-environment-node": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", - "dependencies": { - "@jest/types": "^29.5.0", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", - "dependencies": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-leak-detector/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", - "dependencies": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-leak-detector/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", - "dependencies": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", - "dependencies": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/jest-mock": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", - "dependencies": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "jest-util": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-mock-extended": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/jest-mock-extended/-/jest-mock-extended-2.0.9.tgz", - "integrity": "sha512-eRZq7/FgwHbxOMm3Lo4DpQX6S2zi4OvwMVFHEb3FgDLp0Xy3P1WARkF93xxO5uD4nAHiEPYHZ25qVU9mAVxoLQ==", - "dev": true, - "dependencies": { - "ts-essentials": "^7.0.3" - }, - "peerDependencies": { - "jest": "^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0 || ^29.0.0", - "typescript": "^3.0.0 || ^4.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", - "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "resolve": "^1.20.0", - "resolve.exports": "^2.0.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", - "dependencies": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", - "dependencies": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-runner/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-runner/node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/jest-runtime": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-jsx": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^29.5.0", - "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", - "dependencies": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", - "dependencies": { - "@jest/types": "^29.5.0", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", - "dependencies": { - "@jest/types": "^29.5.0", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "leven": "^3.1.0", - "pretty-format": "^29.5.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-validate/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", - "dependencies": { - "@jest/schemas": "^29.4.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/jest-watch-select-projects": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jest-watch-select-projects/-/jest-watch-select-projects-2.0.0.tgz", - "integrity": "sha512-j00nW4dXc2NiCW6znXgFLF9g8PJ0zP25cpQ1xRro/HU2GBfZQFZD0SoXnAlaoKkIY4MlfTMkKGbNXFpvCdjl1w==", - "dependencies": { - "ansi-escapes": "^4.3.0", - "chalk": "^3.0.0", - "prompts": "^2.2.1" - } - }, - "node_modules/jest-watch-select-projects/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-2.2.2.tgz", - "integrity": "sha512-+QgOFW4o5Xlgd6jGS5X37i08tuuXNW8X0CV9WNFi+3n8ExCIP+E1melYhvYLjv5fE6D0yyzk74vsSO8I6GqtvQ==", - "dependencies": { - "ansi-escapes": "^6.0.0", - "chalk": "^5.2.0", - "jest-regex-util": "^29.0.0", - "jest-watcher": "^29.0.0", - "slash": "^5.0.0", - "string-length": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "jest": "^27.0.0 || ^28.0.0 || ^29.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", - "dependencies": { - "type-fest": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/char-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", - "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/jest-watch-typeahead/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/string-length": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", - "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", - "dependencies": { - "char-regex": "^2.0.0", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/type-fest": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.11.0.tgz", - "integrity": "sha512-JaPw5U9ixP0XcpUbQoVSbxSDcK/K4nww20C3kjm9yE6cDRRhptU28AH60VWf9ltXmCrIfIbtt9J+2OUk2Uqiaw==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", - "dependencies": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.13.1", - "jest-util": "^29.5.0", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", - "dependencies": { - "@types/node": "*", - "jest-util": "^29.5.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", - "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/joi": { - "version": "17.9.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", - "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", - "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", - "@sideway/formula": "^3.0.1", - "@sideway/pinpoint": "^2.0.0" - } - }, - "node_modules/joi/node_modules/@hapi/hoek": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" - }, - "node_modules/jose": { - "version": "4.14.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", - "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "node_modules/jsdom": { - "version": "21.1.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.2.tgz", - "integrity": "sha512-sCpFmK2jv+1sjff4u7fzft+pUh2KSUbUrEHYHyfSIbGTIcmnjyp83qg6qLwdJ/I3LpTXx33ACxeRL7Lsyc6lGQ==", - "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.2", - "acorn-globals": "^7.0.0", - "cssstyle": "^3.0.0", - "data-urls": "^4.0.0", - "decimal.js": "^10.4.3", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.4", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.1", - "ws": "^8.13.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", - "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "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==" - }, - "node_modules/json-schema-typed": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-7.0.3.tgz", - "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - }, - "node_modules/json-stringify-nice": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", - "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/jsonpath-plus": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", - "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/jsprim/node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/jss": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", - "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "csstype": "^3.0.2", - "is-in-browser": "^1.1.3", - "tiny-warning": "^1.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/jss" - } - }, - "node_modules/jss-plugin-camel-case": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz", - "integrity": "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "hyphenate-style-name": "^1.0.3", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-default-unit": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz", - "integrity": "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-global": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz", - "integrity": "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-nested": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz", - "integrity": "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "node_modules/jss-plugin-props-sort": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz", - "integrity": "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0" - } - }, - "node_modules/jss-plugin-rule-value-function": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz", - "integrity": "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "jss": "10.10.0", - "tiny-warning": "^1.0.2" - } - }, - "node_modules/jss-plugin-vendor-prefixer": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz", - "integrity": "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "css-vendor": "^2.0.8", - "jss": "10.10.0" - } - }, - "node_modules/jss/node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", - "dependencies": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jszip/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/jszip/node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/jszip/node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/jszip/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==", - "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/jszip/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==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/just-diff": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", - "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", - "dev": true - }, - "node_modules/just-diff-apply": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", - "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", - "dev": true - }, - "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "peer": true - }, - "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", - "peer": true, - "dependencies": { - "language-subtag-registry": "~0.3.2" - } - }, - "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/lazy-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", - "integrity": "sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==", - "dev": true, - "dependencies": { - "set-getter": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lazy-val": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz", - "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==" - }, - "node_modules/lerna": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-6.6.2.tgz", - "integrity": "sha512-W4qrGhcdutkRdHEaDf9eqp7u4JvI+1TwFy5woX6OI8WPe4PYBdxuILAsvhp614fUG41rKSGDKlOh+AWzdSidTg==", - "dev": true, - "dependencies": { - "@lerna/child-process": "6.6.2", - "@lerna/create": "6.6.2", - "@lerna/legacy-package-management": "6.6.2", - "@npmcli/arborist": "6.2.3", - "@npmcli/run-script": "4.1.7", - "@nrwl/devkit": ">=15.5.2 < 16", - "@octokit/plugin-enterprise-rest": "6.0.1", - "@octokit/rest": "19.0.3", - "byte-size": "7.0.0", - "chalk": "4.1.0", - "clone-deep": "4.0.1", - "cmd-shim": "5.0.0", - "columnify": "1.6.0", - "config-chain": "1.1.12", - "conventional-changelog-angular": "5.0.12", - "conventional-changelog-core": "4.2.4", - "conventional-recommended-bump": "6.1.0", - "cosmiconfig": "7.0.0", - "dedent": "0.7.0", - "dot-prop": "6.0.1", - "envinfo": "^7.7.4", - "execa": "5.0.0", - "fs-extra": "9.1.0", - "get-port": "5.1.1", - "get-stream": "6.0.0", - "git-url-parse": "13.1.0", - "glob-parent": "5.1.2", - "globby": "11.1.0", - "graceful-fs": "4.2.10", - "has-unicode": "2.0.1", - "import-local": "^3.0.2", - "init-package-json": "3.0.2", - "inquirer": "^8.2.4", - "is-ci": "2.0.0", - "is-stream": "2.0.0", - "js-yaml": "^4.1.0", - "libnpmaccess": "^6.0.3", - "libnpmpublish": "7.1.4", - "load-json-file": "6.2.0", - "make-dir": "3.1.0", - "minimatch": "3.0.5", - "multimatch": "5.0.0", - "node-fetch": "2.6.7", - "npm-package-arg": "8.1.1", - "npm-packlist": "5.1.1", - "npm-registry-fetch": "^14.0.3", - "npmlog": "^6.0.2", - "nx": ">=15.5.2 < 16", - "p-map": "4.0.0", - "p-map-series": "2.1.0", - "p-pipe": "3.1.0", - "p-queue": "6.6.2", - "p-reduce": "2.1.0", - "p-waterfall": "2.1.1", - "pacote": "15.1.1", - "pify": "5.0.0", - "read-cmd-shim": "3.0.0", - "read-package-json": "5.0.1", - "resolve-from": "5.0.0", - "rimraf": "^4.4.1", - "semver": "^7.3.8", - "signal-exit": "3.0.7", - "slash": "3.0.0", - "ssri": "9.0.1", - "strong-log-transformer": "2.1.0", - "tar": "6.1.11", - "temp-dir": "1.0.0", - "typescript": "^3 || ^4", - "upath": "^2.0.1", - "uuid": "8.3.2", - "validate-npm-package-license": "3.0.4", - "validate-npm-package-name": "4.0.0", - "write-file-atomic": "4.0.1", - "write-pkg": "4.0.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4" - }, - "bin": { - "lerna": "dist/cli.js" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - } - }, - "node_modules/lerna/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "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/lerna/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/lerna/node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/lerna/node_modules/cosmiconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", - "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lerna/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/lerna/node_modules/execa": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", - "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", - "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/lerna/node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lerna/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/lerna/node_modules/get-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", - "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lerna/node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/lerna/node_modules/inquirer": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", - "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/lerna/node_modules/inquirer/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/lerna/node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/lerna/node_modules/is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/lerna/node_modules/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/lerna/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/lerna/node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/lerna/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/lerna/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/lerna/node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lerna/node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/lerna/node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/lerna/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/lerna/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/lerna/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/lerna/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/lerna/node_modules/write-file-atomic": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", - "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/lerna/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/lerna/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/less": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/less/-/less-4.1.3.tgz", - "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", - "dev": true, - "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" - }, - "bin": { - "lessc": "bin/lessc" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "source-map": "~0.6.0" - } - }, - "node_modules/less/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "optional": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/less/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, - "optional": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/less/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/less/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/less/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, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/libnpmaccess": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-6.0.4.tgz", - "integrity": "sha512-qZ3wcfIyUoW0+qSFkMBovcTrSGJ3ZeyvpR7d5N9pEYv/kXs8sHP2wiqEIXBKLFrZlmM0kR0RJD7mtfLngtlLag==", - "dev": true, - "dependencies": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/libnpmaccess/node_modules/hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/libnpmaccess/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/libnpmaccess/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/libnpmaccess/node_modules/npm-package-arg": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", - "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", - "dev": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/libnpmaccess/node_modules/npm-registry-fetch": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", - "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", - "dev": true, - "dependencies": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/libnpmaccess/node_modules/proc-log": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", - "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/libnpmaccess/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/libnpmpublish": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-7.1.4.tgz", - "integrity": "sha512-mMntrhVwut5prP4rJ228eEbEyvIzLWhqFuY90j5QeXBCTT2pWSMno7Yo2S2qplPUr02zPurGH4heGLZ+wORczg==", - "dev": true, - "dependencies": { - "ci-info": "^3.6.1", - "normalize-package-data": "^5.0.0", - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3", - "proc-log": "^3.0.0", - "semver": "^7.3.7", - "sigstore": "^1.4.0", - "ssri": "^10.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/libnpmpublish/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/libnpmpublish/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/libnpmpublish/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/libnpmpublish/node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/libnpmpublish/node_modules/ssri": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", - "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/libnpmpublish/node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", - "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", - "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/list-item": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/list-item/-/list-item-1.1.1.tgz", - "integrity": "sha512-S3D0WZ4J6hyM8o5SNKWaMYB1ALSacPZ2nHGEuCjmHZ+dc03gFeNZoNDcqfcnO4vDhTZmNrqrpYZCdXsRh22bzw==", - "dev": true, - "dependencies": { - "expand-range": "^1.8.1", - "extend-shallow": "^2.0.1", - "is-number": "^2.1.0", - "repeat-string": "^1.5.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", - "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "parse-json": "^5.0.0", - "strip-bom": "^4.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/load-json-file/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/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==", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/localforage": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", - "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", - "dependencies": { - "lie": "3.1.1" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", - "dev": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "peer": true - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/logform": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", - "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", - "dependencies": { - "@colors/colors": "1.5.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "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/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/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/make-fetch-happen/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-fetch-happen/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-fetch-happen/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/make-fetch-happen/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/make-fetch-happen/node_modules/rimraf/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/make-fetch-happen/node_modules/rimraf/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/make-fetch-happen/node_modules/rimraf/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/make-fetch-happen/node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/markdown/-/markdown-0.5.0.tgz", - "integrity": "sha512-ctGPIcuqsYoJ493sCtFK7H4UEgMWAUdXeBhPbdsg1W0LsV9yJELAHRsMmWfTgao6nH0/x5gf9FmsbxiXnrgaIQ==", - "dev": true, - "dependencies": { - "nopt": "~2.1.1" - }, - "bin": { - "md2html": "bin/md2html.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/markdown-link": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/markdown-link/-/markdown-link-0.1.1.tgz", - "integrity": "sha512-TurLymbyLyo+kAUUAV9ggR9EPcDjP/ctlv9QAFiqUH7c+t6FlsbivPo9OKTU8xdOx9oNd2drW/Fi5RRElQbUqA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/markdown-toc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/markdown-toc/-/markdown-toc-1.2.0.tgz", - "integrity": "sha512-eOsq7EGd3asV0oBfmyqngeEIhrbkc7XVP63OwcJBIhH2EpG2PzFcbZdhy1jutXSlRBBVMNXHvMtSr5LAxSUvUg==", - "dev": true, - "dependencies": { - "concat-stream": "^1.5.2", - "diacritics-map": "^0.1.0", - "gray-matter": "^2.1.0", - "lazy-cache": "^2.0.2", - "list-item": "^1.1.1", - "markdown-link": "^0.1.1", - "minimist": "^1.2.0", - "mixin-deep": "^1.1.3", - "object.pick": "^1.2.0", - "remarkable": "^1.7.1", - "repeat-string": "^1.6.1", - "strip-color": "^0.1.0" - }, - "bin": { - "markdown-toc": "cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/markdown-toc/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/markdown-toc/node_modules/autolinker": { - "version": "0.28.1", - "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz", - "integrity": "sha512-zQAFO1Dlsn69eXaO6+7YZc+v84aquQKbwpzCE3L0stj56ERn9hutFxPopViLjo9G+rWwjozRhgS5KJ25Xy19cQ==", - "dev": true, - "dependencies": { - "gulp-header": "^1.7.1" - } - }, - "node_modules/markdown-toc/node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/markdown-toc/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/markdown-toc/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/markdown-toc/node_modules/remarkable": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz", - "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==", - "dev": true, - "dependencies": { - "argparse": "^1.0.10", - "autolinker": "~0.28.0" - }, - "bin": { - "remarkable": "bin/remarkable.js" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/markdown-toc/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/markdown-toc/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/markdown/node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/markdown/node_modules/nopt": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz", - "integrity": "sha512-x8vXm7BZ2jE1Txrxh/hO74HTuYZQEbo8edoRcANgdZ4+PCV+pbjd/xdummkmjjC7LU5EjPzlu8zEq/oxWylnKA==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "optional": true, - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/matcher-collection": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/matcher-collection/-/matcher-collection-2.0.1.tgz", - "integrity": "sha512-daE62nS2ZQsDg9raM0IlZzLmI2u+7ZapXBwdoeBUKAYERPDDIc0qNqA8E0Rp2D+gspKR7BgIFP52GeujaGXWeQ==", - "dev": true, - "dependencies": { - "@types/minimatch": "^3.0.3", - "minimatch": "^3.0.2" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/matcher-collection/node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "node_modules/math-random": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", - "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", - "dev": true - }, - "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.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz", - "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==", - "dependencies": { - "fs-monkey": "^1.0.3" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/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/meow/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/meow/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/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/meow/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/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/mergee": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mergee/-/mergee-1.0.0.tgz", - "integrity": "sha512-hbbXD4LOcxVkpS+mp3BMEhkSDf+lTVENFeEeqACgjjL8WrgKuW2EyLT0fOHyTbyDiuRLZJZ1HrHNeiX4iOd79Q==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "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==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", - "dependencies": { - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "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/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==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-collect/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/minipass-collect/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", - "dev": true, - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-fetch/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/minipass-fetch/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-flush/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/minipass-flush/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-json-stream/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/minipass-json-stream/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-pipeline/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/minipass-pipeline/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized/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/minipass-sized/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/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/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "node_modules/mkdirp-infer-owner": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz", - "integrity": "sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mobx": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.9.0.tgz", - "integrity": "sha512-HdKewQEREEJgsWnErClfbFoVebze6rGazxFLU/XUyrII8dORfVszN1V0BMRnQSzcgsNNtkX8DHj3nC6cdWE9YQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - } - }, - "node_modules/mobx-observable-history": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/mobx-observable-history/-/mobx-observable-history-2.0.3.tgz", - "integrity": "sha512-cWMG3GcT1l2Y880mfffNh9m6WldQyOtlLUvcdVUjIj++sNOQbRxKBaBUe/TPDiJ80EN6g8FGiVuFlzzyRJPykQ==", - "dependencies": { - "@types/history": "^4.7.8", - "history": "^4.10.1", - "mobx": "^6.3.0" - } - }, - "node_modules/mobx-react": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/mobx-react/-/mobx-react-7.6.0.tgz", - "integrity": "sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA==", - "dependencies": { - "mobx-react-lite": "^3.4.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - }, - "peerDependencies": { - "mobx": "^6.1.0", - "react": "^16.8.0 || ^17 || ^18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/mobx-react-lite": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.4.3.tgz", - "integrity": "sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - }, - "peerDependencies": { - "mobx": "^6.1.0", - "react": "^16.8.0 || ^17 || ^18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/mobx-utils": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/mobx-utils/-/mobx-utils-6.0.6.tgz", - "integrity": "sha512-lzJtxOWgj3Dp2HeXviInV3ZRY4YhThzRHXuy90oKXDH2g+ymJGIts4bdjb7NQuSi34V25cMZoQX7TkHJQuKLOQ==", - "peerDependencies": { - "mobx": "^6.0.0" - } - }, - "node_modules/mock-http": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mock-http/-/mock-http-1.1.0.tgz", - "integrity": "sha512-H2HMGaHNQPWY8PdeEw4RFux2WEOHD6eJAtN3+iFELik5kGjPKAcoyPWcsC2vgDiTa2yimAEDssmMed51e+cBKQ==", - "dev": true, - "dependencies": { - "mergee": "^1.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "engines": { - "node": "*" - } - }, - "node_modules/moment-timezone": { - "version": "0.5.43", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz", - "integrity": "sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==", - "dependencies": { - "moment": "^2.29.4" - }, - "engines": { - "node": "*" - } - }, - "node_modules/monaco-editor": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.38.0.tgz", - "integrity": "sha512-11Fkh6yzEmwx7O0YoLxeae0qEGFwmyPRlVxpg7oF9czOOCB/iCjdJrG5I67da5WiXK3YJCxoz9TJFE8Tfq/v9A==" - }, - "node_modules/monaco-editor-webpack-plugin": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-7.0.1.tgz", - "integrity": "sha512-M8qIqizltrPlIbrb73cZdTWfU9sIsUVFvAZkL3KGjAHmVWEJ0hZKa/uad14JuOckc0GwnCaoGHvMoYtJjVyCzw==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.2" - }, - "peerDependencies": { - "monaco-editor": ">= 0.31.0", - "webpack": "^4.5.0 || 5.x" - } - }, - "node_modules/moo-color": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz", - "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==", - "dev": true, - "dependencies": { - "color-name": "^1.1.4" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/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/multimatch": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", - "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", - "dev": true, - "dependencies": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/multimatch/node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "node_modules/multimatch/node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" - }, - "node_modules/needle": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz", - "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", - "dev": true, - "optional": true, - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "optional": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "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==" - }, - "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-abi": { - "version": "3.40.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz", - "integrity": "sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==" - }, - "node_modules/node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", - "dev": true, - "optional": true - }, - "node_modules/node-api-version": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.1.4.tgz", - "integrity": "sha512-KGXihXdUChwJAOHO53bv9/vXcLmdUsZ6jIptbvYvkpKfth+r7jw44JkVxQFA3kX5nQjzjmGu1uAu/xNNLNlI5g==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - } - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "engines": { - "node": ">=10.5.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "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==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", - "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "dev": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-gyp/node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/node-gyp/node_modules/nopt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", - "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", - "dev": true, - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/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/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" - }, - "node_modules/node-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-2.0.0.tgz", - "integrity": "sha512-I5VN34NO4/5UYJaUBtkrODPWxbobrE4hgDqPrjB25yPkonFhCmZ146vTH+Zg417E9Iwoh1l/MbRs1apc5J295Q==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/node-pty": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/node-pty/-/node-pty-0.10.1.tgz", - "integrity": "sha512-JTdtUS0Im/yRsWJSx7yiW9rtpfmxqxolrtnyKwPLI+6XqTAPW/O2MjS8FYL4I5TsMbH2lVgDb2VMjp+9LoQGNg==", - "hasInstallScript": true, - "dependencies": { - "nan": "^2.14.0" - } - }, - "node_modules/node-releases": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.11.tgz", - "integrity": "sha512-+M0PwXeU80kRohZ3aT4J/OnR+l9/KD2nVLNNoRgFtnf+umQVFdGBAO2N8+nCnEi0xlh/Wk3zOGC+vNNx+uM79Q==" - }, - "node_modules/nodemon": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", - "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/nodemon/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/nodemon/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/nopt": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.1.0.tgz", - "integrity": "sha512-ZFPLe9Iu0tnx7oWhFxAo4s7QTn8+NNDDxYNaKLjE7Dp0tbakQ3M1QhQzsnzXHQBTUO3K9BmwaxnyO8Ayn2I95Q==", - "dev": true, - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", - "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm": { - "version": "9.6.7", - "resolved": "https://registry.npmjs.org/npm/-/npm-9.6.7.tgz", - "integrity": "sha512-xwkU1hSZl6Qrkfw3fhxVmMfNWu0A67+aZZs5gz/LoehCeAPkVhQDB90Z2NFoPSI1KpfBWCJ6Bp28wXzv5U5/2g==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/config", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/run-script", - "abbrev", - "archy", - "cacache", - "chalk", - "ci-info", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "read-package-json", - "read-package-json-fast", - "semver", - "ssri", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^6.2.9", - "@npmcli/config": "^6.1.7", - "@npmcli/map-workspaces": "^3.0.4", - "@npmcli/package-json": "^3.1.0", - "@npmcli/run-script": "^6.0.2", - "abbrev": "^2.0.0", - "archy": "~1.0.0", - "cacache": "^17.1.2", - "chalk": "^4.1.2", - "ci-info": "^3.8.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.3", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.2", - "glob": "^10.2.4", - "graceful-fs": "^4.2.11", - "hosted-git-info": "^6.1.1", - "ini": "^4.1.0", - "init-package-json": "^5.0.0", - "is-cidr": "^4.0.2", - "json-parse-even-better-errors": "^3.0.0", - "libnpmaccess": "^7.0.2", - "libnpmdiff": "^5.0.17", - "libnpmexec": "^5.0.17", - "libnpmfund": "^4.0.17", - "libnpmhook": "^9.0.3", - "libnpmorg": "^5.0.4", - "libnpmpack": "^5.0.17", - "libnpmpublish": "^7.2.0", - "libnpmsearch": "^6.0.2", - "libnpmteam": "^5.0.3", - "libnpmversion": "^4.0.2", - "make-fetch-happen": "^11.1.1", - "minimatch": "^9.0.0", - "minipass": "^5.0.0", - "minipass-pipeline": "^1.2.4", - "ms": "^2.1.2", - "node-gyp": "^9.3.1", - "nopt": "^7.1.0", - "npm-audit-report": "^4.0.0", - "npm-install-checks": "^6.1.1", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-profile": "^7.0.1", - "npm-registry-fetch": "^14.0.5", - "npm-user-validate": "^2.0.0", - "npmlog": "^7.0.1", - "p-map": "^4.0.0", - "pacote": "^15.1.3", - "parse-conflict-json": "^3.0.1", - "proc-log": "^3.0.0", - "qrcode-terminal": "^0.12.0", - "read": "^2.1.0", - "read-package-json": "^6.0.3", - "read-package-json-fast": "^3.0.2", - "semver": "^7.5.1", - "ssri": "^10.0.4", - "tar": "^6.1.14", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.0", - "which": "^3.0.1", - "write-file-atomic": "^5.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-install-checks": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz", - "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==", - "dev": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", - "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-package-arg": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.1.tgz", - "integrity": "sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==", - "dev": true, - "dependencies": { - "hosted-git-info": "^3.0.6", - "semver": "^7.0.0", - "validate-npm-package-name": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-package-arg/node_modules/builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", - "dev": true - }, - "node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-package-arg/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/npm-package-arg/node_modules/validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", - "dev": true, - "dependencies": { - "builtins": "^1.0.3" - } - }, - "node_modules/npm-package-arg/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/npm-packlist": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.1.tgz", - "integrity": "sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==", - "dev": true, - "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^1.1.2", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-packlist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm-packlist/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm-packlist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-packlist/node_modules/npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "node_modules/npm-pick-manifest": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", - "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", - "dev": true, - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm-pick-manifest/node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-pick-manifest/node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", - "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", - "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", - "dev": true, - "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch/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/npm-registry-fetch/node_modules/minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/ssri": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", - "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", - "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/cliui": { - "version": "8.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "6.2.9", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/installed-package-contents": "^2.0.2", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^5.0.0", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^3.0.0", - "@npmcli/query": "^3.0.0", - "@npmcli/run-script": "^6.0.0", - "bin-links": "^4.0.1", - "cacache": "^17.0.4", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^6.1.1", - "json-parse-even-better-errors": "^3.0.0", - "json-stringify-nice": "^1.1.4", - "minimatch": "^9.0.0", - "nopt": "^7.0.0", - "npm-install-checks": "^6.0.0", - "npm-package-arg": "^10.1.0", - "npm-pick-manifest": "^8.0.1", - "npm-registry-fetch": "^14.0.3", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "parse-conflict-json": "^3.0.0", - "proc-log": "^3.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.2", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^10.0.1", - "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "6.1.7", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/map-workspaces": "^3.0.2", - "ini": "^4.1.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.5", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "3.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "4.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^6.0.0", - "lru-cache": "^7.4.4", - "npm-pick-manifest": "^8.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "lib/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "3.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^17.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^15.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/move-file": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "3.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "6.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "inBundle": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.1.0", - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@tootallnate/once": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/@tufjs/canonical-json": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@tufjs/models": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "1.0.0", - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/abort-controller": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/npm/node_modules/agent-base": { - "version": "6.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/npm/node_modules/agentkeepalive": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "depd": "^2.0.0", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^4.1.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/bin-links": { - "version": "4.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/npm/node_modules/builtins": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "17.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/chalk": { - "version": "4.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ci-info": { - "version": "3.8.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "^4.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "6.0.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/cross-spawn": { - "version": "7.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/depd": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/npm/node_modules/diff": { - "version": "5.1.0", - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/eastasianwidth": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/event-target-shim": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/events": { - "version": "3.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/npm/node_modules/foreground-child": { - "version": "3.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/gauge": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^4.0.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "10.2.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", - "minimatch": "^9.0.0", - "minipass": "^5.0.0 || ^6.0.0", - "path-scurry": "^1.7.0" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.11", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/has": { - "version": "1.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/npm/node_modules/has-flag": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "6.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.1", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "BSD-3-Clause" - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/ini": { - "version": "4.1.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^10.0.0", - "promzard": "^1.0.0", - "read": "^2.0.0", - "read-package-json": "^6.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/ip": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "^3.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.12.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/jackspeak": { - "version": "2.2.0", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff": { - "version": "6.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.5.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "7.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "5.0.17", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.2.9", - "@npmcli/disparity-colors": "^3.0.0", - "@npmcli/installed-package-contents": "^2.0.2", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^9.0.0", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8", - "tar": "^6.1.13" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "5.0.17", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.2.9", - "@npmcli/run-script": "^6.0.0", - "chalk": "^4.1.0", - "ci-info": "^3.7.1", - "npm-package-arg": "^10.1.0", - "npmlog": "^7.0.1", - "pacote": "^15.0.8", - "proc-log": "^3.0.0", - "read": "^2.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "4.0.17", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.2.9" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "9.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "5.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "5.0.17", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^6.2.9", - "@npmcli/run-script": "^6.0.0", - "npm-package-arg": "^10.1.0", - "pacote": "^15.0.8" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "7.2.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ci-info": "^3.6.1", - "normalize-package-data": "^5.0.0", - "npm-package-arg": "^10.1.0", - "npm-registry-fetch": "^14.0.3", - "proc-log": "^3.0.0", - "semver": "^7.3.7", - "sigstore": "^1.4.0", - "ssri": "^10.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "6.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "5.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^14.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "4.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^4.0.1", - "@npmcli/run-script": "^6.0.0", - "json-parse-even-better-errors": "^3.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "7.18.3", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "11.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "9.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/minipass": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-collect/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "3.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^5.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "9.3.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^6.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.13 || ^14.13 || >=16" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/@npmcli/fs": { - "version": "2.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/abbrev": { - "version": "1.1.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/node-gyp/node_modules/are-we-there-yet": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/cacache": { - "version": "16.1.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/cacache/node_modules/minimatch": { - "version": "5.1.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/fs-minipass": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/gauge": { - "version": "4.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/make-fetch-happen": { - "version": "10.2.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/minipass-fetch": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/nopt": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^1.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/npmlog": { - "version": "6.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/readable-stream": { - "version": "3.6.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/signal-exit": { - "version": "3.0.7", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/node-gyp/node_modules/ssri": { - "version": "9.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/unique-filename": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/unique-slug": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/which": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "7.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "5.0.0", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^6.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "6.1.1", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "10.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "7.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^6.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "8.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^10.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "7.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "14.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "2.0.0", - "inBundle": true, - "license": "BSD-2-Clause", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npmlog": { - "version": "7.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/once": { - "version": "1.4.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/pacote": { - "version": "15.1.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^5.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.3.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/path-key": { - "version": "3.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/path-scurry": { - "version": "1.9.1", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.13", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/proc-log": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/process": { - "version": "0.11.10", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/read": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~1.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json": { - "version": "6.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/readable-stream": { - "version": "4.4.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", - "optional": true - }, - "node_modules/npm/node_modules/semver": { - "version": "7.5.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/shebang-command": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/shebang-regex": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "4.0.2", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/sigstore": { - "version": "1.5.2", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.1.0", - "make-fetch-happen": "^11.0.1", - "tuf-js": "^1.1.3" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.7.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "7.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.2.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.13", - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/npm/node_modules/ssri": { - "version": "10.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.1.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "7.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "6.1.14", - "inBundle": true, - "license": "ISC", - "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/npm/node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/treeverse": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/tuf-js": { - "version": "1.1.6", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/unique-filename": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/npm/node_modules/which": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/npm/node_modules/wrap-ansi": { - "version": "8.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/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/nwsapi": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.4.tgz", - "integrity": "sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==" - }, - "node_modules/nx": { - "version": "15.9.4", - "resolved": "https://registry.npmjs.org/nx/-/nx-15.9.4.tgz", - "integrity": "sha512-P1G4t59UvE/lkHyruLeSOB5ZuNyh01IwU0tTUOi8f9s/NbP7+OQ8MYVwDV74JHTr6mQgjlS+n+4Eox8tVm9itA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@nrwl/cli": "15.9.4", - "@nrwl/tao": "15.9.4", - "@parcel/watcher": "2.0.4", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "^3.0.0-rc.18", - "@zkochan/js-yaml": "0.0.6", - "axios": "^1.0.0", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^7.0.2", - "dotenv": "~10.0.0", - "enquirer": "~2.3.6", - "fast-glob": "3.2.7", - "figures": "3.2.0", - "flat": "^5.0.2", - "fs-extra": "^11.1.0", - "glob": "7.1.4", - "ignore": "^5.0.4", - "js-yaml": "4.1.0", - "jsonc-parser": "3.2.0", - "lines-and-columns": "~2.0.3", - "minimatch": "3.0.5", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "semver": "7.3.4", - "string-width": "^4.2.3", - "strong-log-transformer": "^2.1.0", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0", - "v8-compile-cache": "2.3.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "nx": "bin/nx.js" - }, - "optionalDependencies": { - "@nrwl/nx-darwin-arm64": "15.9.4", - "@nrwl/nx-darwin-x64": "15.9.4", - "@nrwl/nx-linux-arm-gnueabihf": "15.9.4", - "@nrwl/nx-linux-arm64-gnu": "15.9.4", - "@nrwl/nx-linux-arm64-musl": "15.9.4", - "@nrwl/nx-linux-x64-gnu": "15.9.4", - "@nrwl/nx-linux-x64-musl": "15.9.4", - "@nrwl/nx-win32-arm64-msvc": "15.9.4", - "@nrwl/nx-win32-x64-msvc": "15.9.4" - }, - "peerDependencies": { - "@swc-node/register": "^1.4.2", - "@swc/core": "^1.2.173" - }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } - } - }, - "node_modules/nx/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/nx/node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nx/node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nx/node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/nx/node_modules/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/nx/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/nx/node_modules/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/nx/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/nx/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/nx/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/nx/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/nx/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/nx/node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/nx/node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/nx/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/nx/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", - "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", - "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "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/oidc-token-hash": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", - "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==", - "optional": true, - "engines": { - "node": "^10.13.0 || >=12.0.0" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "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==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/onetime/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/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/open-in-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/open-in-editor/-/open-in-editor-2.2.0.tgz", - "integrity": "sha512-ZQJDm2lmIgR2GkuwzjrlkVmT2KpDVp0Nnnb3LtYLe3Xi3cQhDa1vnh4IIlrT35a46OLZ8nlKJNOsx2B85FOS+Q==", - "dev": true, - "dependencies": { - "clap": "^1.1.3", - "os-homedir": "~1.0.2" - }, - "bin": { - "oe": "bin/oe" - }, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/open-lens": { - "resolved": "open-lens", - "link": true - }, - "node_modules/openid-client": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.4.2.tgz", - "integrity": "sha512-lIhsdPvJ2RneBm3nGBBhQchpe3Uka//xf7WPHTIglery8gnckvW7Bd9IaQzekzXJvWthCMyi/xVEyGW0RFPytw==", - "optional": true, - "dependencies": { - "jose": "^4.14.1", - "lru-cache": "^6.0.0", - "object-hash": "^2.2.0", - "oidc-token-hash": "^5.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/openid-client/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/openid-client/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/os-filter-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", - "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==", - "dev": true, - "dependencies": { - "arch": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz", - "integrity": "sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-pipe": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", - "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "dev": true, - "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-retry/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/p-retry/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/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "dependencies": { - "p-finally": "^1.0.0" - }, - "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==", - "engines": { - "node": ">=6" - } - }, - "node_modules/p-waterfall": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-2.1.1.tgz", - "integrity": "sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==", - "dev": true, - "dependencies": { - "p-reduce": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pacote": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.1.1.tgz", - "integrity": "sha512-eeqEe77QrA6auZxNHIp+1TzHQ0HBKf5V6c8zcaYZ134EJe1lCi+fjXATkNiEEfbG+e50nu02GLvUtmZcGOYabQ==", - "dev": true, - "dependencies": { - "@npmcli/git": "^4.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^6.0.1", - "@npmcli/run-script": "^6.0.0", - "cacache": "^17.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^4.0.0", - "npm-package-arg": "^10.0.0", - "npm-packlist": "^7.0.0", - "npm-pick-manifest": "^8.0.0", - "npm-registry-fetch": "^14.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^6.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^1.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pacote/node_modules/@npmcli/promise-spawn": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", - "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", - "dev": true, - "dependencies": { - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pacote/node_modules/@npmcli/run-script": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", - "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", - "dev": true, - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/promise-spawn": "^6.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^3.0.0", - "which": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pacote/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/pacote/node_modules/glob": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz", - "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==", - "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" - }, - "bin": { - "glob": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/pacote/node_modules/glob/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==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/pacote/node_modules/hosted-git-info": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", - "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pacote/node_modules/ignore-walk": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz", - "integrity": "sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA==", - "dev": true, - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pacote/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/pacote/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==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/pacote/node_modules/npm-package-arg": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", - "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pacote/node_modules/npm-packlist": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", - "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", - "dev": true, - "dependencies": { - "ignore-walk": "^6.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pacote/node_modules/read-package-json": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.3.tgz", - "integrity": "sha512-4QbpReW4kxFgeBQ0vPAqh2y8sXEB3D4t3jsXbJKIhBiF80KT6XRo45reqwtftju5J6ru1ax06A2Gb/wM1qCOEQ==", - "dev": true, - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^5.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pacote/node_modules/ssri": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", - "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pacote/node_modules/ssri/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/pacote/node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", - "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pacote/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" - }, - "node_modules/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/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-conflict-json": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", - "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-json/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/parse-json/node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse-path": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", - "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", - "dev": true, - "dependencies": { - "protocols": "^2.0.0" - } - }, - "node_modules/parse-url": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", - "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", - "dev": true, - "dependencies": { - "parse-path": "^7.0.0" - } - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "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==", - "dependencies": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", - "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-scurry/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==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/peek-readable": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", - "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/peek-stream": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", - "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", - "dependencies": { - "buffer-from": "^1.0.0", - "duplexify": "^3.5.0", - "through2": "^2.0.3" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/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==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/playwright": { - "version": "1.34.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.34.1.tgz", - "integrity": "sha512-RonTwQifzkCZHsjZKYUKsOJkQAVe1HArnyLcSRrkyDxN46Ytpwki5XzQFdpuv0XD8WtAjs4gI3oMYJiEj5Qo6g==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "playwright-core": "1.34.1" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/playwright-core": { - "version": "1.34.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.34.1.tgz", - "integrity": "sha512-4Y5hGLoSrnB/BXj2NFKBNWP/bI9uVejTVbso1ZBtkKZ+O2KiVIeCJ3R4c7Cf2PbP7htjLolHXY+mImt2IWOlEg==", - "dev": true, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/plist": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz", - "integrity": "sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==", - "dev": true, - "dependencies": { - "base64-js": "^1.5.1", - "xmlbuilder": "^15.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/popper.js": { - "version": "1.16.1-lts", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", - "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" - }, - "node_modules/postcss": { - "version": "8.4.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", - "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.0.tgz", - "integrity": "sha512-8/1wgzdKc7bc9E6my5wZjmdavHLvO/QOmLG1FBugblEvY4IXrLjlViIOmL24HthU042lWTDRO90Fz1Yp66UnMw==", - "engines": { - "node": ">= 14", - "npm": ">= 7" - } - }, - "node_modules/postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", - "dev": true, - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prebuild-install/node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "peer": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "peer": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "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/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-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==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-all-reject-late": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", - "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/promise-call-limit": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.2.tgz", - "integrity": "sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/promzard": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", - "integrity": "sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw==", - "dev": true, - "dependencies": { - "read": "1" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "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/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true, - "optional": true - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", - "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/query-string": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", - "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", - "dependencies": { - "decode-uri-component": "^0.2.2", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/raf-schd": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", - "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" - }, - "node_modules/randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "dependencies": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/randomatic/node_modules/is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomcolor": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/randomcolor/-/randomcolor-0.6.2.tgz", - "integrity": "sha512-Mn6TbyYpFgwFuQ8KJKqf3bqqY9O1y37/0jgSK/61PUxV4QfIMv0+K2ioq8DfOjkBslcjwSzRfIDEXfzA9aCx7A==" - }, - "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/raw-body/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/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-beautiful-dnd": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", - "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", - "dependencies": { - "@babel/runtime": "^7.9.2", - "css-box-model": "^1.2.0", - "memoize-one": "^5.1.1", - "raf-schd": "^4.0.2", - "react-redux": "^7.2.0", - "redux": "^4.0.4", - "use-memo-one": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8.5 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "node_modules/react-material-ui-carousel": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/react-material-ui-carousel/-/react-material-ui-carousel-2.3.11.tgz", - "integrity": "sha512-rsD9D2JLDBTfinaPy1+hcb7gunfdX7jmga7xESfRCCtLXzokOrkhmx4qMd8dZmYY42zc/HbYqLqg9E/d187lbw==", - "dependencies": { - "auto-bind": "^2.1.1", - "react-swipeable": "^6.1.0" - }, - "peerDependencies": { - "@material-ui/core": "^4.11.3", - "@material-ui/icons": "^4.11.2", - "react": "^16.13.1 || ^17.0.1", - "react-dom": "^16.13.1 || ^17.0.1" - } - }, - "node_modules/react-material-ui-carousel/node_modules/auto-bind": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-2.1.1.tgz", - "integrity": "sha512-NUwV1i9D3vxxY1KnfZgSZ716d6ovY7o8LfOwLhGIPFBowIb6Ln6DBW64+jCqPzUznel2hRSkQnYQqvh7/ldw8A==", - "dependencies": { - "@types/react": "^16.8.12" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/react-redux": { - "version": "7.2.9", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", - "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", - "dependencies": { - "@babel/runtime": "^7.15.4", - "@types/react-redux": "^7.1.20", - "hoist-non-react-statics": "^3.3.2", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-is": "^17.0.2" - }, - "peerDependencies": { - "react": "^16.8.3 || ^17 || ^18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-router": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", - "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "hoist-non-react-statics": "^3.1.0", - "loose-envify": "^1.3.1", - "path-to-regexp": "^1.7.0", - "prop-types": "^15.6.2", - "react-is": "^16.6.0", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router-dom": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", - "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", - "dependencies": { - "@babel/runtime": "^7.12.13", - "history": "^4.9.0", - "loose-envify": "^1.3.1", - "prop-types": "^15.6.2", - "react-router": "5.3.4", - "tiny-invariant": "^1.0.2", - "tiny-warning": "^1.0.0" - }, - "peerDependencies": { - "react": ">=15" - } - }, - "node_modules/react-router/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/react-router/node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/react-router/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/react-select": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.7.3.tgz", - "integrity": "sha512-z8i3NCuFFWL3w27xq92rBkVI2onT0jzIIPe480HlBjXJ3b5o6Q+Clp4ydyeKrj9DZZ3lrjawwLC5NGl0FSvUDg==", - "dependencies": { - "@babel/runtime": "^7.12.0", - "@emotion/cache": "^11.4.0", - "@emotion/react": "^11.8.1", - "@floating-ui/dom": "^1.0.1", - "@types/react-transition-group": "^4.4.0", - "memoize-one": "^6.0.0", - "prop-types": "^15.6.0", - "react-transition-group": "^4.3.0", - "use-isomorphic-layout-effect": "^1.1.2" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-select-event": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/react-select-event/-/react-select-event-5.5.1.tgz", - "integrity": "sha512-goAx28y0+iYrbqZA2FeRTreHHs/ZtSuKxtA+J5jpKT5RHPCbVZJ4MqACfPnWyFXsEec+3dP5bCrNTxIX8oYe9A==", - "dependencies": { - "@testing-library/dom": ">=7" - } - }, - "node_modules/react-select/node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" - }, - "node_modules/react-swipeable": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/react-swipeable/-/react-swipeable-6.2.2.tgz", - "integrity": "sha512-Oz7nSFrssvq2yvy05aNL3F+yBUqSvLsK6x1mu+rQFOpMdQVnt4izKt1vyjvvTb70q6GQOaSpaB6qniROW2MAzQ==", - "peerDependencies": { - "react": "^16.8.3 || ^17 || ^18" - } - }, - "node_modules/react-table": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/react-table/-/react-table-7.8.0.tgz", - "integrity": "sha512-hNaz4ygkZO4bESeFfnfOft73iBUj8K5oKi1EcSHPAibEydfsX2MyU6Z8KCr3mv3C9Kqqh71U+DhZkFvibbnPbA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^16.8.3 || ^17.0.0-0 || ^18.0.0" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/react-virtualized-auto-sizer": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.17.tgz", - "integrity": "sha512-XtojyZHGo/iYmGkOEL8psTQsr5XI4fd+QxCD16ru00mnJhuvXFXcPLHXj5cKJh/xUttxPCglnpUI8d2u6gUgzw==", - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc", - "react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc" - } - }, - "node_modules/react-window": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.9.tgz", - "integrity": "sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "memoize-one": ">=3.1.1 <6" - }, - "engines": { - "node": ">8.0.0" - }, - "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", - "dev": true, - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-cmd-shim": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-3.0.0.tgz", - "integrity": "sha512-KQDVjGqhZk92PPNRj9ZEXEuqg8bUobSKRw+q0YQ3TKI5xkce7bUJobL4Z/OtiEbAAv70yEpYIXp4iQ9L8oPVog==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/read-config-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.2.0.tgz", - "integrity": "sha512-gx7Pgr5I56JtYz+WuqEbQHj/xWo+5Vwua2jhb1VwM4Wid5PqYmZ4i00ZB0YEGIfkVBsCv9UrjgyqCiQfS/Oosg==", - "dev": true, - "dependencies": { - "dotenv": "^9.0.2", - "dotenv-expand": "^5.1.0", - "js-yaml": "^4.1.0", - "json5": "^2.2.0", - "lazy-val": "^1.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/read-config-file/node_modules/dotenv": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", - "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/read-package-json": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.1.tgz", - "integrity": "sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg==", - "dev": true, - "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", - "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/read-package-json/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/read-package-json/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/read-package-json/node_modules/hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/read-package-json/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/read-package-json/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/read-package-json/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/read-package-json/node_modules/normalize-package-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", - "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", - "dev": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/read-package-json/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read/node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "dev": true, - "dependencies": { - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "peer": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "peer": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexp-tree": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", - "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", - "peer": true, - "bin": { - "regexp-tree": "bin/regexp-tree" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "peer": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "peer": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "peer": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "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/remarkable": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.1.tgz", - "integrity": "sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==", - "dev": true, - "dependencies": { - "argparse": "^1.0.10", - "autolinker": "^3.11.0" - }, - "bin": { - "remarkable": "bin/remarkable.js" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/remarkable/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/remarkable/node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/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/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requireindex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.1.0.tgz", - "integrity": "sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==", - "peer": true, - "engines": { - "node": ">=0.10.5" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/reserved-words": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", - "integrity": "sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==", - "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==", - "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-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "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==", - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-pathname": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", - "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" - }, - "node_modules/resolve.exports": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", - "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfc4648": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.2.tgz", - "integrity": "sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg==" - }, - "node_modules/rfc6902": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/rfc6902/-/rfc6902-5.0.1.tgz", - "integrity": "sha512-tYGfLpKIq9X7lrt4o3IkD9w9bpeAtsejfAqWNR98AoxfTsZqCepKa8eDlRiX8QMiCOD9vMx0/YbKLx0G1nPi5w==" - }, - "node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", - "dependencies": { - "glob": "^9.2.0" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "optional": true, - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==" - }, - "node_modules/run-applescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-applescript/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/run-applescript/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/run-applescript/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/run-applescript/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/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/run-script-os": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/run-script-os/-/run-script-os-1.1.6.tgz", - "integrity": "sha512-ql6P2LzhBTTDfzKts+Qo4H94VUKpxKDFz6QxxwaUZN0mwvi7L3lpOI7BqPCq7lgDh3XLl0dpeXwfcVIitlrYrw==", - "dev": true, - "bin": { - "run-os": "index.js", - "run-script-os": "index.js" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "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==" - }, - "node_modules/safe-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", - "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", - "peer": true, - "dependencies": { - "regexp-tree": "~0.1.1" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, - "node_modules/sass": { - "version": "1.62.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz", - "integrity": "sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==", - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", - "dev": true, - "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", - "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/schema-utils/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/schema-utils/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==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/schema-utils/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==" - }, - "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==", - "dependencies": { - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "optional": true - }, - "node_modules/semver-regex": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz", - "integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/semver-truncate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-2.0.0.tgz", - "integrity": "sha512-Rh266MLDYNeML5h90ttdMwfXe1+Nc4LAWd9X1KdJe8pPHP4kFmvLZALtsMNHNdvTyQygbEC0D59sIz47DIaq8w==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-truncate/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "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/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/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/send/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/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-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "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/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/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/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "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/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/set-getter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.1.tgz", - "integrity": "sha512-9sVWOy+gthr+0G9DzqqLaYNA7+5OKkSmcqjL9cBpDEaZrr3ShQlyX2cZ/O/ozE41oxn/Tt0LGEM/w4Rub3A3gw==", - "dev": true, - "dependencies": { - "to-object-path": "^0.3.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "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==", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sharp": { - "version": "0.30.7", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.30.7.tgz", - "integrity": "sha512-G+MY2YW33jgflKPTXXptVO28HvNOo9G3j0MybYAHeEmby+QuD2U98dT6ueht9cv/XDqZspSpIhoSW+BAKJ7Hig==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.1", - "node-addon-api": "^5.0.0", - "prebuild-install": "^7.1.1", - "semver": "^7.3.7", - "simple-get": "^4.0.1", - "tar-fs": "^2.1.1", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=12.13.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/sharp/node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "node_modules/sharp/node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/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/shiki": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.2.tgz", - "integrity": "sha512-ltSZlSLOuSY0M0Y75KA+ieRaZ0Trf5Wl3gutE7jzLuIcWxLp5i/uEnLoQWNvgKXQ5OMpGkJnVMRLAuzjc0LJ2A==", - "dev": true, - "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/sigstore": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.5.2.tgz", - "integrity": "sha512-X95v6xAAooVpn7PaB94TDmFeSO5SBfCtB1R23fvzr36WTfjtkiiyOeei979nbTjc8nzh6FSLeltQZuODsm1EjQ==", - "dev": true, - "dependencies": { - "@sigstore/protobuf-specs": "^0.1.0", - "make-fetch-happen": "^11.0.1", - "tuf-js": "^1.1.3" - }, - "bin": { - "sigstore": "bin/sigstore.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sigstore/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/sigstore/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sigstore/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/sigstore/node_modules/minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/sigstore/node_modules/ssri": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", - "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "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/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" - }, - "node_modules/simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", - "dev": true, - "dependencies": { - "semver": "~7.0.0" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "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/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", - "dev": true, - "dependencies": { - "is-plain-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sort-keys-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", - "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", - "dev": true, - "dependencies": { - "sort-keys": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "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/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "optional": true - }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/ssri/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/ssri/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "engines": { - "node": "*" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "dev": true - }, - "node_modules/stat-mode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", - "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/static-eval": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", - "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", - "dependencies": { - "escodegen": "^1.8.1" - } - }, - "node_modules/static-eval/node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/static-eval/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/static-eval/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/static-eval/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-eval/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-eval/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-eval/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==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-eval/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "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/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/stoppable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", - "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", - "engines": { - "node": ">=4", - "npm": ">=6" - } - }, - "node_modules/stream-buffers": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", - "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, - "node_modules/streamx": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.13.2.tgz", - "integrity": "sha512-+TWqixPhGDXEG9L/XczSbhfkmwAtGs3BJX5QNU6cvno+pOLKeszByWcnaTu6dg8efsTYqR8ZZuXWHhZfgrxMvA==", - "dependencies": { - "fast-fifo": "^1.1.0", - "queue-tick": "^1.0.1" - } - }, - "node_modules/strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", - "peer": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-color": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/strip-color/-/strip-color-0.1.0.tgz", - "integrity": "sha512-p9LsUieSjWNNAxVCXLeilaDlmuUOrDS5/dF9znM1nZc7EGX5+zEFC0bEevsNIaldjlks+2jns5Siz6F9iK6jwA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-outer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-2.0.0.tgz", - "integrity": "sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", - "dev": true - }, - "node_modules/strong-log-transformer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", - "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", - "dev": true, - "dependencies": { - "duplexer": "^0.1.1", - "minimist": "^1.2.0", - "through": "^2.3.4" - }, - "bin": { - "sl-log-transformer": "bin/sl-log-transformer.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strtok3": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", - "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", - "dev": true, - "dependencies": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^5.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/style-loader": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", - "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - }, - "node_modules/stylus": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", - "integrity": "sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==", - "dev": true, - "dependencies": { - "@adobe/css-tools": "^4.0.1", - "debug": "^4.3.2", - "glob": "^7.1.6", - "sax": "~1.2.4", - "source-map": "^0.7.3" - }, - "bin": { - "stylus": "bin/stylus" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://opencollective.com/stylus" - } - }, - "node_modules/sucrase": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", - "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/sumchecker": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", - "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", - "dependencies": { - "debug": "^4.1.0" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "node_modules/synckit": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", - "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", - "dev": true, - "dependencies": { - "@pkgr/utils": "^2.3.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/table/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/table/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/table/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/table/node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/table/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/table/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/table/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/table/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/table/node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/table/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tailwindcss": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", - "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tailwindcss/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/tailwindcss/node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "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==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/tar-fs/node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/tar-fs/node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.0.0.tgz", - "integrity": "sha512-O6OfUKBbQOqAhh6owTWmA730J/yZCYcpmZ1DBj2YX51ZQrt7d7NgzrR+CnO9wP6nt/viWZW2XeXLavX3/ZEbEg==", - "dependencies": { - "b4a": "^1.6.1", - "bl": "^6.0.0", - "streamx": "^2.12.5" - } - }, - "node_modules/tar-stream/node_modules/bl": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-6.0.1.tgz", - "integrity": "sha512-zk1P1eAEBHhhB+4NfGxqmuV6NgwECnIoRgsOq2ObdEsmoFVIYzJ/Jjcgaj7JOY/8ekH27bIHSV4Si2T+evqu+Q==", - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^4.2.0" - } - }, - "node_modules/tar-stream/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.0.tgz", - "integrity": "sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/tcp-port-used": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.2.tgz", - "integrity": "sha512-l7ar8lLUD3XS1V2lfoJlCBaeoaWo/2xfYt81hM7VlvR4RrMVFqfmzfhLVk40hAb368uitje5gPtBRL1m/DGvLA==", - "dependencies": { - "debug": "4.3.1", - "is2": "^2.0.6" - } - }, - "node_modules/tcp-port-used/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/temp-file": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", - "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==", - "dev": true, - "dependencies": { - "async-exit-hook": "^2.0.1", - "fs-extra": "^10.0.0" - } - }, - "node_modules/temp-file/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tempy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz", - "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==", - "dependencies": { - "del": "^6.0.0", - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.17.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.6.tgz", - "integrity": "sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==", - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "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==", - "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-webpack-plugin/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==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/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==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "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==" - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/through2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/through2/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==", - "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/through2/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==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "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/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "node_modules/titleize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", - "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tmp-promise": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", - "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", - "dependencies": { - "tmp": "^0.2.0" - } - }, - "node_modules/tmp-promise/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/tmp-promise/node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/to-regex-range/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/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/token-types": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", - "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", - "dev": true, - "dependencies": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/toml": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.6.tgz", - "integrity": "sha512-gVweAectJU3ebq//Ferr2JUY4WKSDe5N+z0FvjDncLGyHmIDoxgY/2Ie4qfEIDm4IS7OA6Rmdm7pdEEdMcV/xQ==", - "dev": true - }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/touch/node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/touch/node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", - "dependencies": { - "punycode": "^2.3.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/traverse-chain": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", - "integrity": "sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg==", - "dev": true - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/treeverse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", - "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", - "dev": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/trim-repeated": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-2.0.0.tgz", - "integrity": "sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^5.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/trim-repeated/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" - }, - "node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "dev": true, - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, - "node_modules/ts-essentials": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", - "dev": true, - "peerDependencies": { - "typescript": ">=3.7.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/ts-jest": { - "version": "29.1.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", - "integrity": "sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==", - "dependencies": { - "bs-logger": "0.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^29.0.0", - "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "7.x", - "yargs-parser": "^21.0.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/ts-loader": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.3.tgz", - "integrity": "sha512-n3hBnm6ozJYzwiwt5YRiJZkzktftRpMiBApHaJPoWLA+qetQBAXkHqCLM6nwSdRDimqVtA5ocIkcTRLMTt7yzA==", - "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/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "devOptional": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "devOptional": true - }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", - "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/tuf-js": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.6.tgz", - "integrity": "sha512-CXwFVIsXGbVY4vFiWF7TJKWmlKJAT8TWkH4RmiohJRcDJInix++F0dznDmoVbtJNzZ8yLprKUG4YrDIhv3nBMg==", - "dev": true, - "dependencies": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/tuf-js/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/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/tuf-js/node_modules/minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/tuf-js/node_modules/ssri": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", - "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-emitter": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-1.4.0.tgz", - "integrity": "sha512-weBmoo3HhpKGgLBOYwe8EB31CzDFuaK7CCL+axXhUYhn4jo6DSkHnbefboCF5i4DQ2aMFe0C/FdTWcPdObgHyg==" - }, - "node_modules/typed-regex": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/typed-regex/-/typed-regex-0.0.8.tgz", - "integrity": "sha512-1XkGm1T/rUngbFROIOw9wPnMAKeMsRoc+c9O6GwOHz6aH/FrJFtcyd2sHASbT0OXeGLot5N1shPNpwHGTv9RdQ==" - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "node_modules/typedoc": { - "version": "0.24.7", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.24.7.tgz", - "integrity": "sha512-zzfKDFIZADA+XRIp2rMzLe9xZ6pt12yQOhCr7cD7/PBTjhPmMyMvGrkZ2lPNJitg3Hj1SeiYFNzCsSDrlpxpKw==", - "dev": true, - "dependencies": { - "lunr": "^2.3.9", - "marked": "^4.3.0", - "minimatch": "^9.0.0", - "shiki": "^0.14.1" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 14.14" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x" - } - }, - "node_modules/typedoc-plugin-markdown": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.15.3.tgz", - "integrity": "sha512-idntFYu3vfaY3eaD+w9DeRd0PmNGqGuNLKihPU9poxFGnATJYGn9dPtEhn2QrTdishFMg7jPXAhos+2T6YCWRQ==", - "dev": true, - "dependencies": { - "handlebars": "^4.7.7" - }, - "peerDependencies": { - "typedoc": ">=0.24.0" - } - }, - "node_modules/typedoc/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/typedoc/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==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/typescript-plugin-css-modules": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/typescript-plugin-css-modules/-/typescript-plugin-css-modules-5.0.1.tgz", - "integrity": "sha512-hKXObfwfjx2/myRq4JeQ8D3xIWYTFqusi0hS/Aka7RFX1xQEoEkdOGDWyXNb8LmObawsUzbI30gQnZvqYXCrkA==", - "dev": true, - "dependencies": { - "@types/postcss-modules-local-by-default": "^4.0.0", - "@types/postcss-modules-scope": "^3.0.1", - "dotenv": "^16.0.3", - "icss-utils": "^5.1.0", - "less": "^4.1.3", - "lodash.camelcase": "^4.3.0", - "postcss": "^8.4.21", - "postcss-load-config": "^3.1.4", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "reserved-words": "^0.1.2", - "sass": "^1.58.3", - "source-map-js": "^1.0.2", - "stylus": "^0.59.0", - "tsconfig-paths": "^4.1.2" - }, - "peerDependencies": { - "typescript": ">=4.0.0" - } - }, - "node_modules/typescript-plugin-css-modules/node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/typescript-plugin-css-modules/node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" - }, - "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/typescript-plugin-css-modules/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/typescript-plugin-css-modules/node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "node_modules/underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "peer": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", - "dev": true, - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "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/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/unzip-crx-3": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz", - "integrity": "sha512-0+JiUq/z7faJ6oifVB5nSwt589v1KCduqIJupNVDoWSXZtWDmjDGO3RAEOvwJ07w90aoXoP4enKsR7ecMrJtWQ==", - "dependencies": { - "jszip": "^3.1.0", - "mkdirp": "^0.5.1", - "yaku": "^0.16.6" - } - }, - "node_modules/unzip-crx-3/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "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==", - "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==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", - "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-memo-one": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", - "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/utf8-byte-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", - "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==", - "dev": true - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "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==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "devOptional": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", - "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", - "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/value-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", - "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" - }, - "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/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/walk": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.15.tgz", - "integrity": "sha512-4eRTBZljBfIISK1Vnt69Gvr2w/wc3U6Vtrw7qiN5iqYJPH7LElcYh/iU4XWhdCy2dZqv1ToMyYlybDylfG/5Vg==", - "dev": true, - "dependencies": { - "foreachasync": "^3.0.0" - } - }, - "node_modules/walk-sync": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-2.2.0.tgz", - "integrity": "sha512-IC8sL7aB4/ZgFcGI2T1LczZeFWZ06b3zoHH7jBPyHxOtIIz1jppWHjjEXkOFvFojBVAK9pV7g47xOZ4LW3QLfg==", - "dev": true, - "dependencies": { - "@types/minimatch": "^3.0.3", - "ensure-posix-path": "^1.1.0", - "matcher-collection": "^2.0.0", - "minimatch": "^3.0.4" - }, - "engines": { - "node": "8.* || >= 10.*" - } - }, - "node_modules/walk-sync/node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "node_modules/walk-up-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz", - "integrity": "sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==", - "dev": true - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "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==", - "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/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "engines": { - "node": ">=12" - } - }, - "node_modules/webpack": { - "version": "5.83.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.83.1.tgz", - "integrity": "sha512-TNsG9jDScbNuB+Lb/3+vYolPplCS3bbEaJf+Bj0Gw4DhP3ioAflBb1flcRt9zsWITyvOhM96wMQNRWlSX52DgA==", - "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.14.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": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "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/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "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.15.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", - "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", - "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/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/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", - "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==", - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-node-externals": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", - "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/webpack-sources/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/webpack/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/webpack/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==", - "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/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", - "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", - "dependencies": { - "tr46": "^4.1.1", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" - }, - "node_modules/win-ca": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/win-ca/-/win-ca-3.5.0.tgz", - "integrity": "sha512-0TgO/+2iz2pS3OxBy2ikovPHOYyZRdLRxRTT9ze7DpZwEpaahLFOBuac93GM3lYEVzDyf8fXskJjIX/EILvkhQ==", - "hasInstallScript": true, - "dependencies": { - "is-electron": "^2.2.0", - "make-dir": "^1.3.0", - "node-forge": "^1.2.1", - "split": "^1.0.1" - } - }, - "node_modules/win-ca/node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/win-ca/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/winston": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz", - "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==", - "dependencies": { - "@colors/colors": "1.5.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.4.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", - "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", - "dependencies": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 6.4.0" - } - }, - "node_modules/winston-transport-browserconsole": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/winston-transport-browserconsole/-/winston-transport-browserconsole-1.0.5.tgz", - "integrity": "sha512-BFZDvknATAmsqaRY3WatB2S0eEb0ziwqBYIv+H0Fnu9oe7GnPUVQzEJC1frmLdNsfEkfnyR1PCNDBAFtZE3SuQ==", - "dependencies": { - "winston": "^3.2.1", - "winston-transport": "^4.3.0" - } - }, - "node_modules/winston/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/write-json-file": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", - "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", - "dev": true, - "dependencies": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.15", - "make-dir": "^2.1.0", - "pify": "^4.0.1", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.4.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/write-json-file/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/write-json-file/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/write-json-file/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/write-json-file/node_modules/sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", - "dev": true, - "dependencies": { - "is-plain-obj": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/write-json-file/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/write-pkg": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz", - "integrity": "sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==", - "dev": true, - "dependencies": { - "sort-keys": "^2.0.0", - "type-fest": "^0.4.1", - "write-json-file": "^3.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/write-pkg/node_modules/sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", - "dev": true, - "dependencies": { - "is-plain-obj": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/write-pkg/node_modules/type-fest": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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==", - "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/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlbuilder": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", - "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==", - "dev": true, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/xterm": { - "version": "4.19.0", - "resolved": "https://registry.npmjs.org/xterm/-/xterm-4.19.0.tgz", - "integrity": "sha512-c3Cp4eOVsYY5Q839dR5IejghRPpxciGmLWWaP9g+ppfMeBChMeLa1DCA+pmX/jyDZ+zxFOmlJL/82qVdayVoGQ==" - }, - "node_modules/xterm-addon-fit": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.5.0.tgz", - "integrity": "sha512-DsS9fqhXHacEmsPxBJZvfj2la30Iz9xk+UKjhQgnYNkrUIN5CYLbw7WEfz117c7+S86S/tpHPfvNxJsF5/G8wQ==", - "peerDependencies": { - "xterm": "^4.0.0" - } - }, - "node_modules/xterm-link-provider": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/xterm-link-provider/-/xterm-link-provider-1.3.1.tgz", - "integrity": "sha512-uOlaIeUED6kJeL2nIIf5YwreO0obMhsC0RWypEUmWkz7SAQewzgwdWFjQ2He7NGcT93c4KUf8bRgAu8cV9bAYA==", - "dependencies": { - "xterm": "^4.6.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yaku": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/yaku/-/yaku-0.16.7.tgz", - "integrity": "sha512-Syu3IB3rZvKvYk7yTiyl1bo/jiEFaaStrgv1V2TIJTqYPStSMQVO8EQjg/z+DRzLq/4LIIharNT3iH1hylEIRw==" - }, - "node_modules/yalc": { - "version": "1.0.0-pre.53", - "resolved": "https://registry.npmjs.org/yalc/-/yalc-1.0.0-pre.53.tgz", - "integrity": "sha512-tpNqBCpTXplnduzw5XC+FF8zNJ9L/UXmvQyyQj7NKrDNavbJtHvzmZplL5ES/RCnjX7JR7W9wz5GVDXVP3dHUQ==", - "dependencies": { - "chalk": "^4.1.0", - "detect-indent": "^6.0.0", - "fs-extra": "^8.0.1", - "glob": "^7.1.4", - "ignore": "^5.0.4", - "ini": "^2.0.0", - "npm-packlist": "^2.1.5", - "yargs": "^16.1.1" - }, - "bin": { - "yalc": "src/yalc.js" - } - }, - "node_modules/yalc/node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/yalc/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/yalc/node_modules/ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/yalc/node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yalc/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/yalc/node_modules/npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/yalc/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" - }, - "node_modules/yalc/node_modules/npm-packlist": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", - "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", - "dependencies": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yalc/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/yalc/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "devOptional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.21.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", - "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "open-lens": { - "version": "6.5.0", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@astronautlabs/jsonpath": "^1.1.0", - "@hapi/call": "^9.0.1", - "@hapi/subtext": "^7.1.0", - "@k8slens/application": "^6.5.0", - "@k8slens/application-for-electron-main": "^6.5.0", - "@k8slens/button": "^1.0.0", - "@k8slens/cluster-settings": "^6.5.0", - "@k8slens/cluster-sidebar": "^1.0.0", - "@k8slens/core": "^6.5.0", - "@k8slens/ensure-binaries": "^6.5.0", - "@k8slens/error-boundary": "^1.0.0", - "@k8slens/event-emitter": "^1.0.0", - "@k8slens/feature-core": "^6.5.0", - "@k8slens/json-api": "^1.0.0-alpha.3", - "@k8slens/keyboard-shortcuts": "^1.0.0", - "@k8slens/kube-api": "^1.0.0-alpha.1", - "@k8slens/kube-api-specifics": "^1.0.0", - "@k8slens/kube-object": "^1.0.0", - "@k8slens/kubectl-versions": "^1.0.0", - "@k8slens/legacy-extension-example": "^1.0.0", - "@k8slens/legacy-extensions": "^1.0.0", - "@k8slens/legacy-global-di": "^1.0.0", - "@k8slens/list-layout": "^1.0.0", - "@k8slens/logger": "^1.0.0", - "@k8slens/messaging": "^1.0.0", - "@k8slens/messaging-for-main": "^1.0.0", - "@k8slens/messaging-for-renderer": "^1.0.0", - "@k8slens/metrics": "^6.5.0", - "@k8slens/node-fetch": "^6.5.0", - "@k8slens/prometheus": "^1.0.0", - "@k8slens/random": "^1.0.0", - "@k8slens/react-application": "^1.0.0", - "@k8slens/resizing-anchor": "^1.0.0", - "@k8slens/resource-templates": "^1.0.0", - "@k8slens/routing": "^1.0.0", - "@k8slens/run-many": "^1.0.0", - "@k8slens/startable-stoppable": "^1.0.0", - "@k8slens/tooltip": "^1.0.0", - "@k8slens/utilities": "^1.0.0", - "@kubernetes/client-node": "^0.18.1", - "@material-ui/core": "^4.12.3", - "@material-ui/lab": "^4.0.0-alpha.60", - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "@ogre-tools/injectable-extension-for-mobx": "^17.2.0", - "@ogre-tools/injectable-react": "^17.2.0", - "@sentry/electron": "^3.0.8", - "@sentry/integrations": "^6.19.3", - "ansi_up": "^5.2.1", - "auto-bind": "^4.0.0", - "await-lock": "^2.2.2", - "byline": "^5.0.0", - "chalk": "^4.1.2", - "chart.js": "^2.9.4", - "chokidar": "^3.5.3", - "color": "^3.2.1", - "conf": "^10.2.0", - "crypto-js": "^4.1.1", - "dompurify": "^2.4.4", - "electron-devtools-installer": "^3.2.0", - "electron-updater": "^4.6.5", - "electron-window-state": "^5.0.3", - "fs-extra": "^9.0.1", - "glob-to-regexp": "^0.4.1", - "grapheme-splitter": "^1.0.4", - "handlebars": "^4.7.7", - "history": "^4.10.1", - "hpagent": "^1.2.0", - "http-proxy": "^1.18.1", - "immer": "^9.0.21", - "joi": "^17.9.1", - "js-yaml": "^4.1.0", - "lodash": "^4.17.15", - "marked": "^4.2.12", - "mobx": "^6.9.0", - "mobx-observable-history": "^2.0.3", - "mobx-react": "^7.6.0", - "mobx-utils": "^6.0.4", - "moment": "^2.29.4", - "moment-timezone": "^0.5.40", - "monaco-editor": "^0.38.0", - "node-pty": "0.10.1", - "npm": "^9.6.7", - "p-limit": "^3.1.0", - "path-to-regexp": "^6.2.0", - "proper-lockfile": "^4.1.2", - "query-string": "^7.1.3", - "randomcolor": "^0.6.2", - "react": "^17.0.2", - "react-beautiful-dnd": "^13.1.1", - "react-dom": "^17.0.2", - "react-material-ui-carousel": "^2.3.11", - "react-router": "^5.3.4", - "react-router-dom": "^5.3.4", - "react-select": "^5.7.0", - "react-select-event": "^5.5.1", - "react-table": "^7.8.0", - "react-virtualized-auto-sizer": "^1.0.7", - "react-window": "^1.8.8", - "readable-stream": "^3.6.2", - "rfc6902": "^5.0.1", - "selfsigned": "^2.1.1", - "semver": "^7.3.8", - "stoppable": "^1.1.0", - "tar": "^6.1.13", - "tcp-port-used": "^1.0.2", - "tempy": "1.0.1", - "type-fest": "^2.14.0", - "typed-emitter": "^1.4.0", - "typed-regex": "^0.0.8", - "url-parse": "^1.5.10", - "uuid": "^8.3.2", - "win-ca": "^3.5.0", - "winston": "^3.8.2", - "winston-transport-browserconsole": "^1.0.5", - "ws": "^8.12.1", - "xterm": "^4.19.0", - "xterm-addon-fit": "^0.5.0", - "xterm-link-provider": "^1.3.1" - }, - "devDependencies": { - "@electron/notarize": "^1.2.3", - "@electron/rebuild": "^3.2.10", - "@k8slens/generate-tray-icons": "^6.5.0", - "@k8slens/test-utils": "^1.0.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", - "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.53", - "@swc/jest": "^0.2.26", - "@types/byline": "^4.2.33", - "@types/chart.js": "^2.9.36", - "@types/color": "^3.0.3", - "@types/crypto-js": "^3.1.47", - "@types/lodash": "^4.14.191", - "@types/node": "^16.18.25", - "@types/proper-lockfile": "^4.1.2", - "@types/react-dom": "^17.0.16", - "@types/react-router-dom": "^5.3.3", - "@types/react-virtualized-auto-sizer": "^1.0.1", - "@types/react-window": "^1.8.5", - "@types/request-promise-native": "^1.0.18", - "@types/tar": "^6.1.4", - "@types/tcp-port-used": "^1.0.1", - "@types/url-parse": "^1.4.8", - "@types/uuid": "^8.3.4", - "@types/webpack": "^5.28.1", - "@types/webpack-env": "^1.18.0", - "@types/webpack-node-externals": "2.5.3", - "circular-dependency-plugin": "^5.2.2", - "concurrently": "^7.6.0", - "copy-webpack-plugin": "^11.0.0", - "cross-env": "^7.0.3", - "css-loader": "^6.7.2", - "electron": "^22.3.10", - "electron-builder": "^23.6.0", - "esbuild-loader": "^2.20.0", - "fork-ts-checker-webpack-plugin": "^7.3.0", - "html-webpack-plugin": "^5.5.1", - "jest": "^29.5.0", - "jest-environment-jsdom": "^28.1.3", - "jsonfile": "^6.1.0", - "mini-css-extract-plugin": "^2.7.1", - "monaco-editor-webpack-plugin": "^7.0.1", - "node-loader": "^2.0.0", - "nodemon": "^2.0.20", - "playwright": "^1.33.0", - "rimraf": "^4.4.1", - "run-script-os": "^1.1.6", - "style-loader": "^3.3.1", - "tailwindcss": "^3.3.2", - "ts-loader": "^9.4.2", - "ts-node": "^10.9.1", - "typescript": "^4.9.5", - "typescript-plugin-css-modules": "^5.0.1", - "webpack": "^5.81.0", - "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.13.3", - "webpack-node-externals": "^3.0.0" - }, - "engines": { - "node": ">=16 <17" - } - }, - "packages/business-features/keyboard-shortcuts": { - "name": "@k8slens/keyboard-shortcuts", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@async-fn/jest": "^1.6.4", - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/react-testing-library-discovery": "^1.0.0", - "@k8slens/webpack": "^6.5.0" - }, - "peerDependencies": { - "@k8slens/feature-core": "^6.5.0-alpha.0", - "@k8slens/react-application": "^1.0.0-alpha.0", - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "@ogre-tools/injectable-react": "^17.2.0", - "lodash": "^4.17.21", - "react": "^17 || ^18" - } - }, - "packages/cluster-settings": { - "name": "@k8slens/cluster-settings", - "version": "6.5.0", - "license": "MIT", - "devDependencies": { - "@k8slens/webpack": "^6.5.0", - "rimraf": "^4.4.1" - }, - "peerDependencies": { - "@ogre-tools/injectable": "^17.2.0" - } - }, - "packages/cluster-sidebar": { - "name": "@k8slens/cluster-sidebar", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0-alpha.3", - "@k8slens/jest": "^6.5.0-alpha.5", - "@k8slens/typescript": "^6.5.0-alpha.2", - "@k8slens/webpack": "^6.5.0-alpha.5" - }, - "peerDependencies": { - "@k8slens/feature-core": "^6.5.0-alpha.4", - "@k8slens/utilities": "^1.0.0-alpha.3", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "@ogre-tools/injectable-extension-for-mobx": "^17.2.0", - "mobx": "^6.9.0", - "react": "^17.0.2" - } - }, - "packages/core": { - "name": "@k8slens/core", - "version": "6.5.0", - "license": "MIT", - "devDependencies": { - "@async-fn/jest": "1.6.4", - "@k8slens/messaging-fake-bridge": "^1.0.0", - "@k8slens/react-testing-library-discovery": "^1.0.0", - "@k8slens/test-utils": "^1.0.0", - "@ogre-tools/linkable": "^17.2.0", - "@sentry/types": "^6.19.7", - "@side/jest-runtime": "^1.1.0", - "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.53", - "@swc/jest": "^0.2.26", - "@testing-library/dom": "^8.19.0", - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^12.1.5", - "@testing-library/user-event": "^13.5.0", - "@types/byline": "^4.2.33", - "@types/chart.js": "^2.9.36", - "@types/circular-dependency-plugin": "5.0.5", - "@types/color": "^3.0.3", - "@types/command-line-args": "^5.2.0", - "@types/crypto-js": "^3.1.47", - "@types/dompurify": "^2.4.0", - "@types/electron-devtools-installer": "^2.2.1", - "@types/fs-extra": "^9.0.13", - "@types/glob-to-regexp": "^0.4.1", - "@types/hapi__call": "^9.0.0", - "@types/hapi__subtext": "^7.0.0", - "@types/http-proxy": "^1.17.11", - "@types/jest": "^29.5.0", - "@types/js-yaml": "^4.0.5", - "@types/lodash": "^4.14.191", - "@types/marked": "^4.3.0", - "@types/md5-file": "^4.0.2", - "@types/memorystream": "^0.3.0", - "@types/mock-fs": "^4.13.1", - "@types/node": "^16.18.25", - "@types/proper-lockfile": "^4.1.2", - "@types/randomcolor": "^0.5.7", - "@types/react": "^17.0.45", - "@types/react-beautiful-dnd": "^13.1.4", - "@types/react-dom": "^17.0.16", - "@types/react-router": "^5.1.19", - "@types/react-router-dom": "^5.3.3", - "@types/react-table": "^7.7.14", - "@types/react-virtualized-auto-sizer": "^1.0.1", - "@types/react-window": "^1.8.5", - "@types/readable-stream": "^2.3.13", - "@types/semver": "^7.3.13", - "@types/stoppable": "^1.1.1", - "@types/tar": "^6.1.4", - "@types/tcp-port-used": "^1.0.1", - "@types/triple-beam": "^1.3.2", - "@types/url-parse": "^1.4.8", - "@types/uuid": "^8.3.4", - "@types/webpack": "^5.28.1", - "@types/webpack-env": "^1.18.0", - "@types/webpack-node-externals": "^2.5.3", - "@typescript-eslint/eslint-plugin": "^5.59.1", - "@typescript-eslint/parser": "^5.59.1", - "circular-dependency-plugin": "^5.2.2", - "concurrently": "^7.6.0", - "cross-env": "^7.0.3", - "css-loader": "^6.7.3", - "electron-builder": "^23.6.0", - "esbuild": "^0.17.8", - "esbuild-loader": "^2.21.0", - "eslint": "^8.39.0", - "eslint-import-resolver-typescript": "^3.5.3", - "eslint-plugin-header": "^3.1.1", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-react": "^7.32.2", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-unused-imports": "^2.0.0", - "fork-ts-checker-webpack-plugin": "^7.3.0", - "ignore-loader": "^0.1.2", - "include-media": "^1.4.10", - "jest": "^29.5.0", - "jest-canvas-mock": "^2.3.1", - "jest-environment-jsdom": "^28.1.3", - "jest-mock-extended": "^2.0.9", - "memfs": "^3.5.1", - "memorystream": "^0.3.1", - "mini-css-extract-plugin": "^2.7.2", - "mock-http": "^1.1.0", - "monaco-editor-webpack-plugin": "^7.0.1", - "node-loader": "^2.0.0", - "nodemon": "^2.0.20", - "postcss-loader": "^6.2.1", - "rimraf": "^4.4.1", - "sass-loader": "^12.6.0", - "style-loader": "^3.3.1", - "tailwindcss": "^3.3.2", - "ts-loader": "^9.4.2", - "ts-node": "^10.9.1", - "typedoc": "^0.24.6", - "typedoc-plugin-markdown": "^3.15.1", - "typescript": "^4.9.5", - "typescript-plugin-css-modules": "^5.0.1", - "webpack": "^5.81.0", - "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.13.3", - "webpack-node-externals": "^3.0.0" - }, - "engines": { - "node": ">=16 <17" - }, - "peerDependencies": { - "@hapi/call": "^9.0.1", - "@hapi/subtext": "^7.1.0", - "@k8slens/animate": "^1.0.0-alpha.0", - "@k8slens/application": "^6.5.0-alpha.0", - "@k8slens/application-for-electron-main": "^6.5.0-alpha.0", - "@k8slens/button": "^1.0.0-alpha.5", - "@k8slens/cluster-settings": "^6.5.0-alpha.1", - "@k8slens/cluster-sidebar": "^1.0.0", - "@k8slens/error-boundary": "^1.0.0-alpha.5", - "@k8slens/event-emitter": "^1.0.0-alpha.1", - "@k8slens/icon": "^1.0.0-alpha.7", - "@k8slens/kube-api": "^1.0.0-alpha.1", - "@k8slens/kube-api-specifics": "^1.0.0-alpha.1", - "@k8slens/kube-object": "^1.0.0-alpha.5", - "@k8slens/kubectl-versions": "^1.0.0-alpha.0", - "@k8slens/legacy-extensions": "^1.0.0-alpha.0", - "@k8slens/legacy-global-di": "^1.0.0-alpha.0", - "@k8slens/list-layout": "^1.0.0-alpha.4", - "@k8slens/logger": "^1.0.0-alpha.5", - "@k8slens/messaging": "^1.0.0-alpha.1", - "@k8slens/messaging-for-main": "^1.0.0-alpha.1", - "@k8slens/messaging-for-renderer": "^1.0.0-alpha.1", - "@k8slens/metrics": "^6.5.0-alpha.7", - "@k8slens/node-fetch": "^6.5.0-alpha.3", - "@k8slens/notifications": "^1.0.0", - "@k8slens/prometheus": "^1.0.0", - "@k8slens/random": "^1.0.0", - "@k8slens/react-application": "^1.0.0-alpha.5", - "@k8slens/resizing-anchor": "^1.0.0-alpha.5", - "@k8slens/resource-templates": "^1.0.0-alpha.1", - "@k8slens/routing": "^1.0.0-alpha.5", - "@k8slens/run-many": "^1.0.0-alpha.1", - "@k8slens/startable-stoppable": "^1.0.0-alpha.1", - "@k8slens/tooltip": "^1.0.0-alpha.5", - "@k8slens/utilities": "^1.0.0-alpha.1", - "@kubernetes/client-node": "^0.18.1", - "@material-ui/core": "^4.12.3", - "@material-ui/lab": "^4.0.0-alpha.60", - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "@ogre-tools/injectable-extension-for-mobx": "^17.2.0", - "@ogre-tools/injectable-react": "^17.2.0", - "@sentry/electron": "^3.0.8", - "@sentry/integrations": "^6.19.3", - "ansi_up": "^5.2.1", - "auto-bind": "^4.0.0", - "await-lock": "^2.2.2", - "byline": "^5.0.0", - "chalk": "^4.1.2", - "chart.js": "^2.9.4", - "chokidar": "^3.5.3", - "color": "^3.2.1", - "conf": "^10.2.0", - "crypto-js": "^4.1.1", - "dompurify": "^2.4.4", - "electron": "^22.3.10", - "electron-devtools-installer": "^3.2.0", - "electron-updater": "^4.6.5", - "electron-window-state": "^5.0.3", - "fs-extra": "^9.0.1", - "glob-to-regexp": "^0.4.1", - "grapheme-splitter": "^1.0.4", - "handlebars": "^4.7.7", - "history": "^4.10.1", - "hpagent": "^1.2.0", - "http-proxy": "^1.18.1", - "immer": "^9.0.21", - "joi": "^17.9.1", - "js-yaml": "^4.1.0", - "lodash": "^4.17.15", - "marked": "^4.2.12", - "mobx": "^6.9.0", - "mobx-observable-history": "^2.0.3", - "mobx-react": "^7.6.0", - "mobx-utils": "^6.0.4", - "moment": "^2.29.4", - "moment-timezone": "^0.5.40", - "monaco-editor": "^0.38.0", - "node-pty": "0.10.1", - "npm": "^9.6.7", - "path-to-regexp": "^6.2.0", - "proper-lockfile": "^4.1.2", - "query-string": "^7.1.3", - "randomcolor": "^0.6.2", - "react": "^17.0.2", - "react-beautiful-dnd": "^13.1.1", - "react-dom": "^17.0.2", - "react-material-ui-carousel": "^2.3.11", - "react-router": "^5.3.4", - "react-router-dom": "^5.3.4", - "react-select": "^5.7.0", - "react-select-event": "^5.5.1", - "react-table": "^7.8.0", - "react-virtualized-auto-sizer": "^1.0.7", - "react-window": "^1.8.8", - "rfc6902": "^5.0.1", - "selfsigned": "^2.1.1", - "semver": "^7.3.8", - "stoppable": "^1.1.0", - "tar": "^6.1.13", - "tcp-port-used": "^1.0.2", - "tempy": "1.0.1", - "type-fest": "^2.14.0", - "typed-emitter": "^1.4.0", - "typed-regex": "^0.0.8", - "url-parse": "^1.5.10", - "uuid": "^8.3.2", - "win-ca": "^3.5.0", - "winston": "^3.8.2", - "winston-transport-browserconsole": "^1.0.5", - "ws": "^8.12.1", - "xterm": "^4.19.0", - "xterm-addon-fit": "^0.5.0", - "xterm-link-provider": "^1.3.1" - } - }, - "packages/ensure-binaries": { - "name": "@k8slens/ensure-binaries", - "version": "6.5.0", - "license": "MIT", - "dependencies": { - "arg": "^5.0.2", - "cli-progress": "^3.11.2", - "gunzip-maybe": "^1.4.2", - "node-fetch": "^3.3.0", - "tar-stream": "^3.0.0", - "zod": "^3.20.6" - }, - "devDependencies": { - "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.53", - "@types/cli-progress": "^3.11.0", - "@types/gunzip-maybe": "^1.4.0", - "@types/node": "^16.18.25", - "@types/semver": "^7.3.13", - "@types/tar-stream": "^2.2.2", - "rimraf": "^4.4.1" - } - }, - "packages/ensure-binaries/node_modules/node-fetch": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", - "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "packages/extension-api": { - "name": "@k8slens/extensions", - "version": "6.5.0", - "license": "MIT", - "dependencies": { - "@k8slens/core": "6.5.0" - }, - "devDependencies": { - "@types/node": "^16.18.25", - "@types/webpack": "^5.28.1", - "@types/webpack-env": "^1.18.0", - "@types/webpack-node-externals": "2.5.3", - "css-loader": "^6.7.2", - "node-loader": "^2.0.0", - "rimraf": "^4.4.1", - "style-loader": "^3.3.1", - "ts-loader": "^9.4.2", - "ts-node": "^10.9.1", - "typed-emitter": "^2.1.0", - "typedoc": "^0.24.6", - "typedoc-plugin-markdown": "^3.15.1", - "typescript": "^4.9.5", - "typescript-plugin-css-modules": "^5.0.1", - "webpack": "^5.81.0", - "webpack-cli": "^5.0.1" - } - }, - "packages/extension-api/node_modules/@webpack-cli/configtest": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.0.tgz", - "integrity": "sha512-K/vuv72vpfSEZoo5KIU0a2FsEoYdW0DUMtMpB5X3LlUwshetMZRZRxB7sCsVji/lFaSxtQQ3aM9O4eMolXkU9w==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "packages/extension-api/node_modules/@webpack-cli/info": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", - "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "packages/extension-api/node_modules/@webpack-cli/serve": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.4.tgz", - "integrity": "sha512-0xRgjgDLdz6G7+vvDLlaRpFatJaJ69uTalZLRSMX5B3VUrDmXcrVA3+6fXXQgmYz7bY9AAgs348XQdmtLsK41A==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "packages/extension-api/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" - } - }, - "packages/extension-api/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" - } - }, - "packages/extension-api/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" - } - }, - "packages/extension-api/node_modules/typed-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz", - "integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==", - "dev": true, - "optionalDependencies": { - "rxjs": "*" - } - }, - "packages/extension-api/node_modules/webpack-cli": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.1.tgz", - "integrity": "sha512-OLJwVMoXnXYH2ncNGU8gxVpUtm3ybvdioiTvHgUyBuyMLKiVvWy+QObzBsMtp5pH7qQoEuWgeEUQ/sU3ZJFzAw==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.0", - "@webpack-cli/info": "^2.0.1", - "@webpack-cli/serve": "^2.0.4", - "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 - } - } - }, - "packages/generate-tray-icons": { - "name": "@k8slens/generate-tray-icons", - "version": "6.5.0", - "license": "MIT", - "dependencies": { - "arg": "^5.0.2", - "jsdom": "^21.1.0", - "rimraf": "^4.4.1", - "sharp": "^0.32.1" - }, - "devDependencies": { - "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.53", - "@types/jsdom": "^20.0.1", - "@types/node": "^16.18.25", - "@types/sharp": "^0.31.1" - } - }, - "packages/generate-tray-icons/node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, - "packages/generate-tray-icons/node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" - }, - "packages/generate-tray-icons/node_modules/sharp": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.1.tgz", - "integrity": "sha512-kQTFtj7ldpUqSe8kDxoGLZc1rnMFU0AO2pqbX6pLy3b7Oj8ivJIdoKNwxHVQG2HN6XpHPJqCSM2nsma2gOXvOg==", - "hasInstallScript": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.1", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.0", - "simple-get": "^4.0.1", - "tar-fs": "^2.1.1", - "tunnel-agent": "^0.6.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "packages/infrastructure/eslint-config": { - "name": "@k8slens/eslint-config", - "version": "6.5.0", - "license": "MIT", - "bin": { - "lens-lint": "bin/lint" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": ">= 5", - "@typescript-eslint/parser": ">= 5", - "eslint": ">= 7", - "eslint-config-airbnb-typescript": ">= 17", - "eslint-config-prettier": ">= 8", - "eslint-config-react-app": "^7.0.1", - "eslint-plugin-import": ">= 2", - "eslint-plugin-jest": ">= 27", - "eslint-plugin-jsx-a11y": ">= 6", - "eslint-plugin-no-unsanitized": ">= 4.0.2", - "eslint-plugin-prettier": ">= 4", - "eslint-plugin-react-hooks": ">= 4", - "eslint-plugin-security": ">= 1.6.0", - "eslint-plugin-simple-import-sort": ">= 7", - "eslint-plugin-unused-imports": ">= 2", - "eslint-plugin-xss": ">= 0.1.12", - "prettier": ">= 2" - } - }, - "packages/infrastructure/jest": { - "name": "@k8slens/jest", - "version": "6.5.0", - "license": "MIT", - "dependencies": { - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^12.1.5", - "@types/jest": "^29.2.2", - "identity-obj-proxy": "^3.0.0", - "jest": "^29.5.0", - "jest-environment-jsdom": "^29.5.0", - "jest-watch-select-projects": "^2.0.0", - "jest-watch-typeahead": "^2.2.1", - "lodash": "^4.17.21", - "ts-jest": "^29.0.3" - }, - "devDependencies": { - "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.53", - "@swc/jest": "^0.2.26" - } - }, - "packages/infrastructure/jest/node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "packages/infrastructure/jest/node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "packages/infrastructure/jest/node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/infrastructure/jest/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "packages/infrastructure/jest/node_modules/jest-environment-jsdom": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz", - "integrity": "sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw==", - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/jsdom": "^20.0.0", - "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0", - "jsdom": "^20.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "packages/infrastructure/jest/node_modules/jsdom": { - "version": "20.0.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", - "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", - "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "packages/infrastructure/jest/node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "packages/infrastructure/jest/node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/infrastructure/typescript": { - "name": "@k8slens/typescript", - "version": "6.5.0", - "license": "MIT", - "dependencies": { - "typescript": "^4.9.3" - }, - "devDependencies": { - "typescript-plugin-css-modules": "^5.0.1" - } - }, - "packages/infrastructure/webpack": { - "name": "@k8slens/webpack", - "version": "6.5.0", - "license": "MIT", - "dependencies": { - "@ogre-tools/linkable": "^17.2.0", - "@types/webpack-env": "^1.18.0", - "css-loader": "^6.7.2", - "fork-ts-checker-webpack-plugin": "^7.3.0", - "fs-extra": "^9.0.1", - "mini-css-extract-plugin": "^2.7.3", - "sass": "^1.62.1", - "sass-loader": "^13.2.0", - "style-loader": "^3.3.1", - "tailwindcss": "^3.3.2", - "ts-loader": "^9.4.1", - "webpack": "^5.81.0", - "webpack-cli": "^4.10.0" - }, - "bin": { - "lens-webpack-build": "bin/webpack-build" - }, - "devDependencies": { - "@async-fn/jest": "^1.6.4", - "@k8slens/typescript": "^6.5.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "@ogre-tools/test-utils": "^17.2.0", - "ts-node": "^10.9.1", - "webpack-node-externals": "^3.0.0" - }, - "peerDependencies": { - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "lodash": "^4.17.21" - } - }, - "packages/infrastructure/webpack/node_modules/@ogre-tools/test-utils": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@ogre-tools/test-utils/-/test-utils-17.1.0.tgz", - "integrity": "sha512-QlCBycGqU7XvRj55THt34bRJm2snnMaNraGj0J0biOSiSVawolkQErmvFbBe8NYp+yHdSuJhHmrAjWKNisO8pw==", - "dev": true, - "peerDependencies": { - "lodash": "^4.17.21" - } - }, - "packages/infrastructure/webpack/node_modules/sass-loader": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.0.tgz", - "integrity": "sha512-LeWNswSEujsZnwdn9AuA+Q5wZEAFlU+eORQsDKp35OtGAfFxYxpfk/Ylon+TGGkazSqxi2EHDTqdr3di8r7nCg==", - "dependencies": { - "klona": "^2.0.6", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, - "packages/kube-object": { - "name": "@k8slens/kube-object", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/jest": "^6.5.0", - "@k8slens/typescript": "^6.5.0", - "@k8slens/webpack": "^6.5.0" - }, - "peerDependencies": { - "@k8slens/utilities": "^1.0.0-alpha.2", - "@ogre-tools/injectable": "^17.2.0", - "auto-bind": "^4.0.0", - "moment": "^2.29.4", - "rfc6902": "^5.0.1", - "type-fest": "^2.19.0", - "typed-regex": "^0.0.8" - } - }, - "packages/kubectl-versions": { - "name": "@k8slens/kubectl-versions", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/webpack": "^6.5.0", - "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.53", - "fast-xml-parser": "^4.2.2", - "semver": "^7.3.8", - "ts-node": "^10.9.1", - "typed-regex": "^0.0.8" - }, - "peerDependencies": { - "@ogre-tools/injectable": "^17.2.0" - } - }, - "packages/legacy-extension-example": { - "name": "@k8slens/legacy-extension-example", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/extensions": "^6.5.0", - "@types/node": "^16.18.25", - "typescript": "^4.9.5", - "webpack": "^5.81.0", - "webpack-cli": "^5.0.1" - }, - "engines": { - "lens": "6.5" - } - }, - "packages/legacy-extension-example/node_modules/@webpack-cli/configtest": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.0.tgz", - "integrity": "sha512-K/vuv72vpfSEZoo5KIU0a2FsEoYdW0DUMtMpB5X3LlUwshetMZRZRxB7sCsVji/lFaSxtQQ3aM9O4eMolXkU9w==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "packages/legacy-extension-example/node_modules/@webpack-cli/info": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", - "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - } - }, - "packages/legacy-extension-example/node_modules/@webpack-cli/serve": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.4.tgz", - "integrity": "sha512-0xRgjgDLdz6G7+vvDLlaRpFatJaJ69uTalZLRSMX5B3VUrDmXcrVA3+6fXXQgmYz7bY9AAgs348XQdmtLsK41A==", - "dev": true, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "webpack": "5.x.x", - "webpack-cli": "5.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "packages/legacy-extension-example/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" - } - }, - "packages/legacy-extension-example/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" - } - }, - "packages/legacy-extension-example/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" - } - }, - "packages/legacy-extension-example/node_modules/webpack-cli": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.1.tgz", - "integrity": "sha512-OLJwVMoXnXYH2ncNGU8gxVpUtm3ybvdioiTvHgUyBuyMLKiVvWy+QObzBsMtp5pH7qQoEuWgeEUQ/sU3ZJFzAw==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.0", - "@webpack-cli/info": "^2.0.1", - "@webpack-cli/serve": "^2.0.4", - "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 - } - } - }, - "packages/legacy-global-di": { - "name": "@k8slens/legacy-global-di", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/jest": "^6.5.0", - "@k8slens/typescript": "^6.5.0", - "@k8slens/webpack": "^6.5.0" - }, - "peerDependencies": { - "@ogre-tools/injectable": "^17.2.0" - } - }, - "packages/list-layout": { - "name": "@k8slens/list-layout", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/jest": "^6.5.0", - "@k8slens/typescript": "^6.5.0", - "@k8slens/webpack": "^6.5.0" - }, - "peerDependencies": { - "@k8slens/kube-object": "^1.0.0-alpha.5", - "@k8slens/utilities": "^1.0.0-alpha.3", - "@ogre-tools/injectable": "^17.2.0", - "react": "^17.0.2" - } - }, - "packages/logger": { - "name": "@k8slens/logger", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "6.5.0-alpha.1", - "@k8slens/jest": "^6.5.0", - "@k8slens/react-testing-library-discovery": "^1.0.0", - "@k8slens/webpack": "^6.5.0" - }, - "peerDependencies": { - "@k8slens/feature-core": "^6.5.0-alpha.0", - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "lodash": "^4.17.21", - "winston": "^3.8.2" - } - }, - "packages/logger/node_modules/@k8slens/eslint-config": { - "version": "6.5.0-alpha.1", - "resolved": "https://registry.npmjs.org/@k8slens/eslint-config/-/eslint-config-6.5.0-alpha.1.tgz", - "integrity": "sha512-6DdfKe/iafX85GBK/UlKgz29FOIOp/UVS03bFGLyw7Vmm7pauB0FEHTAdbr3g1qG/Zcn6nxhOM3uqQyRY/uEyA==", - "dev": true, - "bin": { - "lens-lint": "bin/lint" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": ">= 5", - "@typescript-eslint/parser": ">= 5", - "eslint": ">= 7", - "eslint-config-airbnb-typescript": ">= 17", - "eslint-config-prettier": ">= 8", - "eslint-config-react-app": "^7.0.1", - "eslint-plugin-import": ">= 2", - "eslint-plugin-jest": ">= 27", - "eslint-plugin-jsx-a11y": ">= 6", - "eslint-plugin-no-unsanitized": ">= 4.0.2", - "eslint-plugin-prettier": ">= 4", - "eslint-plugin-react-hooks": ">= 4", - "eslint-plugin-security": ">= 1.6.0", - "eslint-plugin-simple-import-sort": ">= 7", - "eslint-plugin-unused-imports": ">= 2", - "eslint-plugin-xss": ">= 0.1.12", - "prettier": ">= 2" - } - }, - "packages/metrics": { - "name": "@k8slens/metrics", - "version": "6.5.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/jest": "^6.5.0", - "@k8slens/typescript": "^6.5.0", - "@k8slens/webpack": "^6.5.0" - }, - "peerDependencies": { - "@k8slens/kube-object": "^1.0.0-alpha.5", - "@ogre-tools/injectable": "^17.2.0", - "react": "^17.0.2" - } - }, - "packages/node-fetch": { - "name": "@k8slens/node-fetch", - "version": "6.5.0", - "license": "MIT", - "dependencies": { - "node-fetch": "^3.3.0" - }, - "devDependencies": { - "rimraf": "^4.4.1" - } - }, - "packages/node-fetch/node_modules/node-fetch": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", - "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "packages/prometheus": { - "name": "@k8slens/prometheus", - "version": "1.0.0", - "extraneous": true, - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0-alpha.3", - "@k8slens/jest": "^6.5.0-alpha.5", - "@k8slens/typescript": "^6.5.0-alpha.3", - "@k8slens/webpack": "^6.5.0-alpha.9" - }, - "peerDependencies": { - "@k8slens/application": "^6.5.0-alpha.2", - "@k8slens/feature-core": "^6.5.0-alpha.0", - "@k8slens/utilities": "^1.0.0-alpha.7", - "@kubernetes/client-node": "^0.18.1", - "@ogre-tools/fp": "^16.1.0", - "@ogre-tools/injectable": "^16.1.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^16.1.0", - "@ogre-tools/injectable-extension-for-mobx": "^16.1.0" - } - }, - "packages/random-id": { - "name": "@k8slens/random", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/webpack": "^6.5.0" - }, - "peerDependencies": { - "@k8slens/feature-core": "^6.5.0-alpha.0", - "@ogre-tools/injectable": "^17.1.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.1.0", - "uuid": "^8.3.2" - } - }, - "packages/release-tool": { - "name": "@k8slens/release-tool", - "version": "6.5.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.2.0", - "inquirer": "^9.2.0", - "semver": "^7.3.8" - }, - "devDependencies": { - "@octokit/core": "^4.2.1", - "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.53", - "@types/inquirer": "^9.0.3", - "@types/node": "^16.18.25", - "@types/semver": "^7.3.13", - "install": "^0.13.0", - "npm": "^9.6.7", - "rimraf": "^4.4.1" - } - }, - "packages/release-tool/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "packages/resource-templates": { - "name": "@k8slens/resource-templates", - "version": "1.0.0", - "license": "MIT" - }, - "packages/routing": { - "name": "@k8slens/routing", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@async-fn/jest": "^1.6.4", - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/react-testing-library-discovery": "^1.0.0", - "@k8slens/webpack": "^6.5.0", - "@testing-library/react": "^12.1.5", - "@testing-library/user-event": "^13.5.0" - }, - "peerDependencies": { - "@k8slens/feature-core": "^6.5.0-alpha.0", - "@k8slens/react-application": "^1.0.0-alpha.0", - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "@ogre-tools/injectable-react": "^17.2.0", - "auto-bind": "^4.0.0", - "history": "^4.10.1", - "lodash": "^4.17.21", - "mobx": "^6.8.0", - "mobx-observable-history": "^2.0.3", - "mobx-react": "^7.6.0", - "react": "^17", - "react-dom": "^17.0.2" - } - }, - "packages/semver": { - "name": "@k8slens/semver", - "version": "6.5.0", - "license": "MIT", - "dependencies": { - "command-line-args": "^5.2.1", - "semver": "^7.3.8" - }, - "devDependencies": { - "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.53", - "@types/command-line-args": "^5.2.0", - "@types/node": "^16.18.25", - "@types/semver": "^7.3.13", - "rimraf": "^4.4.1" - } - }, - "packages/technical-features/application/agnostic": { - "name": "@k8slens/application", - "version": "6.5.0", - "license": "MIT", - "devDependencies": { - "@async-fn/jest": "^1.6.4", - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/webpack": "^6.5.0" - }, - "peerDependencies": { - "@k8slens/feature-core": "^6.5.0-alpha.0", - "@k8slens/logger": "^1.0.0-alpha.5", - "@k8slens/run-many": "^1.0.0-alpha.1", - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "lodash": "^4.17.15" - } - }, - "packages/technical-features/application/electron-main": { - "name": "@k8slens/application-for-electron-main", - "version": "6.5.0", - "license": "MIT", - "devDependencies": { - "@async-fn/jest": "^1.6.4", - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/webpack": "^6.5.0", - "@ogre-tools/test-utils": "^17.2.0" - }, - "peerDependencies": { - "@k8slens/application": "^6.5.0-alpha.0", - "@k8slens/feature-core": "^6.5.0-alpha.0", - "@k8slens/run-many": "^1.0.0-alpha.1", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "electron": "^22.3.3", - "lodash": "^4.17.21" - } - }, - "packages/technical-features/application/electron-main/node_modules/@ogre-tools/test-utils": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/@ogre-tools/test-utils/-/test-utils-17.1.0.tgz", - "integrity": "sha512-QlCBycGqU7XvRj55THt34bRJm2snnMaNraGj0J0biOSiSVawolkQErmvFbBe8NYp+yHdSuJhHmrAjWKNisO8pw==", - "dev": true, - "peerDependencies": { - "lodash": "^4.17.21" - } - }, - "packages/technical-features/application/legacy-extensions": { - "name": "@k8slens/legacy-extensions", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/webpack": "^6.5.0" - }, - "peerDependencies": { - "@ogre-tools/injectable": "^17.2.0" - } - }, - "packages/technical-features/feature-core": { - "name": "@k8slens/feature-core", - "version": "6.5.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/webpack": "^6.5.0" - }, - "peerDependencies": { - "@ogre-tools/injectable": "^17.2.0" - } - }, - "packages/technical-features/messaging/agnostic": { - "name": "@k8slens/messaging", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/webpack": "^6.5.0" - }, - "peerDependencies": { - "@k8slens/application": "^6.5.0-alpha.0", - "@k8slens/feature-core": "^6.5.0-alpha.0", - "@k8slens/startable-stoppable": "^1.0.0-alpha.1", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "@ogre-tools/injectable-extension-for-mobx": "^17.2.0", - "lodash": "^4.17.21", - "mobx": "^6.7.0" - } - }, - "packages/technical-features/messaging/computed-channel": { - "name": "@k8slens/computed-channel", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/messaging-fake-bridge": "^1.0.0", - "@k8slens/webpack": "^6.5.0", - "type-fest": "^2.14.0" - }, - "peerDependencies": { - "@k8slens/application": "^6.5.0-alpha.0", - "@k8slens/feature-core": "^6.5.0-alpha.0", - "@k8slens/messaging": "^1.0.0-alpha.1", - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "@ogre-tools/injectable-extension-for-mobx": "^17.2.0", - "lodash": "^4.17.21", - "mobx": "^6.8.0" - } - }, - "packages/technical-features/messaging/electron/main": { - "name": "@k8slens/messaging-for-main", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/webpack": "^6.5.0" - }, - "peerDependencies": { - "@k8slens/application": "^6.5.0-alpha.0", - "@k8slens/feature-core": "^6.5.0-alpha.0", - "@k8slens/messaging": "^1.0.0-alpha.1", - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "electron": "^22.3.3", - "lodash": "^4.17.21" - } - }, - "packages/technical-features/messaging/electron/renderer": { - "name": "@k8slens/messaging-for-renderer", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/webpack": "^6.5.0" - }, - "peerDependencies": { - "@k8slens/application": "^6.5.0-alpha.0", - "@k8slens/feature-core": "^6.5.0-alpha.0", - "@k8slens/messaging": "^1.0.0-alpha.1", - "@k8slens/run-many": "^1.0.0-alpha.1", - "@k8slens/startable-stoppable": "^1.0.0-alpha.1", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "electron": "^22.3.3", - "lodash": "^4.17.21" - } - }, - "packages/technical-features/messaging/message-bridge-fake": { - "name": "@k8slens/messaging-fake-bridge", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/webpack": "^6.5.0" - }, - "peerDependencies": { - "@async-fn/jest": "^1.6.4", - "@k8slens/feature-core": "^6.5.0-alpha.2", - "@k8slens/messaging": "^1.0.0-alpha.1", - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-mobx": "^17.2.0", - "lodash": "^4.17.21", - "mobx": "^6.9.0" - } - }, - "packages/technical-features/prometheus": { - "name": "@k8slens/prometheus", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0-alpha.3", - "@k8slens/jest": "^6.5.0-alpha.5", - "@k8slens/typescript": "^6.5.0-alpha.3", - "@k8slens/webpack": "^6.5.0-alpha.9" - }, - "peerDependencies": { - "@k8slens/application": "^6.5.0-alpha.2", - "@k8slens/feature-core": "^6.5.0-alpha.0", - "@k8slens/utilities": "^1.0.0-alpha.7", - "@kubernetes/client-node": "^0.18.1", - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "@ogre-tools/injectable-extension-for-mobx": "^17.2.0" - } - }, - "packages/technical-features/react-application": { - "name": "@k8slens/react-application", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@async-fn/jest": "^1.6.4", - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/react-testing-library-discovery": "^1.0.0", - "@k8slens/webpack": "^6.5.0", - "@testing-library/react": "^12.1.5" - }, - "peerDependencies": { - "@k8slens/application": "^6.5.0-alpha.2", - "@k8slens/feature-core": "^6.5.0-alpha.0", - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "@ogre-tools/injectable-extension-for-mobx": "^17.2.0", - "@ogre-tools/injectable-react": "^17.2.0", - "lodash": "^4.17.15", - "mobx": "^6.8.0", - "mobx-react": "^7.6.0", - "react": "^17.0.2", - "react-dom": "^17.0.2" - } - }, - "packages/ui-components/animate": { - "name": "@k8slens/animate", - "version": "1.0.0-alpha.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/webpack": "^6.5.0" - }, - "peerDependencies": { - "@k8slens/feature-core": "^6.5.0-alpha.0", - "@k8slens/utilities": "^1.0.0-alpha.1", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "@ogre-tools/injectable-react": "^17.2.0", - "react": "^17.0.2" - } - }, - "packages/ui-components/button": { - "name": "@k8slens/button", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@async-fn/jest": "^1.6.4", - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/react-testing-library-discovery": "^1.0.0", - "@k8slens/webpack": "^6.5.0", - "@testing-library/react": "^12.1.5", - "@testing-library/user-event": "^12.8.3" - }, - "peerDependencies": { - "@k8slens/tooltip": "^1.0.0-alpha.0", - "@k8slens/utilities": "^1.0.0-alpha.1", - "auto-bind": "^4.0.0", - "lodash": "^4.17.21", - "mobx": "^6.8.0", - "mobx-react": "^7.6.0", - "react": "^17.0.2", - "react-dom": "^17.0.2" - } - }, - "packages/ui-components/button/node_modules/@testing-library/user-event": { - "version": "12.8.3", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", - "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "packages/ui-components/error-boundary": { - "name": "@k8slens/error-boundary", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@async-fn/jest": "^1.6.4", - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/react-testing-library-discovery": "^1.0.0", - "@k8slens/webpack": "^6.5.0", - "@testing-library/react": "^12.1.5", - "@testing-library/user-event": "^13.5.0" - }, - "peerDependencies": { - "@k8slens/button": "^1.0.0-alpha.5", - "@k8slens/routing": "^1.0.0-alpha.5", - "@k8slens/utilities": "^1.0.0-alpha.1", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-react": "^17.2.0", - "auto-bind": "^4.0.0", - "history": "^4.10.1", - "lodash": "^4.17.21", - "mobx": "^6.8.0", - "mobx-observable-history": "^2.0.3", - "mobx-react": "^7.6.0", - "react": "^17.0.2", - "react-dom": "^17.0.2" - } - }, - "packages/ui-components/icon": { - "name": "@k8slens/icon", - "version": "1.0.0-alpha.7", - "license": "MIT", - "devDependencies": { - "@async-fn/jest": "^1.6.4", - "@k8slens/eslint-config": "^6.5.0-alpha.3", - "@k8slens/react-testing-library-discovery": "^1.0.0-alpha.4", - "@k8slens/webpack": "^6.5.0-alpha.9", - "@testing-library/react": "^12.1.5", - "@testing-library/user-event": "^13.5.0" - }, - "peerDependencies": { - "@k8slens/button": "^1.0.0-alpha.10", - "@k8slens/feature-core": "^6.5.0-alpha.8", - "@k8slens/logger": "^1.0.0-alpha.7", - "@k8slens/routing": "^1.0.0-alpha.8", - "@k8slens/tooltip": "^1.0.0-alpha.10", - "@k8slens/utilities": "^1.0.0-alpha.7", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "@ogre-tools/injectable-react": "^17.2.0", - "auto-bind": "^4.0.0", - "dompurify": "^2.4.4", - "history": "^4.10.1", - "lodash": "^4.17.21", - "mobx": "^6.9.0", - "mobx-observable-history": "^2.0.3", - "mobx-react": "^7.6.0", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "react-router-dom": "^5.3.4", - "winston": "^3.8.2" - } - }, - "packages/ui-components/notifications": { - "name": "@k8slens/notifications", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/webpack": "^6.5.0" - }, - "peerDependencies": { - "@k8slens/animate": "^1.0.0-alpha.0", - "@k8slens/application": "^6.5.0", - "@k8slens/event-emitter": "^1.0.0", - "@k8slens/feature-core": "^6.5.0-alpha.0", - "@k8slens/icon": "^1.0.0-alpha.7", - "@k8slens/json-api": "^1.0.0-alpha.3", - "@k8slens/logger": "^1.0.0", - "@k8slens/react-application": "^1.0.0-alpha.5", - "@k8slens/run-many": "^1.0.0", - "@k8slens/tooltip": "^1.0.0", - "@k8slens/utilities": "^1.0.0-alpha.1", - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "@ogre-tools/injectable-extension-for-mobx": "^17.2.0", - "@ogre-tools/injectable-react": "^17.2.0", - "auto-bind": "^4.0.0", - "lodash": "^4.17.21", - "mobx": "^6.8.0", - "mobx-react": "^7.6.0", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "react-router-dom": "^5.3.4", - "uuid": "^8.3.2", - "winston": "^3.8.2" - } - }, - "packages/ui-components/resizing-anchor": { - "name": "@k8slens/resizing-anchor", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@async-fn/jest": "^1.6.4", - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/react-testing-library-discovery": "^1.0.0", - "@k8slens/webpack": "^6.5.0" - }, - "peerDependencies": { - "@k8slens/feature-core": "^6.5.0-alpha.0", - "@k8slens/utilities": "^1.0.0-alpha.1", - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "auto-bind": "^4.0.0", - "lodash": "^4.17.21", - "mobx": "^6.8.0", - "mobx-react": "^7.6.0", - "react": "^17.0.2", - "react-dom": "^17.0.2" - } - }, - "packages/ui-components/spinner": { - "name": "@k8slens/spinner", - "version": "1.0.0-alpha.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/webpack": "^6.5.0" - }, - "peerDependencies": { - "@k8slens/utilities": "^1.0.0-alpha.1", - "react": "^17.0.2" - } - }, - "packages/ui-components/tooltip": { - "name": "@k8slens/tooltip", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@async-fn/jest": "^1.6.4", - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/react-testing-library-discovery": "^1.0.0", - "@k8slens/webpack": "^6.5.0", - "@testing-library/react": "^12.1.5", - "@testing-library/user-event": "^12.8.3" - }, - "peerDependencies": { - "@k8slens/utilities": "^1.0.0-alpha.1", - "auto-bind": "^4.0.0", - "lodash": "^4.17.21", - "mobx": "^6.8.0", - "mobx-react": "^7.6.0", - "react": "^17.0.2", - "react-dom": "^17.0.2" - } - }, - "packages/ui-components/tooltip/node_modules/@testing-library/user-event": { - "version": "12.8.3", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-12.8.3.tgz", - "integrity": "sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "packages/utility-features/event-emitter": { - "name": "@k8slens/event-emitter", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/jest": "^6.5.0", - "@k8slens/typescript": "^6.5.0", - "@k8slens/webpack": "^6.5.0" - } - }, - "packages/utility-features/json-api": { - "name": "@k8slens/json-api", - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@k8slens/node-fetch": "^6.5.0" - }, - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/jest": "^6.5.0", - "@k8slens/typescript": "^6.5.0", - "@types/node": "^16.18.25", - "type-fest": "^2.14.0" - }, - "peerDependencies": { - "@k8slens/event-emitter": "^1.0.0-alpha.1", - "@k8slens/logger": "^1.0.0-alpha.5", - "@k8slens/utilities": "^1.0.0-alpha.1", - "lodash": "^4.17.15", - "rfc6902": "^5.0.1" - } - }, - "packages/utility-features/kube-api": { - "name": "@k8slens/kube-api", - "version": "1.0.0-alpha.1", - "license": "MIT", - "dependencies": { - "@k8slens/node-fetch": "^6.5.0-alpha.3" - }, - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0-alpha.2", - "@k8slens/jest": "^6.5.0-alpha.4", - "@k8slens/typescript": "^6.5.0-alpha.2" - }, - "peerDependencies": { - "@k8slens/json-api": "^1.0.0-alpha.1", - "@k8slens/kube-object": "^1.0.0-alpha.5", - "@k8slens/logger": "^1.0.0-alpha.5", - "@k8slens/utilities": "^1.0.0-alpha.1", - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "byline": "^5.0.0", - "lodash": "^4.17.15", - "mobx": "^6.8.0", - "moment": "^2.29.4", - "rfc6902": "^5.0.1" - } - }, - "packages/utility-features/kube-api-specifics": { - "name": "@k8slens/kube-api-specifics", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0-alpha.2", - "@k8slens/jest": "^6.5.0-alpha.4", - "@k8slens/typescript": "^6.5.0-alpha.2" - }, - "peerDependencies": { - "@k8slens/feature-core": "^6.5.0-alpha.8", - "@k8slens/kube-api": "^1.0.0-alpha.1", - "@k8slens/logger": "^1.0.0", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0" - } - }, - "packages/utility-features/react-testing-library-discovery": { - "name": "@k8slens/react-testing-library-discovery", - "version": "1.0.0", - "license": "MIT", - "peerDependencies": { - "@k8slens/webpack": "^6.5.0-alpha.4", - "@testing-library/dom": "^8.19.0", - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^12.1.5" - } - }, - "packages/utility-features/run-many": { - "name": "@k8slens/run-many", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/webpack": "^6.5.0", - "@types/uuid": "^9.0.1" - }, - "peerDependencies": { - "@k8slens/test-utils": "^1.0.0-alpha.3", - "@k8slens/utilities": "^1.0.0-alpha.1", - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "type-fest": "^2.19.0", - "typed-emitter": "^1.4.0", - "uuid": "^8.3.2" - } - }, - "packages/utility-features/run-many/node_modules/@types/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==", - "dev": true - }, - "packages/utility-features/startable-stoppable": { - "name": "@k8slens/startable-stoppable", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/webpack": "^6.5.0" - } - }, - "packages/utility-features/test-utils": { - "name": "@k8slens/test-utils", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/webpack": "^6.5.0", - "@types/lodash": "^4.14.191" - }, - "peerDependencies": { - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-react": "^17.2.0", - "@testing-library/react": "^12.1.5", - "lodash": "^4.17.21", - "mobx": "^6.8.0", - "react": "^17.0.2", - "react-dom": "^17.0.2" - } - }, - "packages/utility-features/utilities": { - "name": "@k8slens/utilities", - "version": "1.0.0", - "license": "MIT", - "devDependencies": { - "@k8slens/webpack": "^6.5.0", - "@types/crypto-js": "^4.1.1", - "@types/lodash": "^4.14.191", - "@types/react": "^17.0.2", - "@types/react-router": "^5.1.20", - "@types/readable-stream": "^2.3.15", - "@types/semver": "^7.3.13", - "@types/tar": "^6.1.4" - }, - "peerDependencies": { - "@astronautlabs/jsonpath": "^1.1.0", - "crypto-js": "^4.1.1", - "lodash": "^4.17.21", - "mobx": "^6.8.0", - "moment": "^2.29.4", - "p-limit": "^3.1.0", - "path-to-regexp": "^6.2.1", - "react": "^17.0.2", - "react-router": "^5.3.4", - "readable-stream": "^3.6.2", - "semver": "^7.3.8", - "tar": "^6.1.13", - "type-fest": "^2.19.0", - "typed-regex": "^0.0.8" - } - }, - "packages/utility-features/utilities/node_modules/@types/crypto-js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.1.1.tgz", - "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==", - "dev": true - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 6b6e75c4a9..0000000000 --- a/package.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "name": "lens-monorepo", - "private": true, - "workspaces": [ - "packages/**/*", - "open-lens" - ], - "scripts": { - "all:reinstall": "npm run clean:node_modules && npm run all:install", - "all:install": "npx --yes --package npm@^9.6.7 npm install", - "adr:create": "echo \"What is the title?\"; read title; adr new \"$title\"", - "adr:change-status": "echo \"Decision number?:\"; read decision; adr status $decision", - "adr:update-readme": "adr update", - "adr:list": "adr list", - "build": "lerna run --stream build", - "build:app": "lerna run --stream build:app", - "build:docs": "lerna run --stream build:docs", - "clean": "lerna run clean --stream", - "clean:node_modules": "lerna clean -y && rimraf node_modules", - "dev": "cross-env NODE_ENV=development lerna run build --stream --skip-nx-cache", - "postdev": "lerna watch -- lerna run build --stream --include-dependents --scope \\$LERNA_PACKAGE_NAME", - "prestart-dev": "cd ./open-lens && npm run build:tray-icons && npm run download:binaries", - "start-dev": "lerna run start", - "postinstall": "linkable", - "lint": "lerna run lint --stream --no-bail", - "lint:fix": "lerna run lint:fix --stream", - "mkdocs:serve-local": "docker build -t mkdocs-serve-local:latest mkdocs/ && docker run --rm -it -p 8000:8000 -v ${PWD}:/docs mkdocs-serve-local:latest", - "mkdocs:verify": "docker build -t mkdocs-serve-local:latest mkdocs/ && docker run --rm -v ${PWD}:/docs mkdocs-serve-local:latest build --strict", - "test:unit": "lerna run --stream test:unit --no-bail", - "test:unit:updatesnapshot": "lerna run --stream test:unit --no-bail -- -u", - "test:unit:watch": "jest --watch", - "test:integration": "lerna run --stream test:integration --no-bail", - "bump-version": "lerna version --no-git-tag-version --no-push", - "precreate-release-pr": "npm run --workspace @k8slens/release-tool build", - "create-release-pr": "npm run --workspace @k8slens/release-tool create" - }, - "overrides": { - "underscore": "^1.12.1", - "react": "^17", - "@types/react": "^17" - }, - "devDependencies": { - "@ogre-tools/linkable": "^17.2.0", - "adr": "^1.4.3", - "cross-env": "^7.0.3", - "lerna": "^6.6.1", - "npm": "^9.6.7", - "rimraf": "^4.4.1" - }, - "engines": { - "npm": "^9.6.7" - } -} diff --git a/packages/business-features/keyboard-shortcuts/.eslintrc.json b/packages/business-features/keyboard-shortcuts/.eslintrc.json deleted file mode 100644 index b15115cb69..0000000000 --- a/packages/business-features/keyboard-shortcuts/.eslintrc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "@k8slens/eslint-config/eslint", - "parserOptions": { - "project": "./tsconfig.json" - } -} diff --git a/packages/business-features/keyboard-shortcuts/.prettierrc b/packages/business-features/keyboard-shortcuts/.prettierrc deleted file mode 100644 index edd47b479e..0000000000 --- a/packages/business-features/keyboard-shortcuts/.prettierrc +++ /dev/null @@ -1 +0,0 @@ -"@k8slens/eslint-config/prettier" diff --git a/packages/business-features/keyboard-shortcuts/CHANGELOG.md b/packages/business-features/keyboard-shortcuts/CHANGELOG.md deleted file mode 100644 index 37b05fcdd4..0000000000 --- a/packages/business-features/keyboard-shortcuts/CHANGELOG.md +++ /dev/null @@ -1,133 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -# 1.0.0 (2023-05-26) - - - -# 6.5.0-alpha.14 (2023-05-23) - - - -# 6.5.0-alpha.13 (2023-05-16) - - - -# 6.5.0-alpha.12 (2023-05-16) - - -### Bug Fixes - -* Don't crash when hovering hotbar menu index ([9d51ef2](https://github.com/lensapp/lens/commit/9d51ef2aa69c6c9df0fd57281b25131a10efd27a)) - - - -# 6.5.0-alpha.11 (2023-05-11) - - - -# 6.5.0-alpha.9 (2023-05-04) - - - -# 6.5.0-alpha.5 (2023-04-12) - - - -# 6.5.0-alpha.4 (2023-04-12) - - - - - -# 1.0.0-alpha.7 (2023-05-16) - - - -# 6.5.0-alpha.12 (2023-05-16) - - -### Bug Fixes - -* Don't crash when hovering hotbar menu index ([9d51ef2](https://github.com/lensapp/lens/commit/9d51ef2aa69c6c9df0fd57281b25131a10efd27a)) - - - -# 6.5.0-alpha.11 (2023-05-11) - - - -# 6.5.0-alpha.9 (2023-05-04) - - - -# 6.5.0-alpha.5 (2023-04-12) - - - -# 6.5.0-alpha.4 (2023-04-12) - - - - - -# 1.0.0-alpha.6 (2023-05-16) - - -### Bug Fixes - -* Don't crash when hovering hotbar menu index ([9d51ef2](https://github.com/lensapp/lens/commit/9d51ef2aa69c6c9df0fd57281b25131a10efd27a)) - - - -# 6.5.0-alpha.11 (2023-05-11) - - - -# 6.5.0-alpha.9 (2023-05-04) - - - -# 6.5.0-alpha.5 (2023-04-12) - - - -# 6.5.0-alpha.4 (2023-04-12) - - - - - -# 1.0.0-alpha.5 (2023-05-11) - - - -# 6.5.0-alpha.9 (2023-05-04) - - - -# 6.5.0-alpha.5 (2023-04-12) - - - -# 6.5.0-alpha.4 (2023-04-12) - -**Note:** Version bump only for package @k8slens/keyboard-shortcuts - - - - - -# 1.0.0-alpha.4 (2023-05-04) - - - -# 6.5.0-alpha.5 (2023-04-12) - - - -# 6.5.0-alpha.4 (2023-04-12) - -**Note:** Version bump only for package @k8slens/keyboard-shortcuts diff --git a/packages/business-features/keyboard-shortcuts/README.md b/packages/business-features/keyboard-shortcuts/README.md deleted file mode 100644 index 25cc2f8cdb..0000000000 --- a/packages/business-features/keyboard-shortcuts/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# @k8slens/keyboard-shortcuts - -This Feature enables keyboard shortcuts in Lens - -# Usage - -```bash -$ npm install @k8slens/keyboard-shortcuts -``` - -```typescript -import { keyboardShortcutsFeature } from "@k8slens/keyboard-shortcuts"; -import { registerFeature } from "@k8slens/feature-core"; -import { createContainer } from "@ogre-tools/injectable"; - -const di = createContainer("some-container"); - -registerFeature(di, keyboardShortcutsFeature); -``` - -## Extendability diff --git a/packages/business-features/keyboard-shortcuts/index.ts b/packages/business-features/keyboard-shortcuts/index.ts deleted file mode 100644 index 7f8ac51c47..0000000000 --- a/packages/business-features/keyboard-shortcuts/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export { KeyboardShortcutScope } from "./src/keyboard-shortcut-scope"; -export type { KeyboardShortcutScopeProps } from "./src/keyboard-shortcut-scope"; - -export { keyboardShortcutInjectionToken } from "./src/keyboard-shortcut-injection-token"; -export type { Binding, KeyboardShortcut } from "./src/keyboard-shortcut-injection-token"; - -export { keyboardShortcutsFeature } from "./src/feature"; diff --git a/packages/business-features/keyboard-shortcuts/jest.config.js b/packages/business-features/keyboard-shortcuts/jest.config.js deleted file mode 100644 index 38d54ab7b6..0000000000 --- a/packages/business-features/keyboard-shortcuts/jest.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@k8slens/jest").monorepoPackageConfig(__dirname).configForReact; diff --git a/packages/business-features/keyboard-shortcuts/package.json b/packages/business-features/keyboard-shortcuts/package.json deleted file mode 100644 index 36b4c398b5..0000000000 --- a/packages/business-features/keyboard-shortcuts/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "@k8slens/keyboard-shortcuts", - "private": false, - "version": "1.0.0", - "description": "Keyboard shortcuts for Lens", - "type": "commonjs", - "files": [ - "dist" - ], - "publishConfig": { - "access": "public", - "registry": "https://registry.npmjs.org/" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/lensapp/lens.git" - }, - "main": "dist/index.js", - "types": "dist/index.d.ts", - "author": { - "name": "OpenLens Authors", - "email": "info@k8slens.dev" - }, - "license": "MIT", - "homepage": "https://github.com/lensapp/lens", - "scripts": { - "build": "lens-webpack-build", - "clean": "rimraf dist/", - "test:unit": "jest --coverage --runInBand", - "lint": "lens-lint", - "lint:fix": "lens-lint --fix" - }, - "peerDependencies": { - "@k8slens/feature-core": "^6.5.0-alpha.0", - "@k8slens/react-application": "^1.0.0-alpha.0", - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "@ogre-tools/injectable-react": "^17.2.0", - "lodash": "^4.17.21", - "react": "^17 || ^18" - }, - "devDependencies": { - "@async-fn/jest": "^1.6.4", - "@k8slens/eslint-config": "^6.5.0", - "@k8slens/react-testing-library-discovery": "^1.0.0", - "@k8slens/webpack": "^6.5.0" - } -} diff --git a/packages/business-features/keyboard-shortcuts/src/__snapshots__/keyboard-shortcuts.test.tsx.snap b/packages/business-features/keyboard-shortcuts/src/__snapshots__/keyboard-shortcuts.test.tsx.snap deleted file mode 100644 index b2cba6a543..0000000000 --- a/packages/business-features/keyboard-shortcuts/src/__snapshots__/keyboard-shortcuts.test.tsx.snap +++ /dev/null @@ -1,15 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`keyboard-shortcuts when application is started renders 1`] = ` - -
-
-
-
-
- -`; diff --git a/packages/business-features/keyboard-shortcuts/src/feature.ts b/packages/business-features/keyboard-shortcuts/src/feature.ts deleted file mode 100644 index 32d5f2bc62..0000000000 --- a/packages/business-features/keyboard-shortcuts/src/feature.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { getFeature } from "@k8slens/feature-core"; -import { autoRegister } from "@ogre-tools/injectable-extension-for-auto-registration"; -import { reactApplicationFeature } from "@k8slens/react-application"; - -export const keyboardShortcutsFeature = getFeature({ - id: "keyboard-shortcuts", - - register: (di) => { - autoRegister({ - di, - targetModule: module, - getRequireContexts: () => [require.context("./", true, /\.injectable\.(ts|tsx)$/)], - }); - }, - - dependencies: [reactApplicationFeature], -}); diff --git a/packages/business-features/keyboard-shortcuts/src/invoke-shortcut.injectable.ts b/packages/business-features/keyboard-shortcuts/src/invoke-shortcut.injectable.ts deleted file mode 100644 index ecab52138b..0000000000 --- a/packages/business-features/keyboard-shortcuts/src/invoke-shortcut.injectable.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { pipeline } from "@ogre-tools/fp"; -import { filter, isString } from "lodash/fp"; -import { getInjectable } from "@ogre-tools/injectable"; -import { Binding, KeyboardShortcut, keyboardShortcutInjectionToken } from "./keyboard-shortcut-injection-token"; -import platformInjectable from "./platform.injectable"; - -export type InvokeShortcut = (event: KeyboardEvent) => void; - -const toShortcutsWithMatchingScope = (shortcut: KeyboardShortcut) => { - const activeScopeElement = document.activeElement?.closest("[data-keyboard-shortcut-scope]"); - - if (!activeScopeElement) { - const shortcutIsRootLevel = !shortcut.scope; - - return shortcutIsRootLevel; - } - - const castedActiveScopeElementHtml = activeScopeElement as HTMLDivElement; - - // eslint-disable-next-line xss/no-mixed-html - const activeScope = castedActiveScopeElementHtml.dataset.keyboardShortcutScope; - - return shortcut.scope === activeScope; -}; - -const toBindingWithDefaults = (binding: Binding) => - isString(binding) - ? { - code: binding, - shift: false, - ctrl: false, - altOrOption: false, - meta: false, - ctrlOrCommand: false, - } - : { - ctrl: false, - shift: false, - altOrOption: false, - meta: false, - ctrlOrCommand: false, - ...binding, - }; - -const toShortcutsWithMatchingBinding = (event: KeyboardEvent, platform: string) => (shortcut: KeyboardShortcut) => { - const binding = toBindingWithDefaults(shortcut.binding); - - const shiftModifierMatches = binding.shift === event.shiftKey; - const altModifierMatches = binding.altOrOption === event.altKey; - - const isMac = platform === "darwin"; - - const ctrlModifierMatches = binding.ctrl === event.ctrlKey || (!isMac && binding.ctrlOrCommand === event.ctrlKey); - - const metaModifierMatches = binding.meta === event.metaKey || (isMac && binding.ctrlOrCommand === event.metaKey); - - return ( - event.code === binding.code && - shiftModifierMatches && - ctrlModifierMatches && - altModifierMatches && - metaModifierMatches - ); -}; - -const invokeShortcutInjectable = getInjectable({ - id: "invoke-shortcut", - - instantiate: (di): InvokeShortcut => { - const getShortcuts = () => di.injectMany(keyboardShortcutInjectionToken); - const platform = di.inject(platformInjectable); - - return (event) => { - const shortcutsToInvoke = pipeline( - getShortcuts(), - filter(toShortcutsWithMatchingBinding(event, platform)), - filter(toShortcutsWithMatchingScope), - ); - - if (shortcutsToInvoke.length) { - shortcutsToInvoke.forEach((shortcut) => shortcut.invoke()); - } - }; - }, -}); - -export default invokeShortcutInjectable; diff --git a/packages/business-features/keyboard-shortcuts/src/keyboard-shortcut-injection-token.ts b/packages/business-features/keyboard-shortcuts/src/keyboard-shortcut-injection-token.ts deleted file mode 100644 index 637990b107..0000000000 --- a/packages/business-features/keyboard-shortcuts/src/keyboard-shortcut-injection-token.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { getInjectionToken } from "@ogre-tools/injectable"; - -export type Binding = - | string - | { - code: string; - shift?: boolean; - ctrl?: boolean; - altOrOption?: boolean; - meta?: boolean; - ctrlOrCommand?: boolean; - }; - -export type KeyboardShortcut = { - binding: Binding; - invoke: () => void; - scope?: string; -}; - -export const keyboardShortcutInjectionToken = getInjectionToken({ - id: "keyboard-shortcut-injection-token", -}); diff --git a/packages/business-features/keyboard-shortcuts/src/keyboard-shortcut-listener-react-application-hoc.injectable.tsx b/packages/business-features/keyboard-shortcuts/src/keyboard-shortcut-listener-react-application-hoc.injectable.tsx deleted file mode 100644 index ed22ef7fe8..0000000000 --- a/packages/business-features/keyboard-shortcuts/src/keyboard-shortcut-listener-react-application-hoc.injectable.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { getInjectable } from "@ogre-tools/injectable"; -import { KeyboardShortcutListener } from "./keyboard-shortcut-listener"; -import { reactApplicationHigherOrderComponentInjectionToken } from "@k8slens/react-application"; - -export const keyboardShortcutListenerReactApplicationHocInjectable = getInjectable({ - id: "keyboard-shortcut-listener-react-application-hoc", - instantiate: () => KeyboardShortcutListener, - - injectionToken: reactApplicationHigherOrderComponentInjectionToken, -}); diff --git a/packages/business-features/keyboard-shortcuts/src/keyboard-shortcut-listener.tsx b/packages/business-features/keyboard-shortcuts/src/keyboard-shortcut-listener.tsx deleted file mode 100644 index 904bf6f9d4..0000000000 --- a/packages/business-features/keyboard-shortcuts/src/keyboard-shortcut-listener.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import type { StrictReactNode } from "@k8slens/utilities"; -import { withInjectables } from "@ogre-tools/injectable-react"; -import React, { useEffect } from "react"; - -import invokeShortcutInjectable, { InvokeShortcut } from "./invoke-shortcut.injectable"; - -export interface KeyboardShortcutListenerProps { - children: StrictReactNode; -} - -interface Dependencies { - invokeShortcut: InvokeShortcut; -} - -const NonInjectedKeyboardShortcutListener = ({ - children, - invokeShortcut, -}: KeyboardShortcutListenerProps & Dependencies) => { - useEffect(() => { - document.addEventListener("keydown", invokeShortcut); - - return () => { - document.removeEventListener("keydown", invokeShortcut); - }; - }); - - return <>{children}; -}; - -export const KeyboardShortcutListener = withInjectables( - NonInjectedKeyboardShortcutListener, - - { - getProps: (di, props) => ({ - invokeShortcut: di.inject(invokeShortcutInjectable), - ...props, - }), - }, -); diff --git a/packages/business-features/keyboard-shortcuts/src/keyboard-shortcut-scope.tsx b/packages/business-features/keyboard-shortcuts/src/keyboard-shortcut-scope.tsx deleted file mode 100644 index 6fad79bcd4..0000000000 --- a/packages/business-features/keyboard-shortcuts/src/keyboard-shortcut-scope.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import type { StrictReactNode } from "@k8slens/utilities"; -import React from "react"; - -export interface KeyboardShortcutScopeProps { - id: string; - children: StrictReactNode; -} - -export const KeyboardShortcutScope = ({ id, children }: KeyboardShortcutScopeProps) => ( -
- {children} -
-); diff --git a/packages/business-features/keyboard-shortcuts/src/keyboard-shortcuts.test.tsx b/packages/business-features/keyboard-shortcuts/src/keyboard-shortcuts.test.tsx deleted file mode 100644 index 3631a4fa98..0000000000 --- a/packages/business-features/keyboard-shortcuts/src/keyboard-shortcuts.test.tsx +++ /dev/null @@ -1,352 +0,0 @@ -import userEvent from "@testing-library/user-event"; -import type { RenderResult } from "@testing-library/react"; -import { render } from "@testing-library/react"; -import { createContainer, DiContainer, getInjectable } from "@ogre-tools/injectable"; -import { registerInjectableReact } from "@ogre-tools/injectable-react"; -import { registerMobX } from "@ogre-tools/injectable-extension-for-mobx"; -import { keyboardShortcutInjectionToken } from "./keyboard-shortcut-injection-token"; -import { registerFeature } from "@k8slens/feature-core"; -import { keyboardShortcutsFeature } from "./feature"; -import React from "react"; -import { computed, runInAction } from "mobx"; -import { KeyboardShortcutScope } from "./keyboard-shortcut-scope"; -import { Discover, discoverFor } from "@k8slens/react-testing-library-discovery"; -import { startApplicationInjectionToken } from "@k8slens/application"; -import { renderInjectionToken } from "@k8slens/react-application"; -import { reactApplicationChildrenInjectionToken } from "@k8slens/react-application"; -import platformInjectable from "./platform.injectable"; - -describe("keyboard-shortcuts", () => { - let di: DiContainer; - let invokeMock: jest.Mock; - let rendered: RenderResult; - - beforeEach(() => { - di = createContainer("irrelevant"); - - registerInjectableReact(di); - registerMobX(di); - - runInAction(() => { - registerFeature(di, keyboardShortcutsFeature); - }); - - invokeMock = jest.fn(); - - const someKeyboardShortcutInjectable = getInjectable({ - id: "some-keyboard-shortcut", - - instantiate: () => ({ - binding: "Escape", - invoke: () => invokeMock("esc-in-root"), - }), - - injectionToken: keyboardShortcutInjectionToken, - }); - - const someScopedKeyboardShortcutInjectable = getInjectable({ - id: "some-scoped-keyboard-shortcut", - - instantiate: () => ({ - binding: "Escape", - invoke: () => invokeMock("esc-in-scope"), - scope: "some-scope", - }), - - injectionToken: keyboardShortcutInjectionToken, - }); - - const someOtherKeyboardShortcutInjectable = getInjectable({ - id: "some-other-keyboard-shortcut", - - instantiate: () => ({ - binding: "something-else-than-esc", - invoke: () => invokeMock("something-else-than-esc"), - }), - - injectionToken: keyboardShortcutInjectionToken, - }); - - const childComponentForScopeInjectable = getInjectable({ - id: "some-child-component-for-scope", - - instantiate: () => ({ - id: "some-child-component-for-scope", - - enabled: computed(() => true), - - Component: () => ( - -
- - ), - }), - - injectionToken: reactApplicationChildrenInjectionToken, - }); - - runInAction(() => { - di.register( - someKeyboardShortcutInjectable, - someScopedKeyboardShortcutInjectable, - someOtherKeyboardShortcutInjectable, - childComponentForScopeInjectable, - ); - }); - - di.override(renderInjectionToken, () => (application) => { - rendered = render(application); - }); - }); - - describe("when application is started", () => { - let discover: Discover; - - beforeEach(async () => { - const startApplication = di.inject(startApplicationInjectionToken); - - await startApplication(); - - discover = discoverFor(() => rendered); - }); - - it("renders", () => { - expect(rendered.baseElement).toMatchSnapshot(); - }); - - it("given focus is in the body, when pressing the shortcut, calls shortcut in global scope", () => { - userEvent.keyboard("{Escape}"); - - expect(invokeMock.mock.calls).toEqual([["esc-in-root"]]); - }); - - it("given focus inside a nested scope, when pressing the shortcut, calls only the callback for the scope", () => { - const result = discover.getSingleElement("keyboard-shortcut-scope", "some-scope"); - - const discoveredHtml = result.discovered as HTMLDivElement; - - discoveredHtml.focus(); - - userEvent.keyboard("{Escape}"); - - expect(invokeMock.mock.calls).toEqual([["esc-in-scope"]]); - }); - - it("given conflicting shortcut, when pressing the shortcut, calls both callbacks", () => { - const conflictingShortcutInjectable = getInjectable({ - id: "some-conflicting-keyboard-shortcut", - - instantiate: () => ({ - binding: "Escape", - invoke: () => invokeMock("conflicting-esc-in-root"), - }), - - injectionToken: keyboardShortcutInjectionToken, - }); - - runInAction(() => { - di.register(conflictingShortcutInjectable); - }); - - userEvent.keyboard("{Escape}"); - - expect(invokeMock.mock.calls).toEqual([["esc-in-root"], ["conflicting-esc-in-root"]]); - }); - - [ - { - scenario: "given shortcut without modifiers, when shortcut is pressed, calls the callback", - binding: { code: "Escape" }, - keyboard: "{Escape}", - shouldCallCallback: true, - }, - { - scenario: - "given shortcut without modifiers, when shortcut is pressed but with modifier, does not call the callback", - binding: { code: "F1" }, - keyboard: "{Meta>}[F1]", - shouldCallCallback: false, - }, - { - scenario: "given shortcut with meta modifier, when shortcut is pressed, calls the callback", - - binding: { meta: true, code: "F1" }, - keyboard: "{Meta>}[F1]", - shouldCallCallback: true, - }, - { - scenario: "given shortcut with shift modifier, when shortcut is pressed, calls the callback", - - binding: { shift: true, code: "F1" }, - keyboard: "{Shift>}[F1]", - shouldCallCallback: true, - }, - { - scenario: "given shortcut with alt modifier, when shortcut is pressed, calls the callback", - binding: { altOrOption: true, code: "F1" }, - keyboard: "{Alt>}[F1]", - shouldCallCallback: true, - }, - { - scenario: "given shortcut with ctrl modifier, when shortcut is pressed, calls the callback", - binding: { ctrl: true, code: "F1" }, - keyboard: "{Control>}[F1]", - shouldCallCallback: true, - }, - { - scenario: "given shortcut with all modifiers, when shortcut is pressed, calls the callback", - - binding: { ctrl: true, altOrOption: true, shift: true, meta: true, code: "F1" }, - keyboard: "{Meta>}{Shift>}{Alt>}{Control>}[F1]", - shouldCallCallback: true, - }, - ].forEach(({ binding, keyboard, scenario, shouldCallCallback }) => { - // eslint-disable-next-line jest/valid-title - it(scenario, () => { - const invokeMock = jest.fn(); - - const shortcutInjectable = getInjectable({ - id: "shortcut", - - instantiate: () => ({ - binding, - invoke: invokeMock, - }), - - injectionToken: keyboardShortcutInjectionToken, - }); - - runInAction(() => { - di.register(shortcutInjectable); - }); - - userEvent.keyboard(keyboard); - - if (shouldCallCallback) { - // eslint-disable-next-line jest/no-conditional-expect - expect(invokeMock).toHaveBeenCalled(); - } else { - // eslint-disable-next-line jest/no-conditional-expect - expect(invokeMock).not.toHaveBeenCalled(); - } - }); - }); - }); - - describe("given in mac and keyboard shortcut with modifier for ctrl or command", () => { - beforeEach(async () => { - di.override(platformInjectable, () => "darwin"); - - invokeMock = jest.fn(); - - const shortcutInjectable = getInjectable({ - id: "shortcut", - - instantiate: () => ({ - binding: { code: "KeyK", ctrlOrCommand: true }, - invoke: invokeMock, - }), - - injectionToken: keyboardShortcutInjectionToken, - }); - - runInAction(() => { - di.register(shortcutInjectable); - }); - - const startApplication = di.inject(startApplicationInjectionToken); - - await startApplication(); - }); - - it("when pressing the keyboard shortcut with command, calls the callback", () => { - userEvent.keyboard("{Meta>}[KeyK]"); - - expect(invokeMock).toHaveBeenCalled(); - }); - - it("when pressing the keyboard shortcut with ctrl, does not call the callback", () => { - userEvent.keyboard("{Control>}[KeyK]"); - - expect(invokeMock).not.toHaveBeenCalled(); - }); - }); - - describe("given in windows and keyboard shortcut with modifier for ctrl or command", () => { - beforeEach(async () => { - di.override(platformInjectable, () => "win32"); - - invokeMock = jest.fn(); - - const shortcutInjectable = getInjectable({ - id: "shortcut", - - instantiate: () => ({ - binding: { code: "KeyK", ctrlOrCommand: true }, - invoke: invokeMock, - }), - - injectionToken: keyboardShortcutInjectionToken, - }); - - runInAction(() => { - di.register(shortcutInjectable); - }); - - const startApplication = di.inject(startApplicationInjectionToken); - - await startApplication(); - }); - - it("when pressing the keyboard shortcut with windows, does not call the callback", () => { - userEvent.keyboard("{Meta>}[KeyK]"); - - expect(invokeMock).not.toHaveBeenCalled(); - }); - - it("when pressing the keyboard shortcut with ctrl, calls the callback", () => { - userEvent.keyboard("{Control>}[KeyK]"); - - expect(invokeMock).toHaveBeenCalled(); - }); - }); - - describe("given in any other platform and keyboard shortcut with modifier for ctrl or command", () => { - beforeEach(async () => { - di.override(platformInjectable, () => "some-other-platform"); - - invokeMock = jest.fn(); - - const shortcutInjectable = getInjectable({ - id: "shortcut", - - instantiate: () => ({ - binding: { code: "KeyK", ctrlOrCommand: true }, - invoke: invokeMock, - }), - - injectionToken: keyboardShortcutInjectionToken, - }); - - runInAction(() => { - di.register(shortcutInjectable); - }); - - const startApplication = di.inject(startApplicationInjectionToken); - - await startApplication(); - }); - - it("when pressing the keyboard shortcut with meta, does not call the callback", () => { - userEvent.keyboard("{Meta>}[KeyK]"); - - expect(invokeMock).not.toHaveBeenCalled(); - }); - - it("when pressing the keyboard shortcut with ctrl, calls the callback", () => { - userEvent.keyboard("{Control>}[KeyK]"); - - expect(invokeMock).toHaveBeenCalled(); - }); - }); -}); diff --git a/packages/business-features/keyboard-shortcuts/src/platform.injectable.ts b/packages/business-features/keyboard-shortcuts/src/platform.injectable.ts deleted file mode 100644 index 407af8a43d..0000000000 --- a/packages/business-features/keyboard-shortcuts/src/platform.injectable.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { getInjectable } from "@ogre-tools/injectable"; - -export const allPlatforms = ["win32", "darwin", "linux"] as const; - -const platformInjectable = getInjectable({ - id: "platform", - instantiate: () => process.platform as (typeof allPlatforms)[number], - causesSideEffects: true, -}); - -export default platformInjectable; diff --git a/packages/business-features/keyboard-shortcuts/tsconfig.json b/packages/business-features/keyboard-shortcuts/tsconfig.json deleted file mode 100644 index 9e140d79da..0000000000 --- a/packages/business-features/keyboard-shortcuts/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "@k8slens/typescript/config/base.json", - "include": ["**/*.ts", "**/*.tsx"], -} diff --git a/packages/business-features/keyboard-shortcuts/webpack.config.js b/packages/business-features/keyboard-shortcuts/webpack.config.js deleted file mode 100644 index 1cda407f5a..0000000000 --- a/packages/business-features/keyboard-shortcuts/webpack.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@k8slens/webpack").configForReact; diff --git a/packages/cluster-settings/CHANGELOG.md b/packages/cluster-settings/CHANGELOG.md deleted file mode 100644 index 331460b7dc..0000000000 --- a/packages/cluster-settings/CHANGELOG.md +++ /dev/null @@ -1,119 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -# 6.5.0 (2023-05-26) - - - -# 6.5.0-alpha.14 (2023-05-23) - - - -# 6.5.0-alpha.13 (2023-05-16) - - - -# 6.5.0-alpha.12 (2023-05-16) - - - -# 6.5.0-alpha.11 (2023-05-11) - - - -# 6.5.0-alpha.9 (2023-05-04) - - -### Features - -* Compute the kubectl download version map at build time ([0bd7b1f](https://github.com/lensapp/lens/commit/0bd7b1fe92a173379c8a5a1ab7e13cf9e4f8223b)) - - - -# 6.5.0-alpha.4 (2023-04-12) - - - - - -# 6.5.0-alpha.7 (2023-05-16) - - - -# 6.5.0-alpha.12 (2023-05-16) - - - -# 6.5.0-alpha.11 (2023-05-11) - - - -# 6.5.0-alpha.9 (2023-05-04) - - -### Features - -* Compute the kubectl download version map at build time ([0bd7b1f](https://github.com/lensapp/lens/commit/0bd7b1fe92a173379c8a5a1ab7e13cf9e4f8223b)) - - - -# 6.5.0-alpha.4 (2023-04-12) - - - - - -# 6.5.0-alpha.6 (2023-05-16) - - - -# 6.5.0-alpha.11 (2023-05-11) - - - -# 6.5.0-alpha.9 (2023-05-04) - - -### Features - -* Compute the kubectl download version map at build time ([0bd7b1f](https://github.com/lensapp/lens/commit/0bd7b1fe92a173379c8a5a1ab7e13cf9e4f8223b)) - - - -# 6.5.0-alpha.4 (2023-04-12) - - - - - -# 6.5.0-alpha.5 (2023-05-11) - - - -# 6.5.0-alpha.9 (2023-05-04) - - -### Features - -* Compute the kubectl download version map at build time ([0bd7b1f](https://github.com/lensapp/lens/commit/0bd7b1fe92a173379c8a5a1ab7e13cf9e4f8223b)) - - - -# 6.5.0-alpha.4 (2023-04-12) - - - - - -# 6.5.0-alpha.4 (2023-05-04) - - -### Features - -* Compute the kubectl download version map at build time ([0bd7b1f](https://github.com/lensapp/lens/commit/0bd7b1fe92a173379c8a5a1ab7e13cf9e4f8223b)) - - - -# 6.5.0-alpha.4 (2023-04-12) diff --git a/packages/cluster-settings/README.md b/packages/cluster-settings/README.md deleted file mode 100644 index c3d3b890f4..0000000000 --- a/packages/cluster-settings/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Description - -The package exports tokens needed for external configuration of Cluster Settings page. diff --git a/packages/cluster-settings/index.ts b/packages/cluster-settings/index.ts deleted file mode 100644 index 181c69d46a..0000000000 --- a/packages/cluster-settings/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { getInjectionToken } from "@ogre-tools/injectable"; - -type ClusterPreferences = { - clusterName?: string; - icon?: string | null; -} - -export interface ClusterIconMenuItem { - id: string; - title: string; - disabled?: (preferences: ClusterPreferences) => boolean; - onClick: (preferences: ClusterPreferences) => void; -} - -export interface ClusterIconSettingComponentProps { - preferences: ClusterPreferences; -} - -export interface ClusterIconSettingsComponent { - id: string; - Component: React.ComponentType; -} - -export const clusterIconSettingsMenuInjectionToken = getInjectionToken({ - id: "cluster-icon-settings-menu-injection-token", -}); - -export const clusterIconSettingsComponentInjectionToken = getInjectionToken({ - id: "cluster-icon-settings-component-injection-token", -}); \ No newline at end of file diff --git a/packages/cluster-settings/package.json b/packages/cluster-settings/package.json deleted file mode 100644 index 9687c89832..0000000000 --- a/packages/cluster-settings/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "@k8slens/cluster-settings", - "version": "6.5.0", - "description": "Injection token exporter for cluster settings configuration", - "license": "MIT", - "type": "commonjs", - "private": false, - "publishConfig": { - "access": "public", - "registry": "https://registry.npmjs.org/" - }, - "main": "./dist/index.js", - "types": "./dist/index.d.ts", - "files": [ - "dist" - ], - "scripts": { - "clean": "rimraf dist/", - "build": "lens-webpack-build" - }, - "devDependencies": { - "@k8slens/webpack": "^6.5.0", - "rimraf": "^4.4.1" - }, - "peerDependencies": { - "@ogre-tools/injectable": "^17.2.0" - } -} diff --git a/packages/cluster-settings/tsconfig.json b/packages/cluster-settings/tsconfig.json deleted file mode 100644 index 1819203dc1..0000000000 --- a/packages/cluster-settings/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "@k8slens/typescript/config/base.json", - "include": ["**/*.ts"] -} diff --git a/packages/cluster-settings/webpack.config.js b/packages/cluster-settings/webpack.config.js deleted file mode 100644 index 3183f30179..0000000000 --- a/packages/cluster-settings/webpack.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@k8slens/webpack").configForNode; diff --git a/packages/cluster-sidebar/.eslintrc.js b/packages/cluster-sidebar/.eslintrc.js deleted file mode 100644 index f404cf0ace..0000000000 --- a/packages/cluster-sidebar/.eslintrc.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - extends: "@k8slens/eslint-config/eslint", - parserOptions: { - project: "./tsconfig.json", - }, - }; diff --git a/packages/cluster-sidebar/.prettierrc b/packages/cluster-sidebar/.prettierrc deleted file mode 100644 index edd47b479e..0000000000 --- a/packages/cluster-sidebar/.prettierrc +++ /dev/null @@ -1 +0,0 @@ -"@k8slens/eslint-config/prettier" diff --git a/packages/cluster-sidebar/index.ts b/packages/cluster-sidebar/index.ts deleted file mode 100644 index 4d072e91b2..0000000000 --- a/packages/cluster-sidebar/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export * from "./src/tokens"; -export * from "./src/feature"; -export { default as sidebarItemsInjectable } from "./src/sidebar-items.injectable"; diff --git a/packages/cluster-sidebar/jest.config.js b/packages/cluster-sidebar/jest.config.js deleted file mode 100644 index 38d54ab7b6..0000000000 --- a/packages/cluster-sidebar/jest.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@k8slens/jest").monorepoPackageConfig(__dirname).configForReact; diff --git a/packages/cluster-sidebar/package.json b/packages/cluster-sidebar/package.json deleted file mode 100644 index 41ba67a83c..0000000000 --- a/packages/cluster-sidebar/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "@k8slens/cluster-sidebar", - "private": false, - "version": "1.0.0", - "description": "Injection tokens for adding new sidebar items within the Cluster View", - "type": "commonjs", - "publishConfig": { - "access": "public", - "registry": "https://registry.npmjs.org/" - }, - "files": [ - "dist" - ], - "repository": { - "type": "git", - "url": "git+https://github.com/lensapp/lens.git" - }, - "main": "dist/index.js", - "types": "dist/index.d.ts", - "author": { - "name": "OpenLens Authors", - "email": "info@k8slens.dev" - }, - "license": "MIT", - "homepage": "https://github.com/lensapp/lens", - "scripts": { - "build": "lens-webpack-build", - "clean": "rimraf dist/", - "test": "jest --coverage --runInBand", - "lint": "lens-lint", - "lint:fix": "lens-lint --fix" - }, - "peerDependencies": { - "@k8slens/feature-core": "^6.5.0-alpha.4", - "@k8slens/utilities": "^1.0.0-alpha.3", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "@ogre-tools/injectable-extension-for-mobx": "^17.2.0", - "mobx": "^6.9.0", - "react": "^17.0.2" - }, - "devDependencies": { - "@k8slens/eslint-config": "^6.5.0-alpha.3", - "@k8slens/jest": "^6.5.0-alpha.5", - "@k8slens/typescript": "^6.5.0-alpha.2", - "@k8slens/webpack": "^6.5.0-alpha.5" - } -} diff --git a/packages/cluster-sidebar/src/feature.ts b/packages/cluster-sidebar/src/feature.ts deleted file mode 100644 index d51e46c524..0000000000 --- a/packages/cluster-sidebar/src/feature.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { getFeature } from "@k8slens/feature-core"; -import { autoRegister } from "@ogre-tools/injectable-extension-for-auto-registration"; - -export const clusterSidebarFeature = getFeature({ - id: "cluster-side-feature", - - register: (di) => { - autoRegister({ - di, - targetModule: module, - getRequireContexts: () => [require.context("./", true, /\.injectable\.(ts|tsx)$/)], - }); - }, -}); diff --git a/packages/cluster-sidebar/src/order-of-sidebar-items.test.ts b/packages/cluster-sidebar/src/order-of-sidebar-items.test.ts deleted file mode 100644 index 6d04343688..0000000000 --- a/packages/cluster-sidebar/src/order-of-sidebar-items.test.ts +++ /dev/null @@ -1,174 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { createContainer, DiContainer, getInjectable } from "@ogre-tools/injectable"; -import { computed, IComputedValue } from "mobx"; -import { noop } from "lodash/fp"; -import sidebarItemsInjectable from "./sidebar-items.injectable"; -import { SidebarItemDeclaration, sidebarItemInjectionToken } from "./tokens"; -import { registerMobX } from "@ogre-tools/injectable-extension-for-mobx"; -import { clusterSidebarFeature } from "./feature"; - -const someParentSidebarItemInjectable = getInjectable({ - id: "sidebar-item-some-parent", - instantiate: () => ({ - parentId: null, - title: "Some parent", - onClick: noop, - orderNumber: 42, - }), - injectionToken: sidebarItemInjectionToken, -}); - -const someOtherParentSidebarItemInjectable = getInjectable({ - id: "sidebar-item-some-other-parent", - instantiate: () => ({ - parentId: null, - title: "Some other parent", - onClick: noop, - orderNumber: 126, - }), - injectionToken: sidebarItemInjectionToken, -}); - -const someAnotherParentSidebarItemInjectable = getInjectable({ - id: "sidebar-item-some-another-parent", - instantiate: () => ({ - parentId: null, - title: "Some another parent", - onClick: noop, - orderNumber: 84, - }), - injectionToken: sidebarItemInjectionToken, -}); - -const someForthParentSidebarItemInjectable = getInjectable({ - id: "sidebar-item-some-forth-parent", - instantiate: () => ({ - parentId: null, - title: "Some another parent", - onClick: noop, - orderNumber: 84, - isVisible: computed(() => false), - isActive: computed(() => true), - }), - injectionToken: sidebarItemInjectionToken, -}); - -const someChildSidebarItemInjectable = getInjectable({ - id: "sidebar-item-some-child", - instantiate: () => ({ - parentId: someParentSidebarItemInjectable.id, - title: "Some child", - onClick: noop, - orderNumber: 168, - }), - injectionToken: sidebarItemInjectionToken, -}); - -const someOtherChildSidebarItemInjectable = getInjectable({ - id: "sidebar-item-some-other-child", - instantiate: () => ({ - parentId: someParentSidebarItemInjectable.id, - title: "Some other child", - onClick: noop, - orderNumber: 252, - }), - injectionToken: sidebarItemInjectionToken, -}); - -const someAnotherChildSidebarItemInjectable = getInjectable({ - id: "sidebar-item-some-another-child", - instantiate: () => ({ - parentId: someParentSidebarItemInjectable.id, - title: "Some another child", - onClick: noop, - orderNumber: 210, - }), - injectionToken: sidebarItemInjectionToken, -}); - -describe("order of sidebar items", () => { - let di: DiContainer; - let sidebarItems: IComputedValue; - - beforeEach(() => { - di = createContainer("test"); - - di.register( - someParentSidebarItemInjectable, - someOtherParentSidebarItemInjectable, - someAnotherParentSidebarItemInjectable, - someChildSidebarItemInjectable, - someOtherChildSidebarItemInjectable, - someAnotherChildSidebarItemInjectable, - someForthParentSidebarItemInjectable, - ); - - clusterSidebarFeature.register(di); - registerMobX(di); - - sidebarItems = di.inject(sidebarItemsInjectable); - }); - - it("has parent items in order", () => { - const actual = sidebarItems.get().map((item) => item.id); - - expect(actual).toEqual([ - "sidebar-item-some-parent", - "sidebar-item-some-another-parent", - "sidebar-item-some-forth-parent", - "sidebar-item-some-other-parent", - ]); - }); - - it("an item with no children and no isVisible configuration by default is visible", () => { - const item = sidebarItems.get().find((item) => item.id === someAnotherParentSidebarItemInjectable.id); - - expect(item?.isVisible.get()).toBe(true); - }); - - it("an item with no children and an isVisible configuration is whatever the configuration specifies", () => { - const item = sidebarItems.get().find((item) => item.id === someForthParentSidebarItemInjectable.id); - - expect(item?.isVisible.get()).toBe(false); - }); - - it("an item with children is visible if at least one of the children is visible", () => { - const item = sidebarItems.get().find((item) => item.id === "sidebar-item-some-parent"); - - expect(item?.isVisible.get()).toBe(true); - }); - - it("an item with no children and no isActive configuration by default is not active", () => { - const item = sidebarItems.get().find((item) => item.id === someAnotherParentSidebarItemInjectable.id); - - expect(item?.isActive.get()).toBe(false); - }); - - it("an item with no children and an isActive configuration is whatever the configuration specifies", () => { - const item = sidebarItems.get().find((item) => item.id === someForthParentSidebarItemInjectable.id); - - expect(item?.isActive.get()).toBe(true); - }); - - it("an item with children is active if at least one of the children is active", () => { - const item = sidebarItems.get().find((item) => item.id === "sidebar-item-some-parent"); - - expect(item?.isActive.get()).toBe(false); - }); - - it("has child items in order", () => { - const actual = sidebarItems - .get() - .find((item) => item.id === "sidebar-item-some-parent") - ?.children.map((item) => item.id); - - expect(actual).toEqual([ - "sidebar-item-some-child", - "sidebar-item-some-another-child", - "sidebar-item-some-other-child", - ]); - }); -}); diff --git a/packages/cluster-sidebar/src/sidebar-items.injectable.ts b/packages/cluster-sidebar/src/sidebar-items.injectable.ts deleted file mode 100644 index 28f045e507..0000000000 --- a/packages/cluster-sidebar/src/sidebar-items.injectable.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { getInjectable, InjectionInstanceWithMeta } from "@ogre-tools/injectable"; -import { computedInjectManyInjectable } from "@ogre-tools/injectable-extension-for-mobx"; -import { SidebarItemDeclaration, sidebarItemInjectionToken, SidebarItemRegistration } from "./tokens"; -import { computed } from "mobx"; -import { byOrderNumber } from "@k8slens/utilities"; - -const getSidebarItemsHierarchy = ( - registrations: InjectionInstanceWithMeta[], - parentId: string | null, -): SidebarItemDeclaration[] => - registrations - .filter(({ instance }) => instance.parentId === parentId) - .map(({ instance: { isActive, isVisible, ...registration }, meta: { id } }) => { - const children = getSidebarItemsHierarchy(registrations, id); - - return { - ...registration, - id, - children, - isVisible: computed(() => { - if (children.length === 0) { - if (isVisible) { - return isVisible.get(); - } - - return true; - } - - return children.some((child) => child.isVisible.get()); - }), - isActive: computed(() => { - if (children.length === 0) { - if (isActive) { - return isActive.get(); - } - - return false; - } - - return children.some((child) => child.isActive.get()); - }), - }; - }) - .sort(byOrderNumber); - -const sidebarItemsInjectable = getInjectable({ - id: "sidebar-items", - instantiate: (di) => { - const computedInjectMany = di.inject(computedInjectManyInjectable); - const sidebarItemRegistrations = computedInjectMany(sidebarItemInjectionToken); - - return computed(() => { - void sidebarItemRegistrations.get(); - - return getSidebarItemsHierarchy(di.injectManyWithMeta(sidebarItemInjectionToken), null); - }); - }, -}); - -export default sidebarItemsInjectable; diff --git a/packages/cluster-sidebar/src/tokens.ts b/packages/cluster-sidebar/src/tokens.ts deleted file mode 100644 index fbdab816d2..0000000000 --- a/packages/cluster-sidebar/src/tokens.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getInjectionToken } from "@ogre-tools/injectable"; -import type { IComputedValue } from "mobx"; -import type { StrictReactNode } from "@k8slens/utilities"; - -export interface SidebarItemRegistration { - id?: undefined; - parentId: string | null; - title: StrictReactNode; - onClick: () => void; - getIcon?: () => StrictReactNode; - isActive?: IComputedValue; - isVisible?: IComputedValue; - orderNumber: number; -} - -export interface SidebarItemDeclaration { - id: string; - parentId: string | null; - title: StrictReactNode; - onClick: () => void; - getIcon?: () => StrictReactNode; - isActive: IComputedValue; - isVisible: IComputedValue; - children: SidebarItemDeclaration[]; -} - -export const sidebarItemInjectionToken = getInjectionToken({ - id: "sidebar-item-injection-token", -}); diff --git a/packages/cluster-sidebar/tsconfig.json b/packages/cluster-sidebar/tsconfig.json deleted file mode 100644 index 2b0f0e5603..0000000000 --- a/packages/cluster-sidebar/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "@k8slens/typescript/config/base.json", - "include": ["**/*.ts"] - } diff --git a/packages/cluster-sidebar/webpack.config.js b/packages/cluster-sidebar/webpack.config.js deleted file mode 100644 index 1cda407f5a..0000000000 --- a/packages/cluster-sidebar/webpack.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@k8slens/webpack").configForReact; diff --git a/packages/core/.eslintrc.js b/packages/core/.eslintrc.js deleted file mode 100644 index 90ae34ae8b..0000000000 --- a/packages/core/.eslintrc.js +++ /dev/null @@ -1,300 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -const packageJson = require("./package.json"); - -module.exports = { - ignorePatterns: [ - "**/node_modules/**/*", - "**/dist/**/*", - "**/static/**/*", - "**/site/**/*", - "**/build/webpack/**/*", - ], - settings: { - react: { - version: packageJson.devDependencies.react || "detect", - }, - "import/parsers": { - "@typescript-eslint/parser": [".ts", ".tsx"], - }, - "import/resolver": { - "typescript": { - "alwaysTryTypes": true, - "project": "./tsconfig.json", - }, - }, - }, - overrides: [ - { - files: [ - "**/*.js", - "**/*.mjs", - ], - extends: [ - "eslint:recommended", - ], - env: { - node: true, - es2022: true, - }, - parserOptions: { - sourceType: "module", - }, - plugins: [ - "header", - "unused-imports", - "react-hooks", - ], - rules: { - "no-constant-condition": ["error", { "checkLoops": false }], - "header/header": [2, "../../license-header"], - "comma-dangle": ["error", "always-multiline"], - "comma-spacing": "error", - "indent": ["error", 2, { - "SwitchCase": 1, - }], - "no-unused-vars": "off", - "space-before-function-paren": ["error", { - "anonymous": "always", - "named": "never", - "asyncArrow": "always", - }], - "unused-imports/no-unused-imports": "error", - "unused-imports/no-unused-vars": [ - "warn", { - "vars": "all", - "args": "after-used", - "ignoreRestSiblings": true, - }, - ], - "quotes": ["error", "double", { - "avoidEscape": true, - "allowTemplateLiterals": true, - }], - "object-curly-spacing": ["error", "always", { - "objectsInObjects": false, - "arraysInObjects": true, - }], - "linebreak-style": ["error", "unix"], - "eol-last": ["error", "always"], - "semi": ["error", "always"], - "object-shorthand": "error", - "prefer-template": "error", - "template-curly-spacing": "error", - "no-unused-expressions": "error", - "padding-line-between-statements": [ - "error", - { "blankLine": "always", "prev": "*", "next": "return" }, - { "blankLine": "always", "prev": "*", "next": "block-like" }, - { "blankLine": "always", "prev": "*", "next": "function" }, - { "blankLine": "always", "prev": "*", "next": "class" }, - { "blankLine": "always", "prev": ["const", "let", "var"], "next": "*" }, - { "blankLine": "any", "prev": ["const", "let", "var"], "next": ["const", "let", "var"] }, - ], - "no-template-curly-in-string": "error", - }, - }, - { - files: [ - "**/*.ts", - "**/*.tsx", - ], - parser: "@typescript-eslint/parser", - extends: [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:react/recommended", - "plugin:import/recommended", - "plugin:import/typescript", - ], - plugins: [ - "header", - "unused-imports", - "react-hooks", - ], - parserOptions: { - ecmaVersion: 2018, - sourceType: "module", - }, - rules: { - "no-constant-condition": ["error", { - "checkLoops": false, - }], - "header/header": [2, "../../license-header"], - "react/prop-types": "off", - "no-invalid-this": "off", - "@typescript-eslint/no-invalid-this": ["error"], - "@typescript-eslint/explicit-function-return-type": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/interface-name-prefix": "off", - "@typescript-eslint/no-use-before-define": "off", - "@typescript-eslint/no-empty-interface": "off", - "@typescript-eslint/no-var-requires": "off", - "@typescript-eslint/ban-ts-ignore": "off", - "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/ban-types": "off", - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/no-unused-vars": "off", - "no-restricted-imports": ["error", { - "paths": [ - { - "name": ".", - "message": "No importing from local index.ts(x?) file. A common way to make circular dependencies.", - }, - ], - }], - "@typescript-eslint/member-delimiter-style": ["error", { - "multiline": { - "delimiter": "semi", - "requireLast": true, - }, - "singleline": { - "delimiter": "semi", - "requireLast": false, - }, - }], - "react/jsx-max-props-per-line": ["error", { - "maximum": { - "single": 2, - "multi": 1, - }, - }], - "react/jsx-first-prop-new-line": ["error", "multiline"], - "react/jsx-one-expression-per-line": ["error", { - "allow": "single-child", - }], - "react/jsx-indent": ["error", 2], - "react/jsx-indent-props": ["error", 2], - "react/jsx-closing-tag-location": "error", - "react/jsx-wrap-multilines": ["error", { - "declaration": "parens-new-line", - "assignment": "parens-new-line", - "return": "parens-new-line", - "arrow": "parens-new-line", - "condition": "parens-new-line", - "logical": "parens-new-line", - "prop": "parens-new-line", - }], - "react/display-name": "off", - "space-before-function-paren": "off", - "@typescript-eslint/space-before-function-paren": ["error", { - "anonymous": "always", - "named": "never", - "asyncArrow": "always", - }], - "@typescript-eslint/naming-convention": ["error", - { - "selector": "interface", - "format": ["PascalCase"], - "leadingUnderscore": "forbid", - "trailingUnderscore": "forbid", - "custom": { - "regex": "^Props$", - "match": false, - }, - }, - { - "selector": "typeAlias", - "format": ["PascalCase"], - "leadingUnderscore": "forbid", - "trailingUnderscore": "forbid", - "custom": { - "regex": "^(Props|State)$", - "match": false, - }, - }, - ], - "@typescript-eslint/consistent-type-definitions": ["error", "interface"], - "unused-imports/no-unused-imports-ts": process.env.PROD === "true" ? "error" : "warn", - "unused-imports/no-unused-vars-ts": [ - "warn", { - "vars": "all", - "args": "after-used", - "ignoreRestSiblings": true, - }, - ], - "comman-dangle": "off", - "@typescript-eslint/comma-dangle": ["error", "always-multiline"], - "comma-spacing": "off", - "@typescript-eslint/comma-spacing": "error", - "indent": ["error", 2, { - "SwitchCase": 1, - }], - "quotes": ["error", "double", { - "avoidEscape": true, - "allowTemplateLiterals": true, - }], - "object-curly-spacing": "off", - "@typescript-eslint/object-curly-spacing": ["error", "always", { - "objectsInObjects": false, - "arraysInObjects": true, - }], - "semi": "off", - "@typescript-eslint/semi": ["error"], - "linebreak-style": ["error", "unix"], - "eol-last": ["error", "always"], - "object-shorthand": "error", - "prefer-template": "error", - "template-curly-spacing": "error", - "no-unused-expressions": "off", - "@typescript-eslint/no-unused-expressions": "error", - "padding-line-between-statements": [ - "error", - { "blankLine": "always", "prev": "*", "next": "return" }, - { "blankLine": "always", "prev": "*", "next": "block-like" }, - { "blankLine": "always", "prev": "*", "next": "function" }, - { "blankLine": "always", "prev": "*", "next": "class" }, - { "blankLine": "always", "prev": ["const", "let", "var"], "next": "*" }, - { "blankLine": "any", "prev": ["const", "let", "var"], "next": ["const", "let", "var"] }, - ], - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": "off", - "no-template-curly-in-string": "error", - "@typescript-eslint/consistent-type-imports": "error", - }, - }, - { - files: [ - "src/{common,main,renderer}/**/*.ts", - "src/{common,main,renderer}/**/*.tsx", - ], - rules: { - "no-restricted-imports": ["error", { - "paths": [ - { - "name": ".", - "message": "No importing from local index.ts(x?) file. A common way to make circular dependencies.", - }, - { - "name": "..", - "message": "No importing from parent index.ts(x?) file. A common way to make circular dependencies.", - }, - ], - "patterns": [ - { - "group": [ - "**/extensions/renderer-api/**/*", - "**/extensions/main-api/**/*", - "**/extensions/common-api/**/*", - ], - message: "No importing from the extension api definitions in application code", - }, - { - "group": [ - "**/extensions/as-legacy-globals-for-extension-api/as-legacy-global-function-for-extension-api", - "**/extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api-with-modifications", - "**/extensions/as-legacy-globals-for-extension-api/as-legacy-global-object-for-extension-api", - "**/extensions/as-legacy-globals-for-extension-api/as-legacy-global-singleton-object-for-extension-api", - ], - message: "No importing the legacy global functions in non-ExtensionApi code", - }, - ], - }], - }, - }, - ], -}; diff --git a/packages/core/.gitignore b/packages/core/.gitignore deleted file mode 100644 index 2ac9023ff1..0000000000 --- a/packages/core/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -static/build/ -build/webpack/ -binaries/ diff --git a/packages/core/.swcrc b/packages/core/.swcrc deleted file mode 100644 index 742642b7eb..0000000000 --- a/packages/core/.swcrc +++ /dev/null @@ -1,18 +0,0 @@ -{ - "module": { - "type": "commonjs" - }, - "jsc": { - "parser": { - "syntax": "typescript", - "tsx": true, - "decorators": true, - "dynamicImport": false - }, - "transform": { - "legacyDecorator": true, - "decoratorMetadata": true - }, - "target": "es2019" - } -} diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md deleted file mode 100644 index 9d2c0bb043..0000000000 --- a/packages/core/CHANGELOG.md +++ /dev/null @@ -1,1288 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -# 6.5.0 (2023-05-26) - - - -# 6.5.0-alpha.16 (2023-05-25) - - -### Bug Fixes - -* Handle log responses as text ([#7776](https://github.com/lensapp/lens/issues/7776)) ([90c449c](https://github.com/lensapp/lens/commit/90c449cc0dd68ef46eb3c32bae170c3386238db9)) -* Make application size not blow up by consolidating dependencies in core package to peerDependencies ([738985c](https://github.com/lensapp/lens/commit/738985c9b7406ef0722c3994c560f0337e3c5b7c)) - - - -# 6.5.0-alpha.15 (2023-05-23) - - - -# 6.5.0-alpha.14 (2023-05-23) - - -### Bug Fixes - -* Use correct path for node-shell shell PTY ([99e6b77](https://github.com/lensapp/lens/commit/99e6b77fc1c5a74cfef90981b8b0162b46ecfb43)) - - -### Reverts - -* Revert "chore: Extract sidebar item injection token into separate package" ([8f4aa49](https://github.com/lensapp/lens/commit/8f4aa497cc54655f83813d57c224f77dd1472141)) -* Revert "chore: Rename sidebar item injectable files" ([cb0e876](https://github.com/lensapp/lens/commit/cb0e8764aca9e0d28e6e23c5ae87a5ab6d414065)) -* Revert "chore: Convert sidebarItemInjectionToken to use InjectWithMetadata instead of duplicating the IDs" ([93bc41f](https://github.com/lensapp/lens/commit/93bc41f9a3f47f5c777c882c9241f4fd5e3f1952)) -* Revert "chore: Fixup tests snapshots to match new testid behaviour" ([9276df0](https://github.com/lensapp/lens/commit/9276df05924794d30d7d97bc79cf701a6106e8ec)) -* Revert "chore: Fix lint" ([d90bdf6](https://github.com/lensapp/lens/commit/d90bdf6f1497cb25f17788a4170feba31d366b74)) -* Revert "chore: Fix more lint" ([813705f](https://github.com/lensapp/lens/commit/813705fe9097012cd7fc62a8d543d1f7bc2be2ed)) -* Revert "chore: Fix IDs for some sidebar items" ([753c8bf](https://github.com/lensapp/lens/commit/753c8bfa85ccc74980553bb512b5038ff18767a2)) -* Revert "chore: Improve title formatting for Horizontal/Vertical Pod Autoscalers" ([d4c12be](https://github.com/lensapp/lens/commit/d4c12becfc9020009d64f48e4c8f9dd3b7725bb6)) -* Revert "fix: Fix formatting of custom resource sidebar items" ([5608a19](https://github.com/lensapp/lens/commit/5608a199be1067039403b85abe776fab928a956c)) -* Revert "chore: Fix integration tests failing due to helm testid's changing" ([96b7ecb](https://github.com/lensapp/lens/commit/96b7ecbaddedd45cc667cc2d6c25fdc0813557ec)) -* Revert "chore: Fix tests after rebase" ([1b43de5](https://github.com/lensapp/lens/commit/1b43de50fe6431367bf259799f5e0b42f6b38ad9)) -* Revert "fix: Custom Resource Definitions should be the first entry in the side bar" ([1099e65](https://github.com/lensapp/lens/commit/1099e65c52c62153b3d28d0654fffaaa6f6715a7)) -* Revert "fix: Custom Resource Definitions sidebar item should navigate to the correct route" ([7d46cb8](https://github.com/lensapp/lens/commit/7d46cb845d0f1748c0f83a8dc34bbe783270ca2c)) -* Revert "chore: Cleanup custom resource route definition" ([40f1180](https://github.com/lensapp/lens/commit/40f118057925a3b946f5dcc60162bad7e8b12e58)) -* Revert "chore: Factor out NavigateToCustomResources type" ([d3cf708](https://github.com/lensapp/lens/commit/d3cf7088d6c37860984ce0295a3d8a5c528c2a66)) -* Revert "chore: Move around Custom Resource and Custom Resource Definition files to simplify names" ([5f4cdbc](https://github.com/lensapp/lens/commit/5f4cdbc51950c04804139e9b961cfe394ad4ae30)) - - - -# 6.5.0-alpha.13 (2023-05-16) - - -### Bug Fixes - -* Switch to using IAsyncComputed to resolve bad setState error within ClusterOverview from react ([4f8e470](https://github.com/lensapp/lens/commit/4f8e4707f929eee04ff1345c9e93f00d50ac0a92)) - - - -# 6.5.0-alpha.12 (2023-05-16) - - -### Bug Fixes - -* Don't crash when hovering hotbar menu index ([9d51ef2](https://github.com/lensapp/lens/commit/9d51ef2aa69c6c9df0fd57281b25131a10efd27a)) - - - -# 6.5.0-alpha.11 (2023-05-11) - - -### Bug Fixes - -* Add test as repro, and fix bug about kube API details not opening ([bb400ae](https://github.com/lensapp/lens/commit/bb400ae66797fe160567e6b728d85d5e79caef4d)) -* Bring back search filters for pods which were accidentally removed previously ([9c7be39](https://github.com/lensapp/lens/commit/9c7be39eb135b747945f76f61811695d2f96c761)) -* Do not crash when opening details of a helm release ([40af0d3](https://github.com/lensapp/lens/commit/40af0d31c529e252a45c7370852755c4e63067a7)) -* Kludge cluster settings not opening when extension introduces new settings without ID when title contains spaces ([e8491ca](https://github.com/lensapp/lens/commit/e8491ca2d39971d06842f6741eae042554fbc9a0)) - - - -# 6.5.0-alpha.10 (2023-05-09) - - - -# 6.5.0-alpha.9 (2023-05-04) - - -### Bug Fixes - -* Add checks to KubeObject constructor to ensure shape ([bf6af58](https://github.com/lensapp/lens/commit/bf6af58d80552a16be7a547f772902b138a12fbd)) -* add routingFeature to getDiForUnitTesting ([b33a8b4](https://github.com/lensapp/lens/commit/b33a8b49607935450f70b1d5535431ba416fc22e)) -* change class name behaviour to limit snapshot diffs ([bfb2b8e](https://github.com/lensapp/lens/commit/bfb2b8e6591891b529d5cf0f8757ff8b7080e004)) -* **core:** hide update button if downloading of an update fails ([f697742](https://github.com/lensapp/lens/commit/f6977428daa3f61482e7066689ebf7092b0fb2b1)) -* Fix selfLink being missing from requestKubeResource ([b90e04e](https://github.com/lensapp/lens/commit/b90e04e02dfd18896d5f08f1bc36f90179635797)) -* lint:fix ([76c11aa](https://github.com/lensapp/lens/commit/76c11aa697e3ada81c876fe8a3ac6e33b4ce8cb9)) -* observableHistoryInjectionToken and 1 revert for GlobalOverride ([8c0220c](https://github.com/lensapp/lens/commit/8c0220c353c9047a2a4df570b598c31868b5f7e2)) -* Only show Update Channel preferences when applicable ([43cedae](https://github.com/lensapp/lens/commit/43cedae7b05eaa7f932f2718939f7b856a1b86c5)) -* Remove incorrect timeout on standard info notifications ([bcf95a6](https://github.com/lensapp/lens/commit/bcf95a65f1d2be91fa613f0da9d0ae978faaef75)) -* removed as-legacy-globals-for-extension-api ([f1f2634](https://github.com/lensapp/lens/commit/f1f26344900b99c70b2bed2f453ed27574d7b417)) -* removed dependencies: [reactApplicationFeature], ([0dae159](https://github.com/lensapp/lens/commit/0dae1594baabbd06e798f9a1b4c132cee998bb65)) - - -### Features - -* Add deleting subNamespaces to contextMenu ([89cf491](https://github.com/lensapp/lens/commit/89cf491bc0aa80ee398f8b5dc39ec7c69d00c7bb)) -* Add removing subNamespaces to Namespace route ([aa95002](https://github.com/lensapp/lens/commit/aa950026a3162abf6322afb4b5c5bf56f9f7e10f)) -* Adjust container status colors to be distinguable with red/green filter ([#7621](https://github.com/lensapp/lens/issues/7621)) ([3532fc1](https://github.com/lensapp/lens/commit/3532fc1dab918190fa76199a9d7b04d6efe40c47)) -* Compute the kubectl download version map at build time ([0bd7b1f](https://github.com/lensapp/lens/commit/0bd7b1fe92a173379c8a5a1ab7e13cf9e4f8223b)) -* Improve formatting error messages from apiKube ([3439472](https://github.com/lensapp/lens/commit/3439472065e6b850e286f6a34bccc23b827b8e28)) -* Introduce API for changing the status bar colour ([06a0dce](https://github.com/lensapp/lens/commit/06a0dce612b67084f8f36ba552ea23f8ac071201)) -* Introduce injectables to remove subNamespaces ([c557225](https://github.com/lensapp/lens/commit/c5572257bd6a32a2f05fc78f54ece428f54389fe)) -* Never auto-close error notifications ([561d8db](https://github.com/lensapp/lens/commit/561d8dbc09581ff21aa79e85f3903c45e99ac33b)) - - - -# 6.5.0-alpha.6 (2023-04-12) - - - -# 6.5.0-alpha.5 (2023-04-12) - - - -# 6.5.0-alpha.4 (2023-04-12) - - -### Bug Fixes - -* Fix tests by recreating non-specific injection token ([c0ebe60](https://github.com/lensapp/lens/commit/c0ebe605c4d36c0d98454e25565818f75ffb1b69)) -* Referencing apiManager should not throw ([#7468](https://github.com/lensapp/lens/issues/7468)) ([351f9d4](https://github.com/lensapp/lens/commit/351f9d492f6e52e9e97d17d71e2bbdbbde4ea2db)) -* remove platform specific injectable file names ([9b0318b](https://github.com/lensapp/lens/commit/9b0318b493fe2e49a34b8a4cb3d0bef1600759b8)) - - -### Features - -* Allow built versions to specify an environment ([#7495](https://github.com/lensapp/lens/issues/7495)) ([128b05d](https://github.com/lensapp/lens/commit/128b05d4d46344a511398f654865c133c6e36514)) - - -### Reverts - -* Revert "Renderer file logging through IPC" (#7393) ([5409324](https://github.com/lensapp/lens/commit/54093242367717292312df01905d052b66017953)), closes [#7393](https://github.com/lensapp/lens/issues/7393) - - - -# 6.5.0-alpha.3 (2023-03-15) - - - -# 6.5.0-alpha.2 (2023-03-14) - - - -# 6.5.0-alpha.1 (2023-03-14) - - -### Reverts - -* Revert "Renderer file logging transport (#6795)" (#7245) ([ec81af4](https://github.com/lensapp/lens/commit/ec81af4e6c5f8d0c25469a56dfa602894f85734b)), closes [#6795](https://github.com/lensapp/lens/issues/6795) [#7245](https://github.com/lensapp/lens/issues/7245) [#544](https://github.com/lensapp/lens/issues/544) - - - -# 6.4.0-beta.13 (2023-02-03) - - - -# 6.4.0-beta.12 (2023-02-01) - - - -# 6.4.0-beta.11 (2023-02-01) - - - -# 6.4.0-beta.10 (2023-01-27) - - - -# 6.4.0-beta.9 (2023-01-27) - - - -# 6.4.0-beta.8 (2023-01-27) - - - -# 6.4.0-beta.7 (2023-01-27) - - - -# 6.4.0-beta.6 (2023-01-26) - - - -# 6.4.0-beta.5 (2023-01-26) - - - -# 6.4.0-beta.4 (2023-01-26) - - - -# 6.4.0-beta.3 (2023-01-26) - - - - - -# 6.5.0-alpha.16 (2023-05-25) - - -### Bug Fixes - -* Handle log responses as text ([#7776](https://github.com/lensapp/lens/issues/7776)) ([90c449c](https://github.com/lensapp/lens/commit/90c449cc0dd68ef46eb3c32bae170c3386238db9)) -* Make application size not blow up by consolidating dependencies in core package to peerDependencies ([738985c](https://github.com/lensapp/lens/commit/738985c9b7406ef0722c3994c560f0337e3c5b7c)) - - - -# 6.5.0-alpha.15 (2023-05-23) - - - -# 6.5.0-alpha.14 (2023-05-23) - - -### Bug Fixes - -* Use correct path for node-shell shell PTY ([99e6b77](https://github.com/lensapp/lens/commit/99e6b77fc1c5a74cfef90981b8b0162b46ecfb43)) - - -### Reverts - -* Revert "chore: Extract sidebar item injection token into separate package" ([8f4aa49](https://github.com/lensapp/lens/commit/8f4aa497cc54655f83813d57c224f77dd1472141)) -* Revert "chore: Rename sidebar item injectable files" ([cb0e876](https://github.com/lensapp/lens/commit/cb0e8764aca9e0d28e6e23c5ae87a5ab6d414065)) -* Revert "chore: Convert sidebarItemInjectionToken to use InjectWithMetadata instead of duplicating the IDs" ([93bc41f](https://github.com/lensapp/lens/commit/93bc41f9a3f47f5c777c882c9241f4fd5e3f1952)) -* Revert "chore: Fixup tests snapshots to match new testid behaviour" ([9276df0](https://github.com/lensapp/lens/commit/9276df05924794d30d7d97bc79cf701a6106e8ec)) -* Revert "chore: Fix lint" ([d90bdf6](https://github.com/lensapp/lens/commit/d90bdf6f1497cb25f17788a4170feba31d366b74)) -* Revert "chore: Fix more lint" ([813705f](https://github.com/lensapp/lens/commit/813705fe9097012cd7fc62a8d543d1f7bc2be2ed)) -* Revert "chore: Fix IDs for some sidebar items" ([753c8bf](https://github.com/lensapp/lens/commit/753c8bfa85ccc74980553bb512b5038ff18767a2)) -* Revert "chore: Improve title formatting for Horizontal/Vertical Pod Autoscalers" ([d4c12be](https://github.com/lensapp/lens/commit/d4c12becfc9020009d64f48e4c8f9dd3b7725bb6)) -* Revert "fix: Fix formatting of custom resource sidebar items" ([5608a19](https://github.com/lensapp/lens/commit/5608a199be1067039403b85abe776fab928a956c)) -* Revert "chore: Fix integration tests failing due to helm testid's changing" ([96b7ecb](https://github.com/lensapp/lens/commit/96b7ecbaddedd45cc667cc2d6c25fdc0813557ec)) -* Revert "chore: Fix tests after rebase" ([1b43de5](https://github.com/lensapp/lens/commit/1b43de50fe6431367bf259799f5e0b42f6b38ad9)) -* Revert "fix: Custom Resource Definitions should be the first entry in the side bar" ([1099e65](https://github.com/lensapp/lens/commit/1099e65c52c62153b3d28d0654fffaaa6f6715a7)) -* Revert "fix: Custom Resource Definitions sidebar item should navigate to the correct route" ([7d46cb8](https://github.com/lensapp/lens/commit/7d46cb845d0f1748c0f83a8dc34bbe783270ca2c)) -* Revert "chore: Cleanup custom resource route definition" ([40f1180](https://github.com/lensapp/lens/commit/40f118057925a3b946f5dcc60162bad7e8b12e58)) -* Revert "chore: Factor out NavigateToCustomResources type" ([d3cf708](https://github.com/lensapp/lens/commit/d3cf7088d6c37860984ce0295a3d8a5c528c2a66)) -* Revert "chore: Move around Custom Resource and Custom Resource Definition files to simplify names" ([5f4cdbc](https://github.com/lensapp/lens/commit/5f4cdbc51950c04804139e9b961cfe394ad4ae30)) - - - -# 6.5.0-alpha.13 (2023-05-16) - - -### Bug Fixes - -* Switch to using IAsyncComputed to resolve bad setState error within ClusterOverview from react ([4f8e470](https://github.com/lensapp/lens/commit/4f8e4707f929eee04ff1345c9e93f00d50ac0a92)) - - - -# 6.5.0-alpha.12 (2023-05-16) - - -### Bug Fixes - -* Don't crash when hovering hotbar menu index ([9d51ef2](https://github.com/lensapp/lens/commit/9d51ef2aa69c6c9df0fd57281b25131a10efd27a)) - - - -# 6.5.0-alpha.11 (2023-05-11) - - -### Bug Fixes - -* Add test as repro, and fix bug about kube API details not opening ([bb400ae](https://github.com/lensapp/lens/commit/bb400ae66797fe160567e6b728d85d5e79caef4d)) -* Bring back search filters for pods which were accidentally removed previously ([9c7be39](https://github.com/lensapp/lens/commit/9c7be39eb135b747945f76f61811695d2f96c761)) -* Do not crash when opening details of a helm release ([40af0d3](https://github.com/lensapp/lens/commit/40af0d31c529e252a45c7370852755c4e63067a7)) -* Kludge cluster settings not opening when extension introduces new settings without ID when title contains spaces ([e8491ca](https://github.com/lensapp/lens/commit/e8491ca2d39971d06842f6741eae042554fbc9a0)) - - - -# 6.5.0-alpha.10 (2023-05-09) - - - -# 6.5.0-alpha.9 (2023-05-04) - - -### Bug Fixes - -* Add checks to KubeObject constructor to ensure shape ([bf6af58](https://github.com/lensapp/lens/commit/bf6af58d80552a16be7a547f772902b138a12fbd)) -* add routingFeature to getDiForUnitTesting ([b33a8b4](https://github.com/lensapp/lens/commit/b33a8b49607935450f70b1d5535431ba416fc22e)) -* change class name behaviour to limit snapshot diffs ([bfb2b8e](https://github.com/lensapp/lens/commit/bfb2b8e6591891b529d5cf0f8757ff8b7080e004)) -* **core:** hide update button if downloading of an update fails ([f697742](https://github.com/lensapp/lens/commit/f6977428daa3f61482e7066689ebf7092b0fb2b1)) -* Fix selfLink being missing from requestKubeResource ([b90e04e](https://github.com/lensapp/lens/commit/b90e04e02dfd18896d5f08f1bc36f90179635797)) -* lint:fix ([76c11aa](https://github.com/lensapp/lens/commit/76c11aa697e3ada81c876fe8a3ac6e33b4ce8cb9)) -* observableHistoryInjectionToken and 1 revert for GlobalOverride ([8c0220c](https://github.com/lensapp/lens/commit/8c0220c353c9047a2a4df570b598c31868b5f7e2)) -* Only show Update Channel preferences when applicable ([43cedae](https://github.com/lensapp/lens/commit/43cedae7b05eaa7f932f2718939f7b856a1b86c5)) -* Remove incorrect timeout on standard info notifications ([bcf95a6](https://github.com/lensapp/lens/commit/bcf95a65f1d2be91fa613f0da9d0ae978faaef75)) -* removed as-legacy-globals-for-extension-api ([f1f2634](https://github.com/lensapp/lens/commit/f1f26344900b99c70b2bed2f453ed27574d7b417)) -* removed dependencies: [reactApplicationFeature], ([0dae159](https://github.com/lensapp/lens/commit/0dae1594baabbd06e798f9a1b4c132cee998bb65)) - - -### Features - -* Add deleting subNamespaces to contextMenu ([89cf491](https://github.com/lensapp/lens/commit/89cf491bc0aa80ee398f8b5dc39ec7c69d00c7bb)) -* Add removing subNamespaces to Namespace route ([aa95002](https://github.com/lensapp/lens/commit/aa950026a3162abf6322afb4b5c5bf56f9f7e10f)) -* Adjust container status colors to be distinguable with red/green filter ([#7621](https://github.com/lensapp/lens/issues/7621)) ([3532fc1](https://github.com/lensapp/lens/commit/3532fc1dab918190fa76199a9d7b04d6efe40c47)) -* Compute the kubectl download version map at build time ([0bd7b1f](https://github.com/lensapp/lens/commit/0bd7b1fe92a173379c8a5a1ab7e13cf9e4f8223b)) -* Improve formatting error messages from apiKube ([3439472](https://github.com/lensapp/lens/commit/3439472065e6b850e286f6a34bccc23b827b8e28)) -* Introduce API for changing the status bar colour ([06a0dce](https://github.com/lensapp/lens/commit/06a0dce612b67084f8f36ba552ea23f8ac071201)) -* Introduce injectables to remove subNamespaces ([c557225](https://github.com/lensapp/lens/commit/c5572257bd6a32a2f05fc78f54ece428f54389fe)) -* Never auto-close error notifications ([561d8db](https://github.com/lensapp/lens/commit/561d8dbc09581ff21aa79e85f3903c45e99ac33b)) - - - -# 6.5.0-alpha.6 (2023-04-12) - - - -# 6.5.0-alpha.5 (2023-04-12) - - - -# 6.5.0-alpha.4 (2023-04-12) - - -### Bug Fixes - -* Fix tests by recreating non-specific injection token ([c0ebe60](https://github.com/lensapp/lens/commit/c0ebe605c4d36c0d98454e25565818f75ffb1b69)) -* Referencing apiManager should not throw ([#7468](https://github.com/lensapp/lens/issues/7468)) ([351f9d4](https://github.com/lensapp/lens/commit/351f9d492f6e52e9e97d17d71e2bbdbbde4ea2db)) -* remove platform specific injectable file names ([9b0318b](https://github.com/lensapp/lens/commit/9b0318b493fe2e49a34b8a4cb3d0bef1600759b8)) - - -### Features - -* Allow built versions to specify an environment ([#7495](https://github.com/lensapp/lens/issues/7495)) ([128b05d](https://github.com/lensapp/lens/commit/128b05d4d46344a511398f654865c133c6e36514)) - - -### Reverts - -* Revert "Renderer file logging through IPC" (#7393) ([5409324](https://github.com/lensapp/lens/commit/54093242367717292312df01905d052b66017953)), closes [#7393](https://github.com/lensapp/lens/issues/7393) - - - -# 6.5.0-alpha.3 (2023-03-15) - - - -# 6.5.0-alpha.2 (2023-03-14) - - - -# 6.5.0-alpha.1 (2023-03-14) - - -### Reverts - -* Revert "Renderer file logging transport (#6795)" (#7245) ([ec81af4](https://github.com/lensapp/lens/commit/ec81af4e6c5f8d0c25469a56dfa602894f85734b)), closes [#6795](https://github.com/lensapp/lens/issues/6795) [#7245](https://github.com/lensapp/lens/issues/7245) [#544](https://github.com/lensapp/lens/issues/544) - - - -# 6.4.0-beta.13 (2023-02-03) - - - -# 6.4.0-beta.12 (2023-02-01) - - - -# 6.4.0-beta.11 (2023-02-01) - - - -# 6.4.0-beta.10 (2023-01-27) - - - -# 6.4.0-beta.9 (2023-01-27) - - - -# 6.4.0-beta.8 (2023-01-27) - - - -# 6.4.0-beta.7 (2023-01-27) - - - -# 6.4.0-beta.6 (2023-01-26) - - - -# 6.4.0-beta.5 (2023-01-26) - - - -# 6.4.0-beta.4 (2023-01-26) - - - -# 6.4.0-beta.3 (2023-01-26) - - - - - -# 6.5.0-alpha.15 (2023-05-23) - - - -# 6.5.0-alpha.14 (2023-05-23) - - -### Bug Fixes - -* Use correct path for node-shell shell PTY ([99e6b77](https://github.com/lensapp/lens/commit/99e6b77fc1c5a74cfef90981b8b0162b46ecfb43)) - - -### Reverts - -* Revert "chore: Extract sidebar item injection token into separate package" ([8f4aa49](https://github.com/lensapp/lens/commit/8f4aa497cc54655f83813d57c224f77dd1472141)) -* Revert "chore: Rename sidebar item injectable files" ([cb0e876](https://github.com/lensapp/lens/commit/cb0e8764aca9e0d28e6e23c5ae87a5ab6d414065)) -* Revert "chore: Convert sidebarItemInjectionToken to use InjectWithMetadata instead of duplicating the IDs" ([93bc41f](https://github.com/lensapp/lens/commit/93bc41f9a3f47f5c777c882c9241f4fd5e3f1952)) -* Revert "chore: Fixup tests snapshots to match new testid behaviour" ([9276df0](https://github.com/lensapp/lens/commit/9276df05924794d30d7d97bc79cf701a6106e8ec)) -* Revert "chore: Fix lint" ([d90bdf6](https://github.com/lensapp/lens/commit/d90bdf6f1497cb25f17788a4170feba31d366b74)) -* Revert "chore: Fix more lint" ([813705f](https://github.com/lensapp/lens/commit/813705fe9097012cd7fc62a8d543d1f7bc2be2ed)) -* Revert "chore: Fix IDs for some sidebar items" ([753c8bf](https://github.com/lensapp/lens/commit/753c8bfa85ccc74980553bb512b5038ff18767a2)) -* Revert "chore: Improve title formatting for Horizontal/Vertical Pod Autoscalers" ([d4c12be](https://github.com/lensapp/lens/commit/d4c12becfc9020009d64f48e4c8f9dd3b7725bb6)) -* Revert "fix: Fix formatting of custom resource sidebar items" ([5608a19](https://github.com/lensapp/lens/commit/5608a199be1067039403b85abe776fab928a956c)) -* Revert "chore: Fix integration tests failing due to helm testid's changing" ([96b7ecb](https://github.com/lensapp/lens/commit/96b7ecbaddedd45cc667cc2d6c25fdc0813557ec)) -* Revert "chore: Fix tests after rebase" ([1b43de5](https://github.com/lensapp/lens/commit/1b43de50fe6431367bf259799f5e0b42f6b38ad9)) -* Revert "fix: Custom Resource Definitions should be the first entry in the side bar" ([1099e65](https://github.com/lensapp/lens/commit/1099e65c52c62153b3d28d0654fffaaa6f6715a7)) -* Revert "fix: Custom Resource Definitions sidebar item should navigate to the correct route" ([7d46cb8](https://github.com/lensapp/lens/commit/7d46cb845d0f1748c0f83a8dc34bbe783270ca2c)) -* Revert "chore: Cleanup custom resource route definition" ([40f1180](https://github.com/lensapp/lens/commit/40f118057925a3b946f5dcc60162bad7e8b12e58)) -* Revert "chore: Factor out NavigateToCustomResources type" ([d3cf708](https://github.com/lensapp/lens/commit/d3cf7088d6c37860984ce0295a3d8a5c528c2a66)) -* Revert "chore: Move around Custom Resource and Custom Resource Definition files to simplify names" ([5f4cdbc](https://github.com/lensapp/lens/commit/5f4cdbc51950c04804139e9b961cfe394ad4ae30)) - - - -# 6.5.0-alpha.13 (2023-05-16) - - -### Bug Fixes - -* Switch to using IAsyncComputed to resolve bad setState error within ClusterOverview from react ([4f8e470](https://github.com/lensapp/lens/commit/4f8e4707f929eee04ff1345c9e93f00d50ac0a92)) - - - -# 6.5.0-alpha.12 (2023-05-16) - - -### Bug Fixes - -* Don't crash when hovering hotbar menu index ([9d51ef2](https://github.com/lensapp/lens/commit/9d51ef2aa69c6c9df0fd57281b25131a10efd27a)) - - - -# 6.5.0-alpha.11 (2023-05-11) - - -### Bug Fixes - -* Add test as repro, and fix bug about kube API details not opening ([bb400ae](https://github.com/lensapp/lens/commit/bb400ae66797fe160567e6b728d85d5e79caef4d)) -* Bring back search filters for pods which were accidentally removed previously ([9c7be39](https://github.com/lensapp/lens/commit/9c7be39eb135b747945f76f61811695d2f96c761)) -* Do not crash when opening details of a helm release ([40af0d3](https://github.com/lensapp/lens/commit/40af0d31c529e252a45c7370852755c4e63067a7)) -* Kludge cluster settings not opening when extension introduces new settings without ID when title contains spaces ([e8491ca](https://github.com/lensapp/lens/commit/e8491ca2d39971d06842f6741eae042554fbc9a0)) - - - -# 6.5.0-alpha.10 (2023-05-09) - - - -# 6.5.0-alpha.9 (2023-05-04) - - -### Bug Fixes - -* Add checks to KubeObject constructor to ensure shape ([bf6af58](https://github.com/lensapp/lens/commit/bf6af58d80552a16be7a547f772902b138a12fbd)) -* add routingFeature to getDiForUnitTesting ([b33a8b4](https://github.com/lensapp/lens/commit/b33a8b49607935450f70b1d5535431ba416fc22e)) -* change class name behaviour to limit snapshot diffs ([bfb2b8e](https://github.com/lensapp/lens/commit/bfb2b8e6591891b529d5cf0f8757ff8b7080e004)) -* **core:** hide update button if downloading of an update fails ([f697742](https://github.com/lensapp/lens/commit/f6977428daa3f61482e7066689ebf7092b0fb2b1)) -* Fix selfLink being missing from requestKubeResource ([b90e04e](https://github.com/lensapp/lens/commit/b90e04e02dfd18896d5f08f1bc36f90179635797)) -* lint:fix ([76c11aa](https://github.com/lensapp/lens/commit/76c11aa697e3ada81c876fe8a3ac6e33b4ce8cb9)) -* observableHistoryInjectionToken and 1 revert for GlobalOverride ([8c0220c](https://github.com/lensapp/lens/commit/8c0220c353c9047a2a4df570b598c31868b5f7e2)) -* Only show Update Channel preferences when applicable ([43cedae](https://github.com/lensapp/lens/commit/43cedae7b05eaa7f932f2718939f7b856a1b86c5)) -* Remove incorrect timeout on standard info notifications ([bcf95a6](https://github.com/lensapp/lens/commit/bcf95a65f1d2be91fa613f0da9d0ae978faaef75)) -* removed as-legacy-globals-for-extension-api ([f1f2634](https://github.com/lensapp/lens/commit/f1f26344900b99c70b2bed2f453ed27574d7b417)) -* removed dependencies: [reactApplicationFeature], ([0dae159](https://github.com/lensapp/lens/commit/0dae1594baabbd06e798f9a1b4c132cee998bb65)) - - -### Features - -* Add deleting subNamespaces to contextMenu ([89cf491](https://github.com/lensapp/lens/commit/89cf491bc0aa80ee398f8b5dc39ec7c69d00c7bb)) -* Add removing subNamespaces to Namespace route ([aa95002](https://github.com/lensapp/lens/commit/aa950026a3162abf6322afb4b5c5bf56f9f7e10f)) -* Adjust container status colors to be distinguable with red/green filter ([#7621](https://github.com/lensapp/lens/issues/7621)) ([3532fc1](https://github.com/lensapp/lens/commit/3532fc1dab918190fa76199a9d7b04d6efe40c47)) -* Compute the kubectl download version map at build time ([0bd7b1f](https://github.com/lensapp/lens/commit/0bd7b1fe92a173379c8a5a1ab7e13cf9e4f8223b)) -* Improve formatting error messages from apiKube ([3439472](https://github.com/lensapp/lens/commit/3439472065e6b850e286f6a34bccc23b827b8e28)) -* Introduce API for changing the status bar colour ([06a0dce](https://github.com/lensapp/lens/commit/06a0dce612b67084f8f36ba552ea23f8ac071201)) -* Introduce injectables to remove subNamespaces ([c557225](https://github.com/lensapp/lens/commit/c5572257bd6a32a2f05fc78f54ece428f54389fe)) -* Never auto-close error notifications ([561d8db](https://github.com/lensapp/lens/commit/561d8dbc09581ff21aa79e85f3903c45e99ac33b)) - - - -# 6.5.0-alpha.6 (2023-04-12) - - - -# 6.5.0-alpha.5 (2023-04-12) - - - -# 6.5.0-alpha.4 (2023-04-12) - - -### Bug Fixes - -* Fix tests by recreating non-specific injection token ([c0ebe60](https://github.com/lensapp/lens/commit/c0ebe605c4d36c0d98454e25565818f75ffb1b69)) -* Referencing apiManager should not throw ([#7468](https://github.com/lensapp/lens/issues/7468)) ([351f9d4](https://github.com/lensapp/lens/commit/351f9d492f6e52e9e97d17d71e2bbdbbde4ea2db)) -* remove platform specific injectable file names ([9b0318b](https://github.com/lensapp/lens/commit/9b0318b493fe2e49a34b8a4cb3d0bef1600759b8)) - - -### Features - -* Allow built versions to specify an environment ([#7495](https://github.com/lensapp/lens/issues/7495)) ([128b05d](https://github.com/lensapp/lens/commit/128b05d4d46344a511398f654865c133c6e36514)) - - -### Reverts - -* Revert "Renderer file logging through IPC" (#7393) ([5409324](https://github.com/lensapp/lens/commit/54093242367717292312df01905d052b66017953)), closes [#7393](https://github.com/lensapp/lens/issues/7393) - - - -# 6.5.0-alpha.3 (2023-03-15) - - - -# 6.5.0-alpha.2 (2023-03-14) - - - -# 6.5.0-alpha.1 (2023-03-14) - - -### Reverts - -* Revert "Renderer file logging transport (#6795)" (#7245) ([ec81af4](https://github.com/lensapp/lens/commit/ec81af4e6c5f8d0c25469a56dfa602894f85734b)), closes [#6795](https://github.com/lensapp/lens/issues/6795) [#7245](https://github.com/lensapp/lens/issues/7245) [#544](https://github.com/lensapp/lens/issues/544) - - - -# 6.4.0-beta.13 (2023-02-03) - - - -# 6.4.0-beta.12 (2023-02-01) - - - -# 6.4.0-beta.11 (2023-02-01) - - - -# 6.4.0-beta.10 (2023-01-27) - - - -# 6.4.0-beta.9 (2023-01-27) - - - -# 6.4.0-beta.8 (2023-01-27) - - - -# 6.4.0-beta.7 (2023-01-27) - - - -# 6.4.0-beta.6 (2023-01-26) - - - -# 6.4.0-beta.5 (2023-01-26) - - - -# 6.4.0-beta.4 (2023-01-26) - - - -# 6.4.0-beta.3 (2023-01-26) - - - - - -# 6.5.0-alpha.13 (2023-05-16) - - -### Bug Fixes - -* Switch to using IAsyncComputed to resolve bad setState error within ClusterOverview from react ([4f8e470](https://github.com/lensapp/lens/commit/4f8e4707f929eee04ff1345c9e93f00d50ac0a92)) - - - -# 6.5.0-alpha.12 (2023-05-16) - - -### Bug Fixes - -* Don't crash when hovering hotbar menu index ([9d51ef2](https://github.com/lensapp/lens/commit/9d51ef2aa69c6c9df0fd57281b25131a10efd27a)) - - - -# 6.5.0-alpha.11 (2023-05-11) - - -### Bug Fixes - -* Add test as repro, and fix bug about kube API details not opening ([bb400ae](https://github.com/lensapp/lens/commit/bb400ae66797fe160567e6b728d85d5e79caef4d)) -* Bring back search filters for pods which were accidentally removed previously ([9c7be39](https://github.com/lensapp/lens/commit/9c7be39eb135b747945f76f61811695d2f96c761)) -* Do not crash when opening details of a helm release ([40af0d3](https://github.com/lensapp/lens/commit/40af0d31c529e252a45c7370852755c4e63067a7)) -* Kludge cluster settings not opening when extension introduces new settings without ID when title contains spaces ([e8491ca](https://github.com/lensapp/lens/commit/e8491ca2d39971d06842f6741eae042554fbc9a0)) - - - -# 6.5.0-alpha.10 (2023-05-09) - - - -# 6.5.0-alpha.9 (2023-05-04) - - -### Bug Fixes - -* Add checks to KubeObject constructor to ensure shape ([bf6af58](https://github.com/lensapp/lens/commit/bf6af58d80552a16be7a547f772902b138a12fbd)) -* add routingFeature to getDiForUnitTesting ([b33a8b4](https://github.com/lensapp/lens/commit/b33a8b49607935450f70b1d5535431ba416fc22e)) -* change class name behaviour to limit snapshot diffs ([bfb2b8e](https://github.com/lensapp/lens/commit/bfb2b8e6591891b529d5cf0f8757ff8b7080e004)) -* **core:** hide update button if downloading of an update fails ([f697742](https://github.com/lensapp/lens/commit/f6977428daa3f61482e7066689ebf7092b0fb2b1)) -* Fix selfLink being missing from requestKubeResource ([b90e04e](https://github.com/lensapp/lens/commit/b90e04e02dfd18896d5f08f1bc36f90179635797)) -* lint:fix ([76c11aa](https://github.com/lensapp/lens/commit/76c11aa697e3ada81c876fe8a3ac6e33b4ce8cb9)) -* observableHistoryInjectionToken and 1 revert for GlobalOverride ([8c0220c](https://github.com/lensapp/lens/commit/8c0220c353c9047a2a4df570b598c31868b5f7e2)) -* Only show Update Channel preferences when applicable ([43cedae](https://github.com/lensapp/lens/commit/43cedae7b05eaa7f932f2718939f7b856a1b86c5)) -* Remove incorrect timeout on standard info notifications ([bcf95a6](https://github.com/lensapp/lens/commit/bcf95a65f1d2be91fa613f0da9d0ae978faaef75)) -* removed as-legacy-globals-for-extension-api ([f1f2634](https://github.com/lensapp/lens/commit/f1f26344900b99c70b2bed2f453ed27574d7b417)) -* removed dependencies: [reactApplicationFeature], ([0dae159](https://github.com/lensapp/lens/commit/0dae1594baabbd06e798f9a1b4c132cee998bb65)) - - -### Features - -* Add deleting subNamespaces to contextMenu ([89cf491](https://github.com/lensapp/lens/commit/89cf491bc0aa80ee398f8b5dc39ec7c69d00c7bb)) -* Add removing subNamespaces to Namespace route ([aa95002](https://github.com/lensapp/lens/commit/aa950026a3162abf6322afb4b5c5bf56f9f7e10f)) -* Adjust container status colors to be distinguable with red/green filter ([#7621](https://github.com/lensapp/lens/issues/7621)) ([3532fc1](https://github.com/lensapp/lens/commit/3532fc1dab918190fa76199a9d7b04d6efe40c47)) -* Compute the kubectl download version map at build time ([0bd7b1f](https://github.com/lensapp/lens/commit/0bd7b1fe92a173379c8a5a1ab7e13cf9e4f8223b)) -* Improve formatting error messages from apiKube ([3439472](https://github.com/lensapp/lens/commit/3439472065e6b850e286f6a34bccc23b827b8e28)) -* Introduce API for changing the status bar colour ([06a0dce](https://github.com/lensapp/lens/commit/06a0dce612b67084f8f36ba552ea23f8ac071201)) -* Introduce injectables to remove subNamespaces ([c557225](https://github.com/lensapp/lens/commit/c5572257bd6a32a2f05fc78f54ece428f54389fe)) -* Never auto-close error notifications ([561d8db](https://github.com/lensapp/lens/commit/561d8dbc09581ff21aa79e85f3903c45e99ac33b)) - - - -# 6.5.0-alpha.6 (2023-04-12) - - - -# 6.5.0-alpha.5 (2023-04-12) - - - -# 6.5.0-alpha.4 (2023-04-12) - - -### Bug Fixes - -* Fix tests by recreating non-specific injection token ([c0ebe60](https://github.com/lensapp/lens/commit/c0ebe605c4d36c0d98454e25565818f75ffb1b69)) -* Referencing apiManager should not throw ([#7468](https://github.com/lensapp/lens/issues/7468)) ([351f9d4](https://github.com/lensapp/lens/commit/351f9d492f6e52e9e97d17d71e2bbdbbde4ea2db)) -* remove platform specific injectable file names ([9b0318b](https://github.com/lensapp/lens/commit/9b0318b493fe2e49a34b8a4cb3d0bef1600759b8)) - - -### Features - -* Allow built versions to specify an environment ([#7495](https://github.com/lensapp/lens/issues/7495)) ([128b05d](https://github.com/lensapp/lens/commit/128b05d4d46344a511398f654865c133c6e36514)) - - -### Reverts - -* Revert "Renderer file logging through IPC" (#7393) ([5409324](https://github.com/lensapp/lens/commit/54093242367717292312df01905d052b66017953)), closes [#7393](https://github.com/lensapp/lens/issues/7393) - - - -# 6.5.0-alpha.3 (2023-03-15) - - - -# 6.5.0-alpha.2 (2023-03-14) - - - -# 6.5.0-alpha.1 (2023-03-14) - - -### Reverts - -* Revert "Renderer file logging transport (#6795)" (#7245) ([ec81af4](https://github.com/lensapp/lens/commit/ec81af4e6c5f8d0c25469a56dfa602894f85734b)), closes [#6795](https://github.com/lensapp/lens/issues/6795) [#7245](https://github.com/lensapp/lens/issues/7245) [#544](https://github.com/lensapp/lens/issues/544) - - - -# 6.4.0-beta.13 (2023-02-03) - - - -# 6.4.0-beta.12 (2023-02-01) - - - -# 6.4.0-beta.11 (2023-02-01) - - - -# 6.4.0-beta.10 (2023-01-27) - - - -# 6.4.0-beta.9 (2023-01-27) - - - -# 6.4.0-beta.8 (2023-01-27) - - - -# 6.4.0-beta.7 (2023-01-27) - - - -# 6.4.0-beta.6 (2023-01-26) - - - -# 6.4.0-beta.5 (2023-01-26) - - - -# 6.4.0-beta.4 (2023-01-26) - - - -# 6.4.0-beta.3 (2023-01-26) - - - - - -# 6.5.0-alpha.12 (2023-05-16) - - -### Bug Fixes - -* Don't crash when hovering hotbar menu index ([9d51ef2](https://github.com/lensapp/lens/commit/9d51ef2aa69c6c9df0fd57281b25131a10efd27a)) - - - -# 6.5.0-alpha.11 (2023-05-11) - - -### Bug Fixes - -* Add test as repro, and fix bug about kube API details not opening ([bb400ae](https://github.com/lensapp/lens/commit/bb400ae66797fe160567e6b728d85d5e79caef4d)) -* Bring back search filters for pods which were accidentally removed previously ([9c7be39](https://github.com/lensapp/lens/commit/9c7be39eb135b747945f76f61811695d2f96c761)) -* Do not crash when opening details of a helm release ([40af0d3](https://github.com/lensapp/lens/commit/40af0d31c529e252a45c7370852755c4e63067a7)) -* Kludge cluster settings not opening when extension introduces new settings without ID when title contains spaces ([e8491ca](https://github.com/lensapp/lens/commit/e8491ca2d39971d06842f6741eae042554fbc9a0)) - - - -# 6.5.0-alpha.10 (2023-05-09) - - - -# 6.5.0-alpha.9 (2023-05-04) - - -### Bug Fixes - -* Add checks to KubeObject constructor to ensure shape ([bf6af58](https://github.com/lensapp/lens/commit/bf6af58d80552a16be7a547f772902b138a12fbd)) -* add routingFeature to getDiForUnitTesting ([b33a8b4](https://github.com/lensapp/lens/commit/b33a8b49607935450f70b1d5535431ba416fc22e)) -* change class name behaviour to limit snapshot diffs ([bfb2b8e](https://github.com/lensapp/lens/commit/bfb2b8e6591891b529d5cf0f8757ff8b7080e004)) -* **core:** hide update button if downloading of an update fails ([f697742](https://github.com/lensapp/lens/commit/f6977428daa3f61482e7066689ebf7092b0fb2b1)) -* Fix selfLink being missing from requestKubeResource ([b90e04e](https://github.com/lensapp/lens/commit/b90e04e02dfd18896d5f08f1bc36f90179635797)) -* lint:fix ([76c11aa](https://github.com/lensapp/lens/commit/76c11aa697e3ada81c876fe8a3ac6e33b4ce8cb9)) -* observableHistoryInjectionToken and 1 revert for GlobalOverride ([8c0220c](https://github.com/lensapp/lens/commit/8c0220c353c9047a2a4df570b598c31868b5f7e2)) -* Only show Update Channel preferences when applicable ([43cedae](https://github.com/lensapp/lens/commit/43cedae7b05eaa7f932f2718939f7b856a1b86c5)) -* Remove incorrect timeout on standard info notifications ([bcf95a6](https://github.com/lensapp/lens/commit/bcf95a65f1d2be91fa613f0da9d0ae978faaef75)) -* removed as-legacy-globals-for-extension-api ([f1f2634](https://github.com/lensapp/lens/commit/f1f26344900b99c70b2bed2f453ed27574d7b417)) -* removed dependencies: [reactApplicationFeature], ([0dae159](https://github.com/lensapp/lens/commit/0dae1594baabbd06e798f9a1b4c132cee998bb65)) - - -### Features - -* Add deleting subNamespaces to contextMenu ([89cf491](https://github.com/lensapp/lens/commit/89cf491bc0aa80ee398f8b5dc39ec7c69d00c7bb)) -* Add removing subNamespaces to Namespace route ([aa95002](https://github.com/lensapp/lens/commit/aa950026a3162abf6322afb4b5c5bf56f9f7e10f)) -* Adjust container status colors to be distinguable with red/green filter ([#7621](https://github.com/lensapp/lens/issues/7621)) ([3532fc1](https://github.com/lensapp/lens/commit/3532fc1dab918190fa76199a9d7b04d6efe40c47)) -* Compute the kubectl download version map at build time ([0bd7b1f](https://github.com/lensapp/lens/commit/0bd7b1fe92a173379c8a5a1ab7e13cf9e4f8223b)) -* Improve formatting error messages from apiKube ([3439472](https://github.com/lensapp/lens/commit/3439472065e6b850e286f6a34bccc23b827b8e28)) -* Introduce API for changing the status bar colour ([06a0dce](https://github.com/lensapp/lens/commit/06a0dce612b67084f8f36ba552ea23f8ac071201)) -* Introduce injectables to remove subNamespaces ([c557225](https://github.com/lensapp/lens/commit/c5572257bd6a32a2f05fc78f54ece428f54389fe)) -* Never auto-close error notifications ([561d8db](https://github.com/lensapp/lens/commit/561d8dbc09581ff21aa79e85f3903c45e99ac33b)) - - - -# 6.5.0-alpha.6 (2023-04-12) - - - -# 6.5.0-alpha.5 (2023-04-12) - - - -# 6.5.0-alpha.4 (2023-04-12) - - -### Bug Fixes - -* Fix tests by recreating non-specific injection token ([c0ebe60](https://github.com/lensapp/lens/commit/c0ebe605c4d36c0d98454e25565818f75ffb1b69)) -* Referencing apiManager should not throw ([#7468](https://github.com/lensapp/lens/issues/7468)) ([351f9d4](https://github.com/lensapp/lens/commit/351f9d492f6e52e9e97d17d71e2bbdbbde4ea2db)) -* remove platform specific injectable file names ([9b0318b](https://github.com/lensapp/lens/commit/9b0318b493fe2e49a34b8a4cb3d0bef1600759b8)) - - -### Features - -* Allow built versions to specify an environment ([#7495](https://github.com/lensapp/lens/issues/7495)) ([128b05d](https://github.com/lensapp/lens/commit/128b05d4d46344a511398f654865c133c6e36514)) - - -### Reverts - -* Revert "Renderer file logging through IPC" (#7393) ([5409324](https://github.com/lensapp/lens/commit/54093242367717292312df01905d052b66017953)), closes [#7393](https://github.com/lensapp/lens/issues/7393) - - - -# 6.5.0-alpha.3 (2023-03-15) - - - -# 6.5.0-alpha.2 (2023-03-14) - - - -# 6.5.0-alpha.1 (2023-03-14) - - -### Reverts - -* Revert "Renderer file logging transport (#6795)" (#7245) ([ec81af4](https://github.com/lensapp/lens/commit/ec81af4e6c5f8d0c25469a56dfa602894f85734b)), closes [#6795](https://github.com/lensapp/lens/issues/6795) [#7245](https://github.com/lensapp/lens/issues/7245) [#544](https://github.com/lensapp/lens/issues/544) - - - -# 6.4.0-beta.13 (2023-02-03) - - - -# 6.4.0-beta.12 (2023-02-01) - - - -# 6.4.0-beta.11 (2023-02-01) - - - -# 6.4.0-beta.10 (2023-01-27) - - - -# 6.4.0-beta.9 (2023-01-27) - - - -# 6.4.0-beta.8 (2023-01-27) - - - -# 6.4.0-beta.7 (2023-01-27) - - - -# 6.4.0-beta.6 (2023-01-26) - - - -# 6.4.0-beta.5 (2023-01-26) - - - -# 6.4.0-beta.4 (2023-01-26) - - - -# 6.4.0-beta.3 (2023-01-26) - - - - - -# 6.5.0-alpha.11 (2023-05-11) - - -### Bug Fixes - -* Add test as repro, and fix bug about kube API details not opening ([bb400ae](https://github.com/lensapp/lens/commit/bb400ae66797fe160567e6b728d85d5e79caef4d)) -* Bring back search filters for pods which were accidentally removed previously ([9c7be39](https://github.com/lensapp/lens/commit/9c7be39eb135b747945f76f61811695d2f96c761)) -* Do not crash when opening details of a helm release ([40af0d3](https://github.com/lensapp/lens/commit/40af0d31c529e252a45c7370852755c4e63067a7)) -* Kludge cluster settings not opening when extension introduces new settings without ID when title contains spaces ([e8491ca](https://github.com/lensapp/lens/commit/e8491ca2d39971d06842f6741eae042554fbc9a0)) - - - -# 6.5.0-alpha.10 (2023-05-09) - - - -# 6.5.0-alpha.9 (2023-05-04) - - -### Bug Fixes - -* Add checks to KubeObject constructor to ensure shape ([bf6af58](https://github.com/lensapp/lens/commit/bf6af58d80552a16be7a547f772902b138a12fbd)) -* add routingFeature to getDiForUnitTesting ([b33a8b4](https://github.com/lensapp/lens/commit/b33a8b49607935450f70b1d5535431ba416fc22e)) -* change class name behaviour to limit snapshot diffs ([bfb2b8e](https://github.com/lensapp/lens/commit/bfb2b8e6591891b529d5cf0f8757ff8b7080e004)) -* **core:** hide update button if downloading of an update fails ([f697742](https://github.com/lensapp/lens/commit/f6977428daa3f61482e7066689ebf7092b0fb2b1)) -* Fix selfLink being missing from requestKubeResource ([b90e04e](https://github.com/lensapp/lens/commit/b90e04e02dfd18896d5f08f1bc36f90179635797)) -* lint:fix ([76c11aa](https://github.com/lensapp/lens/commit/76c11aa697e3ada81c876fe8a3ac6e33b4ce8cb9)) -* observableHistoryInjectionToken and 1 revert for GlobalOverride ([8c0220c](https://github.com/lensapp/lens/commit/8c0220c353c9047a2a4df570b598c31868b5f7e2)) -* Only show Update Channel preferences when applicable ([43cedae](https://github.com/lensapp/lens/commit/43cedae7b05eaa7f932f2718939f7b856a1b86c5)) -* Remove incorrect timeout on standard info notifications ([bcf95a6](https://github.com/lensapp/lens/commit/bcf95a65f1d2be91fa613f0da9d0ae978faaef75)) -* removed as-legacy-globals-for-extension-api ([f1f2634](https://github.com/lensapp/lens/commit/f1f26344900b99c70b2bed2f453ed27574d7b417)) -* removed dependencies: [reactApplicationFeature], ([0dae159](https://github.com/lensapp/lens/commit/0dae1594baabbd06e798f9a1b4c132cee998bb65)) - - -### Features - -* Add deleting subNamespaces to contextMenu ([89cf491](https://github.com/lensapp/lens/commit/89cf491bc0aa80ee398f8b5dc39ec7c69d00c7bb)) -* Add removing subNamespaces to Namespace route ([aa95002](https://github.com/lensapp/lens/commit/aa950026a3162abf6322afb4b5c5bf56f9f7e10f)) -* Adjust container status colors to be distinguable with red/green filter ([#7621](https://github.com/lensapp/lens/issues/7621)) ([3532fc1](https://github.com/lensapp/lens/commit/3532fc1dab918190fa76199a9d7b04d6efe40c47)) -* Compute the kubectl download version map at build time ([0bd7b1f](https://github.com/lensapp/lens/commit/0bd7b1fe92a173379c8a5a1ab7e13cf9e4f8223b)) -* Improve formatting error messages from apiKube ([3439472](https://github.com/lensapp/lens/commit/3439472065e6b850e286f6a34bccc23b827b8e28)) -* Introduce API for changing the status bar colour ([06a0dce](https://github.com/lensapp/lens/commit/06a0dce612b67084f8f36ba552ea23f8ac071201)) -* Introduce injectables to remove subNamespaces ([c557225](https://github.com/lensapp/lens/commit/c5572257bd6a32a2f05fc78f54ece428f54389fe)) -* Never auto-close error notifications ([561d8db](https://github.com/lensapp/lens/commit/561d8dbc09581ff21aa79e85f3903c45e99ac33b)) - - - -# 6.5.0-alpha.6 (2023-04-12) - - - -# 6.5.0-alpha.5 (2023-04-12) - - - -# 6.5.0-alpha.4 (2023-04-12) - - -### Bug Fixes - -* Fix tests by recreating non-specific injection token ([c0ebe60](https://github.com/lensapp/lens/commit/c0ebe605c4d36c0d98454e25565818f75ffb1b69)) -* Referencing apiManager should not throw ([#7468](https://github.com/lensapp/lens/issues/7468)) ([351f9d4](https://github.com/lensapp/lens/commit/351f9d492f6e52e9e97d17d71e2bbdbbde4ea2db)) -* remove platform specific injectable file names ([9b0318b](https://github.com/lensapp/lens/commit/9b0318b493fe2e49a34b8a4cb3d0bef1600759b8)) - - -### Features - -* Allow built versions to specify an environment ([#7495](https://github.com/lensapp/lens/issues/7495)) ([128b05d](https://github.com/lensapp/lens/commit/128b05d4d46344a511398f654865c133c6e36514)) - - -### Reverts - -* Revert "Renderer file logging through IPC" (#7393) ([5409324](https://github.com/lensapp/lens/commit/54093242367717292312df01905d052b66017953)), closes [#7393](https://github.com/lensapp/lens/issues/7393) - - - -# 6.5.0-alpha.3 (2023-03-15) - - - -# 6.5.0-alpha.2 (2023-03-14) - - - -# 6.5.0-alpha.1 (2023-03-14) - - -### Reverts - -* Revert "Renderer file logging transport (#6795)" (#7245) ([ec81af4](https://github.com/lensapp/lens/commit/ec81af4e6c5f8d0c25469a56dfa602894f85734b)), closes [#6795](https://github.com/lensapp/lens/issues/6795) [#7245](https://github.com/lensapp/lens/issues/7245) [#544](https://github.com/lensapp/lens/issues/544) - - - -# 6.4.0-beta.13 (2023-02-03) - - - -# 6.4.0-beta.12 (2023-02-01) - - - -# 6.4.0-beta.11 (2023-02-01) - - - -# 6.4.0-beta.10 (2023-01-27) - - - -# 6.4.0-beta.9 (2023-01-27) - - - -# 6.4.0-beta.8 (2023-01-27) - - - -# 6.4.0-beta.7 (2023-01-27) - - - -# 6.4.0-beta.6 (2023-01-26) - - - -# 6.4.0-beta.5 (2023-01-26) - - - -# 6.4.0-beta.4 (2023-01-26) - - - -# 6.4.0-beta.3 (2023-01-26) - - - - - -# 6.5.0-alpha.10 (2023-05-09) - - - -# 6.5.0-alpha.9 (2023-05-04) - - -### Bug Fixes - -* Add checks to KubeObject constructor to ensure shape ([bf6af58](https://github.com/lensapp/lens/commit/bf6af58d80552a16be7a547f772902b138a12fbd)) -* add routingFeature to getDiForUnitTesting ([b33a8b4](https://github.com/lensapp/lens/commit/b33a8b49607935450f70b1d5535431ba416fc22e)) -* change class name behaviour to limit snapshot diffs ([bfb2b8e](https://github.com/lensapp/lens/commit/bfb2b8e6591891b529d5cf0f8757ff8b7080e004)) -* **core:** hide update button if downloading of an update fails ([f697742](https://github.com/lensapp/lens/commit/f6977428daa3f61482e7066689ebf7092b0fb2b1)) -* Fix selfLink being missing from requestKubeResource ([b90e04e](https://github.com/lensapp/lens/commit/b90e04e02dfd18896d5f08f1bc36f90179635797)) -* lint:fix ([76c11aa](https://github.com/lensapp/lens/commit/76c11aa697e3ada81c876fe8a3ac6e33b4ce8cb9)) -* observableHistoryInjectionToken and 1 revert for GlobalOverride ([8c0220c](https://github.com/lensapp/lens/commit/8c0220c353c9047a2a4df570b598c31868b5f7e2)) -* Only show Update Channel preferences when applicable ([43cedae](https://github.com/lensapp/lens/commit/43cedae7b05eaa7f932f2718939f7b856a1b86c5)) -* Remove incorrect timeout on standard info notifications ([bcf95a6](https://github.com/lensapp/lens/commit/bcf95a65f1d2be91fa613f0da9d0ae978faaef75)) -* removed as-legacy-globals-for-extension-api ([f1f2634](https://github.com/lensapp/lens/commit/f1f26344900b99c70b2bed2f453ed27574d7b417)) -* removed dependencies: [reactApplicationFeature], ([0dae159](https://github.com/lensapp/lens/commit/0dae1594baabbd06e798f9a1b4c132cee998bb65)) - - -### Features - -* Add deleting subNamespaces to contextMenu ([89cf491](https://github.com/lensapp/lens/commit/89cf491bc0aa80ee398f8b5dc39ec7c69d00c7bb)) -* Add removing subNamespaces to Namespace route ([aa95002](https://github.com/lensapp/lens/commit/aa950026a3162abf6322afb4b5c5bf56f9f7e10f)) -* Adjust container status colors to be distinguable with red/green filter ([#7621](https://github.com/lensapp/lens/issues/7621)) ([3532fc1](https://github.com/lensapp/lens/commit/3532fc1dab918190fa76199a9d7b04d6efe40c47)) -* Compute the kubectl download version map at build time ([0bd7b1f](https://github.com/lensapp/lens/commit/0bd7b1fe92a173379c8a5a1ab7e13cf9e4f8223b)) -* Improve formatting error messages from apiKube ([3439472](https://github.com/lensapp/lens/commit/3439472065e6b850e286f6a34bccc23b827b8e28)) -* Introduce API for changing the status bar colour ([06a0dce](https://github.com/lensapp/lens/commit/06a0dce612b67084f8f36ba552ea23f8ac071201)) -* Introduce injectables to remove subNamespaces ([c557225](https://github.com/lensapp/lens/commit/c5572257bd6a32a2f05fc78f54ece428f54389fe)) -* Never auto-close error notifications ([561d8db](https://github.com/lensapp/lens/commit/561d8dbc09581ff21aa79e85f3903c45e99ac33b)) - - - -# 6.5.0-alpha.6 (2023-04-12) - - - -# 6.5.0-alpha.5 (2023-04-12) - - - -# 6.5.0-alpha.4 (2023-04-12) - - -### Bug Fixes - -* Fix tests by recreating non-specific injection token ([c0ebe60](https://github.com/lensapp/lens/commit/c0ebe605c4d36c0d98454e25565818f75ffb1b69)) -* Referencing apiManager should not throw ([#7468](https://github.com/lensapp/lens/issues/7468)) ([351f9d4](https://github.com/lensapp/lens/commit/351f9d492f6e52e9e97d17d71e2bbdbbde4ea2db)) -* remove platform specific injectable file names ([9b0318b](https://github.com/lensapp/lens/commit/9b0318b493fe2e49a34b8a4cb3d0bef1600759b8)) - - -### Features - -* Allow built versions to specify an environment ([#7495](https://github.com/lensapp/lens/issues/7495)) ([128b05d](https://github.com/lensapp/lens/commit/128b05d4d46344a511398f654865c133c6e36514)) - - -### Reverts - -* Revert "Renderer file logging through IPC" (#7393) ([5409324](https://github.com/lensapp/lens/commit/54093242367717292312df01905d052b66017953)), closes [#7393](https://github.com/lensapp/lens/issues/7393) - - - -# 6.5.0-alpha.3 (2023-03-15) - - - -# 6.5.0-alpha.2 (2023-03-14) - - - -# 6.5.0-alpha.1 (2023-03-14) - - -### Reverts - -* Revert "Renderer file logging transport (#6795)" (#7245) ([ec81af4](https://github.com/lensapp/lens/commit/ec81af4e6c5f8d0c25469a56dfa602894f85734b)), closes [#6795](https://github.com/lensapp/lens/issues/6795) [#7245](https://github.com/lensapp/lens/issues/7245) [#544](https://github.com/lensapp/lens/issues/544) - - - -# 6.4.0-beta.13 (2023-02-03) - - - -# 6.4.0-beta.12 (2023-02-01) - - - -# 6.4.0-beta.11 (2023-02-01) - - - -# 6.4.0-beta.10 (2023-01-27) - - - -# 6.4.0-beta.9 (2023-01-27) - - - -# 6.4.0-beta.8 (2023-01-27) - - - -# 6.4.0-beta.7 (2023-01-27) - - - -# 6.4.0-beta.6 (2023-01-26) - - - -# 6.4.0-beta.5 (2023-01-26) - - - -# 6.4.0-beta.4 (2023-01-26) - - - -# 6.4.0-beta.3 (2023-01-26) - - - - - -# 6.5.0-alpha.9 (2023-05-04) - - -### Bug Fixes - -* Add checks to KubeObject constructor to ensure shape ([bf6af58](https://github.com/lensapp/lens/commit/bf6af58d80552a16be7a547f772902b138a12fbd)) -* add routingFeature to getDiForUnitTesting ([b33a8b4](https://github.com/lensapp/lens/commit/b33a8b49607935450f70b1d5535431ba416fc22e)) -* change class name behaviour to limit snapshot diffs ([bfb2b8e](https://github.com/lensapp/lens/commit/bfb2b8e6591891b529d5cf0f8757ff8b7080e004)) -* **core:** hide update button if downloading of an update fails ([f697742](https://github.com/lensapp/lens/commit/f6977428daa3f61482e7066689ebf7092b0fb2b1)) -* Fix selfLink being missing from requestKubeResource ([b90e04e](https://github.com/lensapp/lens/commit/b90e04e02dfd18896d5f08f1bc36f90179635797)) -* lint:fix ([76c11aa](https://github.com/lensapp/lens/commit/76c11aa697e3ada81c876fe8a3ac6e33b4ce8cb9)) -* observableHistoryInjectionToken and 1 revert for GlobalOverride ([8c0220c](https://github.com/lensapp/lens/commit/8c0220c353c9047a2a4df570b598c31868b5f7e2)) -* Only show Update Channel preferences when applicable ([43cedae](https://github.com/lensapp/lens/commit/43cedae7b05eaa7f932f2718939f7b856a1b86c5)) -* Remove incorrect timeout on standard info notifications ([bcf95a6](https://github.com/lensapp/lens/commit/bcf95a65f1d2be91fa613f0da9d0ae978faaef75)) -* removed as-legacy-globals-for-extension-api ([f1f2634](https://github.com/lensapp/lens/commit/f1f26344900b99c70b2bed2f453ed27574d7b417)) -* removed dependencies: [reactApplicationFeature], ([0dae159](https://github.com/lensapp/lens/commit/0dae1594baabbd06e798f9a1b4c132cee998bb65)) - - -### Features - -* Add deleting subNamespaces to contextMenu ([89cf491](https://github.com/lensapp/lens/commit/89cf491bc0aa80ee398f8b5dc39ec7c69d00c7bb)) -* Add removing subNamespaces to Namespace route ([aa95002](https://github.com/lensapp/lens/commit/aa950026a3162abf6322afb4b5c5bf56f9f7e10f)) -* Adjust container status colors to be distinguable with red/green filter ([#7621](https://github.com/lensapp/lens/issues/7621)) ([3532fc1](https://github.com/lensapp/lens/commit/3532fc1dab918190fa76199a9d7b04d6efe40c47)) -* Compute the kubectl download version map at build time ([0bd7b1f](https://github.com/lensapp/lens/commit/0bd7b1fe92a173379c8a5a1ab7e13cf9e4f8223b)) -* Improve formatting error messages from apiKube ([3439472](https://github.com/lensapp/lens/commit/3439472065e6b850e286f6a34bccc23b827b8e28)) -* Introduce API for changing the status bar colour ([06a0dce](https://github.com/lensapp/lens/commit/06a0dce612b67084f8f36ba552ea23f8ac071201)) -* Introduce injectables to remove subNamespaces ([c557225](https://github.com/lensapp/lens/commit/c5572257bd6a32a2f05fc78f54ece428f54389fe)) -* Never auto-close error notifications ([561d8db](https://github.com/lensapp/lens/commit/561d8dbc09581ff21aa79e85f3903c45e99ac33b)) - - - -# 6.5.0-alpha.6 (2023-04-12) - - - -# 6.5.0-alpha.5 (2023-04-12) - - - -# 6.5.0-alpha.4 (2023-04-12) - - -### Bug Fixes - -* Fix tests by recreating non-specific injection token ([c0ebe60](https://github.com/lensapp/lens/commit/c0ebe605c4d36c0d98454e25565818f75ffb1b69)) -* Referencing apiManager should not throw ([#7468](https://github.com/lensapp/lens/issues/7468)) ([351f9d4](https://github.com/lensapp/lens/commit/351f9d492f6e52e9e97d17d71e2bbdbbde4ea2db)) -* remove platform specific injectable file names ([9b0318b](https://github.com/lensapp/lens/commit/9b0318b493fe2e49a34b8a4cb3d0bef1600759b8)) - - -### Features - -* Allow built versions to specify an environment ([#7495](https://github.com/lensapp/lens/issues/7495)) ([128b05d](https://github.com/lensapp/lens/commit/128b05d4d46344a511398f654865c133c6e36514)) - - -### Reverts - -* Revert "Renderer file logging through IPC" (#7393) ([5409324](https://github.com/lensapp/lens/commit/54093242367717292312df01905d052b66017953)), closes [#7393](https://github.com/lensapp/lens/issues/7393) - - - -# 6.5.0-alpha.3 (2023-03-15) - - - -# 6.5.0-alpha.2 (2023-03-14) - - - -# 6.5.0-alpha.1 (2023-03-14) - - -### Reverts - -* Revert "Renderer file logging transport (#6795)" (#7245) ([ec81af4](https://github.com/lensapp/lens/commit/ec81af4e6c5f8d0c25469a56dfa602894f85734b)), closes [#6795](https://github.com/lensapp/lens/issues/6795) [#7245](https://github.com/lensapp/lens/issues/7245) [#544](https://github.com/lensapp/lens/issues/544) - - - -# 6.4.0-beta.13 (2023-02-03) - - - -# 6.4.0-beta.12 (2023-02-01) - - - -# 6.4.0-beta.11 (2023-02-01) - - - -# 6.4.0-beta.10 (2023-01-27) - - - -# 6.4.0-beta.9 (2023-01-27) - - - -# 6.4.0-beta.8 (2023-01-27) - - - -# 6.4.0-beta.7 (2023-01-27) - - - -# 6.4.0-beta.6 (2023-01-26) - - - -# 6.4.0-beta.5 (2023-01-26) - - - -# 6.4.0-beta.4 (2023-01-26) - - - -# 6.4.0-beta.3 (2023-01-26) diff --git a/packages/core/__mocks__/@sentry/electron/main.ts b/packages/core/__mocks__/@sentry/electron/main.ts deleted file mode 100644 index cbe02cb296..0000000000 --- a/packages/core/__mocks__/@sentry/electron/main.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -export default {}; diff --git a/packages/core/__mocks__/@sentry/electron/renderer.ts b/packages/core/__mocks__/@sentry/electron/renderer.ts deleted file mode 100644 index cbe02cb296..0000000000 --- a/packages/core/__mocks__/@sentry/electron/renderer.ts +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -export default {}; diff --git a/packages/core/__mocks__/assetMock.ts b/packages/core/__mocks__/assetMock.ts deleted file mode 100644 index 5412bc08dc..0000000000 --- a/packages/core/__mocks__/assetMock.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export default ""; // mostly path to bundled file or data-url (webpack) diff --git a/packages/core/__mocks__/electron-updater.ts b/packages/core/__mocks__/electron-updater.ts deleted file mode 100644 index 6d39773984..0000000000 --- a/packages/core/__mocks__/electron-updater.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -// This mock exists because library causes criminal side-effect on import -export const autoUpdater = {}; diff --git a/packages/core/__mocks__/electron.ts b/packages/core/__mocks__/electron.ts deleted file mode 100644 index 5375ed631b..0000000000 --- a/packages/core/__mocks__/electron.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -export default { - require: jest.fn(), - match: jest.fn(), - app: { - getVersion: jest.fn().mockReturnValue("3.0.0"), - getLocale: jest.fn().mockRejectedValue("en"), - getPath: jest.fn(() => "tmp"), - }, - dialog: jest.fn(), - ipcRenderer: { - on: jest.fn(), - }, -}; diff --git a/packages/core/__mocks__/node-pty.ts b/packages/core/__mocks__/node-pty.ts deleted file mode 100644 index 92b96563ee..0000000000 --- a/packages/core/__mocks__/node-pty.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -// This mock exists because library causes criminal side-effect on import -export default {}; diff --git a/packages/core/__mocks__/react-beautiful-dnd.tsx b/packages/core/__mocks__/react-beautiful-dnd.tsx deleted file mode 100644 index e3549c2968..0000000000 --- a/packages/core/__mocks__/react-beautiful-dnd.tsx +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import React from "react"; - -import type { - DragDropContextProps, - DraggableProps, - DraggableProvidedDraggableProps, - DroppableProps, - DroppableProvidedProps, -} from "react-beautiful-dnd"; - -export const DragDropContext = ({ children }: DragDropContextProps) => <>{ children }; -export const Draggable = ({ children }: DraggableProps) => ( - <> - { - children( - { - draggableProps: {} as DraggableProvidedDraggableProps, - innerRef: () => {}, - }, - { - isDragging: false, - isDropAnimating: false, - }, - { - draggableId: "some-mock-draggable-id", - mode: "FLUID", - source: { - droppableId: "some-mock-droppable-id", - index: 0, - }, - }, - ) - } - -); -export const Droppable = ({ children }: DroppableProps) => ( - <> - { - children( - { - droppableProps: {} as DroppableProvidedProps, - innerRef: () => {}, - }, - { - isDraggingOver: false, - isUsingPlaceholder: false, - }, - ) - } - -); diff --git a/packages/core/__mocks__/react-virtualized-auto-sizer.tsx b/packages/core/__mocks__/react-virtualized-auto-sizer.tsx deleted file mode 100644 index ede5de41cb..0000000000 --- a/packages/core/__mocks__/react-virtualized-auto-sizer.tsx +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import React from "react"; -import type { Size } from "react-virtualized-auto-sizer"; - -export default ({ children } : { children: (size: Size) => React.ReactNode }) => { - return ( -
- {children({ - height: 420000, - width: 100, - })} -
- ); -}; diff --git a/packages/core/build/entitlements.mac.plist b/packages/core/build/entitlements.mac.plist deleted file mode 100644 index 9a279dc836..0000000000 --- a/packages/core/build/entitlements.mac.plist +++ /dev/null @@ -1,12 +0,0 @@ - - - - - com.apple.security.cs.allow-jit - - com.apple.security.cs.allow-unsigned-executable-memory - - com.apple.security.cs.disable-library-validation - - - diff --git a/packages/core/build/icon.ico b/packages/core/build/icon.ico deleted file mode 100644 index af1ec205bd..0000000000 Binary files a/packages/core/build/icon.ico and /dev/null differ diff --git a/packages/core/build/icon.png b/packages/core/build/icon.png deleted file mode 100644 index 2c953f6efd..0000000000 Binary files a/packages/core/build/icon.png and /dev/null differ diff --git a/packages/core/build/icons/512x512.png b/packages/core/build/icons/512x512.png deleted file mode 100644 index e08b9f5b15..0000000000 Binary files a/packages/core/build/icons/512x512.png and /dev/null differ diff --git a/packages/core/build/icons/512x512@2x.png b/packages/core/build/icons/512x512@2x.png deleted file mode 100644 index da0aa8ae80..0000000000 Binary files a/packages/core/build/icons/512x512@2x.png and /dev/null differ diff --git a/packages/core/build/installer.nsh b/packages/core/build/installer.nsh deleted file mode 100644 index d0fe18809a..0000000000 --- a/packages/core/build/installer.nsh +++ /dev/null @@ -1,15 +0,0 @@ -!macro customInit - ; Make sure all old extensions are removed - RMDir /r "$INSTDIR\resources\extensions" - - ; Workaround for installer handing when the app directory is removed manually - ${ifNot} ${FileExists} "$INSTDIR" - DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\{${UNINSTALL_APP_KEY}}" - ${EndIf} - - ; Workaround for the old-format uninstall registry key (some people report it causes hangups, too) - ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_APP_KEY}" "QuietUninstallString" - StrCmp $0 "" proceed 0 - DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\${UNINSTALL_APP_KEY}" - proceed: -!macroend \ No newline at end of file diff --git a/packages/core/package.json b/packages/core/package.json deleted file mode 100644 index e830c28b8d..0000000000 --- a/packages/core/package.json +++ /dev/null @@ -1,324 +0,0 @@ -{ - "name": "@k8slens/core", - "productName": "", - "description": "Lens Desktop Core", - "homepage": "https://github.com/lensapp/lens", - "version": "6.5.0", - "repository": { - "type": "git", - "url": "git+https://github.com/lensapp/lens.git" - }, - "keywords": [], - "bugs": { - "url": "https://github.com/lensapp/lens/issues" - }, - "publishConfig": { - "access": "public", - "registry": "https://registry.npmjs.org/" - }, - "main": "static/build/main.js", - "exports": { - "./package.json": "./package.json", - "./main": "./static/build/library/main.js", - "./renderer": "./static/build/library/renderer.js", - "./styles": "./static/build/library/renderer.css", - "./template.html": "./src/renderer/template.html", - "./vars.scss": "./src/renderer/components/vars.scss", - "./fonts": "./static/build/library/fonts" - }, - "typesVersions": { - "*": { - "main": [ - "./static/build/library/src/main/library.d.ts" - ], - "renderer": [ - "./static/build/library/src/renderer/library.d.ts" - ] - } - }, - "files": [ - "build/*.plist", - "build/installer.nsh", - "build/notarize.js", - "static/build/library/**/*", - "src/renderer/template.html", - "src/renderer/components/vars.scss", - "types/*", - "tsconfig.json" - ], - "copyright": "© 2023 OpenLens Authors", - "license": "MIT", - "author": "OpenLens Authors ", - "scripts": { - "build": "cross-env NODE_ENV=production webpack --config webpack/library-bundle.ts --progress && linkable-push", - "clean": "rimraf dist static/build", - "test:unit": "jest --testPathIgnorePatterns integration", - "test:watch": "func() { jest ${1} --watch --testPathIgnorePatterns integration; }; func", - "lint": "PROD=true eslint --ext js,ts,tsx --max-warnings=0 .", - "lint:fix": "npm run lint -- --fix" - }, - "config": { - "k8sProxyVersion": "0.3.0", - "bundledKubectlVersion": "1.23.3", - "bundledHelmVersion": "3.11.0", - "sentryDsn": "", - "contentSecurityPolicy": "script-src 'unsafe-eval' 'self'; frame-src https://*.lens.app:*/; img-src * data:", - "welcomeRoute": "/welcome" - }, - "engines": { - "node": ">=16 <17" - }, - "jest": { - "collectCoverage": false, - "verbose": true, - "transform": { - "^.+\\.(t|j)sx?$": [ - "@swc/jest" - ] - }, - "testEnvironment": "jsdom", - "resolver": "/src/jest-28-resolver.js", - "moduleNameMapper": { - "\\.(css|scss)$": "identity-obj-proxy", - "\\.(svg|png|jpg|eot|woff2?|ttf)$": "/__mocks__/assetMock.ts" - }, - "modulePathIgnorePatterns": [ - "/dist", - "/packages", - "/static/build" - ], - "setupFiles": [ - "/src/jest.setup.tsx", - "jest-canvas-mock" - ], - "globalSetup": "/src/jest.timezone.ts", - "setupFilesAfterEnv": [ - "/src/jest-after-env.setup.ts" - ], - "transformIgnorePatterns": [ - "node_modules/(?!jsonpath-plus)" - ], - "runtime": "@side/jest-runtime" - }, - "devDependencies": { - "@async-fn/jest": "1.6.4", - "@k8slens/messaging-fake-bridge": "^1.0.0", - "@k8slens/react-testing-library-discovery": "^1.0.0", - "@k8slens/test-utils": "^1.0.0", - "@ogre-tools/linkable": "^17.2.0", - "@sentry/types": "^6.19.7", - "@side/jest-runtime": "^1.1.0", - "@swc/cli": "^0.1.62", - "@swc/core": "^1.3.53", - "@swc/jest": "^0.2.26", - "@testing-library/dom": "^8.19.0", - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^12.1.5", - "@testing-library/user-event": "^13.5.0", - "@types/byline": "^4.2.33", - "@types/chart.js": "^2.9.36", - "@types/circular-dependency-plugin": "5.0.5", - "@types/color": "^3.0.3", - "@types/command-line-args": "^5.2.0", - "@types/crypto-js": "^3.1.47", - "@types/dompurify": "^2.4.0", - "@types/electron-devtools-installer": "^2.2.1", - "@types/fs-extra": "^9.0.13", - "@types/glob-to-regexp": "^0.4.1", - "@types/hapi__call": "^9.0.0", - "@types/hapi__subtext": "^7.0.0", - "@types/http-proxy": "^1.17.11", - "@types/jest": "^29.5.0", - "@types/js-yaml": "^4.0.5", - "@types/lodash": "^4.14.191", - "@types/marked": "^4.3.0", - "@types/md5-file": "^4.0.2", - "@types/memorystream": "^0.3.0", - "@types/mock-fs": "^4.13.1", - "@types/node": "^16.18.25", - "@types/proper-lockfile": "^4.1.2", - "@types/randomcolor": "^0.5.7", - "@types/react": "^17.0.45", - "@types/react-beautiful-dnd": "^13.1.4", - "@types/react-dom": "^17.0.16", - "@types/react-router": "^5.1.19", - "@types/react-router-dom": "^5.3.3", - "@types/react-table": "^7.7.14", - "@types/react-virtualized-auto-sizer": "^1.0.1", - "@types/react-window": "^1.8.5", - "@types/readable-stream": "^2.3.13", - "@types/semver": "^7.3.13", - "@types/stoppable": "^1.1.1", - "@types/tar": "^6.1.4", - "@types/tcp-port-used": "^1.0.1", - "@types/triple-beam": "^1.3.2", - "@types/url-parse": "^1.4.8", - "@types/uuid": "^8.3.4", - "@types/webpack": "^5.28.1", - "@types/webpack-env": "^1.18.0", - "@types/webpack-node-externals": "^2.5.3", - "@typescript-eslint/eslint-plugin": "^5.59.1", - "@typescript-eslint/parser": "^5.59.1", - "circular-dependency-plugin": "^5.2.2", - "concurrently": "^7.6.0", - "cross-env": "^7.0.3", - "css-loader": "^6.7.3", - "electron-builder": "^23.6.0", - "esbuild": "^0.17.8", - "esbuild-loader": "^2.21.0", - "eslint": "^8.39.0", - "eslint-import-resolver-typescript": "^3.5.3", - "eslint-plugin-header": "^3.1.1", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-react": "^7.32.2", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-unused-imports": "^2.0.0", - "fork-ts-checker-webpack-plugin": "^7.3.0", - "ignore-loader": "^0.1.2", - "include-media": "^1.4.10", - "jest": "^29.5.0", - "jest-canvas-mock": "^2.3.1", - "jest-environment-jsdom": "^28.1.3", - "jest-mock-extended": "^2.0.9", - "memfs": "^3.5.1", - "memorystream": "^0.3.1", - "mini-css-extract-plugin": "^2.7.2", - "mock-http": "^1.1.0", - "monaco-editor-webpack-plugin": "^7.0.1", - "node-loader": "^2.0.0", - "nodemon": "^2.0.20", - "postcss-loader": "^6.2.1", - "rimraf": "^4.4.1", - "sass-loader": "^12.6.0", - "style-loader": "^3.3.1", - "tailwindcss": "^3.3.2", - "ts-loader": "^9.4.2", - "ts-node": "^10.9.1", - "typedoc": "^0.24.6", - "typedoc-plugin-markdown": "^3.15.1", - "typescript": "^4.9.5", - "typescript-plugin-css-modules": "^5.0.1", - "webpack": "^5.81.0", - "webpack-cli": "^4.9.2", - "webpack-dev-server": "^4.13.3", - "webpack-node-externals": "^3.0.0" - }, - "peerDependencies": { - "@hapi/call": "^9.0.1", - "@hapi/subtext": "^7.1.0", - "@k8slens/animate": "^1.0.0-alpha.0", - "@k8slens/notifications": "^1.0.0", - "@k8slens/application": "^6.5.0-alpha.0", - "@k8slens/application-for-electron-main": "^6.5.0-alpha.0", - "@k8slens/button": "^1.0.0-alpha.5", - "@k8slens/cluster-settings": "^6.5.0-alpha.1", - "@k8slens/cluster-sidebar": "^1.0.0", - "@k8slens/error-boundary": "^1.0.0-alpha.5", - "@k8slens/event-emitter": "^1.0.0-alpha.1", - "@k8slens/icon": "^1.0.0-alpha.7", - "@k8slens/kube-api": "^1.0.0-alpha.1", - "@k8slens/kube-api-specifics": "^1.0.0-alpha.1", - "@k8slens/kube-object": "^1.0.0-alpha.5", - "@k8slens/kubectl-versions": "^1.0.0-alpha.0", - "@k8slens/legacy-extensions": "^1.0.0-alpha.0", - "@k8slens/legacy-global-di": "^1.0.0-alpha.0", - "@k8slens/list-layout": "^1.0.0-alpha.4", - "@k8slens/logger": "^1.0.0-alpha.5", - "@k8slens/messaging": "^1.0.0-alpha.1", - "@k8slens/messaging-for-main": "^1.0.0-alpha.1", - "@k8slens/messaging-for-renderer": "^1.0.0-alpha.1", - "@k8slens/metrics": "^6.5.0-alpha.7", - "@k8slens/node-fetch": "^6.5.0-alpha.3", - "@k8slens/prometheus": "^1.0.0", - "@k8slens/react-application": "^1.0.0-alpha.5", - "@k8slens/random": "^1.0.0", - "@k8slens/resizing-anchor": "^1.0.0-alpha.5", - "@k8slens/resource-templates": "^1.0.0-alpha.1", - "@k8slens/routing": "^1.0.0-alpha.5", - "@k8slens/run-many": "^1.0.0-alpha.1", - "@k8slens/spinner": "^1.0.0", - "@k8slens/startable-stoppable": "^1.0.0-alpha.1", - "@k8slens/tooltip": "^1.0.0-alpha.5", - "@k8slens/utilities": "^1.0.0-alpha.1", - "@kubernetes/client-node": "^0.18.1", - "@material-ui/core": "^4.12.3", - "@material-ui/lab": "^4.0.0-alpha.60", - "@ogre-tools/fp": "^17.2.0", - "@ogre-tools/injectable": "^17.2.0", - "@ogre-tools/injectable-extension-for-auto-registration": "^17.2.0", - "@ogre-tools/injectable-extension-for-mobx": "^17.2.0", - "@ogre-tools/injectable-react": "^17.2.0", - "@sentry/electron": "^3.0.8", - "@sentry/integrations": "^6.19.3", - "ansi_up": "^5.2.1", - "auto-bind": "^4.0.0", - "await-lock": "^2.2.2", - "byline": "^5.0.0", - "chalk": "^4.1.2", - "chart.js": "^2.9.4", - "chokidar": "^3.5.3", - "color": "^3.2.1", - "conf": "^10.2.0", - "crypto-js": "^4.1.1", - "dompurify": "^2.4.4", - "electron": "^22.3.10", - "electron-devtools-installer": "^3.2.0", - "electron-updater": "^4.6.5", - "electron-window-state": "^5.0.3", - "fs-extra": "^9.0.1", - "glob-to-regexp": "^0.4.1", - "grapheme-splitter": "^1.0.4", - "handlebars": "^4.7.7", - "history": "^4.10.1", - "hpagent": "^1.2.0", - "http-proxy": "^1.18.1", - "immer": "^9.0.21", - "joi": "^17.9.1", - "js-yaml": "^4.1.0", - "lodash": "^4.17.15", - "marked": "^4.2.12", - "mobx": "^6.9.0", - "mobx-observable-history": "^2.0.3", - "mobx-react": "^7.6.0", - "mobx-utils": "^6.0.4", - "moment": "^2.29.4", - "moment-timezone": "^0.5.40", - "monaco-editor": "^0.38.0", - "node-pty": "0.10.1", - "npm": "^9.6.7", - "path-to-regexp": "^6.2.0", - "proper-lockfile": "^4.1.2", - "query-string": "^7.1.3", - "randomcolor": "^0.6.2", - "react": "^17.0.2", - "react-beautiful-dnd": "^13.1.1", - "react-dom": "^17.0.2", - "react-material-ui-carousel": "^2.3.11", - "react-router": "^5.3.4", - "react-router-dom": "^5.3.4", - "react-select": "^5.7.0", - "react-select-event": "^5.5.1", - "react-table": "^7.8.0", - "react-virtualized-auto-sizer": "^1.0.7", - "react-window": "^1.8.8", - "rfc6902": "^5.0.1", - "selfsigned": "^2.1.1", - "semver": "^7.3.8", - "stoppable": "^1.1.0", - "tar": "^6.1.13", - "tcp-port-used": "^1.0.2", - "tempy": "1.0.1", - "type-fest": "^2.14.0", - "typed-emitter": "^1.4.0", - "typed-regex": "^0.0.8", - "url-parse": "^1.5.10", - "uuid": "^8.3.2", - "win-ca": "^3.5.0", - "winston": "^3.8.2", - "winston-transport-browserconsole": "^1.0.5", - "ws": "^8.12.1", - "xterm": "^4.19.0", - "xterm-addon-fit": "^0.5.0", - "xterm-link-provider": "^1.3.1" - } -} diff --git a/packages/core/src/common/.gitkeep b/packages/core/src/common/.gitkeep deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/core/src/common/__tests__/catalog-category-registry.test.ts b/packages/core/src/common/__tests__/catalog-category-registry.test.ts deleted file mode 100644 index 7da9e1c7c7..0000000000 --- a/packages/core/src/common/__tests__/catalog-category-registry.test.ts +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { CatalogCategorySpec } from "../catalog"; -import { CatalogCategory, CatalogCategoryRegistry } from "../catalog"; - -class TestCatalogCategoryRegistry extends CatalogCategoryRegistry { } - -class TestCatalogCategory extends CatalogCategory { - public readonly apiVersion = "catalog.k8slens.dev/v1alpha1"; - public readonly kind = "CatalogCategory"; - public metadata = { - name: "Test Category", - icon: "", - }; - public spec: CatalogCategorySpec = { - group: "entity.k8slens.dev", - versions: [], - names: { - kind: "Test", - }, - }; -} - -class TestCatalogCategory2 extends CatalogCategory { - public readonly apiVersion = "catalog.k8slens.dev/v1alpha1"; - public readonly kind = "CatalogCategory"; - public metadata = { - name: "Test Category 2", - icon: "", - }; - public spec: CatalogCategorySpec = { - group: "entity.k8slens.dev", - versions: [], - names: { - kind: "Test2", - }, - }; -} - -describe("CatalogCategoryRegistry", () => { - it("should remove only the category registered when running the disposer", () => { - const registry = new TestCatalogCategoryRegistry(); - - expect(registry.items.length).toBe(0); - - const d1 = registry.add(new TestCatalogCategory()); - const d2 = registry.add(new TestCatalogCategory2()); - - expect(registry.items.length).toBe(2); - - d1(); - expect(registry.items.length).toBe(1); - - d2(); - expect(registry.items.length).toBe(0); - }); - - it("doesn't return items that are filtered out", () => { - const registry = new TestCatalogCategoryRegistry(); - - registry.add(new TestCatalogCategory()); - registry.add(new TestCatalogCategory2()); - - expect(registry.items.length).toBe(2); - expect(registry.filteredItems.length).toBe(2); - - const disposer = registry.addCatalogCategoryFilter(category => category.metadata.name === "Test Category"); - - expect(registry.items.length).toBe(2); - expect(registry.filteredItems.length).toBe(1); - - const disposer2 = registry.addCatalogCategoryFilter(category => category.metadata.name === "foo"); - - expect(registry.items.length).toBe(2); - expect(registry.filteredItems.length).toBe(0); - - disposer(); - - expect(registry.items.length).toBe(2); - expect(registry.filteredItems.length).toBe(0); - - disposer2(); - - expect(registry.items.length).toBe(2); - expect(registry.filteredItems.length).toBe(2); - }); -}); diff --git a/packages/core/src/common/__tests__/catalog-entity.test.tsx b/packages/core/src/common/__tests__/catalog-entity.test.tsx deleted file mode 100644 index d0700b53d3..0000000000 --- a/packages/core/src/common/__tests__/catalog-entity.test.tsx +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import React from "react"; -import { CatalogCategory } from "../catalog"; -import type { CatalogCategorySpec } from "../catalog"; - -class TestCatalogCategoryWithoutBadge extends CatalogCategory { - public readonly apiVersion = "catalog.k8slens.dev/v1alpha1"; - public readonly kind = "CatalogCategory"; - - public metadata = { - name: "Test Category", - icon: "", - }; - - public spec: CatalogCategorySpec = { - group: "entity.k8slens.dev", - versions: [], - names: { - kind: "Test", - }, - }; -} - -class TestCatalogCategoryWithBadge extends TestCatalogCategoryWithoutBadge { - getBadge() { - return (
Test Badge
); - } -} - -describe("CatalogCategory", () => { - it("returns name", () => { - const category = new TestCatalogCategoryWithoutBadge(); - - expect(category.getName()).toEqual("Test Category"); - }); - - it("doesn't return badge by default", () => { - const category = new TestCatalogCategoryWithoutBadge(); - - expect(category.getBadge()).toEqual(null); - }); - - it("returns a badge", () => { - const category = new TestCatalogCategoryWithBadge(); - - expect(category.getBadge()).toBeTruthy(); - }); -}); diff --git a/packages/core/src/common/__tests__/create-resource-stack.test.ts b/packages/core/src/common/__tests__/create-resource-stack.test.ts deleted file mode 100644 index 5bf9cb1fe7..0000000000 --- a/packages/core/src/common/__tests__/create-resource-stack.test.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { DiContainer } from "@ogre-tools/injectable"; -import kubectlApplyAllInjectable from "../../main/kubectl/kubectl-apply-all.injectable"; -import { getDiForUnitTesting } from "../../main/getDiForUnitTesting"; -import type { KubernetesCluster } from "../catalog-entities"; -import readDirectoryInjectable from "../fs/read-directory.injectable"; -import readFileInjectable from "../fs/read-file.injectable"; -import createResourceStackInjectable from "../k8s/create-resource-stack.injectable"; -import appPathsStateInjectable from "../app-paths/app-paths-state.injectable"; -import directoryForUserDataInjectable from "../app-paths/directory-for-user-data/directory-for-user-data.injectable"; - -describe("create resource stack tests", () => { - let di: DiContainer; - let cluster: KubernetesCluster; - - beforeEach(async () => { - di = getDiForUnitTesting(); - cluster = { - getId: () => "test-cluster", - } as any; - - di.override(readDirectoryInjectable, () => () => Promise.resolve(["file1"]) as any); - di.override(readFileInjectable, () => () => Promise.resolve("filecontents")); - di.override(appPathsStateInjectable, () => ({ - get: () => ({}), - })); - di.override(directoryForUserDataInjectable, () => "/some-directory-for-user-data"); - - }); - - describe("kubectlApplyFolder", () => { - it("returns response", async () => { - di.override(kubectlApplyAllInjectable, () => () => Promise.resolve({ - callWasSuccessful: true as const, - response: "success", - })); - - const createResourceStack = di.inject(createResourceStackInjectable); - const resourceStack = createResourceStack(cluster, "test"); - - const response = await resourceStack.kubectlApplyFolder("/foo/bar"); - - expect(response).toEqual("success"); - }); - - it("throws on error", async () => { - di.override(kubectlApplyAllInjectable, () => () => Promise.resolve({ - callWasSuccessful: false as const, - error: "No permissions", - })); - - const createResourceStack = di.inject(createResourceStackInjectable); - const resourceStack = createResourceStack(cluster, "test"); - - await expect(() => resourceStack.kubectlApplyFolder("/foo/bar")).rejects.toThrow("No permissions"); - }); - }); -}); diff --git a/packages/core/src/common/__tests__/kube-helpers.test.ts b/packages/core/src/common/__tests__/kube-helpers.test.ts deleted file mode 100644 index ec466b5c56..0000000000 --- a/packages/core/src/common/__tests__/kube-helpers.test.ts +++ /dev/null @@ -1,235 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { KubeConfig } from "@kubernetes/client-node"; -import { validateKubeConfig, loadConfigFromString } from "../kube-helpers"; - -const kubeconfig = ` -apiVersion: v1 -clusters: -- cluster: - server: https://localhost - name: test -contexts: -- context: - cluster: test - user: test - name: valid -- context: - cluster: test2 - user: test - name: invalidCluster -- context: - cluster: test - user: test2 - name: invalidUser -- context: - cluster: test - user: invalidExec - name: invalidExec -current-context: test -kind: Config -preferences: {} -users: -- name: test - user: - exec: - command: echo -- name: invalidExec - user: - exec: - command: foo -`; - -interface Kubeconfig { - apiVersion: string; - clusters: [{ - name: string; - cluster: { - server: string; - }; - }]; - contexts: [{ - context: { - cluster: string; - user: string; - }; - name: string; - }]; - users: [{ - name: string; - }]; - kind: string; - "current-context": string; - preferences: {}; -} - -let mockKubeConfig: Kubeconfig; - -describe("kube helpers", () => { - describe("validateKubeconfig", () => { - const kc = new KubeConfig(); - - beforeAll(() => { - kc.loadFromString(kubeconfig); - }); - describe("with default validation options", () => { - describe("with valid kubeconfig", () => { - it("does not return an error", () => { - expect(validateKubeConfig(kc, "valid")).toBeDefined(); - }); - }); - describe("with invalid context object", () => { - it("returns an error", () => { - expect(validateKubeConfig(kc, "invalid").error?.toString()).toEqual( - expect.stringContaining("No valid context object provided in kubeconfig for context 'invalid'"), - ); - }); - }); - - describe("with invalid cluster object", () => { - it("returns an error", () => { - expect(validateKubeConfig(kc, "invalidCluster").error?.toString()).toEqual( - expect.stringContaining("No valid cluster object provided in kubeconfig for context 'invalidCluster'"), - ); - }); - }); - - describe("with invalid user object", () => { - it("returns an error", () => { - expect(validateKubeConfig(kc, "invalidUser").error?.toString()).toEqual( - expect.stringContaining("No valid user object provided in kubeconfig for context 'invalidUser'"), - ); - }); - }); - }); - }); - - describe("pre-validate context object in kubeconfig tests", () => { - beforeEach(() => { - jest.clearAllMocks(); - }); - - describe("Check logger.error() output", () => { - it("invalid yaml string", () => { - const invalidYAMLString = "fancy foo config"; - - expect(loadConfigFromString(invalidYAMLString).error).toBeInstanceOf(Error); - }); - it("empty contexts", () => { - const emptyContexts = `apiVersion: v1\ncontexts: []`; - - expect(loadConfigFromString(emptyContexts).error).toBeUndefined(); - }); - }); - - describe("Check valid kubeconfigs", () => { - beforeEach(() => { - mockKubeConfig = { - apiVersion: "v1", - clusters: [{ - name: "minikube", - cluster: { - server: "https://192.168.64.3:8443", - }, - }], - contexts: [{ - context: { - cluster: "minikube", - user: "minikube", - }, - name: "minikube", - }], - users: [{ - name: "minikube", - }], - kind: "Config", - "current-context": "minikube", - preferences: {}, - }; - }); - - it("single context is ok", async () => { - const { config } = loadConfigFromString(JSON.stringify(mockKubeConfig)); - - expect(config.getCurrentContext()).toBe("minikube"); - }); - - it("multiple context is ok", async () => { - mockKubeConfig.contexts.push({ context: { cluster: "cluster-2", user: "cluster-2" }, name: "cluster-2" }); - const { config } = loadConfigFromString(JSON.stringify(mockKubeConfig)); - - expect(config.getCurrentContext()).toBe("minikube"); - expect(config.contexts.length).toBe(2); - }); - }); - - describe("Check invalid kubeconfigs", () => { - beforeEach(() => { - mockKubeConfig = { - apiVersion: "v1", - clusters: [{ - name: "minikube", - cluster: { - server: "https://192.168.64.3:8443", - }, - }], - contexts: [{ - context: { - cluster: "minikube", - user: "minikube", - }, - name: "minikube", - }], - users: [{ - name: "minikube", - }], - kind: "Config", - "current-context": "minikube", - preferences: {}, - }; - }); - - it("empty name in context causes it to be removed", async () => { - mockKubeConfig.contexts.push({ context: { cluster: "cluster-2", user: "cluster-2" }, name: "" }); - expect(mockKubeConfig.contexts.length).toBe(2); - const { config } = loadConfigFromString(JSON.stringify(mockKubeConfig)); - - expect(config.getCurrentContext()).toBe("minikube"); - expect(config.contexts.length).toBe(1); - }); - - it("empty cluster in context causes it to be removed", async () => { - mockKubeConfig.contexts.push({ context: { cluster: "", user: "cluster-2" }, name: "cluster-2" }); - expect(mockKubeConfig.contexts.length).toBe(2); - const { config } = loadConfigFromString(JSON.stringify(mockKubeConfig)); - - expect(config.getCurrentContext()).toBe("minikube"); - expect(config.contexts.length).toBe(1); - }); - - it("empty user in context causes it to be removed", async () => { - mockKubeConfig.contexts.push({ context: { cluster: "cluster-2", user: "" }, name: "cluster-2" }); - expect(mockKubeConfig.contexts.length).toBe(2); - const { config } = loadConfigFromString(JSON.stringify(mockKubeConfig)); - - expect(config.getCurrentContext()).toBe("minikube"); - expect(config.contexts.length).toBe(1); - }); - - it("invalid context in between valid contexts is removed", async () => { - mockKubeConfig.contexts.push({ context: { cluster: "cluster-2", user: "" }, name: "cluster-2" }); - mockKubeConfig.contexts.push({ context: { cluster: "cluster-3", user: "cluster-3" }, name: "cluster-3" }); - expect(mockKubeConfig.contexts.length).toBe(3); - const { config } = loadConfigFromString(JSON.stringify(mockKubeConfig)); - - expect(config.getCurrentContext()).toBe("minikube"); - expect(config.contexts.length).toBe(2); - expect(config.contexts[0].name).toBe("minikube"); - expect(config.contexts[1].name).toBe("cluster-3"); - }); - }); - }); -}); diff --git a/packages/core/src/common/__tests__/timezones.test.ts b/packages/core/src/common/__tests__/timezones.test.ts deleted file mode 100644 index e7fa68e87c..0000000000 --- a/packages/core/src/common/__tests__/timezones.test.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -describe("Timezones", () => { - it("should always be UTC", () => { - expect(new Date().getTimezoneOffset()).toBe(0); - }); -}); - -export {}; diff --git a/packages/core/src/common/__tests__/user-store.test.ts b/packages/core/src/common/__tests__/user-store.test.ts deleted file mode 100644 index 25c4f1eeea..0000000000 --- a/packages/core/src/common/__tests__/user-store.test.ts +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { DiContainer } from "@ogre-tools/injectable"; -import directoryForUserDataInjectable from "../app-paths/directory-for-user-data/directory-for-user-data.injectable"; -import { defaultThemeId } from "../vars"; -import writeFileInjectable from "../fs/write-file.injectable"; -import { getDiForUnitTesting } from "../../main/getDiForUnitTesting"; -import storeMigrationVersionInjectable from "../vars/store-migration-version.injectable"; -import writeJsonSyncInjectable from "../fs/write-json-sync.injectable"; -import writeFileSyncInjectable from "../fs/write-file-sync.injectable"; -import type { UserPreferencesState } from "../../features/user-preferences/common/state.injectable"; -import userPreferencesStateInjectable from "../../features/user-preferences/common/state.injectable"; -import userPreferencesPersistentStorageInjectable from "../../features/user-preferences/common/storage.injectable"; -import type { ResetTheme } from "../../features/user-preferences/common/reset-theme.injectable"; -import resetThemeInjectable from "../../features/user-preferences/common/reset-theme.injectable"; -import type { ClusterStoreModel } from "../../features/cluster/storage/common/storage.injectable"; -import releaseChannelInjectable from "../../features/vars/common/release-channel.injectable"; - -describe("user store tests", () => { - let state: UserPreferencesState; - let resetTheme: ResetTheme; - let di: DiContainer; - - beforeEach(async () => { - di = getDiForUnitTesting(); - - di.override(writeFileInjectable, () => () => Promise.resolve()); - di.override(directoryForUserDataInjectable, () => "/some-directory-for-user-data"); - - di.override(releaseChannelInjectable, () => "latest"); - - state = di.inject(userPreferencesStateInjectable); - resetTheme = di.inject(resetThemeInjectable); - }); - - describe("for an empty config", () => { - beforeEach(() => { - const writeJsonSync = di.inject(writeJsonSyncInjectable); - - writeJsonSync("/some-directory-for-user-data/lens-user-store.json", {}); - writeJsonSync("/some-directory-for-user-data/kube_config", {}); - - di.inject(userPreferencesPersistentStorageInjectable).loadAndStartSyncing(); - }); - - it("allows setting and getting preferences", () => { - state.httpsProxy = "abcd://defg"; - - expect(state.httpsProxy).toBe("abcd://defg"); - expect(state.colorTheme).toBe(defaultThemeId); - - state.colorTheme = "light"; - expect(state.colorTheme).toBe("light"); - }); - - it("correctly resets theme to default value", async () => { - state.colorTheme = "some other theme"; - resetTheme(); - expect(state.colorTheme).toBe(defaultThemeId); - }); - }); - - describe("migrations", () => { - beforeEach(() => { - const writeJsonSync = di.inject(writeJsonSyncInjectable); - const writeFileSync = di.inject(writeFileSyncInjectable); - - writeJsonSync("/some-directory-for-user-data/lens-user-store.json", { - preferences: { colorTheme: "light" }, - }); - - writeJsonSync("/some-directory-for-user-data/lens-cluster-store.json", { - clusters: [ - { - id: "foobar", - kubeConfigPath: "/some-directory-for-user-data/extension_data/foo/bar", - }, - { - id: "barfoo", - kubeConfigPath: "/some/other/path", - }, - ], - } as ClusterStoreModel); - - writeJsonSync("/some-directory-for-user-data/extension_data", {}); - - writeFileSync("/some/other/path", "is file"); - - di.override(storeMigrationVersionInjectable, () => "10.0.0"); - - di.inject(userPreferencesPersistentStorageInjectable).loadAndStartSyncing(); - }); - - it("skips clusters for adding to kube-sync with files under extension_data/", () => { - expect(state.syncKubeconfigEntries.has("/some-directory-for-user-data/extension_data/foo/bar")).toBe(false); - expect(state.syncKubeconfigEntries.has("/some/other/path")).toBe(true); - }); - - it("allows access to the colorTheme preference", () => { - expect(state.colorTheme).toBe("light"); - }); - }); -}); diff --git a/packages/core/src/common/app-event-bus/app-event-bus.injectable.ts b/packages/core/src/common/app-event-bus/app-event-bus.injectable.ts deleted file mode 100644 index 9126a05620..0000000000 --- a/packages/core/src/common/app-event-bus/app-event-bus.injectable.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { EventEmitter } from "@k8slens/event-emitter"; -import type { AppEvent } from "./event-bus"; - -const appEventBusInjectable = getInjectable({ - id: "app-event-bus", - instantiate: () => new EventEmitter<[AppEvent]>, - decorable: false, -}); - -export default appEventBusInjectable; diff --git a/packages/core/src/common/app-event-bus/emit-event.injectable.ts b/packages/core/src/common/app-event-bus/emit-event.injectable.ts deleted file mode 100644 index 9c9194ceb8..0000000000 --- a/packages/core/src/common/app-event-bus/emit-event.injectable.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import appEventBusInjectable from "./app-event-bus.injectable"; -import type { AppEvent } from "./event-bus"; - -export type EmitAppEvent = (event: AppEvent) => void; - -const emitAppEventInjectable = getInjectable({ - id: "emit-app-event", - instantiate: (di): EmitAppEvent => { - const bus = di.inject(appEventBusInjectable); - - return (event) => bus.emit(event); - }, - decorable: false, -}); - -export default emitAppEventInjectable; diff --git a/packages/core/src/common/app-event-bus/event-bus.ts b/packages/core/src/common/app-event-bus/event-bus.ts deleted file mode 100644 index d121b842f7..0000000000 --- a/packages/core/src/common/app-event-bus/event-bus.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -/** - * Data for telemetry - */ -export interface AppEvent { - name: string; - action: string; - destination?: string; - params?: Record; -} diff --git a/packages/core/src/common/app-paths/app-path-injection-token.ts b/packages/core/src/common/app-paths/app-path-injection-token.ts deleted file mode 100644 index 91e8a580d8..0000000000 --- a/packages/core/src/common/app-paths/app-path-injection-token.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { PathName } from "./app-path-names"; - -export type AppPaths = Record; diff --git a/packages/core/src/common/app-paths/app-path-names.ts b/packages/core/src/common/app-paths/app-path-names.ts deleted file mode 100644 index b7b829a5e3..0000000000 --- a/packages/core/src/common/app-paths/app-path-names.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { app as electronApp } from "electron"; - -export type PathName = Parameters[0] | "currentApp"; - -export const pathNames: PathName[] = [ - "currentApp", - "home", - "appData", - "userData", - "sessionData", - "temp", - "exe", - "module", - "desktop", - "documents", - "downloads", - "music", - "pictures", - "videos", - "logs", - "crashDumps", - "recent", -]; diff --git a/packages/core/src/common/app-paths/app-paths-channel.ts b/packages/core/src/common/app-paths/app-paths-channel.ts deleted file mode 100644 index e738b4896a..0000000000 --- a/packages/core/src/common/app-paths/app-paths-channel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { AppPaths } from "./app-path-injection-token"; -import { getRequestChannel } from "@k8slens/messaging"; - -export const appPathsChannel = getRequestChannel("app-paths"); - diff --git a/packages/core/src/common/app-paths/app-paths-state.injectable.ts b/packages/core/src/common/app-paths/app-paths-state.injectable.ts deleted file mode 100644 index 5487d428b2..0000000000 --- a/packages/core/src/common/app-paths/app-paths-state.injectable.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { AppPaths } from "./app-path-injection-token"; - -const appPathsStateInjectable = getInjectable({ - id: "app-paths-state", - - instantiate: () => { - let state: AppPaths; - - return { - get: () =>{ - if (!state) { - throw new Error("Tried to get app paths before state is setupped."); - } - - return state; - }, - - set: (newState: AppPaths) => { - if (state) { - throw new Error("Tried to overwrite existing state of app paths."); - } - - state = newState; - }, - }; - }, -}); - -export default appPathsStateInjectable; diff --git a/packages/core/src/common/app-paths/app-paths.injectable.ts b/packages/core/src/common/app-paths/app-paths.injectable.ts deleted file mode 100644 index 0e836a8514..0000000000 --- a/packages/core/src/common/app-paths/app-paths.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import appPathsStateInjectable from "./app-paths-state.injectable"; - -const appPathsInjectable = getInjectable({ - id: "app-paths", - instantiate: (di) => di.inject(appPathsStateInjectable).get(), -}); - -export default appPathsInjectable; diff --git a/packages/core/src/common/app-paths/app-paths.test.ts b/packages/core/src/common/app-paths/app-paths.test.ts deleted file mode 100644 index 851ece4390..0000000000 --- a/packages/core/src/common/app-paths/app-paths.test.ts +++ /dev/null @@ -1,153 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { AppPaths } from "./app-path-injection-token"; -import getElectronAppPathInjectable from "../../main/app-paths/get-electron-app-path/get-electron-app-path.injectable"; -import type { PathName } from "./app-path-names"; -import setElectronAppPathInjectable from "../../main/app-paths/set-electron-app-path/set-electron-app-path.injectable"; -import directoryForIntegrationTestingInjectable from "../../main/app-paths/directory-for-integration-testing/directory-for-integration-testing.injectable"; -import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; -import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; -import type { DiContainer } from "@ogre-tools/injectable"; -import appPathsInjectable from "./app-paths.injectable"; - -describe("app-paths", () => { - let builder: ApplicationBuilder; - - beforeEach(() => { - builder = getApplicationBuilder(); - - const defaultAppPathsStub: AppPaths = { - currentApp: "/some-current-app", - appData: "/some-app-data", - crashDumps: "/some-crash-dumps", - desktop: "/some-desktop", - documents: "/some-documents", - downloads: "/some-downloads", - exe: "/some-exe", - home: "/some-home-path", - logs: "/some-logs", - module: "/some-module", - music: "/some-music", - pictures: "/some-pictures", - recent: "/some-recent", - temp: "/some-temp", - videos: "/some-videos", - userData: "/some-irrelevant-user-data", - sessionData: "/some-irrelevant-user-data", // By default this points to userData - }; - - builder.beforeApplicationStart(({ mainDi }) => { - mainDi.override( - getElectronAppPathInjectable, - () => - (key: PathName): string | null => - defaultAppPathsStub[key], - ); - - mainDi.override( - setElectronAppPathInjectable, - () => - (key: PathName, path: string): void => { - defaultAppPathsStub[key] = path; - }, - ); - }); - }); - - describe("normally", () => { - let windowDi: DiContainer; - let mainDi: DiContainer; - - beforeEach(async () => { - await builder.render(); - - windowDi = builder.applicationWindow.only.di; - mainDi = builder.mainDi; - }); - - it("given in renderer, when injecting app paths, returns application specific app paths", () => { - const actual = windowDi.inject(appPathsInjectable); - - expect(actual).toEqual({ - currentApp: "/some-current-app", - appData: "/some-app-data", - crashDumps: "/some-crash-dumps", - desktop: "/some-desktop", - documents: "/some-documents", - downloads: "/some-downloads", - exe: "/some-exe", - home: "/some-home-path", - logs: "/some-logs", - module: "/some-module", - music: "/some-music", - pictures: "/some-pictures", - recent: "/some-recent", - temp: "/some-temp", - videos: "/some-videos", - userData: "/some-app-data/some-product-name", - sessionData: "/some-app-data/some-product-name", - }); - }); - - it("given in main, when injecting app paths, returns application specific app paths", () => { - const actual = mainDi.inject(appPathsInjectable); - - expect(actual).toEqual({ - currentApp: "/some-current-app", - appData: "/some-app-data", - crashDumps: "/some-crash-dumps", - desktop: "/some-desktop", - documents: "/some-documents", - downloads: "/some-downloads", - exe: "/some-exe", - home: "/some-home-path", - logs: "/some-logs", - module: "/some-module", - music: "/some-music", - pictures: "/some-pictures", - recent: "/some-recent", - temp: "/some-temp", - videos: "/some-videos", - userData: "/some-app-data/some-product-name", - sessionData: "/some-app-data/some-product-name", - }); - }); - }); - - describe("when running integration tests", () => { - let windowDi: DiContainer; - - beforeEach(async () => { - builder.beforeApplicationStart(({ mainDi }) => { - mainDi.override( - directoryForIntegrationTestingInjectable, - () => "/some-integration-testing-app-data", - ); - }); - - await builder.render(); - - windowDi = builder.applicationWindow.only.di; - }); - - it("given in renderer, when injecting path for app data, has integration specific app data path", () => { - const { appData, userData } = windowDi.inject(appPathsInjectable); - - expect({ appData, userData }).toEqual({ - appData: "/some-integration-testing-app-data", - userData: "/some-integration-testing-app-data/some-product-name", - }); - }); - - it("given in main, when injecting path for app data, has integration specific app data path", () => { - const { appData, userData } = windowDi.inject(appPathsInjectable); - - expect({ appData, userData }).toEqual({ - appData: "/some-integration-testing-app-data", - userData: "/some-integration-testing-app-data/some-product-name", - }); - }); - }); -}); diff --git a/packages/core/src/common/app-paths/directory-for-binaries/directory-for-binaries.injectable.ts b/packages/core/src/common/app-paths/directory-for-binaries/directory-for-binaries.injectable.ts deleted file mode 100644 index f8a55b041c..0000000000 --- a/packages/core/src/common/app-paths/directory-for-binaries/directory-for-binaries.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import directoryForUserDataInjectable from "../directory-for-user-data/directory-for-user-data.injectable"; -import joinPathsInjectable from "../../path/join-paths.injectable"; - -const directoryForBinariesInjectable = getInjectable({ - id: "directory-for-binaries", - - instantiate: (di) => { - const joinPaths = di.inject(joinPathsInjectable); - const directoryForUserData = di.inject(directoryForUserDataInjectable); - - return joinPaths(directoryForUserData, "binaries"); - }, -}); - -export default directoryForBinariesInjectable; diff --git a/packages/core/src/common/app-paths/directory-for-downloads/directory-for-downloads.injectable.ts b/packages/core/src/common/app-paths/directory-for-downloads/directory-for-downloads.injectable.ts deleted file mode 100644 index 01f97dbaec..0000000000 --- a/packages/core/src/common/app-paths/directory-for-downloads/directory-for-downloads.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import appPathsInjectable from "../app-paths.injectable"; - -const directoryForDownloadsInjectable = getInjectable({ - id: "directory-for-downloads", - instantiate: (di) => di.inject(appPathsInjectable).downloads, -}); - -export default directoryForDownloadsInjectable; diff --git a/packages/core/src/common/app-paths/directory-for-exes/directory-for-exes.injectable.ts b/packages/core/src/common/app-paths/directory-for-exes/directory-for-exes.injectable.ts deleted file mode 100644 index 690f53d958..0000000000 --- a/packages/core/src/common/app-paths/directory-for-exes/directory-for-exes.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import appPathsInjectable from "../app-paths.injectable"; - -const directoryForExesInjectable = getInjectable({ - id: "directory-for-exes", - instantiate: (di) => di.inject(appPathsInjectable).exe, -}); - -export default directoryForExesInjectable; diff --git a/packages/core/src/common/app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable.ts b/packages/core/src/common/app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable.ts deleted file mode 100644 index d49029572e..0000000000 --- a/packages/core/src/common/app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import directoryForUserDataInjectable from "../directory-for-user-data/directory-for-user-data.injectable"; -import joinPathsInjectable from "../../path/join-paths.injectable"; - -const directoryForKubeConfigsInjectable = getInjectable({ - id: "directory-for-kube-configs", - - instantiate: (di) => { - const joinPaths = di.inject(joinPathsInjectable); - const directoryForUserData = di.inject(directoryForUserDataInjectable); - - return joinPaths(directoryForUserData, "kubeconfigs"); - }, -}); - -export default directoryForKubeConfigsInjectable; diff --git a/packages/core/src/common/app-paths/directory-for-kubectl-binaries/directory-for-kubectl-binaries.injectable.ts b/packages/core/src/common/app-paths/directory-for-kubectl-binaries/directory-for-kubectl-binaries.injectable.ts deleted file mode 100644 index c1ef1b23f5..0000000000 --- a/packages/core/src/common/app-paths/directory-for-kubectl-binaries/directory-for-kubectl-binaries.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import directoryForBinariesInjectable from "../directory-for-binaries/directory-for-binaries.injectable"; -import joinPathsInjectable from "../../path/join-paths.injectable"; - -const directoryForKubectlBinariesInjectable = getInjectable({ - id: "directory-for-kubectl-binaries", - - instantiate: (di) => { - const joinPaths = di.inject(joinPathsInjectable); - const directoryForBinaries = di.inject(directoryForBinariesInjectable); - - return joinPaths(directoryForBinaries, "kubectl"); - }, -}); - -export default directoryForKubectlBinariesInjectable; diff --git a/packages/core/src/common/app-paths/directory-for-logs.injectable.ts b/packages/core/src/common/app-paths/directory-for-logs.injectable.ts deleted file mode 100644 index e9abc35c44..0000000000 --- a/packages/core/src/common/app-paths/directory-for-logs.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import appPathsInjectable from "./app-paths.injectable"; - -const directoryForLogsInjectable = getInjectable({ - id: "directory-for-logs", - instantiate: (di) => di.inject(appPathsInjectable).logs, -}); - -export default directoryForLogsInjectable; diff --git a/packages/core/src/common/app-paths/directory-for-temp/directory-for-temp.injectable.ts b/packages/core/src/common/app-paths/directory-for-temp/directory-for-temp.injectable.ts deleted file mode 100644 index 460efc073d..0000000000 --- a/packages/core/src/common/app-paths/directory-for-temp/directory-for-temp.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import appPathsInjectable from "../app-paths.injectable"; - -const directoryForTempInjectable = getInjectable({ - id: "directory-for-temp", - instantiate: (di) => di.inject(appPathsInjectable).temp, -}); - -export default directoryForTempInjectable; diff --git a/packages/core/src/common/app-paths/directory-for-user-data/directory-for-user-data.injectable.ts b/packages/core/src/common/app-paths/directory-for-user-data/directory-for-user-data.injectable.ts deleted file mode 100644 index 0eb32221c6..0000000000 --- a/packages/core/src/common/app-paths/directory-for-user-data/directory-for-user-data.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import appPathsInjectable from "../app-paths.injectable"; - -const directoryForUserDataInjectable = getInjectable({ - id: "directory-for-user-data", - instantiate: (di) => di.inject(appPathsInjectable).userData, -}); - -export default directoryForUserDataInjectable; diff --git a/packages/core/src/common/app-paths/get-custom-kube-config-directory/get-custom-kube-config-directory.injectable.ts b/packages/core/src/common/app-paths/get-custom-kube-config-directory/get-custom-kube-config-directory.injectable.ts deleted file mode 100644 index 0580d372f1..0000000000 --- a/packages/core/src/common/app-paths/get-custom-kube-config-directory/get-custom-kube-config-directory.injectable.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import directoryForKubeConfigsInjectable from "../directory-for-kube-configs/directory-for-kube-configs.injectable"; -import joinPathsInjectable from "../../path/join-paths.injectable"; - -export type GetCustomKubeConfigFilePath = (fileName: string) => string; - -const getCustomKubeConfigFilePathInjectable = getInjectable({ - id: "get-custom-kube-config-directory", - - instantiate: (di): GetCustomKubeConfigFilePath => { - const directoryForKubeConfigs = di.inject(directoryForKubeConfigsInjectable); - const joinPaths = di.inject(joinPathsInjectable); - - return (fileName) => joinPaths(directoryForKubeConfigs, fileName); - }, -}); - -export default getCustomKubeConfigFilePathInjectable; diff --git a/packages/core/src/common/app-paths/path-to-npm-cli.global-override-for-injectable.ts b/packages/core/src/common/app-paths/path-to-npm-cli.global-override-for-injectable.ts deleted file mode 100644 index 76a7a9b539..0000000000 --- a/packages/core/src/common/app-paths/path-to-npm-cli.global-override-for-injectable.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "@k8slens/test-utils"; -import pathToNpmCliInjectable from "./path-to-npm-cli.injectable"; - -export default getGlobalOverride(pathToNpmCliInjectable, () => "/some/npm/cli/path"); diff --git a/packages/core/src/common/app-paths/path-to-npm-cli.injectable.ts b/packages/core/src/common/app-paths/path-to-npm-cli.injectable.ts deleted file mode 100644 index 1c32b9ed6a..0000000000 --- a/packages/core/src/common/app-paths/path-to-npm-cli.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; - -const pathToNpmCliInjectable = getInjectable({ - id: "path-to-npm-cli", - instantiate: () => __non_webpack_require__.resolve("npm"), - causesSideEffects: true, -}); - -export default pathToNpmCliInjectable; diff --git a/packages/core/src/common/catalog-entities/__tests__/kubernetes-cluster.test.ts b/packages/core/src/common/catalog-entities/__tests__/kubernetes-cluster.test.ts deleted file mode 100644 index d681713a80..0000000000 --- a/packages/core/src/common/catalog-entities/__tests__/kubernetes-cluster.test.ts +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getDiForUnitTesting } from "../../../renderer/getDiForUnitTesting"; -import kubernetesClusterCategoryInjectable from "../../catalog/categories/kubernetes-cluster.injectable"; -import type { KubernetesClusterCategory } from "../kubernetes-cluster"; - - -describe("kubernetesClusterCategory", () => { - let kubernetesClusterCategory: KubernetesClusterCategory; - - beforeEach(() => { - const di = getDiForUnitTesting(); - - kubernetesClusterCategory = di.inject(kubernetesClusterCategoryInjectable); - }); - - describe("filteredItems", () => { - const item1 = { - icon: "Icon", - title: "Title", - onClick: () => {}, - }; - const item2 = { - icon: "Icon 2", - title: "Title 2", - onClick: () => {}, - }; - - it("returns all items if no filter set", () => { - expect(kubernetesClusterCategory.filteredItems([item1, item2])).toEqual([item1, item2]); - }); - - it("returns filtered items", () => { - expect(kubernetesClusterCategory.filteredItems([item1, item2])).toEqual([item1, item2]); - - const disposer1 = kubernetesClusterCategory.addMenuFilter(item => item.icon === "Icon"); - - expect(kubernetesClusterCategory.filteredItems([item1, item2])).toEqual([item1]); - - const disposer2 = kubernetesClusterCategory.addMenuFilter(item => item.title === "Title 2"); - - expect(kubernetesClusterCategory.filteredItems([item1, item2])).toEqual([]); - - disposer1(); - - expect(kubernetesClusterCategory.filteredItems([item1, item2])).toEqual([item2]); - - disposer2(); - - expect(kubernetesClusterCategory.filteredItems([item1, item2])).toEqual([item1, item2]); - }); - }); -}); diff --git a/packages/core/src/common/catalog-entities/general-catalog-entities/general-catalog-entity-injection-token.ts b/packages/core/src/common/catalog-entities/general-catalog-entities/general-catalog-entity-injection-token.ts deleted file mode 100644 index ad743802bf..0000000000 --- a/packages/core/src/common/catalog-entities/general-catalog-entities/general-catalog-entity-injection-token.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectionToken } from "@ogre-tools/injectable"; -import type { GeneralEntity } from "../index"; - -export const generalCatalogEntityInjectionToken = getInjectionToken({ - id: "general-catalog-entity-injection-token", -}); diff --git a/packages/core/src/common/catalog-entities/general-catalog-entities/implementations/catalog-catalog-entity.injectable.ts b/packages/core/src/common/catalog-entities/general-catalog-entities/implementations/catalog-catalog-entity.injectable.ts deleted file mode 100644 index b36be73de6..0000000000 --- a/packages/core/src/common/catalog-entities/general-catalog-entities/implementations/catalog-catalog-entity.injectable.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { generalCatalogEntityInjectionToken } from "../general-catalog-entity-injection-token"; -import { GeneralEntity } from "../../index"; -import { buildURL } from "@k8slens/utilities"; -import catalogRouteInjectable from "../../../front-end-routing/routes/catalog/catalog-route.injectable"; - -const catalogCatalogEntityInjectable = getInjectable({ - id: "general-catalog-entity-for-catalog", - - instantiate: (di) => { - const route = di.inject(catalogRouteInjectable); - const url = buildURL(route.path); - - return new GeneralEntity({ - metadata: { - uid: "catalog-entity", - name: "Catalog", - source: "app", - labels: {}, - }, - spec: { - path: url, - icon: { - material: "view_list", - background: "#3d90ce", - }, - }, - status: { - phase: "active", - }, - }); - }, - - injectionToken: generalCatalogEntityInjectionToken, -}); - -export default catalogCatalogEntityInjectable; diff --git a/packages/core/src/common/catalog-entities/general-catalog-entities/implementations/welcome-catalog-entity.injectable.ts b/packages/core/src/common/catalog-entities/general-catalog-entities/implementations/welcome-catalog-entity.injectable.ts deleted file mode 100644 index bb0d926569..0000000000 --- a/packages/core/src/common/catalog-entities/general-catalog-entities/implementations/welcome-catalog-entity.injectable.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { generalCatalogEntityInjectionToken } from "../general-catalog-entity-injection-token"; -import { GeneralEntity } from "../../index"; -import { buildURL } from "@k8slens/utilities"; -import welcomeRouteInjectable from "../../../front-end-routing/routes/welcome/welcome-route.injectable"; - -const welcomeCatalogEntityInjectable = getInjectable({ - id: "general-catalog-entity-for-welcome", - - instantiate: (di) => { - const route = di.inject(welcomeRouteInjectable); - const url = buildURL(route.path); - - return new GeneralEntity({ - metadata: { - uid: "welcome-page-entity", - name: "Welcome Page", - source: "app", - labels: {}, - }, - spec: { - path: url, - icon: { - material: "home", - background: "#3d90ce", - }, - }, - status: { - phase: "active", - }, - }); - }, - - injectionToken: generalCatalogEntityInjectionToken, -}); - -export default welcomeCatalogEntityInjectable; diff --git a/packages/core/src/common/catalog-entities/general.ts b/packages/core/src/common/catalog-entities/general.ts deleted file mode 100644 index 40988a95c8..0000000000 --- a/packages/core/src/common/catalog-entities/general.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { CatalogEntityMetadata, CatalogEntitySpec, CatalogEntityStatus } from "../catalog"; -import type { CatalogEntityActionContext } from "../catalog/catalog-entity"; -import { CatalogCategory, CatalogEntity, categoryVersion } from "../catalog/catalog-entity"; - -export interface GeneralEntitySpec extends CatalogEntitySpec { - path: string; - icon?: { - material?: string; - background?: string; - }; -} - -export class GeneralEntity extends CatalogEntity { - public readonly apiVersion = "entity.k8slens.dev/v1alpha1"; - public readonly kind = "General"; - - async onRun(context: CatalogEntityActionContext) { - context.navigate(this.spec.path); - } -} - -export class GeneralCategory extends CatalogCategory { - public readonly apiVersion = "catalog.k8slens.dev/v1alpha1"; - public readonly kind = "CatalogCategory"; - public metadata = { - name: "General", - icon: "settings", - }; - public spec = { - group: "entity.k8slens.dev", - versions: [ - categoryVersion("v1alpha1", GeneralEntity), - ], - names: { - kind: "General", - }, - }; -} diff --git a/packages/core/src/common/catalog-entities/icons/kubernetes.svg b/packages/core/src/common/catalog-entities/icons/kubernetes.svg deleted file mode 100644 index b4a9068420..0000000000 --- a/packages/core/src/common/catalog-entities/icons/kubernetes.svg +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - diff --git a/packages/core/src/common/catalog-entities/index.ts b/packages/core/src/common/catalog-entities/index.ts deleted file mode 100644 index 336a8c0f9a..0000000000 --- a/packages/core/src/common/catalog-entities/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export * from "./general"; -export * from "./kubernetes-cluster"; -export * from "./web-link"; diff --git a/packages/core/src/common/catalog-entities/kubernetes-cluster.ts b/packages/core/src/common/catalog-entities/kubernetes-cluster.ts deleted file mode 100644 index e4c9867514..0000000000 --- a/packages/core/src/common/catalog-entities/kubernetes-cluster.ts +++ /dev/null @@ -1,158 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { CatalogEntityActionContext, CatalogEntityContextMenuContext, CatalogEntityMetadata, CatalogEntityStatus, CatalogCategorySpec } from "../catalog"; -import { CatalogEntity, CatalogCategory, categoryVersion } from "../catalog/catalog-entity"; -import { broadcastMessage } from "../ipc"; -import type { CatalogEntityConstructor, CatalogEntitySpec } from "../catalog/catalog-entity"; -import { IpcRendererNavigationEvents } from "../ipc/navigation-events"; -import KubeClusterCategoryIcon from "./icons/kubernetes.svg"; -import { getLegacyGlobalDiForExtensionApi } from "@k8slens/legacy-global-di"; -import { requestClusterActivationInjectionToken, requestClusterDeactivationInjectionToken } from "../../features/cluster/activation/common/request-token"; - -export interface KubernetesClusterPrometheusMetrics { - address?: { - namespace: string; - service: string; - port: number; - prefix: string; - }; - type?: string; -} - -export interface KubernetesClusterSpec extends CatalogEntitySpec { - kubeconfigPath: string; - kubeconfigContext: string; - metrics?: { - source: string; - prometheus?: KubernetesClusterPrometheusMetrics; - }; - icon?: { - // TODO: move to CatalogEntitySpec once any-entity icons are supported - src?: string; - material?: string; - background?: string; - }; - accessibleNamespaces?: string[]; -} - -export enum LensKubernetesClusterStatus { - DELETING = "deleting", - CONNECTING = "connecting", - CONNECTED = "connected", - DISCONNECTED = "disconnected", -} - -export interface KubernetesClusterMetadata extends CatalogEntityMetadata { - distro?: string; - kubeVersion?: string; -} - -/** - * @deprecated This is no longer used as it is incorrect. Other sources can add more values - */ -export type KubernetesClusterStatusPhase = "connected" | "connecting" | "disconnected" | "deleting"; - -export interface KubernetesClusterStatus extends CatalogEntityStatus { -} - -export function isKubernetesCluster(item: unknown): item is KubernetesCluster { - return item instanceof KubernetesCluster; -} - -export class KubernetesCluster< - Metadata extends KubernetesClusterMetadata = KubernetesClusterMetadata, - Status extends KubernetesClusterStatus = KubernetesClusterStatus, - Spec extends KubernetesClusterSpec = KubernetesClusterSpec, -> extends CatalogEntity { - public static readonly apiVersion: string = "entity.k8slens.dev/v1alpha1"; - public static readonly kind: string = "KubernetesCluster"; - - public readonly apiVersion = KubernetesCluster.apiVersion; - public readonly kind = KubernetesCluster.kind; - - async connect(): Promise { - const di = getLegacyGlobalDiForExtensionApi(); - const requestClusterActivation = di.inject(requestClusterActivationInjectionToken); - - await requestClusterActivation({ - clusterId: this.getId(), - }); - } - - async disconnect(): Promise { - const di = getLegacyGlobalDiForExtensionApi(); - const requestClusterDeactivation = di.inject(requestClusterDeactivationInjectionToken); - - await requestClusterDeactivation(this.getId()); - } - - async onRun(context: CatalogEntityActionContext) { - context.navigate(`/cluster/${this.getId()}`); - } - - onDetailsOpen(): void { - // - } - - onSettingsOpen(): void { - // - } - - onContextMenuOpen(context: CatalogEntityContextMenuContext) { - if (!this.metadata.source || this.metadata.source === "local") { - context.menuItems.push({ - title: "Settings", - icon: "settings", - onClick: () => broadcastMessage( - IpcRendererNavigationEvents.NAVIGATE_IN_APP, - `/entity/${this.getId()}/settings`, - ), - }); - } - - switch (this.status.phase) { - case LensKubernetesClusterStatus.CONNECTED: - case LensKubernetesClusterStatus.CONNECTING: - context.menuItems.push({ - title: "Disconnect", - icon: "link_off", - onClick: () => { - this.disconnect(); - broadcastMessage( - IpcRendererNavigationEvents.NAVIGATE_IN_APP, - "/catalog", - ); - }, - }); - break; - case LensKubernetesClusterStatus.DISCONNECTED: - context.menuItems.push({ - title: "Connect", - icon: "link", - onClick: () => context.navigate(`/cluster/${this.getId()}`), - }); - break; - } - } -} - -export class KubernetesClusterCategory extends CatalogCategory { - public readonly apiVersion = "catalog.k8slens.dev/v1alpha1"; - public readonly kind = "CatalogCategory"; - public metadata = { - name: "Clusters", - icon: KubeClusterCategoryIcon, - }; - public spec: CatalogCategorySpec = { - group: "entity.k8slens.dev", - versions: [ - categoryVersion("v1alpha1", KubernetesCluster as CatalogEntityConstructor), - ], - names: { - kind: "KubernetesCluster", - }, - }; -} diff --git a/packages/core/src/common/catalog-entities/web-link.ts b/packages/core/src/common/catalog-entities/web-link.ts deleted file mode 100644 index be11efe238..0000000000 --- a/packages/core/src/common/catalog-entities/web-link.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getEnvironmentSpecificLegacyGlobalDiForExtensionApi } from "@k8slens/legacy-global-di"; -import removeWeblinkInjectable from "../../features/weblinks/common/remove.injectable"; -import type { CatalogEntityContextMenuContext, CatalogEntityMetadata, CatalogEntityStatus } from "../catalog"; -import { CatalogCategory, CatalogEntity, categoryVersion } from "../catalog/catalog-entity"; -import productNameInjectable from "../vars/product-name.injectable"; - -export type WebLinkStatusPhase = "available" | "unavailable"; - -export interface WebLinkStatus extends CatalogEntityStatus { - phase: WebLinkStatusPhase; -} - -export interface WebLinkSpec { - url: string; -} - -export class WebLink extends CatalogEntity { - public static readonly apiVersion = "entity.k8slens.dev/v1alpha1"; - public static readonly kind = "WebLink"; - - public readonly apiVersion = WebLink.apiVersion; - public readonly kind = WebLink.kind; - - async onRun() { - window.open(this.spec.url, "_blank"); - } - - onContextMenuOpen(context: CatalogEntityContextMenuContext) { - // NOTE: this is safe because `onContextMenuOpen` is only supposed to be called in the renderer - const di = getEnvironmentSpecificLegacyGlobalDiForExtensionApi("renderer"); - const productName = di.inject(productNameInjectable); - const removeWeblink = di.inject(removeWeblinkInjectable); - - if (this.metadata.source === "local") { - context.menuItems.push({ - title: "Delete", - icon: "delete", - onClick: () => removeWeblink(this.getId()), - confirm: { - message: `Remove Web Link "${this.getName()}" from ${productName}?`, - }, - }); - } - } -} - -export class WebLinkCategory extends CatalogCategory { - public readonly apiVersion = "catalog.k8slens.dev/v1alpha1"; - public readonly kind = "CatalogCategory"; - public metadata = { - name: "Web Links", - icon: "public", - }; - public spec = { - group: "entity.k8slens.dev", - versions: [ - categoryVersion("v1alpha1", WebLink), - ], - names: { - kind: "WebLink", - }, - }; -} diff --git a/packages/core/src/common/catalog/catalog-entity.ts b/packages/core/src/common/catalog/catalog-entity.ts deleted file mode 100644 index 6b66743d86..0000000000 --- a/packages/core/src/common/catalog/catalog-entity.ts +++ /dev/null @@ -1,415 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import EventEmitter from "events"; -import type TypedEmitter from "typed-emitter"; -import { observable, makeObservable } from "mobx"; -import { once } from "lodash"; -import type { Disposer, StrictReactNode } from "@k8slens/utilities"; -import { iter } from "@k8slens/utilities"; -import type { CategoryColumnRegistration, TitleCellProps } from "../../renderer/components/catalog/custom-category-columns"; - -export type { CategoryColumnRegistration, TitleCellProps }; - -export type CatalogEntityDataFor = Entity extends CatalogEntity - ? CatalogEntityData - : never; - -export type CatalogEntityInstanceFrom = Constructor extends CatalogEntityConstructor - ? Entity - : never; - -export type CatalogEntityConstructor = ( - new (data: CatalogEntityDataFor) => Entity -); - -export interface CatalogCategoryVersion { - /** - * The specific version that the associated constructor is for. This MUST be - * a DNS label and SHOULD be of the form `vN`, `vNalphaY`, or `vNbetaY` where - * `N` and `Y` are both integers greater than 0. - * - * Examples: The following are valid values for this field. - * - `v1` - * - `v1beta1` - * - `v1alpha2` - * - `v3beta2` - */ - readonly name: string; - - /** - * The constructor for the entities. - */ - readonly entityClass: CatalogEntityConstructor; -} - -export interface CatalogCategorySpec { - /** - * The grouping for for the category. This MUST be a DNS label. - */ - readonly group: string; - - /** - * The specific versions of the constructors. - * - * NOTE: the field `.apiVersion` after construction MUST match `{.group}/{.versions.[] | .name}`. - * For example, if `group = "entity.k8slens.dev"` and there is an entry in `.versions` with - * `name = "v1alpha1"` then the resulting `.apiVersion` MUST be `entity.k8slens.dev/v1alpha1` - */ - readonly versions: CatalogCategoryVersion[]; - - /** - * This is the concerning the category - */ - readonly names: { - /** - * The kind of entity that this category is for. This value MUST be a DNS - * label and MUST be equal to the `kind` fields that are produced by the - * `.versions.[] | .entityClass` fields. - */ - readonly kind: string; - }; - - /** - * These are the columns used for displaying entities when in the catalog. - * - * If this is not provided then some default columns will be used, similar in - * scope to the columns in the "Browse" view. - * - * Even if you provide columns, a "Name" column will be provided as well with - * `priority: 0`. - * - * These columns will not be used in the "Browse" view. - */ - readonly displayColumns?: CategoryColumnRegistration[]; -} - -/** - * If the filter return a thruthy value, the menu item is displayed - */ -export type AddMenuFilter = (menu: CatalogEntityAddMenu) => any; - -export interface CatalogCategoryEvents { - /** - * This event will be emitted when the category is loaded in the catalog - * view. - */ - load: () => void; - - /** - * This event will be emitted when the catalog add menu is opened and is the - * way to added entries to that menu. - */ - catalogAddMenu: (context: CatalogEntityAddMenuContext) => void; - - /** - * This event will be emitted when the context menu for an entity is declared - * by this category is opened. - */ - contextMenuOpen: (entity: CatalogEntity, context: CatalogEntityContextMenuContext) => void; -} - -export interface CatalogCategoryMetadata { - /** - * The name of your category. The category can be searched for by this - * value. This will also be used for the catalog menu. - */ - readonly name: string; - /** - * Either an `` or one of the provided svg names from {@link Renderer.Component.NamedSvg} - */ - readonly icon: string; -} - -export function categoryVersion< - T extends CatalogEntity, - Metadata extends CatalogEntityMetadata, - Status extends CatalogEntityStatus, - Spec extends CatalogEntitySpec, ->(name: string, entityClass: new (data: CatalogEntityData) => T): CatalogCategoryVersion { - return { - name, - entityClass: entityClass as CatalogEntityConstructor, - }; -} - -export abstract class CatalogCategory extends (EventEmitter as new () => TypedEmitter) { - /** - * The version of category that you are wanting to declare. - * - * Currently supported values: - * - * - `"catalog.k8slens.dev/v1alpha1"` - */ - abstract readonly apiVersion: string; - - /** - * The kind of item you wish to declare. - * - * Currently supported values: - * - * - `"CatalogCategory"` - */ - abstract readonly kind: string; - - /** - * The data about the category itself - */ - abstract readonly metadata: CatalogCategoryMetadata; - - /** - * The most important part of a category, as it is where entity versions are declared. - */ - abstract readonly spec: CatalogCategorySpec; - - /** - * @internal - */ - protected readonly filters = observable.set([], { - deep: false, - }); - - /** - * Parse a category ID into parts. - * @param id The id of a category is parse - * @returns The group and kind parts of the ID - */ - public static parseId(id: string): { group?: string; kind?: string } { - const [group, kind] = id.split("/") ?? []; - - return { group, kind }; - } - - /** - * Get the ID of this category - */ - public getId(): string { - return `${this.spec.group}/${this.spec.names.kind}`; - } - - /** - * Get the name of this category - */ - public getName(): string { - return this.metadata.name; - } - - /** - * Get the badge of this category. - * Defaults to no badge. - * The badge is displayed next to the Category name in the Catalog Category menu - */ - public getBadge(): StrictReactNode { - return null; - } - - /** - * Add a filter for menu items of catalogAddMenu - * @param fn The function that should return a truthy value if that menu item should be displayed - * @returns A function to remove that filter - */ - public addMenuFilter(fn: AddMenuFilter): Disposer { - this.filters.add(fn); - - return once(() => void this.filters.delete(fn)); - } - - /** - * Filter menuItems according to the Category's set filters - * @param menuItems menu items to filter - * @returns filtered menu items - */ - public filteredItems(menuItems: CatalogEntityAddMenu[]) { - return Array.from( - iter.reduce( - this.filters, - iter.filter, - menuItems.values(), - ), - ); - } -} - -export type EntityMetadataObject = { [Key in string]?: EntityMetadataValue }; -export type EntityMetadataValue = string | number | boolean | EntityMetadataObject | undefined; - -export interface CatalogEntityMetadata extends EntityMetadataObject { - uid: string; - name: string; - shortName?: string; - description?: string; - source?: string; - labels: Partial>; -} - -export interface CatalogEntityStatus { - phase: string; - reason?: string; - - /** - * @default true - */ - enabled?: boolean; - message?: string; - active?: boolean; -} - -export interface CatalogEntityActionContext { - navigate: (url: string) => void; - setCommandPaletteContext: (context?: CatalogEntity) => void; -} - -export interface CatalogEntityContextMenu { - /** - * Menu title - */ - title: string; - /** - * Menu icon - */ - icon?: string; - /** - * OnClick handler - */ - onClick: () => void | Promise; - /** - * Confirm click with a message - */ - confirm?: { - message: string; - }; -} - -export interface CatalogEntityAddMenu extends CatalogEntityContextMenu { - icon: string; - defaultAction?: boolean; -} - -export interface CatalogEntitySettingsMenu { - group?: string; - title: string; - components: { - View: React.ComponentType; - }; -} - -export interface CatalogEntityContextMenuNavigate { - /** - * @param pathname The location to navigate to in the main iframe - */ - (pathname: string, forceMainFrame?: boolean): void; - /** - * @param pathname The location to navigate to in the current iframe. Useful for when called within the cluster frame - */ - (pathname: string, forceMainFrame: false): void; -} - -export interface CatalogEntityContextMenuContext { - /** - * Navigate to the specified pathname - */ - navigate: CatalogEntityContextMenuNavigate; - menuItems: CatalogEntityContextMenu[]; -} - -export interface CatalogEntitySettingsContext { - menuItems: CatalogEntityContextMenu[]; -} - -export interface CatalogEntityAddMenuContext { - navigate: (url: string) => void; - menuItems: CatalogEntityAddMenu[]; -} - -export type CatalogEntitySpec = Record; - - -export interface CatalogEntityData< - Metadata extends CatalogEntityMetadata = CatalogEntityMetadata, - Status extends CatalogEntityStatus = CatalogEntityStatus, - Spec extends CatalogEntitySpec = CatalogEntitySpec, -> { - metadata: Metadata; - status: Status; - spec: Spec; -} - -export interface CatalogEntityKindData { - readonly apiVersion: string; - readonly kind: string; -} - -export abstract class CatalogEntity< - Metadata extends CatalogEntityMetadata = CatalogEntityMetadata, - Status extends CatalogEntityStatus = CatalogEntityStatus, - Spec extends CatalogEntitySpec = CatalogEntitySpec, -> implements CatalogEntityKindData { - /** - * The group and version of this class. - */ - public abstract readonly apiVersion: string; - - /** - * A DNS label name of the entity. - */ - public abstract readonly kind: string; - - @observable metadata: Metadata; - @observable status: Status; - @observable spec: Spec; - - constructor({ metadata, status, spec }: CatalogEntityData) { - makeObservable(this); - - if (!metadata || typeof metadata !== "object") { - throw new TypeError("CatalogEntity's metadata must be a defined object"); - } - - if (!status || typeof status !== "object") { - throw new TypeError("CatalogEntity's status must be a defined object"); - } - - if (!spec || typeof spec !== "object") { - throw new TypeError("CatalogEntity's spec must be a defined object"); - } - - this.metadata = metadata; - this.status = status; - this.spec = spec; - } - - /** - * Get the UID of this entity - */ - public getId(): string { - return this.metadata.uid; - } - - /** - * Get the name of this entity - */ - public getName(): string { - return this.metadata.name; - } - - /** - * Get the specified source of this entity, defaulting to `"unknown"` if not - * provided - */ - public getSource(): string { - return this.metadata.source ?? "unknown"; - } - - /** - * Get if this entity is enabled. - */ - public isEnabled(): boolean { - return this.status.enabled ?? true; - } - - public onRun?(context: CatalogEntityActionContext): void | Promise; - public onContextMenuOpen?(context: CatalogEntityContextMenuContext): void | Promise; - public onSettingsOpen?(context: CatalogEntitySettingsContext): void | Promise; -} diff --git a/packages/core/src/common/catalog/catalog-run-event.ts b/packages/core/src/common/catalog/catalog-run-event.ts deleted file mode 100644 index c1b5eac986..0000000000 --- a/packages/core/src/common/catalog/catalog-run-event.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { CatalogEntity } from "../catalog"; - -export class CatalogRunEvent { - #defaultPrevented: boolean; - #target: CatalogEntity; - - get defaultPrevented() { - return this.#defaultPrevented; - } - - get target() { - return this.#target; - } - - constructor({ target }: { target: CatalogEntity }) { - this.#defaultPrevented = false; - this.#target = target; - } - - preventDefault() { - this.#defaultPrevented = true; - } -} diff --git a/packages/core/src/common/catalog/categories/general.injectable.ts b/packages/core/src/common/catalog/categories/general.injectable.ts deleted file mode 100644 index d2e3ba7a69..0000000000 --- a/packages/core/src/common/catalog/categories/general.injectable.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { GeneralCategory } from "../../catalog-entities"; -import { builtInCategoryInjectionToken } from "../category-registry.injectable"; - -const generalCategoryInjectable = getInjectable({ - id: "general-category", - instantiate: () => new GeneralCategory(), - injectionToken: builtInCategoryInjectionToken, -}); - -export default generalCategoryInjectable; diff --git a/packages/core/src/common/catalog/categories/kubernetes-cluster.injectable.ts b/packages/core/src/common/catalog/categories/kubernetes-cluster.injectable.ts deleted file mode 100644 index 6dc3f9be8d..0000000000 --- a/packages/core/src/common/catalog/categories/kubernetes-cluster.injectable.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { KubernetesClusterCategory } from "../../catalog-entities/kubernetes-cluster"; -import { builtInCategoryInjectionToken } from "../category-registry.injectable"; - -const kubernetesClusterCategoryInjectable = getInjectable({ - id: "kubernetes-cluster-category", - instantiate: () => new KubernetesClusterCategory(), - injectionToken: builtInCategoryInjectionToken, -}); - -export default kubernetesClusterCategoryInjectable; diff --git a/packages/core/src/common/catalog/categories/weblink.injectable.ts b/packages/core/src/common/catalog/categories/weblink.injectable.ts deleted file mode 100644 index 339758efbf..0000000000 --- a/packages/core/src/common/catalog/categories/weblink.injectable.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { WebLinkCategory } from "../../catalog-entities"; -import { builtInCategoryInjectionToken } from "../category-registry.injectable"; - -const weblinkCategoryInjectable = getInjectable({ - id: "weblink-category", - instantiate: () => new WebLinkCategory(), - injectionToken: builtInCategoryInjectionToken, -}); - -export default weblinkCategoryInjectable; diff --git a/packages/core/src/common/catalog/category-registry.injectable.ts b/packages/core/src/common/catalog/category-registry.injectable.ts deleted file mode 100644 index a73ed973f6..0000000000 --- a/packages/core/src/common/catalog/category-registry.injectable.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable, getInjectionToken } from "@ogre-tools/injectable"; -import type { CatalogCategory } from "./catalog-entity"; -import { CatalogCategoryRegistry } from "./category-registry"; - -export const builtInCategoryInjectionToken = getInjectionToken({ - id: "built-in-category-token", -}); - -const catalogCategoryRegistryInjectable = getInjectable({ - id: "catalog-category-registry", - instantiate: (di) => { - const registry = new CatalogCategoryRegistry(); - const categories = di.injectMany(builtInCategoryInjectionToken); - - for (const category of categories) { - registry.add(category); - } - - return registry; - }, -}); - -export default catalogCategoryRegistryInjectable; diff --git a/packages/core/src/common/catalog/category-registry.ts b/packages/core/src/common/catalog/category-registry.ts deleted file mode 100644 index f541645df0..0000000000 --- a/packages/core/src/common/catalog/category-registry.ts +++ /dev/null @@ -1,107 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { action, computed, observable, makeObservable } from "mobx"; -import { once } from "lodash"; -import { iter, getOrInsertMap, strictSet } from "@k8slens/utilities"; -import type { Disposer } from "@k8slens/utilities"; -import type { CatalogCategory, CatalogEntityData, CatalogEntityKindData } from "./catalog-entity"; - -export type CategoryFilter = (category: CatalogCategory) => any; - -export class CatalogCategoryRegistry { - protected readonly categories = observable.set(); - protected readonly groupKinds = new Map>(); - protected readonly filters = observable.set([], { - deep: false, - }); - - constructor() { - makeObservable(this); - } - - @action add(category: CatalogCategory): Disposer { - const byGroup = getOrInsertMap(this.groupKinds, category.spec.group); - - this.categories.add(category); - strictSet(byGroup, category.spec.names.kind, category); - - return () => { - this.categories.delete(category); - byGroup.delete(category.spec.names.kind); - }; - } - - getById(id: string) { - return iter.find(this.categories.values(), (category) => category.getId() === id); - } - - @computed get items() { - return Array.from(this.categories); - } - - @computed get filteredItems() { - return Array.from( - iter.reduce( - this.filters, - iter.filter, - this.items.values(), - ), - ); - } - - - getForGroupKind(group: string, kind: string): T | undefined { - return this.groupKinds.get(group)?.get(kind) as T; - } - - getEntityForData(data: CatalogEntityData & CatalogEntityKindData) { - const category = this.getCategoryForEntity(data); - - if (!category) { - return null; - } - - const splitApiVersion = data.apiVersion.split("/"); - const version = splitApiVersion[1]; - - const specVersion = category.spec.versions.find((v) => v.name === version); - - if (!specVersion) { - return null; - } - - return new specVersion.entityClass(data); - } - - hasCategoryForEntity({ kind, apiVersion }: CatalogEntityData & CatalogEntityKindData): boolean { - const splitApiVersion = apiVersion.split("/"); - const group = splitApiVersion[0]; - - return this.groupKinds.get(group)?.has(kind) ?? false; - } - - getCategoryForEntity(data: CatalogEntityData & CatalogEntityKindData): T | undefined { - const splitApiVersion = data.apiVersion.split("/"); - const group = splitApiVersion[0]; - - return this.getForGroupKind(group, data.kind); - } - - getByName(name: string) { - return this.items.find(category => category.metadata?.name == name); - } - - /** - * Add a new filter to the set of category filters - * @param fn The function that should return a truthy value if that category should be displayed - * @returns A function to remove that filter - */ - addCatalogCategoryFilter(fn: CategoryFilter): Disposer { - this.filters.add(fn); - - return once(() => void this.filters.delete(fn)); - } -} diff --git a/packages/core/src/common/catalog/filtered-categories.injectable.ts b/packages/core/src/common/catalog/filtered-categories.injectable.ts deleted file mode 100644 index c84d527ff2..0000000000 --- a/packages/core/src/common/catalog/filtered-categories.injectable.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { computed } from "mobx"; -import catalogCategoryRegistryInjectable from "./category-registry.injectable"; - -const filteredCategoriesInjectable = getInjectable({ - id: "filtered-categories", - instantiate: (di) => { - const registry = di.inject(catalogCategoryRegistryInjectable); - - return computed(() => [...registry.filteredItems]); - }, -}); - -export default filteredCategoriesInjectable; diff --git a/packages/core/src/common/catalog/has-category-for-entity.injectable.ts b/packages/core/src/common/catalog/has-category-for-entity.injectable.ts deleted file mode 100644 index cff7d720c1..0000000000 --- a/packages/core/src/common/catalog/has-category-for-entity.injectable.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { CatalogEntityData, CatalogEntityKindData } from "./catalog-entity"; -import catalogCategoryRegistryInjectable from "./category-registry.injectable"; - -export type HasCategoryForEntity = (data: CatalogEntityData & CatalogEntityKindData) => boolean; - -const hasCategoryForEntityInjectable = getInjectable({ - id: "has-category-for-entity", - - instantiate: (di): HasCategoryForEntity => { - const registry = di.inject(catalogCategoryRegistryInjectable); - - return (data) => registry.hasCategoryForEntity(data); - }, -}); - -export default hasCategoryForEntityInjectable; diff --git a/packages/core/src/common/catalog/helpers.ts b/packages/core/src/common/catalog/helpers.ts deleted file mode 100644 index 75cdf726aa..0000000000 --- a/packages/core/src/common/catalog/helpers.ts +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { CatalogEntity } from "./catalog-entity"; -import GraphemeSplitter from "grapheme-splitter"; -import { hasOwnProperty, hasTypedProperty, isObject, isString, iter } from "@k8slens/utilities"; - -function getNameParts(name: string): string[] { - const byWhitespace = name.split(/\s+/); - - if (byWhitespace.length > 1) { - return byWhitespace; - } - - const byDashes = name.split(/[-_]+/); - - if (byDashes.length > 1) { - return byDashes; - } - - return name.split(/@+/); -} - -export function limitGraphemeLengthOf(src: string, count: number): string { - const splitter = new GraphemeSplitter(); - - return iter - .chain(splitter.iterateGraphemes(src)) - .take(count) - .join(""); -} - -export function computeDefaultShortName(name: string) { - if (!name || typeof name !== "string") { - return "??"; - } - - const [rawFirst, rawSecond, rawThird] = getNameParts(name); - const splitter = new GraphemeSplitter(); - const first = splitter.iterateGraphemes(rawFirst); - const second = rawSecond ? splitter.iterateGraphemes(rawSecond): first; - const third = rawThird ? splitter.iterateGraphemes(rawThird) : iter.newEmpty(); - - return iter.chain(iter.take(first, 1)) - .concat(iter.take(second, 1)) - .concat(iter.take(third, 1)) - .join(""); -} - -export function getShortName(entity: CatalogEntity): string { - return entity.metadata.shortName || computeDefaultShortName(entity.getName()); -} - -export function getIconColourHash(entity: CatalogEntity): string { - return `${entity.metadata.name}-${entity.metadata.source}`; -} - -export function getIconBackground(entity: CatalogEntity): string | undefined { - if (isObject(entity.spec.icon)) { - if (hasTypedProperty(entity.spec.icon, "background", isString)) { - return entity.spec.icon.background; - } - - return hasOwnProperty(entity.spec.icon, "src") - ? "transparent" - : undefined; - } - - return undefined; -} - -export function getIconMaterial(entity: CatalogEntity): string | undefined { - if ( - isObject(entity.spec.icon) - && hasTypedProperty(entity.spec.icon, "material", isString) - ) { - return entity.spec.icon.material; - } - - return undefined; -} diff --git a/packages/core/src/common/catalog/index.ts b/packages/core/src/common/catalog/index.ts deleted file mode 100644 index 4964dada6a..0000000000 --- a/packages/core/src/common/catalog/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export * from "./category-registry"; -export * from "./catalog-entity"; diff --git a/packages/core/src/common/catalog/visit-entity-context-menu.injectable.ts b/packages/core/src/common/catalog/visit-entity-context-menu.injectable.ts deleted file mode 100644 index eb1a2abeba..0000000000 --- a/packages/core/src/common/catalog/visit-entity-context-menu.injectable.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { CatalogEntity, CatalogEntityContextMenuContext } from "./catalog-entity"; -import catalogCategoryRegistryInjectable from "./category-registry.injectable"; - -export type VisitEntityContextMenu = (entity: CatalogEntity, context: CatalogEntityContextMenuContext) => void; - -const visitEntityContextMenuInjectable = getInjectable({ - id: "visit-entity-context-menu", - instantiate: (di): VisitEntityContextMenu => { - const categoryRegistry = di.inject(catalogCategoryRegistryInjectable); - - return (entity, context) => { - entity.onContextMenuOpen?.(context); - categoryRegistry.getCategoryForEntity(entity)?.emit("contextMenuOpen", entity, context); - }; - }, -}); - -export default visitEntityContextMenuInjectable; diff --git a/packages/core/src/common/certificate/lens-proxy-certificate-channel.ts b/packages/core/src/common/certificate/lens-proxy-certificate-channel.ts deleted file mode 100644 index 9dd339ee65..0000000000 --- a/packages/core/src/common/certificate/lens-proxy-certificate-channel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { SelfSignedCert } from "selfsigned"; -import { getRequestChannel } from "@k8slens/messaging"; - -export const lensProxyCertificateChannel = getRequestChannel("request-lens-proxy-certificate"); diff --git a/packages/core/src/common/certificate/lens-proxy-certificate.global-override-for-injectable.ts b/packages/core/src/common/certificate/lens-proxy-certificate.global-override-for-injectable.ts deleted file mode 100644 index 4d0aeec1d8..0000000000 --- a/packages/core/src/common/certificate/lens-proxy-certificate.global-override-for-injectable.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "@k8slens/test-utils"; -import lensProxyCertificateInjectable from "./lens-proxy-certificate.injectable"; - -export default getGlobalOverride(lensProxyCertificateInjectable, () => { - return { - get: () => ({ - public: "", - private: "", - cert: "", - }), - set: () => {}, - }; -}); - diff --git a/packages/core/src/common/certificate/lens-proxy-certificate.injectable.ts b/packages/core/src/common/certificate/lens-proxy-certificate.injectable.ts deleted file mode 100644 index b5e00e0094..0000000000 --- a/packages/core/src/common/certificate/lens-proxy-certificate.injectable.ts +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { SelfSignedCert } from "selfsigned"; - -const lensProxyCertificateInjectable = getInjectable({ - id: "lens-proxy-certificate", - instantiate: () => { - let certState: SelfSignedCert; - const cert = { - get: () => { - if (!certState) { - throw "certificate has not been set"; - } - - return certState; - }, - set: (certificate: SelfSignedCert) => { - if (certState) { - throw "certificate has already been set"; - } - - certState = certificate; - }, - }; - - return cert; - }, -}); - -export default lensProxyCertificateInjectable; diff --git a/packages/core/src/common/cluster-frames.injectable.ts b/packages/core/src/common/cluster-frames.injectable.ts deleted file mode 100644 index dc8bf5dee7..0000000000 --- a/packages/core/src/common/cluster-frames.injectable.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { observable } from "mobx"; - -export interface ClusterFrameInfo { - frameId: number; - processId: number; -} - -const clusterFramesInjectable = getInjectable({ - id: "cluster-frames", - instantiate: () => observable.map(), -}); - -export default clusterFramesInjectable; diff --git a/packages/core/src/common/cluster-types.ts b/packages/core/src/common/cluster-types.ts deleted file mode 100644 index a8ce7da912..0000000000 --- a/packages/core/src/common/cluster-types.ts +++ /dev/null @@ -1,194 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import Joi from "joi"; - -/** - * JSON serializable metadata type - */ -export type ClusterMetadata = Record; - -/** - * Metadata for cluster's prometheus settings - */ -export interface ClusterPrometheusMetadata { - success?: boolean; - provider?: string; - autoDetected?: boolean; -} - -/** - * A ClusterId is an opaque string - */ -export type ClusterId = string; - -/** - * The fields that are used for updating a cluster instance - */ -export type UpdateClusterModel = Omit; - -/** - * A type validator for `UpdateClusterModel` so that only expected types are present - */ -export const updateClusterModelChecker = Joi.object({ - kubeConfigPath: Joi.string() - .required() - .min(1), - contextName: Joi.string() - .required() - .min(1), - preferences: Joi.object(), - metadata: Joi.object(), - accessibleNamespaces: Joi.array() - .items(Joi.string()), - labels: Joi.object().pattern(Joi.string(), Joi.string()), -}); - -/** - * A type validator for just the `id` fields of `ClusterModel`. The rest is - * covered by `updateClusterModelChecker` - */ -export const clusterModelIdChecker = Joi.object>({ - id: Joi.string() - .required() - .min(1), -}); - -/** - * The model for passing cluster data around, including to disk - */ -export interface ClusterModel { - /** Unique id for a cluster */ - id: ClusterId; - - /** Path to cluster kubeconfig */ - kubeConfigPath: string; - - /** User context in kubeconfig */ - contextName: string; - - /** Preferences */ - preferences?: ClusterPreferences; - - /** Metadata */ - metadata?: ClusterMetadata; - - /** List of accessible namespaces */ - accessibleNamespaces?: string[]; - - /** - * Labels for the catalog entity - */ - labels?: Partial>; -} - -/** - * This data is retreived from the kubeconfig file before calling the cluster constructor. - * - * That is done to remove the external dependency on the construction of Cluster instances. - */ -export interface ClusterConfigData { - clusterServerUrl: string; -} - -/** - * The complete set of cluster settings or preferences - */ -export interface ClusterPreferences extends ClusterPrometheusPreferences { - terminalCWD?: string; - clusterName?: string; - iconOrder?: number; - /** - * The src for the cluster. If set to `null` that means that it was - * cleared by preferences. - */ - icon?: string | null; - httpsProxy?: string; - hiddenMetrics?: string[]; - nodeShellImage?: string; - imagePullSecret?: string; - defaultNamespace?: string; -} - -/** - * A cluster's prometheus settings (a subset of cluster settings) - */ -export interface ClusterPrometheusPreferences { - prometheus?: { - namespace: string; - service: string; - port: number; - prefix: string; - }; - prometheusProvider?: { - type: string; - }; -} - -/** - * The options for the status of connection attempts to a cluster - */ -export enum ClusterStatus { - AccessGranted = 2, - AccessDenied = 1, - Offline = 0, -} - -/** - * The message format for the "cluster::connection-update" channels - */ -export interface KubeAuthUpdate { - message: string; - level: "info" | "warning" | "error"; -} - -/** - * The OpenLens known static metadata keys - */ -export enum ClusterMetadataKey { - VERSION = "version", - CLUSTER_ID = "id", - DISTRIBUTION = "distribution", - NODES_COUNT = "nodes", - LAST_SEEN = "lastSeen", - PROMETHEUS = "prometheus", -} - -/** - * A shorthand enum for resource types that have metrics attached to them via OpenLens metrics stack - */ -export enum ClusterMetricsResourceType { - Cluster = "Cluster", - Node = "Node", - Pod = "Pod", - Deployment = "Deployment", - StatefulSet = "StatefulSet", - Container = "Container", - Ingress = "Ingress", - VolumeClaim = "PersistentVolumeClaim", - ReplicaSet = "ReplicaSet", - DaemonSet = "DaemonSet", - Job = "Job", - Namespace = "Namespace", -} - -/** - * The default node shell image - */ -export const initialNodeShellImage = "docker.io/alpine:3.13"; - -/** - * The data representing a cluster's state, for passing between main and renderer - */ -export interface ClusterState { - online: boolean; - disconnected: boolean; - accessible: boolean; - ready: boolean; - isAdmin: boolean; - allowedNamespaces: string[]; - resourcesToShow: string[]; - isGlobalWatchEnabled: boolean; -} diff --git a/packages/core/src/common/cluster/cluster.ts b/packages/core/src/common/cluster/cluster.ts deleted file mode 100644 index f703ebc336..0000000000 --- a/packages/core/src/common/cluster/cluster.ts +++ /dev/null @@ -1,222 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { computed, observable, toJS, runInAction } from "mobx"; -import type { KubeApiResource } from "../rbac"; -import type { ClusterState, ClusterId, ClusterMetadata, ClusterModel, ClusterPreferences, ClusterPrometheusPreferences, UpdateClusterModel } from "../cluster-types"; -import { ClusterMetadataKey, clusterModelIdChecker, updateClusterModelChecker } from "../cluster-types"; -import type { IObservableValue } from "mobx"; -import { replaceObservableObject } from "../utils/replace-observable-object"; -import { pick } from "lodash"; - -export class Cluster { - /** - * Unique id for a cluster - */ - readonly id: ClusterId; - - /** - * Kubeconfig context name - */ - readonly contextName = observable.box() as IObservableValue; - - /** - * Path to kubeconfig - */ - readonly kubeConfigPath = observable.box() as IObservableValue; - - /** - * Describes if we can detect that cluster is online - */ - readonly online = observable.box(false); - - /** - * Describes if user is able to access cluster resources - */ - readonly accessible = observable.box(false); - - /** - * Is cluster instance in usable state - */ - readonly ready = observable.box(false); - - /** - * Is cluster disconnected. False if user has selected to connect. - */ - readonly disconnected = observable.box(true); - - /** - * Does user have admin like access - */ - readonly isAdmin = observable.box(false); - - /** - * Global watch-api accessibility , e.g. "/api/v1/services?watch=1" - */ - readonly isGlobalWatchEnabled = observable.box(false); - - /** - * Preferences - */ - readonly preferences = observable.object({}); - - /** - * Metadata - */ - readonly metadata = observable.object({}); - - /** - * List of allowed namespaces verified via K8S::SelfSubjectAccessReview api - */ - readonly allowedNamespaces = observable.array(); - - /** - * List of accessible namespaces provided by user in the Cluster Settings - */ - readonly accessibleNamespaces = observable.array(); - - /** - * The list of all known resources associated with this cluster - */ - readonly knownResources = observable.array(); - - /** - * The formatting of this is `group.name` or `name` (if in core) - */ - readonly resourcesToShow = observable.set(); - - /** - * Labels for the catalog entity - */ - readonly labels = observable.object>>({}); - - /** - * Is cluster available - */ - readonly available = computed(() => this.accessible.get() && !this.disconnected.get()); - - /** - * Cluster name - */ - readonly name = computed(() => this.preferences.clusterName || this.contextName.get()); - - /** - * The detected kubernetes distribution - */ - readonly distribution = computed(() => this.metadata[ClusterMetadataKey.DISTRIBUTION]?.toString() || "unknown"); - - /** - * The detected kubernetes version - */ - readonly version = computed(() => this.metadata[ClusterMetadataKey.VERSION]?.toString() || "unknown"); - - /** - * Prometheus preferences - */ - readonly prometheusPreferences = computed(() => pick(toJS(this.preferences), "prometheus", "prometheusProvider") as ClusterPrometheusPreferences); - - constructor({ id, ...model }: ClusterModel) { - const { error } = clusterModelIdChecker.validate({ id }); - - if (error) { - throw error; - } - - this.id = id; - this.updateModel(model); - } - - /** - * Update cluster data model - * - * @param model - */ - updateModel(model: UpdateClusterModel) { - // Note: do not assign ID as that should never be updated - - const { error } = updateClusterModelChecker.validate(model, { allowUnknown: true }); - - if (error) { - throw error; - } - - runInAction(() => { - this.kubeConfigPath.set(model.kubeConfigPath); - this.contextName.set(model.contextName); - - if (model.preferences) { - replaceObservableObject(this.preferences, model.preferences); - } - - if (model.metadata) { - replaceObservableObject(this.metadata, model.metadata); - } - - if (model.accessibleNamespaces) { - this.accessibleNamespaces.replace(model.accessibleNamespaces); - } - - if (model.labels) { - replaceObservableObject(this.labels, model.labels); - } - }); - } - - toJSON(): ClusterModel { - return { - id: this.id, - contextName: this.contextName.get(), - kubeConfigPath: this.kubeConfigPath.get(), - preferences: toJS(this.preferences), - metadata: toJS(this.metadata), - accessibleNamespaces: this.accessibleNamespaces.toJSON(), - labels: toJS(this.labels), - }; - } - - /** - * Serializable cluster-state used for sync btw main <-> renderer - */ - getState(): ClusterState { - return { - online: this.online.get(), - ready: this.ready.get(), - disconnected: this.disconnected.get(), - accessible: this.accessible.get(), - isAdmin: this.isAdmin.get(), - allowedNamespaces: this.allowedNamespaces.toJSON(), - resourcesToShow: this.resourcesToShow.toJSON(), - isGlobalWatchEnabled: this.isGlobalWatchEnabled.get(), - }; - } - - /** - * @param state cluster state - */ - setState(state: ClusterState) { - runInAction(() => { - this.accessible.set(state.accessible); - this.allowedNamespaces.replace(state.allowedNamespaces); - this.resourcesToShow.replace(state.resourcesToShow); - this.disconnected.set(state.disconnected); - this.isAdmin.set(state.isAdmin); - this.isGlobalWatchEnabled.set(state.isGlobalWatchEnabled); - this.online.set(state.online); - this.ready.set(state.ready); - }); - } - - // get cluster system meta, e.g. use in "logger" - getMeta() { - return { - id: this.id, - name: this.contextName.get(), - ready: this.ready.get(), - online: this.online.get(), - accessible: this.accessible.get(), - disconnected: this.disconnected.get(), - }; - } -} diff --git a/packages/core/src/common/cluster/create-authorization-api.injectable.ts b/packages/core/src/common/cluster/create-authorization-api.injectable.ts deleted file mode 100644 index c0658a4a34..0000000000 --- a/packages/core/src/common/cluster/create-authorization-api.injectable.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { AuthorizationV1Api } from "@kubernetes/client-node"; -import type { KubeConfig } from "@kubernetes/client-node"; -import { getInjectable } from "@ogre-tools/injectable"; - -export type CreateAuthorizationApi = (config: KubeConfig) => AuthorizationV1Api; - -const createAuthorizationApiInjectable = getInjectable({ - id: "create-authorization-api", - instantiate: (): CreateAuthorizationApi => (config) => config.makeApiClient(AuthorizationV1Api), -}); - -export default createAuthorizationApiInjectable; diff --git a/packages/core/src/common/cluster/create-can-i.injectable.ts b/packages/core/src/common/cluster/create-can-i.injectable.ts deleted file mode 100644 index 3613f4da84..0000000000 --- a/packages/core/src/common/cluster/create-can-i.injectable.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { AuthorizationV1Api, V1ResourceAttributes } from "@kubernetes/client-node"; -import { getInjectable } from "@ogre-tools/injectable"; -import { loggerInjectionToken } from "@k8slens/logger"; - -/** - * Requests the permissions for actions on the kube cluster - * @param resourceAttributes The descriptor of the action that is desired to be known if it is allowed - * @returns `true` if the actions described are allowed - */ -export type CanI = (resourceAttributes: V1ResourceAttributes) => Promise; - -export type CreateCanI = (api: AuthorizationV1Api) => CanI; - -const createCanIInjectable = getInjectable({ - id: "create-can-i", - instantiate: (di): CreateCanI => { - const logger = di.inject(loggerInjectionToken); - - return (api) => async (resourceAttributes: V1ResourceAttributes): Promise => { - try { - const { body } = await api.createSelfSubjectAccessReview({ - apiVersion: "authorization.k8s.io/v1", - kind: "SelfSubjectAccessReview", - spec: { resourceAttributes }, - }); - - return body.status?.allowed ?? false; - } catch (error) { - logger.error(`[AUTHORIZATION-REVIEW]: failed to create access review: ${error}`, { resourceAttributes }); - - return false; - } - }; - }, -}); - -export default createCanIInjectable; diff --git a/packages/core/src/common/cluster/create-core-api.injectable.ts b/packages/core/src/common/cluster/create-core-api.injectable.ts deleted file mode 100644 index 2389b12478..0000000000 --- a/packages/core/src/common/cluster/create-core-api.injectable.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { KubeConfig } from "@kubernetes/client-node"; -import { CoreV1Api } from "@kubernetes/client-node"; -import { getInjectable } from "@ogre-tools/injectable"; - -export type CreateCoreApi = (config: KubeConfig) => CoreV1Api; - -const createCoreApiInjectable = getInjectable({ - id: "create-core-api", - instantiate: (): CreateCoreApi => config => config.makeApiClient(CoreV1Api), -}); - -export default createCoreApiInjectable; diff --git a/packages/core/src/common/cluster/create-request-namespace-list-permissions.injectable.ts b/packages/core/src/common/cluster/create-request-namespace-list-permissions.injectable.ts deleted file mode 100644 index 0e2678cda7..0000000000 --- a/packages/core/src/common/cluster/create-request-namespace-list-permissions.injectable.ts +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { AuthorizationV1Api } from "@kubernetes/client-node"; -import { getInjectable } from "@ogre-tools/injectable"; -import { loggerInjectionToken } from "@k8slens/logger"; -import type { KubeApiResource } from "../rbac"; - -export type CanListResource = (resource: KubeApiResource) => boolean; - -/** - * Requests the permissions for actions on the kube cluster - * @param namespace The namespace of the resources - */ -export type RequestNamespaceListPermissions = (namespace: string) => Promise; - -export type CreateRequestNamespaceListPermissions = (api: AuthorizationV1Api) => RequestNamespaceListPermissions; - -const createRequestNamespaceListPermissionsInjectable = getInjectable({ - id: "create-request-namespace-list-permissions", - instantiate: (di): CreateRequestNamespaceListPermissions => { - const logger = di.inject(loggerInjectionToken); - - return (api) => async (namespace) => { - try { - const { body: { status }} = await api.createSelfSubjectRulesReview({ - apiVersion: "authorization.k8s.io/v1", - kind: "SelfSubjectRulesReview", - spec: { namespace }, - }); - - if (!status || status.incomplete) { - logger.warn(`[AUTHORIZATION-NAMESPACE-REVIEW]: allowing all resources in namespace="${namespace}" due to incomplete SelfSubjectRulesReview: ${status?.evaluationError}`); - - return () => true; - } - - const { resourceRules } = status; - - return (resource) => ( - resourceRules - .filter(({ apiGroups = ["*"] }) => apiGroups.includes("*") || apiGroups.includes(resource.group)) - .filter(({ resources = ["*"] }) => resources.includes("*") || resources.includes(resource.apiName)) - .some(({ verbs }) => verbs.includes("*") || verbs.includes("list")) - ); - } catch (error) { - logger.error(`[AUTHORIZATION-NAMESPACE-REVIEW]: failed to create subject rules review`, { namespace, error }); - - return () => true; - } - }; - }, -}); - -export default createRequestNamespaceListPermissionsInjectable; diff --git a/packages/core/src/common/cluster/current-cluster-channel.ts b/packages/core/src/common/cluster/current-cluster-channel.ts deleted file mode 100644 index c16af7832b..0000000000 --- a/packages/core/src/common/cluster/current-cluster-channel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { ClusterId } from "../cluster-types"; -import type { MessageChannel } from "@k8slens/messaging"; - -export const currentClusterMessageChannel: MessageChannel = { - id: "current-visible-cluster", -}; diff --git a/packages/core/src/common/cluster/list-namespaces.injectable.ts b/packages/core/src/common/cluster/list-namespaces.injectable.ts deleted file mode 100644 index 04acb0671b..0000000000 --- a/packages/core/src/common/cluster/list-namespaces.injectable.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { CoreV1Api } from "@kubernetes/client-node"; -import { getInjectable } from "@ogre-tools/injectable"; -import { isDefined } from "@k8slens/utilities"; - -export type ListNamespaces = () => Promise; -export type CreateListNamespaces = (api: CoreV1Api) => ListNamespaces; - -const createListNamespacesInjectable = getInjectable({ - id: "create-list-namespaces", - instantiate: (): CreateListNamespaces => (api) => async () => { - const { body: { items }} = await api.listNamespace(); - - return items - .map(ns => ns.metadata?.name) - .filter(isDefined); - }, -}); - -export default createListNamespacesInjectable; diff --git a/packages/core/src/common/cluster/load-kubeconfig.injectable.ts b/packages/core/src/common/cluster/load-kubeconfig.injectable.ts deleted file mode 100644 index 4a420dadd3..0000000000 --- a/packages/core/src/common/cluster/load-kubeconfig.injectable.ts +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { KubeConfig } from "@kubernetes/client-node"; -import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; -import type { Cluster } from "./cluster"; -import loadConfigFromFileInjectable from "../kube-helpers/load-config-from-file.injectable"; -import type { ConfigResult } from "../kube-helpers"; - -export interface LoadKubeconfig { - (fullResult?: false): Promise; - (fullResult: true): Promise; -} - -const loadKubeconfigInjectable = getInjectable({ - id: "load-kubeconfig", - instantiate: (di, cluster) => { - const loadConfigFromFile = di.inject(loadConfigFromFileInjectable); - - return (async (fullResult = false) => { - const result = await loadConfigFromFile(cluster.kubeConfigPath.get()); - - if (fullResult) { - return result; - } - - return result.config; - }) as LoadKubeconfig; - }, - lifecycle: lifecycleEnum.keyedSingleton({ - getInstanceKey: (di, cluster: Cluster) => cluster.id, - }), -}); - -export default loadKubeconfigInjectable; diff --git a/packages/core/src/common/cluster/request-namespace-list-permissions.test.ts b/packages/core/src/common/cluster/request-namespace-list-permissions.test.ts deleted file mode 100644 index 194b5ce7e5..0000000000 --- a/packages/core/src/common/cluster/request-namespace-list-permissions.test.ts +++ /dev/null @@ -1,227 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { AsyncFnMock } from "@async-fn/jest"; -import asyncFn from "@async-fn/jest"; -import type { AuthorizationV1Api, V1SubjectRulesReviewStatus } from "@kubernetes/client-node"; -import type { DiContainer } from "@ogre-tools/injectable"; -import type { IncomingMessage } from "http"; -import { anyObject } from "jest-mock-extended"; -import { getDiForUnitTesting } from "../../main/getDiForUnitTesting"; -import { cast } from "../../test-utils/cast"; -import type { KubeApiResource } from "../rbac"; -import type { RequestNamespaceListPermissions } from "./create-request-namespace-list-permissions.injectable"; -import createRequestNamespaceListPermissionsInjectable from "./create-request-namespace-list-permissions.injectable"; - -interface TestCase { - description: string; - status: V1SubjectRulesReviewStatus; - expected: boolean; -} - -describe("requestNamespaceListPermissions", () => { - let di: DiContainer; - let createSelfSubjectRulesReviewMock: AsyncFnMock; - let requestNamespaceListPermissions: RequestNamespaceListPermissions; - - beforeEach(() => { - di = getDiForUnitTesting(); - - const createRequestNamespaceListPermissions = di.inject(createRequestNamespaceListPermissionsInjectable); - - createSelfSubjectRulesReviewMock = asyncFn(); - - requestNamespaceListPermissions = createRequestNamespaceListPermissions(cast({ - createSelfSubjectRulesReview: createSelfSubjectRulesReviewMock, - })); - }); - - describe("when a request for list permissions in a namespace has been started", () => { - let request: ReturnType; - - beforeEach(() => { - request = requestNamespaceListPermissions("irrelevant-namespace"); - }); - - it("should request the creation of a SelfSubjectRulesReview", () => { - expect(createSelfSubjectRulesReviewMock).toBeCalledWith(anyObject({ - spec: { - namespace: "irrelevant-namespace", - }, - })); - }); - - ([ - { - description: "incomplete data", - status: { - incomplete: true, - resourceRules: [], - nonResourceRules: [], - }, - expected: true, - }, - { - description: "first resourceRule has all permissions for everything", - status: { - incomplete: false, - resourceRules: [ - { - apiGroups: ["*"], - verbs: ["*"], - }, - { - apiGroups: ["*"], - verbs: ["get"], - }, - ], - nonResourceRules: [], - }, - expected: true, - }, - { - description: "first resourceRule has list permissions for everything", - status: { - incomplete: false, - resourceRules: [ - { - apiGroups: ["*"], - verbs: ["list"], - }, - { - apiGroups: ["*"], - verbs: ["get"], - }, - ], - nonResourceRules: [], - }, - expected: true, - }, - { - description: "first resourceRule has list permissions for asked resource", - status: { - incomplete: false, - resourceRules: [ - { - apiGroups: ["some-api-group"], - resources: ["some-kind"], - verbs: ["list"], - }, - { - apiGroups: ["*"], - verbs: ["get"], - }, - ], - nonResourceRules: [], - }, - expected: true, - }, - { - description: "last resourceRule has all permissions for everything", - status: { - incomplete: false, - resourceRules: [ - { - apiGroups: ["*"], - verbs: ["get"], - }, - { - apiGroups: ["*"], - verbs: ["*"], - }, - ], - nonResourceRules: [], - }, - expected: true, - }, - { - description: "last resourceRule has list permissions for asked resource", - status: { - incomplete: false, - resourceRules: [ - { - apiGroups: ["*"], - verbs: ["get"], - }, - { - apiGroups: ["some-api-group"], - resources: ["some-kind"], - verbs: ["list"], - }, - ], - nonResourceRules: [], - }, - expected: true, - }, - { - description: "resourceRules has matching resource without list verb", - status: { - incomplete: false, - resourceRules: [ - { - apiGroups: ["some-api-group"], - resources: ["some-kind"], - verbs: ["get"], - }, - ], - nonResourceRules: [], - }, - expected: false, - }, - { - description: "resourceRules has no matching resource with list verb", - status: { - incomplete: false, - resourceRules: [ - { - apiGroups: [""], - resources: ["services"], - verbs: ["list"], - }, - ], - nonResourceRules: [], - }, - expected: false, - }, - ] as TestCase[]).forEach(({ description, status, expected }) => { - describe(`when api returns ${description}`, () => { - beforeEach(async () => { - await createSelfSubjectRulesReviewMock.resolve({ - body: { - status, - spec: {}, - }, - response: null as unknown as IncomingMessage, - }); - }); - - it(`allows the request to complete, and 'canListResource' will return ${expected}`, async () => { - const canListResource = await request; - - expect(canListResource(someKubeResource)).toBe(expected); - }); - }); - }); - - describe("when api rejects", () => { - beforeEach(async () => { - await createSelfSubjectRulesReviewMock.reject(new Error("unknown error")); - }); - - it("allows the request to complete, and 'canListResource' will return true", async () => { - const canListResource = await request; - - expect(canListResource(someKubeResource)).toBe(true); - }); - }); - }); -}); - -const someKubeResource: KubeApiResource = { - apiName: "some-kind", - group: "some-api-group", - kind: "SomeKind", - namespaced: true, -}; diff --git a/packages/core/src/common/cluster/visibility-channel.ts b/packages/core/src/common/cluster/visibility-channel.ts deleted file mode 100644 index 554217a409..0000000000 --- a/packages/core/src/common/cluster/visibility-channel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { ClusterId } from "../cluster-types"; -import type { MessageChannel } from "@k8slens/messaging"; - -export const clusterVisibilityChannel: MessageChannel = { - id: "cluster-visibility", -}; diff --git a/packages/core/src/common/directory-for-lens-local-storage/directory-for-lens-local-storage.injectable.ts b/packages/core/src/common/directory-for-lens-local-storage/directory-for-lens-local-storage.injectable.ts deleted file mode 100644 index 11a8f3f7de..0000000000 --- a/packages/core/src/common/directory-for-lens-local-storage/directory-for-lens-local-storage.injectable.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import directoryForUserDataInjectable from "../app-paths/directory-for-user-data/directory-for-user-data.injectable"; -import joinPathsInjectable from "../path/join-paths.injectable"; - -const directoryForLensLocalStorageInjectable = getInjectable({ - id: "directory-for-lens-local-storage", - - instantiate: (di) => { - const joinPaths = di.inject(joinPathsInjectable); - const directoryForUserData = di.inject(directoryForUserDataInjectable); - - return joinPaths( - directoryForUserData, - "lens-local-storage", - ); - }, -}); - -export default directoryForLensLocalStorageInjectable; diff --git a/packages/core/src/common/error-reporting/initialize-sentry-reporting.global-override-for-injectable.ts b/packages/core/src/common/error-reporting/initialize-sentry-reporting.global-override-for-injectable.ts deleted file mode 100644 index 1a7dce6a61..0000000000 --- a/packages/core/src/common/error-reporting/initialize-sentry-reporting.global-override-for-injectable.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "@k8slens/test-utils"; -import initializeSentryReportingWithInjectable from "./initialize-sentry-reporting.injectable"; - -export default getGlobalOverride(initializeSentryReportingWithInjectable, () => () => {}); diff --git a/packages/core/src/common/error-reporting/initialize-sentry-reporting.injectable.ts b/packages/core/src/common/error-reporting/initialize-sentry-reporting.injectable.ts deleted file mode 100644 index 3a72ef7b12..0000000000 --- a/packages/core/src/common/error-reporting/initialize-sentry-reporting.injectable.ts +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { ElectronMainOptions } from "@sentry/electron/main"; -import type { BrowserOptions } from "@sentry/electron/renderer"; -import isProductionInjectable from "../vars/is-production.injectable"; -import sentryDataSourceNameInjectable from "../vars/sentry-dsn-url.injectable"; -import { Dedupe, Offline } from "@sentry/integrations"; -import { inspect } from "util"; -import userPreferencesStateInjectable from "../../features/user-preferences/common/state.injectable"; - -export type InitializeSentryReportingWith = (initSentry: (opts: BrowserOptions | ElectronMainOptions) => void) => void; - -const mapProcessName = (type: "browser" | "renderer" | "worker" | "utility") => type === "browser" ? "main" : type; - -const initializeSentryReportingWithInjectable = getInjectable({ - id: "initialize-sentry-reporting-with", - instantiate: (di): InitializeSentryReportingWith => { - const sentryDataSourceName = di.inject(sentryDataSourceNameInjectable); - const isProduction = di.inject(isProductionInjectable); - const state = di.inject(userPreferencesStateInjectable); - - if (!sentryDataSourceName) { - return () => {}; - } - - return (initSentry) => initSentry({ - beforeSend: (event) => { - if (state.allowErrorReporting) { - return event; - } - - /** - * Directly write to stdout so that no other integrations capture this and create an infinite loop - */ - process.stdout.write(`🔒 [SENTRY-BEFORE-SEND-HOOK]: Sentry event is caught but not sent to server.`); - process.stdout.write("🔒 [SENTRY-BEFORE-SEND-HOOK]: === START OF SENTRY EVENT ==="); - process.stdout.write(inspect(event, false, null, true)); - process.stdout.write("🔒 [SENTRY-BEFORE-SEND-HOOK]: === END OF SENTRY EVENT ==="); - - // if return null, the event won't be sent - // ref https://github.com/getsentry/sentry-javascript/issues/2039 - return null; - }, - dsn: sentryDataSourceName, - integrations: [ - new Dedupe(), - new Offline(), - ], - initialScope: { - tags: { - "process": mapProcessName(process.type), - }, - }, - environment: isProduction ? "production" : "development", - }); - }, - causesSideEffects: true, -}); - -export default initializeSentryReportingWithInjectable; diff --git a/packages/core/src/common/fetch/download-binary.injectable.ts b/packages/core/src/common/fetch/download-binary.injectable.ts deleted file mode 100644 index 9f0ce65093..0000000000 --- a/packages/core/src/common/fetch/download-binary.injectable.ts +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { RequestInit, Response } from "@k8slens/node-fetch"; -import type { AsyncResult } from "@k8slens/utilities"; -import fetchInjectable from "./fetch.injectable"; - -export interface DownloadBinaryOptions { - signal?: AbortSignal | null | undefined; -} - -export type DownloadBinary = (url: string, opts?: DownloadBinaryOptions) => AsyncResult; - -const downloadBinaryInjectable = getInjectable({ - id: "download-binary", - instantiate: (di): DownloadBinary => { - const fetch = di.inject(fetchInjectable); - - return async (url, opts) => { - let result: Response; - - try { - result = await fetch(url, opts as RequestInit); - } catch (error) { - return { - callWasSuccessful: false, - error: String(error), - }; - } - - if (result.status < 200 || 300 <= result.status) { - return { - callWasSuccessful: false, - error: result.statusText, - }; - } - - try { - return { - callWasSuccessful: true, - response: await result.buffer(), - }; - } catch (error) { - return { - callWasSuccessful: false, - error: String(error), - }; - } - }; - }, -}); - -export default downloadBinaryInjectable; diff --git a/packages/core/src/common/fetch/download-json/impl.ts b/packages/core/src/common/fetch/download-json/impl.ts deleted file mode 100644 index f691cc2762..0000000000 --- a/packages/core/src/common/fetch/download-json/impl.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { AsyncResult } from "@k8slens/utilities"; -import type { Fetch } from "../fetch.injectable"; -import type { RequestInit, Response } from "@k8slens/node-fetch"; - -export interface DownloadJsonOptions { - signal?: AbortSignal | null | undefined; -} - -export type DownloadJson = (url: string, opts?: DownloadJsonOptions) => AsyncResult; - -export const downloadJsonWith = (fetch: Fetch): DownloadJson => async (url, opts) => { - let result: Response; - - try { - result = await fetch(url, opts as RequestInit); - } catch (error) { - return { - callWasSuccessful: false, - error: String(error), - }; - } - - if (result.status < 200 || 300 <= result.status) { - return { - callWasSuccessful: false, - error: result.statusText, - }; - } - - try { - return { - callWasSuccessful: true, - response: await result.json(), - }; - } catch (error) { - return { - callWasSuccessful: false, - error: String(error), - }; - } -}; - diff --git a/packages/core/src/common/fetch/download-json/normal.injectable.ts b/packages/core/src/common/fetch/download-json/normal.injectable.ts deleted file mode 100644 index adb5e35d82..0000000000 --- a/packages/core/src/common/fetch/download-json/normal.injectable.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import fetchInjectable from "../fetch.injectable"; -import { downloadJsonWith } from "./impl"; - -const downloadJsonInjectable = getInjectable({ - id: "download-json", - instantiate: (di) => downloadJsonWith(di.inject(fetchInjectable)), -}); - -export default downloadJsonInjectable; diff --git a/packages/core/src/common/fetch/download-json/proxy.injectable.ts b/packages/core/src/common/fetch/download-json/proxy.injectable.ts deleted file mode 100644 index 46268d4ddb..0000000000 --- a/packages/core/src/common/fetch/download-json/proxy.injectable.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import proxyFetchInjectable from "../proxy-fetch.injectable"; -import { downloadJsonWith } from "./impl"; - -const proxyDownloadJsonInjectable = getInjectable({ - id: "proxy-download-json", - instantiate: (di) => downloadJsonWith(di.inject(proxyFetchInjectable)), -}); - -export default proxyDownloadJsonInjectable; diff --git a/packages/core/src/common/fetch/fetch.global-override-for-injectable.ts b/packages/core/src/common/fetch/fetch.global-override-for-injectable.ts deleted file mode 100644 index 7aa6db7a2d..0000000000 --- a/packages/core/src/common/fetch/fetch.global-override-for-injectable.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverrideForFunction } from "@k8slens/test-utils"; -import fetchInjectable from "./fetch.injectable"; - -export default getGlobalOverrideForFunction(fetchInjectable); diff --git a/packages/core/src/common/fetch/fetch.injectable.ts b/packages/core/src/common/fetch/fetch.injectable.ts deleted file mode 100644 index 6a323b1bc5..0000000000 --- a/packages/core/src/common/fetch/fetch.injectable.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import fetch from "@k8slens/node-fetch"; - -export type Fetch = typeof fetch; - -const fetchInjectable = getInjectable({ - id: "fetch", - instantiate: () => fetch, - causesSideEffects: true, -}); - -export default fetchInjectable; diff --git a/packages/core/src/common/fetch/lens-fetch.global-override-for-injectable.ts b/packages/core/src/common/fetch/lens-fetch.global-override-for-injectable.ts deleted file mode 100644 index 3598b6ce14..0000000000 --- a/packages/core/src/common/fetch/lens-fetch.global-override-for-injectable.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverrideForFunction } from "@k8slens/test-utils"; -import lensFetchInjectable from "./lens-fetch.injectable"; - -export default getGlobalOverrideForFunction(lensFetchInjectable); diff --git a/packages/core/src/common/fetch/lens-fetch.injectable.ts b/packages/core/src/common/fetch/lens-fetch.injectable.ts deleted file mode 100644 index 634081fda5..0000000000 --- a/packages/core/src/common/fetch/lens-fetch.injectable.ts +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { Agent } from "https"; -import type { RequestInit, Response } from "@k8slens/node-fetch"; -import lensProxyPortInjectable from "../../main/lens-proxy/lens-proxy-port.injectable"; -import lensProxyCertificateInjectable from "../certificate/lens-proxy-certificate.injectable"; -import fetch from "@k8slens/node-fetch"; - -export type LensRequestInit = Omit; - -export type LensFetch = (pathnameAndQuery: string, init?: LensRequestInit) => Promise; - -const lensFetchInjectable = getInjectable({ - id: "lens-fetch", - instantiate: (di): LensFetch => { - const lensProxyPort = di.inject(lensProxyPortInjectable); - const lensProxyCertificate = di.inject(lensProxyCertificateInjectable); - - return async (pathnameAndQuery, init = {}) => { - const agent = new Agent({ - ca: lensProxyCertificate.get().cert, - }); - - return fetch(`https://127.0.0.1:${lensProxyPort.get()}${pathnameAndQuery}`, { - ...init, - agent, - }); - }; - }, - causesSideEffects: true, -}); - -export default lensFetchInjectable; diff --git a/packages/core/src/common/fetch/proxy-fetch.injectable.ts b/packages/core/src/common/fetch/proxy-fetch.injectable.ts deleted file mode 100644 index 433670e003..0000000000 --- a/packages/core/src/common/fetch/proxy-fetch.injectable.ts +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { HttpsProxyAgent } from "hpagent"; -import userPreferencesStateInjectable from "../../features/user-preferences/common/state.injectable"; -import type { Fetch } from "./fetch.injectable"; -import fetchInjectable from "./fetch.injectable"; - -const proxyFetchInjectable = getInjectable({ - id: "proxy-fetch", - instantiate: (di): Fetch => { - const fetch = di.inject(fetchInjectable); - const { httpsProxy, allowUntrustedCAs } = di.inject(userPreferencesStateInjectable); - const agent = httpsProxy - ? new HttpsProxyAgent({ - proxy: httpsProxy, - rejectUnauthorized: !allowUntrustedCAs, - }) - : undefined; - - return (url, init = {}) => fetch(url, { - agent, - ...init, - }); - }, -}); - -export default proxyFetchInjectable; diff --git a/packages/core/src/common/fetch/timeout-controller.ts b/packages/core/src/common/fetch/timeout-controller.ts deleted file mode 100644 index c4688218db..0000000000 --- a/packages/core/src/common/fetch/timeout-controller.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { formatDuration } from "@k8slens/utilities"; - -/** - * Creates an AbortController with an associated timeout - * @param timeout The number of milliseconds before this controller will auto abort - */ -export function withTimeout(timeout: number): AbortController { - const controller = new AbortController(); - const id = setTimeout(() => controller.abort(`Operation timed out: timeout ${formatDuration(timeout)}`), timeout); - - controller.signal.addEventListener("abort", () => clearTimeout(id)); - - return controller; -} diff --git a/packages/core/src/common/front-end-routing/app-navigation-channel.ts b/packages/core/src/common/front-end-routing/app-navigation-channel.ts deleted file mode 100644 index 8670fc4953..0000000000 --- a/packages/core/src/common/front-end-routing/app-navigation-channel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { IpcRendererNavigationEvents } from "../ipc/navigation-events"; -import type { MessageChannel } from "@k8slens/messaging"; - -export type AppNavigationChannel = MessageChannel; - -export const appNavigationChannel: AppNavigationChannel = { - id: IpcRendererNavigationEvents.NAVIGATE_IN_APP, -}; diff --git a/packages/core/src/common/front-end-routing/cluster-frame-navigation-channel.ts b/packages/core/src/common/front-end-routing/cluster-frame-navigation-channel.ts deleted file mode 100644 index 5f96526da4..0000000000 --- a/packages/core/src/common/front-end-routing/cluster-frame-navigation-channel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { IpcRendererNavigationEvents } from "../ipc/navigation-events"; -import type { MessageChannel } from "@k8slens/messaging"; - -export type ClusterFrameNavigationChannel = MessageChannel; - -export const clusterFrameNavigationChannel: ClusterFrameNavigationChannel = { - id: IpcRendererNavigationEvents.NAVIGATE_IN_CLUSTER, -}; diff --git a/packages/core/src/common/front-end-routing/front-end-route-injection-token.ts b/packages/core/src/common/front-end-routing/front-end-route-injection-token.ts deleted file mode 100644 index cf1f9ed87e..0000000000 --- a/packages/core/src/common/front-end-routing/front-end-route-injection-token.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectionToken } from "@ogre-tools/injectable"; -import type { IComputedValue } from "mobx"; -import type { LensRendererExtension } from "../../extensions/lens-renderer-extension"; - -export const frontEndRouteInjectionToken = getInjectionToken>({ - id: "front-end-route-injection-token", -}); - -export interface Route { - path: string; - clusterFrame: boolean; - isEnabled: IComputedValue; - extension?: LensRendererExtension; - - readonly parameterSignature?: TParameter; -} diff --git a/packages/core/src/common/front-end-routing/navigate-to-front-page.injectable.ts b/packages/core/src/common/front-end-routing/navigate-to-front-page.injectable.ts deleted file mode 100644 index a48eee6c04..0000000000 --- a/packages/core/src/common/front-end-routing/navigate-to-front-page.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import navigateToCatalogInjectable from "./routes/catalog/navigate-to-catalog.injectable"; - -const navigateToFrontPageInjectable = getInjectable({ - id: "navigate-to-front-page", - instantiate: (di) => di.inject(navigateToCatalogInjectable), -}); - -export default navigateToFrontPageInjectable; diff --git a/packages/core/src/common/front-end-routing/navigate-to-route-injection-token.ts b/packages/core/src/common/front-end-routing/navigate-to-route-injection-token.ts deleted file mode 100644 index 29fb82867c..0000000000 --- a/packages/core/src/common/front-end-routing/navigate-to-route-injection-token.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectionToken } from "@ogre-tools/injectable"; -import type { Route } from "./front-end-route-injection-token"; - -type InferParametersFrom = TRoute extends Route - ? TParameters - : never; - -type RequiredKeys = Exclude< - { - [K in keyof T]: T extends Record ? K : never; - }[keyof T], - undefined ->; - -type ObjectContainingNoRequired = T extends void - ? never - : RequiredKeys extends [] - ? any - : never; - -type ObjectContainsNoRequired = T extends ObjectContainingNoRequired - ? true - : false; - -// TODO: Missing types for: -// - Navigating to route without parameters, with parameters -// - Navigating to route with required parameters, without parameters -type Parameters = TParameters extends void - ? {} - : ObjectContainsNoRequired extends true - ? { parameters?: TParameters } - : { parameters: TParameters }; - -export type NavigateToRouteOptions = Parameters< - InferParametersFrom -> & { - query?: Record; - fragment?: string; - withoutAffectingBackButton?: boolean; -}; - -export type NavigateToRoute = >( - route: TRoute, - options?: NavigateToRouteOptions) => void; - -export const navigateToRouteInjectionToken = getInjectionToken( - { id: "navigate-to-route-injection-token" }, -); diff --git a/packages/core/src/common/front-end-routing/navigate-to-url-injection-token.ts b/packages/core/src/common/front-end-routing/navigate-to-url-injection-token.ts deleted file mode 100644 index 560d62ce4a..0000000000 --- a/packages/core/src/common/front-end-routing/navigate-to-url-injection-token.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectionToken } from "@ogre-tools/injectable"; - -export interface NavigateToUrlOptions { - withoutAffectingBackButton?: boolean; - forceRootFrame?: boolean; -} - -export type NavigateToUrl = (url: string, options?: NavigateToUrlOptions) => void; - -export const navigateToUrlInjectionToken = getInjectionToken( - { id: "navigate-to-url-injection-token" }, -); diff --git a/packages/core/src/common/front-end-routing/routes/add-cluster/add-cluster-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/add-cluster/add-cluster-route.injectable.ts deleted file mode 100644 index 41e165dc59..0000000000 --- a/packages/core/src/common/front-end-routing/routes/add-cluster/add-cluster-route.injectable.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { computed } from "mobx"; -import { frontEndRouteInjectionToken } from "../../front-end-route-injection-token"; - -const addClusterRouteInjectable = getInjectable({ - id: "add-cluster-route", - - instantiate: () => ({ - path: "/add-cluster", - clusterFrame: false, - isEnabled: computed(() => true), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default addClusterRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/add-cluster/navigate-to-add-cluster.injectable.ts b/packages/core/src/common/front-end-routing/routes/add-cluster/navigate-to-add-cluster.injectable.ts deleted file mode 100644 index 15595d51c2..0000000000 --- a/packages/core/src/common/front-end-routing/routes/add-cluster/navigate-to-add-cluster.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import addClusterRouteInjectable from "./add-cluster-route.injectable"; -import { navigateToRouteInjectionToken } from "../../navigate-to-route-injection-token"; - -const navigateToAddClusterInjectable = getInjectable({ - id: "navigate-to-add-cluster", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(addClusterRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToAddClusterInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/catalog/catalog-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/catalog/catalog-route.injectable.ts deleted file mode 100644 index bfe0904073..0000000000 --- a/packages/core/src/common/front-end-routing/routes/catalog/catalog-route.injectable.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { computed } from "mobx"; -import type { Route } from "../../front-end-route-injection-token"; -import { frontEndRouteInjectionToken } from "../../front-end-route-injection-token"; - -export interface CatalogPathParameters { - group?: string; - kind?: string; -} - -const catalogRouteInjectable = getInjectable({ - id: "catalog-route", - - instantiate: (): Route => ({ - path: "/catalog/:group?/:kind?", - clusterFrame: false, - isEnabled: computed(() => true), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default catalogRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/catalog/navigate-to-catalog.injectable.ts b/packages/core/src/common/front-end-routing/routes/catalog/navigate-to-catalog.injectable.ts deleted file mode 100644 index 24fab385bb..0000000000 --- a/packages/core/src/common/front-end-routing/routes/catalog/navigate-to-catalog.injectable.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { CatalogPathParameters } from "./catalog-route.injectable"; -import catalogRouteInjectable from "./catalog-route.injectable"; -import { navigateToRouteInjectionToken } from "../../navigate-to-route-injection-token"; - -export type NavigateToCatalog = (parameters?: CatalogPathParameters) => void; - -const navigateToCatalogInjectable = getInjectable({ - id: "navigate-to-catalog", - - instantiate: (di): NavigateToCatalog => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const catalogRoute = di.inject(catalogRouteInjectable); - - return (parameters) => - navigateToRoute(catalogRoute, { - parameters, - }); - }, -}); - -export default navigateToCatalogInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster-view/cluster-view-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster-view/cluster-view-route.injectable.ts deleted file mode 100644 index e912ff63e0..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster-view/cluster-view-route.injectable.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { computed } from "mobx"; -import { frontEndRouteInjectionToken } from "../../front-end-route-injection-token"; - -const clusterViewRouteInjectable = getInjectable({ - id: "cluster-view-route", - - instantiate: () => ({ - path: "/cluster/:clusterId", - clusterFrame: false, - isEnabled: computed(() => true), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default clusterViewRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster-view/navigate-to-cluster-view.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster-view/navigate-to-cluster-view.injectable.ts deleted file mode 100644 index 4edc3d3bb5..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster-view/navigate-to-cluster-view.injectable.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { navigateToRouteInjectionToken } from "../../navigate-to-route-injection-token"; -import clusterViewRouteInjectable from "./cluster-view-route.injectable"; - -export type NavigateToClusterView = (clusterId: string) => void; - -const navigateToClusterViewInjectable = getInjectable({ - id: "navigate-to-cluster-view", - - instantiate: (di): NavigateToClusterView => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(clusterViewRouteInjectable); - - return (clusterId) => - navigateToRoute(route, { parameters: { clusterId }}); - }, -}); - -export default navigateToClusterViewInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/config-maps/config-maps-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/config-maps/config-maps-route.injectable.ts deleted file mode 100644 index c6a525269c..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/config-maps/config-maps-route.injectable.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const configMapsRouteInjectable = getInjectable({ - id: "config-maps-route", - instantiate: (di) => ({ - path: "/configmaps", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "configmaps", - group: "", - }), - }), - injectionToken: frontEndRouteInjectionToken, -}); - -export default configMapsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/config-maps/navigate-to-config-maps.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/config-maps/navigate-to-config-maps.injectable.ts deleted file mode 100644 index d4fa31027f..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/config-maps/navigate-to-config-maps.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import configMapsRouteInjectable from "./config-maps-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToConfigMapsInjectable = getInjectable({ - id: "navigate-to-config-maps", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(configMapsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToConfigMapsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/horizontal-pod-autoscalers/horizontal-pod-autoscalers-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/horizontal-pod-autoscalers/horizontal-pod-autoscalers-route.injectable.ts deleted file mode 100644 index cef3bdcb5a..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/horizontal-pod-autoscalers/horizontal-pod-autoscalers-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const horizontalPodAutoscalersRouteInjectable = getInjectable({ - id: "horizontal-pod-autoscalers-route", - - instantiate: (di) => ({ - path: "/hpa", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "horizontalpodautoscalers", - group: "autoscaling", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default horizontalPodAutoscalersRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/horizontal-pod-autoscalers/navigate-to-horizontal-pod-autoscalers.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/horizontal-pod-autoscalers/navigate-to-horizontal-pod-autoscalers.injectable.ts deleted file mode 100644 index ab171f4a08..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/horizontal-pod-autoscalers/navigate-to-horizontal-pod-autoscalers.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import horizontalPodAutoscalersRouteInjectable from "./horizontal-pod-autoscalers-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToHorizontalPodAutoscalersInjectable = getInjectable({ - id: "navigate-to-horizontal-pod-autoscalers", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(horizontalPodAutoscalersRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToHorizontalPodAutoscalersInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/leases/leases-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/leases/leases-route.injectable.ts deleted file mode 100644 index 6da3564c8f..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/leases/leases-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const leasesRouteInjectable = getInjectable({ - id: "leases", - - instantiate: (di) => ({ - path: "/leases", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "leases", - group: "coordination.k8s.io", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default leasesRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/leases/navigate-to-leases.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/leases/navigate-to-leases.injectable.ts deleted file mode 100644 index 5bf7d74ff1..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/leases/navigate-to-leases.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import leasesRouteInjectable from "./leases-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToLeasesInjectable = getInjectable({ - id: "navigate-to-leases", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(leasesRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToLeasesInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/limit-ranges/limit-ranges-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/limit-ranges/limit-ranges-route.injectable.ts deleted file mode 100644 index a80a9e8ef4..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/limit-ranges/limit-ranges-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const limitRangesRouteInjectable = getInjectable({ - id: "limit-ranges-route", - - instantiate: (di) => ({ - path: "/limitranges", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "limitranges", - group: "", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default limitRangesRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/limit-ranges/navigate-to-limit-ranges.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/limit-ranges/navigate-to-limit-ranges.injectable.ts deleted file mode 100644 index 00e8c89d7c..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/limit-ranges/navigate-to-limit-ranges.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import limitRangesRouteInjectable from "./limit-ranges-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToLimitRangesInjectable = getInjectable({ - id: "navigate-to-limit-ranges", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(limitRangesRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToLimitRangesInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/mutating-webhook-configurations/mutating-webhook-configurations-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/mutating-webhook-configurations/mutating-webhook-configurations-route.injectable.ts deleted file mode 100644 index 5812f1258d..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/mutating-webhook-configurations/mutating-webhook-configurations-route.injectable.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { - shouldShowResourceInjectionToken, -} from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; -import { getInjectable } from "@ogre-tools/injectable"; - -const mutatingWebhookConfigurationsRouteInjectable = getInjectable({ - id: "mutatingwebhookconfigurations", - - instantiate: (di) => ({ - path: "/mutatingwebhookconfigurations", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "mutatingwebhookconfigurations", - group: "admissionregistration.k8s.io", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default mutatingWebhookConfigurationsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/mutating-webhook-configurations/navigate-to-mutating-webhook-configurations.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/mutating-webhook-configurations/navigate-to-mutating-webhook-configurations.injectable.ts deleted file mode 100644 index ffb0e4b3d0..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/mutating-webhook-configurations/navigate-to-mutating-webhook-configurations.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import mutatingWebhookConfigurationsRouteInjectable from "./mutating-webhook-configurations-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToMutatingWebhookConfigurationsInjectable = getInjectable({ - id: "navigate-to-mutating-webhook-configurations", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(mutatingWebhookConfigurationsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToMutatingWebhookConfigurationsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/pod-disruption-budgets/navigate-to-pod-disruption-budgets.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/pod-disruption-budgets/navigate-to-pod-disruption-budgets.injectable.ts deleted file mode 100644 index 5a3f17027d..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/pod-disruption-budgets/navigate-to-pod-disruption-budgets.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import podDisruptionBudgetsRouteInjectable from "./pod-disruption-budgets-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToPodDisruptionBudgetsInjectable = getInjectable({ - id: "navigate-to-pod-disruption-budgets", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(podDisruptionBudgetsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToPodDisruptionBudgetsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/pod-disruption-budgets/pod-disruption-budgets-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/pod-disruption-budgets/pod-disruption-budgets-route.injectable.ts deleted file mode 100644 index e297c7396e..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/pod-disruption-budgets/pod-disruption-budgets-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const podDisruptionBudgetsRouteInjectable = getInjectable({ - id: "pod-disruption-budgets-route", - - instantiate: (di) => ({ - path: "/poddisruptionbudgets", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "poddisruptionbudgets", - group: "policy", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default podDisruptionBudgetsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/priority-classes/navigate-to-priority-classes.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/priority-classes/navigate-to-priority-classes.injectable.ts deleted file mode 100644 index 45b7a34eeb..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/priority-classes/navigate-to-priority-classes.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import priorityClassesRouteInjectable from "./priority-classes-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToPriorityClassesInjectable = getInjectable({ - id: "navigate-to-priority-classes", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(priorityClassesRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToPriorityClassesInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/priority-classes/priority-classes-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/priority-classes/priority-classes-route.injectable.ts deleted file mode 100644 index ea424ec86d..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/priority-classes/priority-classes-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const priorityClassesRouteInjectable = getInjectable({ - id: "priority-classes-route", - - instantiate: (di) => ({ - path: "/priorityclasses", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "priorityclasses", - group: "scheduling.k8s.io", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default priorityClassesRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/resource-quotas/navigate-to-resource-quotas.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/resource-quotas/navigate-to-resource-quotas.injectable.ts deleted file mode 100644 index 3637782115..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/resource-quotas/navigate-to-resource-quotas.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import resourceQuotasRouteInjectable from "./resource-quotas-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToResourceQuotasInjectable = getInjectable({ - id: "navigate-to-resource-quotas", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(resourceQuotasRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToResourceQuotasInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/resource-quotas/resource-quotas-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/resource-quotas/resource-quotas-route.injectable.ts deleted file mode 100644 index 96704bbc80..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/resource-quotas/resource-quotas-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const resourceQuotasRouteInjectable = getInjectable({ - id: "resource-quotas-route", - - instantiate: (di) => ({ - path: "/resourcequotas", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "resourcequotas", - group: "", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default resourceQuotasRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/runtime-classes/navigate-to-runtime-classes.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/runtime-classes/navigate-to-runtime-classes.injectable.ts deleted file mode 100644 index 4d6ca1757d..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/runtime-classes/navigate-to-runtime-classes.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import runtimeClassesRouteInjectable from "./runtime-classes-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToRuntimeClassesInjectable = getInjectable({ - id: "navigate-to-runtime-classes", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(runtimeClassesRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToRuntimeClassesInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/runtime-classes/runtime-classes-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/runtime-classes/runtime-classes-route.injectable.ts deleted file mode 100644 index a088ee2ba4..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/runtime-classes/runtime-classes-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const runtimeClassesRouteInjectable = getInjectable({ - id: "runtime-classes-route", - - instantiate: (di) => ({ - path: "/runtimeclasses", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "runtimeclasses", - group: "node.k8s.io", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default runtimeClassesRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/secrets/navigate-to-secrets.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/secrets/navigate-to-secrets.injectable.ts deleted file mode 100644 index b8afdf74c3..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/secrets/navigate-to-secrets.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import secretsRouteInjectable from "./secrets-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToSecretsInjectable = getInjectable({ - id: "navigate-to-secrets", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(secretsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToSecretsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/secrets/secrets-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/secrets/secrets-route.injectable.ts deleted file mode 100644 index 38343e4729..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/secrets/secrets-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const secretsRouteInjectable = getInjectable({ - id: "secrets-route", - - instantiate: (di) => ({ - path: "/secrets", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "secrets", - group: "", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default secretsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/validating-webhook-configurations/navigate-to-validating-webhook-configurations.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/validating-webhook-configurations/navigate-to-validating-webhook-configurations.injectable.ts deleted file mode 100644 index 47e4535765..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/validating-webhook-configurations/navigate-to-validating-webhook-configurations.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import validatingWebhookConfigurationsRouteInjectable from "./validating-webhook-configurations-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToValidatingWebhookConfigurationsInjectable = getInjectable({ - id: "navigate-to-validating-webhook-configurations", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(validatingWebhookConfigurationsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToValidatingWebhookConfigurationsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/validating-webhook-configurations/validating-webhook-configurations-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/validating-webhook-configurations/validating-webhook-configurations-route.injectable.ts deleted file mode 100644 index 6307238350..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/validating-webhook-configurations/validating-webhook-configurations-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; -import { getInjectable } from "@ogre-tools/injectable"; - -const validatingWebhookConfigurationsRouteInjectable = getInjectable({ - id: "validatingwebhookconfigurations", - - instantiate: (di) => ({ - path: "/validatingwebhookconfigurations", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "validatingwebhookconfigurations", - group: "admissionregistration.k8s.io", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default validatingWebhookConfigurationsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/vertical-pod-autoscalers/navigate-to-vertical-pod-autoscalers.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/vertical-pod-autoscalers/navigate-to-vertical-pod-autoscalers.injectable.ts deleted file mode 100644 index c453f03ddb..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/vertical-pod-autoscalers/navigate-to-vertical-pod-autoscalers.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import verticalPodAutoscalersRouteInjectable from "./vertical-pod-autoscalers-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToVerticalPodAutoscalersInjectable = getInjectable({ - id: "navigate-to-vertical-pod-autoscalers", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(verticalPodAutoscalersRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToVerticalPodAutoscalersInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/config/vertical-pod-autoscalers/vertical-pod-autoscalers-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/config/vertical-pod-autoscalers/vertical-pod-autoscalers-route.injectable.ts deleted file mode 100644 index 07559a8d2a..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/config/vertical-pod-autoscalers/vertical-pod-autoscalers-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const verticalPodAutoscalersRouteInjectable = getInjectable({ - id: "vertical-pod-autoscalers-route", - - instantiate: (di) => ({ - path: "/vpa", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "verticalpodautoscalers", - group: "autoscaling.k8s.io", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default verticalPodAutoscalersRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/custom-resources/custom-resource-definitions.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/custom-resources/custom-resource-definitions.injectable.ts deleted file mode 100644 index 74251a6499..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/custom-resources/custom-resource-definitions.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../front-end-route-injection-token"; - -const customResourceDefinitionsRouteInjectable = getInjectable({ - id: "custom-resource-definitions-route", - - instantiate: (di) => ({ - path: "/crd/definitions", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - group: "apiextensions.k8s.io", - apiName: "customresourcedefinitions", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default customResourceDefinitionsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/custom-resources/custom-resources-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/custom-resources/custom-resources-route.injectable.ts deleted file mode 100644 index ada023cf0b..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/custom-resources/custom-resources-route.injectable.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { computed } from "mobx"; -import type { Route } from "../../../front-end-route-injection-token"; -import { frontEndRouteInjectionToken } from "../../../front-end-route-injection-token"; - -export interface CustomResourcesPathParameters { - group: string; - name: string; -} - -const customResourcesRouteInjectable = getInjectable({ - id: "custom-resources-route", - - instantiate: (): Route => ({ - path: "/crd/:group/:name", - clusterFrame: true, - isEnabled: computed(() => true), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default customResourcesRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/custom-resources/navigate-to-custom-resource-definitions.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/custom-resources/navigate-to-custom-resource-definitions.injectable.ts deleted file mode 100644 index fcba8fbcbb..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/custom-resources/navigate-to-custom-resource-definitions.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { navigateToRouteInjectionToken } from "../../../navigate-to-route-injection-token"; -import crdListRouteInjectable from "./custom-resource-definitions.injectable"; - -const navigateToCustomResourceDefinitionsInjectable = getInjectable({ - id: "navigate-to-custom-resource-definitions", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(crdListRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToCustomResourceDefinitionsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/custom-resources/navigate-to-custom-resources.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/custom-resources/navigate-to-custom-resources.injectable.ts deleted file mode 100644 index dcf671ee2e..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/custom-resources/navigate-to-custom-resources.injectable.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { navigateToRouteInjectionToken } from "../../../navigate-to-route-injection-token"; -import type { CustomResourcesPathParameters } from "./custom-resources-route.injectable"; -import customResourcesRouteInjectable from "./custom-resources-route.injectable"; - -export type NavigateToCustomResources = (parameters: CustomResourcesPathParameters) => void; - -const navigateToCustomResourcesInjectable = getInjectable({ - id: "navigate-to-custom-resources", - - instantiate: (di): NavigateToCustomResources => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(customResourcesRouteInjectable); - - return (parameters) => navigateToRoute(route, { parameters }); - }, -}); - -export default navigateToCustomResourcesInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/events/events-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/events/events-route.injectable.ts deleted file mode 100644 index fd4dfef75d..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/events/events-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../front-end-route-injection-token"; - -const eventsRouteInjectable = getInjectable({ - id: "events-route", - - instantiate: (di) => ({ - path: "/events", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "events", - group: "", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default eventsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/events/navigate-to-events.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/events/navigate-to-events.injectable.ts deleted file mode 100644 index 767f69b497..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/events/navigate-to-events.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import eventsRouteInjectable from "./events-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../navigate-to-route-injection-token"; - -const navigateToEventsInjectable = getInjectable({ - id: "navigate-to-events", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(eventsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToEventsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/helm/charts/helm-charts-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/helm/charts/helm-charts-route.injectable.ts deleted file mode 100644 index 02161b082a..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/helm/charts/helm-charts-route.injectable.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { computed } from "mobx"; -import type { Route } from "../../../../front-end-route-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -export interface HelmChartsPathParameters { - repo?: string; - chartName?: string; -} - -const helmChartsRouteInjectable = getInjectable({ - id: "helm-charts-route", - - instantiate: (): Route => ({ - path: "/helm/charts/:repo?/:chartName?", - clusterFrame: true, - isEnabled: computed(() => true), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default helmChartsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/helm/charts/navigate-to-helm-charts.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/helm/charts/navigate-to-helm-charts.injectable.ts deleted file mode 100644 index 37ab96cc2c..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/helm/charts/navigate-to-helm-charts.injectable.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { HelmChartsPathParameters } from "./helm-charts-route.injectable"; -import helmChartsRouteInjectable from "./helm-charts-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -export type NavigateToHelmCharts = (parameters?: HelmChartsPathParameters) => void; - -const navigateToHelmChartsInjectable = getInjectable({ - id: "navigate-to-helm-charts", - - instantiate: (di): NavigateToHelmCharts => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(helmChartsRouteInjectable); - - return (parameters) => - navigateToRoute(route, { - parameters, - }); - }, -}); - -export default navigateToHelmChartsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/helm/releases/helm-releases-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/helm/releases/helm-releases-route.injectable.ts deleted file mode 100644 index fb66416c63..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/helm/releases/helm-releases-route.injectable.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { computed } from "mobx"; -import type { Route } from "../../../../front-end-route-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -export interface HelmReleasesPathParameters { - namespace?: string; - name?: string; -} - -const helmReleasesRouteInjectable = getInjectable({ - id: "helm-releases-route", - - instantiate: (): Route => ({ - path: "/helm/releases/:namespace?/:name?", - clusterFrame: true, - isEnabled: computed(() => true), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default helmReleasesRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/helm/releases/navigate-to-helm-releases.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/helm/releases/navigate-to-helm-releases.injectable.ts deleted file mode 100644 index 3d9aebddf5..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/helm/releases/navigate-to-helm-releases.injectable.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { HelmReleasesPathParameters } from "./helm-releases-route.injectable"; -import helmReleasesRouteInjectable from "./helm-releases-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -export type NavigateToHelmReleases = (parameters?: HelmReleasesPathParameters) => void; - -const navigateToHelmReleasesInjectable = getInjectable({ - id: "navigate-to-helm-releases", - - instantiate: (di): NavigateToHelmReleases => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(helmReleasesRouteInjectable); - - return (parameters) => navigateToRoute(route, { parameters }); - }, -}); - -export default navigateToHelmReleasesInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/namespaces/namespaces-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/namespaces/namespaces-route.injectable.ts deleted file mode 100644 index 6fb569fc11..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/namespaces/namespaces-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../front-end-route-injection-token"; - -const namespacesRouteInjectable = getInjectable({ - id: "namespaces-route", - - instantiate: (di) => ({ - path: "/namespaces", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "namespaces", - group: "", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default namespacesRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/namespaces/navigate-to-namespaces.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/namespaces/navigate-to-namespaces.injectable.ts deleted file mode 100644 index 85fa63c695..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/namespaces/navigate-to-namespaces.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import namespacesRouteInjectable from "./namespaces-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../navigate-to-route-injection-token"; - -const navigateToNamespacesInjectable = getInjectable({ - id: "navigate-to-namespaces", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(namespacesRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToNamespacesInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/network/endpoints/endpoints-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/network/endpoints/endpoints-route.injectable.ts deleted file mode 100644 index d8dcf8aa8f..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/network/endpoints/endpoints-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const endpointsRouteInjectable = getInjectable({ - id: "endpoints-route", - - instantiate: (di) => ({ - path: "/endpoints", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "endpoints", - group: "", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default endpointsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/network/endpoints/navigate-to-endpoints.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/network/endpoints/navigate-to-endpoints.injectable.ts deleted file mode 100644 index 04439b3d3b..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/network/endpoints/navigate-to-endpoints.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import endpointsRouteInjectable from "./endpoints-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToEndpointsInjectable = getInjectable({ - id: "navigate-to-endpoints", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(endpointsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToEndpointsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/network/ingress-class/ingress-classes-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/network/ingress-class/ingress-classes-route.injectable.ts deleted file mode 100644 index 6ea8ffd736..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/network/ingress-class/ingress-classes-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; - -const ingressClassesRouteInjectable = getInjectable({ - id: "ingress-classes-route", - - instantiate: (di) => ({ - path: "/ingress-classes", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "ingressclasses", - group: "networking.k8s.io", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default ingressClassesRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/network/ingress-class/navigate-to-ingress-classes.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/network/ingress-class/navigate-to-ingress-classes.injectable.ts deleted file mode 100644 index 1cc241ef7e..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/network/ingress-class/navigate-to-ingress-classes.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; -import ingressClassesRouteInjectable from "./ingress-classes-route.injectable"; - -const navigateToIngressesInjectable = getInjectable({ - id: "navigate-to-ingress-classes", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(ingressClassesRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToIngressesInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/network/ingresses/ingresses-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/network/ingresses/ingresses-route.injectable.ts deleted file mode 100644 index c2a6fe33cc..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/network/ingresses/ingresses-route.injectable.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { computedOr } from "@k8slens/utilities"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const ingressesRouteInjectable = getInjectable({ - id: "ingresses-route", - - instantiate: (di) => ({ - path: "/ingresses", - clusterFrame: true, - isEnabled: computedOr( - di.inject(shouldShowResourceInjectionToken, { - apiName: "ingresses", - group: "networking.k8s.io", - }), - di.inject(shouldShowResourceInjectionToken, { - apiName: "ingresses", - group: "extensions", - }), - ), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default ingressesRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/network/ingresses/navigate-to-ingresses.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/network/ingresses/navigate-to-ingresses.injectable.ts deleted file mode 100644 index b47f9d4be3..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/network/ingresses/navigate-to-ingresses.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import ingressesRouteInjectable from "./ingresses-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToIngressesInjectable = getInjectable({ - id: "navigate-to-ingresses", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(ingressesRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToIngressesInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/network/network-policies/navigate-to-network-policies.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/network/network-policies/navigate-to-network-policies.injectable.ts deleted file mode 100644 index 82bc76ee9f..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/network/network-policies/navigate-to-network-policies.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import networkPoliciesRouteInjectable from "./network-policies-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToNetworkPoliciesInjectable = getInjectable({ - id: "navigate-to-network-policies", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(networkPoliciesRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToNetworkPoliciesInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/network/network-policies/network-policies-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/network/network-policies/network-policies-route.injectable.ts deleted file mode 100644 index 664eefa9f1..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/network/network-policies/network-policies-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const networkPoliciesRouteInjectable = getInjectable({ - id: "network-policies-route", - - instantiate: (di) => ({ - path: "/network-policies", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "networkpolicies", - group: "networking.k8s.io", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default networkPoliciesRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/network/port-forwards/navigate-to-port-forwards.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/network/port-forwards/navigate-to-port-forwards.injectable.ts deleted file mode 100644 index 9a03eeda47..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/network/port-forwards/navigate-to-port-forwards.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { PortForwardsPathParameters } from "./port-forwards-route.injectable"; -import portForwardsRouteInjectable from "./port-forwards-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -export type NavigateToPortForwards = (parameters?: PortForwardsPathParameters) => void; - -const navigateToPortForwardsInjectable = getInjectable({ - id: "navigate-to-port-forwards", - - instantiate: (di): NavigateToPortForwards => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(portForwardsRouteInjectable); - - return (parameters) => - navigateToRoute(route, { parameters }); - }, -}); - -export default navigateToPortForwardsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/network/port-forwards/port-forwards-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/network/port-forwards/port-forwards-route.injectable.ts deleted file mode 100644 index 0c8cd5ef2d..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/network/port-forwards/port-forwards-route.injectable.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { computed } from "mobx"; -import type { Route } from "../../../../front-end-route-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -export interface PortForwardsPathParameters { - forwardport?: string; -} - -const portForwardsRouteInjectable = getInjectable({ - id: "port-forwards-route", - - instantiate: (): Route => ({ - path: "/port-forwards/:forwardport?", - clusterFrame: true, - isEnabled: computed(() => true), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default portForwardsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/network/services/navigate-to-services.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/network/services/navigate-to-services.injectable.ts deleted file mode 100644 index 02aa060b89..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/network/services/navigate-to-services.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import servicesRouteInjectable from "./services-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToServicesInjectable = getInjectable({ - id: "navigate-to-services", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(servicesRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToServicesInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/network/services/services-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/network/services/services-route.injectable.ts deleted file mode 100644 index e9b130b318..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/network/services/services-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const servicesRouteInjectable = getInjectable({ - id: "services-route", - - instantiate: (di) => ({ - path: "/services", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "services", - group: "", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default servicesRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/nodes/navigate-to-nodes.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/nodes/navigate-to-nodes.injectable.ts deleted file mode 100644 index eccdd2377d..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/nodes/navigate-to-nodes.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import nodesRouteInjectable from "./nodes-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../navigate-to-route-injection-token"; - -const navigateToNodesInjectable = getInjectable({ - id: "navigate-to-nodes", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(nodesRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToNodesInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/nodes/nodes-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/nodes/nodes-route.injectable.ts deleted file mode 100644 index 1fe80a799b..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/nodes/nodes-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../front-end-route-injection-token"; - -const nodesRouteInjectable = getInjectable({ - id: "nodes-route", - - instantiate: (di) => ({ - path: "/nodes", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "nodes", - group: "", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default nodesRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/overview/cluster-overview-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/overview/cluster-overview-route.injectable.ts deleted file mode 100644 index bf9c3961ed..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/overview/cluster-overview-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../front-end-route-injection-token"; - -const clusterOverviewRouteInjectable = getInjectable({ - id: "cluster-overview-route", - - instantiate: (di) => ({ - path: "/overview", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "nodes", - group: "", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default clusterOverviewRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/overview/navigate-to-cluster-overview.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/overview/navigate-to-cluster-overview.injectable.ts deleted file mode 100644 index f15dca518c..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/overview/navigate-to-cluster-overview.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import clusterOverviewRouteInjectable from "./cluster-overview-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../navigate-to-route-injection-token"; - -const navigateToClusterOverviewInjectable = getInjectable({ - id: "navigate-to-cluster-overview", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(clusterOverviewRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToClusterOverviewInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/storage/persistent-volume-claims/navigate-to-persistent-volume-claims.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/storage/persistent-volume-claims/navigate-to-persistent-volume-claims.injectable.ts deleted file mode 100644 index 015ad6e988..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/storage/persistent-volume-claims/navigate-to-persistent-volume-claims.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import persistentVolumeClaimsRouteInjectable from "./persistent-volume-claims-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToPersistentVolumeClaimsInjectable = getInjectable({ - id: "navigate-to-persistent-volume-claims", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(persistentVolumeClaimsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToPersistentVolumeClaimsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/storage/persistent-volume-claims/persistent-volume-claims-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/storage/persistent-volume-claims/persistent-volume-claims-route.injectable.ts deleted file mode 100644 index c8d7b64f8d..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/storage/persistent-volume-claims/persistent-volume-claims-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const persistentVolumeClaimsRouteInjectable = getInjectable({ - id: "persistent-volume-claims-route", - - instantiate: (di) => ({ - path: "/persistent-volume-claims", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "persistentvolumeclaims", - group: "", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default persistentVolumeClaimsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/storage/persistent-volumes/navigate-to-persistent-volumes.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/storage/persistent-volumes/navigate-to-persistent-volumes.injectable.ts deleted file mode 100644 index 6702dd6712..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/storage/persistent-volumes/navigate-to-persistent-volumes.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import persistentVolumesRouteInjectable from "./persistent-volumes-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToPersistentVolumesInjectable = getInjectable({ - id: "navigate-to-persistent-volumes", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(persistentVolumesRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToPersistentVolumesInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/storage/persistent-volumes/persistent-volumes-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/storage/persistent-volumes/persistent-volumes-route.injectable.ts deleted file mode 100644 index a93ac0a3c8..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/storage/persistent-volumes/persistent-volumes-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const persistentVolumesRouteInjectable = getInjectable({ - id: "persistent-volumes-route", - - instantiate: (di) => ({ - path: "/persistent-volumes", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "persistentvolumes", - group: "", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default persistentVolumesRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/storage/storage-classes/navigate-to-storage-classes.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/storage/storage-classes/navigate-to-storage-classes.injectable.ts deleted file mode 100644 index adaba3225b..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/storage/storage-classes/navigate-to-storage-classes.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import storageClassesRouteInjectable from "./storage-classes-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToStorageClassesInjectable = getInjectable({ - id: "navigate-to-storage-classes", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(storageClassesRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToStorageClassesInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/storage/storage-classes/storage-classes-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/storage/storage-classes/storage-classes-route.injectable.ts deleted file mode 100644 index 0645c0f4eb..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/storage/storage-classes/storage-classes-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const storageClassesRouteInjectable = getInjectable({ - id: "storage-classes-route", - - instantiate: (di) => ({ - path: "/storage-classes", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "storageclasses", - group: "storage.k8s.io", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default storageClassesRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/user-management/cluster-role-bindings/cluster-role-bindings-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/user-management/cluster-role-bindings/cluster-role-bindings-route.injectable.ts deleted file mode 100644 index 158563f8d5..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/user-management/cluster-role-bindings/cluster-role-bindings-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const clusterRoleBindingsRouteInjectable = getInjectable({ - id: "cluster-role-bindings-route", - - instantiate: (di) => ({ - path: "/cluster-role-bindings", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "clusterrolebindings", - group: "rbac.authorization.k8s.io", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default clusterRoleBindingsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/user-management/cluster-role-bindings/navigate-to-cluster-role-bindings.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/user-management/cluster-role-bindings/navigate-to-cluster-role-bindings.injectable.ts deleted file mode 100644 index f6bd0bfd97..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/user-management/cluster-role-bindings/navigate-to-cluster-role-bindings.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import clusterRoleBindingsRouteInjectable from "./cluster-role-bindings-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToClusterRoleBindingsInjectable = getInjectable({ - id: "navigate-to-cluster-role-bindings", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(clusterRoleBindingsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToClusterRoleBindingsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/user-management/cluster-roles/cluster-roles-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/user-management/cluster-roles/cluster-roles-route.injectable.ts deleted file mode 100644 index db28d8dfff..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/user-management/cluster-roles/cluster-roles-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const clusterRolesRouteInjectable = getInjectable({ - id: "cluster-roles-route", - - instantiate: (di) => ({ - path: "/cluster-roles", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "clusterroles", - group: "rbac.authorization.k8s.io", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default clusterRolesRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/user-management/cluster-roles/navigate-to-cluster-roles.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/user-management/cluster-roles/navigate-to-cluster-roles.injectable.ts deleted file mode 100644 index ed56679155..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/user-management/cluster-roles/navigate-to-cluster-roles.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import clusterRolesRouteInjectable from "./cluster-roles-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToClusterRolesInjectable = getInjectable({ - id: "navigate-to-cluster-roles", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(clusterRolesRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToClusterRolesInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/user-management/pod-security-policies/navigate-to-pod-security-policies.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/user-management/pod-security-policies/navigate-to-pod-security-policies.injectable.ts deleted file mode 100644 index 205354ba3b..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/user-management/pod-security-policies/navigate-to-pod-security-policies.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import podSecurityPoliciesRouteInjectable from "./pod-security-policies-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToPodSecurityPoliciesInjectable = getInjectable({ - id: "navigate-to-pod-security-policies", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(podSecurityPoliciesRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToPodSecurityPoliciesInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/user-management/pod-security-policies/pod-security-policies-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/user-management/pod-security-policies/pod-security-policies-route.injectable.ts deleted file mode 100644 index 27f9165be8..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/user-management/pod-security-policies/pod-security-policies-route.injectable.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const podSecurityPoliciesRouteInjectable = getInjectable({ - id: "pod-security-policies-route", - - instantiate: (di) => { - return { - path: "/pod-security-policies", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "podsecuritypolicies", - group: "policy", - }), - }; - }, - - injectionToken: frontEndRouteInjectionToken, -}); - -export default podSecurityPoliciesRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/user-management/role-bindings/navigate-to-role-bindings.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/user-management/role-bindings/navigate-to-role-bindings.injectable.ts deleted file mode 100644 index ce5bb3713b..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/user-management/role-bindings/navigate-to-role-bindings.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import roleBindingsRouteInjectable from "./role-bindings-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToRoleBindingsInjectable = getInjectable({ - id: "navigate-to-role-bindings", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(roleBindingsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToRoleBindingsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/user-management/role-bindings/role-bindings-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/user-management/role-bindings/role-bindings-route.injectable.ts deleted file mode 100644 index 195210df23..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/user-management/role-bindings/role-bindings-route.injectable.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const roleBindingsRouteInjectable = getInjectable({ - id: "role-bindings-route", - - instantiate: (di) => { - return { - path: "/role-bindings", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "rolebindings", - group: "rbac.authorization.k8s.io", - }), - }; - }, - - injectionToken: frontEndRouteInjectionToken, -}); - -export default roleBindingsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/user-management/roles/navigate-to-roles.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/user-management/roles/navigate-to-roles.injectable.ts deleted file mode 100644 index adebb64ae1..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/user-management/roles/navigate-to-roles.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import rolesRouteInjectable from "./roles-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToRolesInjectable = getInjectable({ - id: "navigate-to-roles", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(rolesRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToRolesInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/user-management/roles/roles-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/user-management/roles/roles-route.injectable.ts deleted file mode 100644 index 807a12177c..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/user-management/roles/roles-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const rolesRouteInjectable = getInjectable({ - id: "roles-route", - - instantiate: (di) => ({ - path: "/roles", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "roles", - group: "rbac.authorization.k8s.io", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default rolesRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/user-management/service-accounts/navigate-to-service-accounts.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/user-management/service-accounts/navigate-to-service-accounts.injectable.ts deleted file mode 100644 index 5eb1861a92..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/user-management/service-accounts/navigate-to-service-accounts.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import serviceAccountsRouteInjectable from "./service-accounts-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToServiceAccountsInjectable = getInjectable({ - id: "navigate-to-service-accounts", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(serviceAccountsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToServiceAccountsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/user-management/service-accounts/service-accounts-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/user-management/service-accounts/service-accounts-route.injectable.ts deleted file mode 100644 index aecc5a3640..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/user-management/service-accounts/service-accounts-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const serviceAccountsRouteInjectable = getInjectable({ - id: "service-accounts-route", - - instantiate: (di) => ({ - path: "/service-accounts", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "serviceaccounts", - group: "", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default serviceAccountsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/workloads/cron-jobs/cron-jobs-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/workloads/cron-jobs/cron-jobs-route.injectable.ts deleted file mode 100644 index 0899486298..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/workloads/cron-jobs/cron-jobs-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const cronJobsRouteInjectable = getInjectable({ - id: "cron-jobs-route", - - instantiate: (di) => ({ - path: "/cronjobs", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "cronjobs", - group: "batch", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default cronJobsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/workloads/cron-jobs/navigate-to-cron-jobs.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/workloads/cron-jobs/navigate-to-cron-jobs.injectable.ts deleted file mode 100644 index 42b104055e..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/workloads/cron-jobs/navigate-to-cron-jobs.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import cronJobsRouteInjectable from "./cron-jobs-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToCronJobsInjectable = getInjectable({ - id: "navigate-to-cron-jobs", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(cronJobsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToCronJobsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/workloads/daemonsets/daemonsets-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/workloads/daemonsets/daemonsets-route.injectable.ts deleted file mode 100644 index 42f1329551..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/workloads/daemonsets/daemonsets-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const daemonsetsRouteInjectable = getInjectable({ - id: "daemonsets-route", - - instantiate: (di) => ({ - path: "/daemonsets", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "daemonsets", - group: "apps", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default daemonsetsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/workloads/daemonsets/navigate-to-daemonsets.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/workloads/daemonsets/navigate-to-daemonsets.injectable.ts deleted file mode 100644 index 1cc5ec8d8d..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/workloads/daemonsets/navigate-to-daemonsets.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import daemonsetsRouteInjectable from "./daemonsets-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToDaemonsetsInjectable = getInjectable({ - id: "navigate-to-daemonsets", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(daemonsetsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToDaemonsetsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/workloads/deployments/deployments-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/workloads/deployments/deployments-route.injectable.ts deleted file mode 100644 index 222f842981..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/workloads/deployments/deployments-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const deploymentsRouteInjectable = getInjectable({ - id: "deployments-route", - - instantiate: (di) => ({ - path: "/deployments", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "deployments", - group: "apps", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default deploymentsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/workloads/deployments/navigate-to-deployments.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/workloads/deployments/navigate-to-deployments.injectable.ts deleted file mode 100644 index b6d2f07391..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/workloads/deployments/navigate-to-deployments.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import deploymentsRouteInjectable from "./deployments-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToDeploymentsInjectable = getInjectable({ - id: "navigate-to-deployments", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(deploymentsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToDeploymentsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/workloads/jobs/jobs-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/workloads/jobs/jobs-route.injectable.ts deleted file mode 100644 index 4933c69531..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/workloads/jobs/jobs-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const jobsRouteInjectable = getInjectable({ - id: "jobs-route", - - instantiate: (di) => ({ - path: "/jobs", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "jobs", - group: "batch", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default jobsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/workloads/jobs/navigate-to-jobs.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/workloads/jobs/navigate-to-jobs.injectable.ts deleted file mode 100644 index 920c5c4de7..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/workloads/jobs/navigate-to-jobs.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import jobsRouteInjectable from "./jobs-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToJobsInjectable = getInjectable({ - id: "navigate-to-jobs", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(jobsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToJobsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/workloads/overview/navigate-to-workloads-overview.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/workloads/overview/navigate-to-workloads-overview.injectable.ts deleted file mode 100644 index 224950206b..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/workloads/overview/navigate-to-workloads-overview.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import workloadsOverviewRouteInjectable from "./workloads-overview-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToWorkloadsOverviewInjectable = getInjectable({ - id: "navigate-to-workloads-overview", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(workloadsOverviewRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToWorkloadsOverviewInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/workloads/overview/workloads-overview-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/workloads/overview/workloads-overview-route.injectable.ts deleted file mode 100644 index 188bd9f1de..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/workloads/overview/workloads-overview-route.injectable.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { computed } from "mobx"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const workloadsOverviewRouteInjectable = getInjectable({ - id: "workloads-overview-route", - - instantiate: () => ({ - path: "/workloads", - clusterFrame: true, - isEnabled: computed(() => true), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default workloadsOverviewRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/workloads/pods/navigate-to-pods.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/workloads/pods/navigate-to-pods.injectable.ts deleted file mode 100644 index 4eab211598..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/workloads/pods/navigate-to-pods.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import podsRouteInjectable from "./pods-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToPodsInjectable = getInjectable({ - id: "navigate-to-pods", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(podsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToPodsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/workloads/pods/pods-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/workloads/pods/pods-route.injectable.ts deleted file mode 100644 index 6563896893..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/workloads/pods/pods-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const podsRouteInjectable = getInjectable({ - id: "pods-route", - - instantiate: (di) => ({ - path: "/pods", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "pods", - group: "", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default podsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/workloads/replicasets/navigate-to-replicasets.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/workloads/replicasets/navigate-to-replicasets.injectable.ts deleted file mode 100644 index 9549abab09..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/workloads/replicasets/navigate-to-replicasets.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import replicasetsRouteInjectable from "./replicasets-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToReplicasetsInjectable = getInjectable({ - id: "navigate-to-replicasets", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(replicasetsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToReplicasetsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/workloads/replicasets/replicasets-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/workloads/replicasets/replicasets-route.injectable.ts deleted file mode 100644 index bff60b2b8d..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/workloads/replicasets/replicasets-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const replicasetsRouteInjectable = getInjectable({ - id: "replicasets-route", - - instantiate: (di) => ({ - path: "/replicasets", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "replicasets", - group: "apps", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default replicasetsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/workloads/replication-controllers/navigate-to.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/workloads/replication-controllers/navigate-to.injectable.ts deleted file mode 100644 index 9158c163d7..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/workloads/replication-controllers/navigate-to.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import replicationControllersRouteInjectable from "./route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToReplicationControllersInjectable = getInjectable({ - id: "navigate-to-replicationcontrollers", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(replicationControllersRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToReplicationControllersInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/workloads/replication-controllers/route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/workloads/replication-controllers/route.injectable.ts deleted file mode 100644 index e43712632f..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/workloads/replication-controllers/route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const replicationControllersRouteInjectable = getInjectable({ - id: "replication-controllers-route", - - instantiate: (di) => ({ - path: "/replication-controllers", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "replicationcontrollers", - group: "", // core - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default replicationControllersRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/workloads/statefulsets/navigate-to-statefulsets.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/workloads/statefulsets/navigate-to-statefulsets.injectable.ts deleted file mode 100644 index 403c7fa042..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/workloads/statefulsets/navigate-to-statefulsets.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import statefulsetsRouteInjectable from "./statefulsets-route.injectable"; -import { navigateToRouteInjectionToken } from "../../../../navigate-to-route-injection-token"; - -const navigateToStatefulsetsInjectable = getInjectable({ - id: "navigate-to-statefulsets", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(statefulsetsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToStatefulsetsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/cluster/workloads/statefulsets/statefulsets-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/cluster/workloads/statefulsets/statefulsets-route.injectable.ts deleted file mode 100644 index 0a0160ccd9..0000000000 --- a/packages/core/src/common/front-end-routing/routes/cluster/workloads/statefulsets/statefulsets-route.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shouldShowResourceInjectionToken } from "../../../../../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import { frontEndRouteInjectionToken } from "../../../../front-end-route-injection-token"; - -const statefulsetsRouteInjectable = getInjectable({ - id: "statefulsets-route", - - instantiate: (di) => ({ - path: "/statefulsets", - clusterFrame: true, - isEnabled: di.inject(shouldShowResourceInjectionToken, { - apiName: "statefulsets", - group: "apps", - }), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default statefulsetsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/entity-settings/entity-settings-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/entity-settings/entity-settings-route.injectable.ts deleted file mode 100644 index e7d3ac5f46..0000000000 --- a/packages/core/src/common/front-end-routing/routes/entity-settings/entity-settings-route.injectable.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { computed } from "mobx"; -import type { Route } from "../../front-end-route-injection-token"; -import { frontEndRouteInjectionToken } from "../../front-end-route-injection-token"; - -export interface EntitySettingsPathParameters { - entityId: string; -} - -const entitySettingsRouteInjectable = getInjectable({ - id: "entity-settings-route", - - instantiate: (): Route => ({ - path: "/entity/:entityId/settings", - clusterFrame: false, - isEnabled: computed(() => true), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default entitySettingsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/entity-settings/navigate-to-entity-settings.injectable.ts b/packages/core/src/common/front-end-routing/routes/entity-settings/navigate-to-entity-settings.injectable.ts deleted file mode 100644 index bc49bc4041..0000000000 --- a/packages/core/src/common/front-end-routing/routes/entity-settings/navigate-to-entity-settings.injectable.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import entitySettingsRouteInjectable from "./entity-settings-route.injectable"; -import { navigateToRouteInjectionToken } from "../../navigate-to-route-injection-token"; - -export type NavigateToEntitySettings = (entityId: string, targetTabId?: string) => void; - -const navigateToEntitySettingsInjectable = getInjectable({ - id: "navigate-to-entity-settings", - - instantiate: (di): NavigateToEntitySettings => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(entitySettingsRouteInjectable); - - return (entityId, targetTabId) => - navigateToRoute(route, { parameters: { entityId }, fragment: targetTabId }); - }, -}); - -export default navigateToEntitySettingsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/extensions/extensions-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/extensions/extensions-route.injectable.ts deleted file mode 100644 index 5992355022..0000000000 --- a/packages/core/src/common/front-end-routing/routes/extensions/extensions-route.injectable.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { computed } from "mobx"; -import { frontEndRouteInjectionToken } from "../../front-end-route-injection-token"; - -const extensionsRouteInjectable = getInjectable({ - id: "extensions-route", - - instantiate: () => ({ - path: "/extensions", - clusterFrame: false, - isEnabled: computed(() => true), - }), - - injectionToken: frontEndRouteInjectionToken, -}); - -export default extensionsRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/extensions/navigate-to-extensions.injectable.ts b/packages/core/src/common/front-end-routing/routes/extensions/navigate-to-extensions.injectable.ts deleted file mode 100644 index 2e4e6d7d4c..0000000000 --- a/packages/core/src/common/front-end-routing/routes/extensions/navigate-to-extensions.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import extensionsRouteInjectable from "./extensions-route.injectable"; -import { navigateToRouteInjectionToken } from "../../navigate-to-route-injection-token"; - -const navigateToExtensionsInjectable = getInjectable({ - id: "navigate-to-extensions", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(extensionsRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToExtensionsInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/welcome/default-welcome-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/welcome/default-welcome-route.injectable.ts deleted file mode 100644 index d8db889033..0000000000 --- a/packages/core/src/common/front-end-routing/routes/welcome/default-welcome-route.injectable.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { computed } from "mobx"; -import welcomeRouteConfigInjectable from "./welcome-route-config.injectable"; -import { frontEndRouteInjectionToken } from "../../front-end-route-injection-token"; - -const defaultWelcomeRouteInjectable = getInjectable({ - id: "default-welcome-route", - - instantiate: (di) => { - const welcomeRoute = di.inject(welcomeRouteConfigInjectable); - - return { - path: "/welcome", - clusterFrame: false, - isEnabled: computed(() => welcomeRoute === "/welcome"), - }; - }, - - injectionToken: frontEndRouteInjectionToken, -}); - -export default defaultWelcomeRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/welcome/navigate-to-welcome.injectable.ts b/packages/core/src/common/front-end-routing/routes/welcome/navigate-to-welcome.injectable.ts deleted file mode 100644 index 46f5b42056..0000000000 --- a/packages/core/src/common/front-end-routing/routes/welcome/navigate-to-welcome.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import welcomeRouteInjectable from "./welcome-route.injectable"; -import { navigateToRouteInjectionToken } from "../../navigate-to-route-injection-token"; - -const navigateToWelcomeInjectable = getInjectable({ - id: "navigate-to-welcome", - - instantiate: (di) => { - const navigateToRoute = di.inject(navigateToRouteInjectionToken); - const route = di.inject(welcomeRouteInjectable); - - return () => navigateToRoute(route); - }, -}); - -export default navigateToWelcomeInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/welcome/welcome-route-config.injectable.ts b/packages/core/src/common/front-end-routing/routes/welcome/welcome-route-config.injectable.ts deleted file mode 100644 index 9883c1476b..0000000000 --- a/packages/core/src/common/front-end-routing/routes/welcome/welcome-route-config.injectable.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { applicationInformationToken } from "@k8slens/application"; -import { getInjectable } from "@ogre-tools/injectable"; - -const welcomeRouteConfigInjectable = getInjectable({ - id: "welcome-route-config", - - instantiate: (di) => di.inject(applicationInformationToken).welcomeRoute, -}); - -export default welcomeRouteConfigInjectable; diff --git a/packages/core/src/common/front-end-routing/routes/welcome/welcome-route.injectable.ts b/packages/core/src/common/front-end-routing/routes/welcome/welcome-route.injectable.ts deleted file mode 100644 index 839a7446c1..0000000000 --- a/packages/core/src/common/front-end-routing/routes/welcome/welcome-route.injectable.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { computed } from "mobx"; -import welcomeRouteConfigInjectable from "./welcome-route-config.injectable"; -import { frontEndRouteInjectionToken } from "../../front-end-route-injection-token"; - -const welcomeRouteInjectable = getInjectable({ - id: "welcome-route", - - instantiate: (di) => { - const welcomeRoute = di.inject(welcomeRouteConfigInjectable); - - return { - path: welcomeRoute, - clusterFrame: false, - isEnabled: computed(() => true), - }; - }, - - injectionToken: frontEndRouteInjectionToken, -}); - -export default welcomeRouteInjectable; diff --git a/packages/core/src/common/front-end-routing/verify-that-all-routes-have-route-component.test.ts b/packages/core/src/common/front-end-routing/verify-that-all-routes-have-route-component.test.ts deleted file mode 100644 index a13a3f8929..0000000000 --- a/packages/core/src/common/front-end-routing/verify-that-all-routes-have-route-component.test.ts +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getDiForUnitTesting } from "../../renderer/getDiForUnitTesting"; -import { routeSpecificComponentInjectionToken } from "../../renderer/routes/route-specific-component-injection-token"; -import { frontEndRouteInjectionToken } from "./front-end-route-injection-token"; -import { filter, map } from "lodash/fp"; -import { pipeline } from "@ogre-tools/fp"; - -describe("verify-that-all-routes-have-component", () => { - it("verify that routes have route component", () => { - const rendererDi = getDiForUnitTesting(); - - const routes = rendererDi.injectMany(frontEndRouteInjectionToken); - const routeComponents = rendererDi.injectMany(routeSpecificComponentInjectionToken); - - const routesMissingComponent = pipeline( - routes, - - map( - (currentRoute) => ({ - path: currentRoute.path, - routeComponent: routeComponents.find(({ route }) => ( - route.path === currentRoute.path - && route.clusterFrame === currentRoute.clusterFrame)), - }), - ), - - filter({ routeComponent: undefined }), - - map("path"), - ); - - expect(routesMissingComponent).toEqual([]); - }); -}); diff --git a/packages/core/src/common/fs/access-path.injectable.ts b/packages/core/src/common/fs/access-path.injectable.ts deleted file mode 100644 index 0504de9d6f..0000000000 --- a/packages/core/src/common/fs/access-path.injectable.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import fsInjectable from "./fs.injectable"; - -export type AccessPath = (path: string, mode?: number) => Promise; - -const accessPathInjectable = getInjectable({ - id: "access-path", - instantiate: (di): AccessPath => { - const { access } = di.inject(fsInjectable); - - return async (path, mode) => { - try { - await access(path, mode); - - return true; - } catch { - return false; - } - }; - }, -}); - -export default accessPathInjectable; diff --git a/packages/core/src/common/fs/copy.injectable.ts b/packages/core/src/common/fs/copy.injectable.ts deleted file mode 100644 index 6a64ee3751..0000000000 --- a/packages/core/src/common/fs/copy.injectable.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { CopyOptions } from "fs-extra"; -import fsInjectable from "./fs.injectable"; - -export type Copy = (src: string, dest: string, options?: CopyOptions | undefined) => Promise; - -const copyInjectable = getInjectable({ - id: "copy", - instantiate: (di): Copy => di.inject(fsInjectable).copy, -}); - -export default copyInjectable; diff --git a/packages/core/src/common/fs/create-read-file-stream.injectable.ts b/packages/core/src/common/fs/create-read-file-stream.injectable.ts deleted file mode 100644 index 8714e1cdcd..0000000000 --- a/packages/core/src/common/fs/create-read-file-stream.injectable.ts +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { ReadStream } from "fs"; -import fsInjectable from "./fs.injectable"; - -export interface CreateReadStreamOptions { - mode?: number; - end?: number | undefined; - flags?: string | undefined; - encoding?: BufferEncoding | undefined; - autoClose?: boolean | undefined; - /** - * @default false - */ - emitClose?: boolean | undefined; - start?: number | undefined; - highWaterMark?: number | undefined; -} - -export type CreateReadFileStream = (filePath: string, options?: CreateReadStreamOptions) => ReadStream; - -const createReadFileStreamInjectable = getInjectable({ - id: "create-read-file-stream", - instantiate: (di): CreateReadFileStream => di.inject(fsInjectable).createReadStream, -}); - -export default createReadFileStreamInjectable; diff --git a/packages/core/src/common/fs/ensure-dir.injectable.ts b/packages/core/src/common/fs/ensure-dir.injectable.ts deleted file mode 100644 index 78ec4d91dc..0000000000 --- a/packages/core/src/common/fs/ensure-dir.injectable.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import fsInjectable from "./fs.injectable"; - -export type EnsureDirectory = (dirPath: string) => Promise; - -const ensureDirInjectable = getInjectable({ - id: "ensure-dir", - - // TODO: Remove usages of ensureDir from business logic. - // TODO: Read, Write, Watch etc. operations should do this internally. - instantiate: (di): EnsureDirectory => di.inject(fsInjectable).ensureDir, -}); - -export default ensureDirInjectable; diff --git a/packages/core/src/common/fs/exec-file.global-override-for-injectable.ts b/packages/core/src/common/fs/exec-file.global-override-for-injectable.ts deleted file mode 100644 index 381a546125..0000000000 --- a/packages/core/src/common/fs/exec-file.global-override-for-injectable.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverrideForFunction } from "@k8slens/test-utils"; -import execFileInjectable from "./exec-file.injectable"; - -export default getGlobalOverrideForFunction(execFileInjectable); diff --git a/packages/core/src/common/fs/exec-file.injectable.ts b/packages/core/src/common/fs/exec-file.injectable.ts deleted file mode 100644 index 9ee0fae78f..0000000000 --- a/packages/core/src/common/fs/exec-file.injectable.ts +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { ExecFileException, ExecFileOptions } from "child_process"; -import { execFile } from "child_process"; -import type { AsyncResult } from "@k8slens/utilities"; - -export type ExecFileError = ExecFileException & { stderr: string }; - -export interface ExecFile { - (filePath: string): AsyncResult; - (filePath: string, argsOrOptions: string[] | ExecFileOptions): AsyncResult; - (filePath: string, args: string[], options: ExecFileOptions): AsyncResult; -} - -const execFileInjectable = getInjectable({ - id: "exec-file", - - instantiate: (): ExecFile => { - return (filePath: string, argsOrOptions?: string[] | ExecFileOptions, maybeOptions?: ExecFileOptions) => { - const { args, options } = (() => { - if (Array.isArray(argsOrOptions)) { - return { - args: argsOrOptions, - options: maybeOptions ?? {}, - }; - } else { - return { - args: [], - options: argsOrOptions ?? {}, - }; - } - })(); - - return new Promise((resolve) => { - execFile(filePath, args, options, (error, stdout, stderr) => { - if (error) { - resolve({ - callWasSuccessful: false, - error: Object.assign(error, { stderr }), - }); - } else { - resolve({ - callWasSuccessful: true, - response: stdout, - }); - } - }); - }); - }; - }, - - causesSideEffects: true, -}); - -export default execFileInjectable; diff --git a/packages/core/src/common/fs/extract-tar.global-override-for-injectable.ts b/packages/core/src/common/fs/extract-tar.global-override-for-injectable.ts deleted file mode 100644 index 68d1fe4259..0000000000 --- a/packages/core/src/common/fs/extract-tar.global-override-for-injectable.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "@k8slens/test-utils"; -import extractTarInjectable from "./extract-tar.injectable"; - -export default getGlobalOverride(extractTarInjectable, () => async () => { - throw new Error("tried to extract a tar file without override"); -}); diff --git a/packages/core/src/common/fs/extract-tar.injectable.ts b/packages/core/src/common/fs/extract-tar.injectable.ts deleted file mode 100644 index 410512139e..0000000000 --- a/packages/core/src/common/fs/extract-tar.injectable.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { ExtractOptions } from "tar"; -import { extract } from "tar"; -import getDirnameOfPathInjectable from "../path/get-dirname.injectable"; - -export type ExtractTar = (filePath: string, opts?: ExtractOptions) => Promise; - -const extractTarInjectable = getInjectable({ - id: "extract-tar", - instantiate: (di): ExtractTar => { - const getDirnameOfPath = di.inject(getDirnameOfPathInjectable); - - return (filePath, opts = {}) => extract({ - file: filePath, - cwd: getDirnameOfPath(filePath), - ...opts, - }); - }, - causesSideEffects: true, -}); - -export default extractTarInjectable; diff --git a/packages/core/src/common/fs/fs.injectable.ts b/packages/core/src/common/fs/fs.injectable.ts deleted file mode 100644 index 16fbbd73aa..0000000000 --- a/packages/core/src/common/fs/fs.injectable.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { ReadOptions } from "fs-extra"; -import fse from "fs-extra"; - -/** - * NOTE: Add corresponding override of this injectable in `src/test-utils/override-fs-with-fakes.ts` - */ -const fsInjectable = getInjectable({ - id: "fs", - instantiate: () => { - const { - promises: { - readFile, - writeFile, - readdir, - lstat, - rm, - access, - stat, - unlink, - rename, - }, - ensureDir, - ensureDirSync, - readFileSync, - readJson, - writeJson, - readJsonSync, - writeFileSync, - writeJsonSync, - pathExistsSync, - pathExists, - copy, - createReadStream, - } = fse; - - return { - readFile, - readJson: readJson as (file: string, options?: ReadOptions | BufferEncoding) => Promise, - writeFile, - writeJson, - pathExists, - readdir, - readFileSync, - readJsonSync, - writeFileSync, - writeJsonSync, - pathExistsSync, - lstat, - rm, - access, - copy: copy as (src: string, dest: string, options?: fse.CopyOptions) => Promise, - ensureDir: ensureDir as (path: string, options?: number | fse.EnsureOptions ) => Promise, - ensureDirSync, - createReadStream, - stat, - unlink, - rename, - }; - }, - causesSideEffects: true, -}); - -export default fsInjectable; diff --git a/packages/core/src/common/fs/lstat.injectable.ts b/packages/core/src/common/fs/lstat.injectable.ts deleted file mode 100644 index 50c1d4ad12..0000000000 --- a/packages/core/src/common/fs/lstat.injectable.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { Stats } from "fs"; -import fsInjectable from "./fs.injectable"; - -export type LStat = (path: string) => Promise; - -const lstatInjectable = getInjectable({ - id: "lstat", - instantiate: (di): LStat => di.inject(fsInjectable).lstat, -}); - -export default lstatInjectable; diff --git a/packages/core/src/common/fs/path-exists-sync.injectable.ts b/packages/core/src/common/fs/path-exists-sync.injectable.ts deleted file mode 100644 index 21bcb6d7d1..0000000000 --- a/packages/core/src/common/fs/path-exists-sync.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import fsInjectable from "./fs.injectable"; - -const pathExistsSyncInjectable = getInjectable({ - id: "path-exists-sync", - instantiate: (di) => di.inject(fsInjectable).pathExistsSync, -}); - -export default pathExistsSyncInjectable; diff --git a/packages/core/src/common/fs/path-exists.injectable.ts b/packages/core/src/common/fs/path-exists.injectable.ts deleted file mode 100644 index aee6cac52b..0000000000 --- a/packages/core/src/common/fs/path-exists.injectable.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import fsInjectable from "./fs.injectable"; - -export type PathExists = (path: string) => Promise; - -const pathExistsInjectable = getInjectable({ - id: "path-exists", - instantiate: (di): PathExists => di.inject(fsInjectable).pathExists, -}); - -export default pathExistsInjectable; diff --git a/packages/core/src/common/fs/read-directory.injectable.ts b/packages/core/src/common/fs/read-directory.injectable.ts deleted file mode 100644 index 8ebeebe75a..0000000000 --- a/packages/core/src/common/fs/read-directory.injectable.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { Dirent } from "fs"; -import fsInjectable from "./fs.injectable"; - -export interface ReadDirectory { - ( - path: string, - options: "buffer" | { encoding: "buffer"; withFileTypes?: false | undefined } - ): Promise; - ( - path: string, - options?: - | { encoding: BufferEncoding; withFileTypes?: false | undefined } - | BufferEncoding - ): Promise; - ( - path: string, - options?: { encoding?: BufferEncoding; withFileTypes?: false | undefined }, - ): Promise; - ( - path: string, - options: { encoding?: BufferEncoding; withFileTypes: true }, - ): Promise; -} - -const readDirectoryInjectable = getInjectable({ - id: "read-directory", - instantiate: (di): ReadDirectory => di.inject(fsInjectable).readdir, -}); - -export default readDirectoryInjectable; diff --git a/packages/core/src/common/fs/read-file-buffer-sync.injectable.ts b/packages/core/src/common/fs/read-file-buffer-sync.injectable.ts deleted file mode 100644 index 98ba8e6d4b..0000000000 --- a/packages/core/src/common/fs/read-file-buffer-sync.injectable.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import fsInjectable from "./fs.injectable"; - -export type ReadFileBufferSync = (filePath: string) => Buffer; - -const readFileBufferSyncInjectable = getInjectable({ - id: "read-file-buffer-sync", - instantiate: (di): ReadFileBufferSync => { - const { readFileSync } = di.inject(fsInjectable); - - return (filePath) => readFileSync(filePath); - }, -}); - -export default readFileBufferSyncInjectable; diff --git a/packages/core/src/common/fs/read-file-buffer.injectable.ts b/packages/core/src/common/fs/read-file-buffer.injectable.ts deleted file mode 100644 index f7707dc594..0000000000 --- a/packages/core/src/common/fs/read-file-buffer.injectable.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import fsInjectable from "./fs.injectable"; - -const readFileBufferInjectable = getInjectable({ - id: "read-file-buffer", - - instantiate: (di) => (filePath: string) => - di.inject(fsInjectable).readFile(filePath), -}); - -export default readFileBufferInjectable; diff --git a/packages/core/src/common/fs/read-file-sync.injectable.ts b/packages/core/src/common/fs/read-file-sync.injectable.ts deleted file mode 100644 index cdb2e4b4d2..0000000000 --- a/packages/core/src/common/fs/read-file-sync.injectable.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import fsInjectable from "./fs.injectable"; - -export type ReadFileSync = (filePath: string) => string; - -const readFileSyncInjectable = getInjectable({ - id: "read-file-sync", - instantiate: (di): ReadFileSync => { - const { readFileSync } = di.inject(fsInjectable); - - return (filePath) => readFileSync(filePath, "utf-8"); - }, -}); - -export default readFileSyncInjectable; diff --git a/packages/core/src/common/fs/read-file.injectable.ts b/packages/core/src/common/fs/read-file.injectable.ts deleted file mode 100644 index 0dc539e1b1..0000000000 --- a/packages/core/src/common/fs/read-file.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import fsInjectable from "./fs.injectable"; - -export type ReadFile = (filePath: string) => Promise; - -const readFileInjectable = getInjectable({ - id: "read-file", - - instantiate: (di): ReadFile => { - const { readFile } = di.inject(fsInjectable); - - return (filePath) => readFile(filePath, "utf-8"); - }, -}); - -export default readFileInjectable; diff --git a/packages/core/src/common/fs/read-json-file.injectable.ts b/packages/core/src/common/fs/read-json-file.injectable.ts deleted file mode 100644 index d270368cf9..0000000000 --- a/packages/core/src/common/fs/read-json-file.injectable.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { JsonValue } from "type-fest"; -import fsInjectable from "./fs.injectable"; - -export type ReadJson = (filePath: string) => Promise; - -const readJsonFileInjectable = getInjectable({ - id: "read-json-file", - instantiate: (di): ReadJson => di.inject(fsInjectable).readJson, -}); - -export default readJsonFileInjectable; diff --git a/packages/core/src/common/fs/read-json-sync.injectable.ts b/packages/core/src/common/fs/read-json-sync.injectable.ts deleted file mode 100644 index 81a9ef478f..0000000000 --- a/packages/core/src/common/fs/read-json-sync.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import fsInjectable from "./fs.injectable"; - -const readJsonSyncInjectable = getInjectable({ - id: "read-json-sync", - instantiate: (di) => di.inject(fsInjectable).readJsonSync, -}); - -export default readJsonSyncInjectable; diff --git a/packages/core/src/common/fs/read-yaml-file.injectable.ts b/packages/core/src/common/fs/read-yaml-file.injectable.ts deleted file mode 100644 index a34a69d388..0000000000 --- a/packages/core/src/common/fs/read-yaml-file.injectable.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import readFileInjectable from "./read-file.injectable"; -import yaml from "js-yaml"; - -export type ReadYamlFile = (filePath: string) => Promise; - -const readYamlFileInjectable = getInjectable({ - id: "read-yaml-file", - - instantiate: (di): ReadYamlFile => { - const readFile = di.inject(readFileInjectable); - - return async (filePath: string) => { - const contents = await readFile(filePath); - - return yaml.load(contents); - }; - }, -}); - -export default readYamlFileInjectable; diff --git a/packages/core/src/common/fs/remove.injectable.ts b/packages/core/src/common/fs/remove.injectable.ts deleted file mode 100644 index cf6f03987b..0000000000 --- a/packages/core/src/common/fs/remove.injectable.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import fsInjectable from "./fs.injectable"; - -export type RemovePath = (filePath: string) => Promise; - -const removePathInjectable = getInjectable({ - id: "remove-path", - instantiate: (di): RemovePath => { - const { rm } = di.inject(fsInjectable); - - return (filePath) => rm(filePath, { force: true, recursive: true }); - }, -}); - -export default removePathInjectable; diff --git a/packages/core/src/common/fs/stat.injectable.ts b/packages/core/src/common/fs/stat.injectable.ts deleted file mode 100644 index 07f2b298b1..0000000000 --- a/packages/core/src/common/fs/stat.injectable.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { Stats } from "fs"; -import fsInjectable from "./fs.injectable"; - -export type Stat = (path: string) => Promise; - -const statInjectable = getInjectable({ - id: "stat", - instantiate: (di): Stat => di.inject(fsInjectable).stat, -}); - -export default statInjectable; diff --git a/packages/core/src/common/fs/unlink.injectable.ts b/packages/core/src/common/fs/unlink.injectable.ts deleted file mode 100644 index e13bf35935..0000000000 --- a/packages/core/src/common/fs/unlink.injectable.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import fsInjectable from "./fs.injectable"; - -export type Unlink = (path: string) => Promise; - -const unlinkInjectable = getInjectable({ - id: "unlink", - instantiate: (di): Unlink => di.inject(fsInjectable).unlink, -}); - -export default unlinkInjectable; diff --git a/packages/core/src/common/fs/validate-directory.injectable.ts b/packages/core/src/common/fs/validate-directory.injectable.ts deleted file mode 100644 index 717caf5ec8..0000000000 --- a/packages/core/src/common/fs/validate-directory.injectable.ts +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { AsyncResult } from "@k8slens/utilities"; -import { isErrnoException } from "@k8slens/utilities"; -import type { Stats } from "fs-extra"; -import { lowerFirst } from "lodash/fp"; -import statInjectable from "./stat.injectable"; - -export type ValidateDirectory = (path: string) => AsyncResult; - -function getUserReadableFileType(stats: Stats): string { - if (stats.isFile()) { - return "a file"; - } - - if (stats.isFIFO()) { - return "a pipe"; - } - - if (stats.isSocket()) { - return "a socket"; - } - - if (stats.isBlockDevice()) { - return "a block device"; - } - - if (stats.isCharacterDevice()) { - return "a character device"; - } - - return "an unknown file type"; -} - -const validateDirectoryInjectable = getInjectable({ - id: "validate-directory", - - instantiate: (di): ValidateDirectory => { - const stat = di.inject(statInjectable); - - return async (path) => { - try { - const stats = await stat(path); - - if (stats.isDirectory()) { - return { callWasSuccessful: true, response: undefined }; - } - - return { callWasSuccessful: false, error: `the provided path is ${getUserReadableFileType(stats)} and not a directory.` }; - } catch (error) { - if (!isErrnoException(error)) { - return { callWasSuccessful: false, error: "of an unknown error, please try again." }; - } - - const humanReadableErrors: Record = { - ENOENT: "the provided path does not exist.", - EACCES: "search permissions is denied for one of the directories in the prefix of the provided path.", - ELOOP: "the provided path is a sym-link which points to a chain of sym-links that is too long to resolve. Perhaps it is cyclic.", - ENAMETOOLONG: "the pathname is too long to be used.", - ENOTDIR: "a prefix of the provided path is not a directory.", - }; - - const humanReadableError = error.code - ? humanReadableErrors[error.code] - : lowerFirst(String(error)); - - return { callWasSuccessful: false, error: humanReadableError }; - } - }; - }, -}); - -export default validateDirectoryInjectable; diff --git a/packages/core/src/common/fs/watch/watch.global-override-for-injectable.ts b/packages/core/src/common/fs/watch/watch.global-override-for-injectable.ts deleted file mode 100644 index b74c3eec20..0000000000 --- a/packages/core/src/common/fs/watch/watch.global-override-for-injectable.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getGlobalOverride } from "@k8slens/test-utils"; -import watchInjectable from "./watch.injectable"; - -export default getGlobalOverride(watchInjectable, () => () => { - throw new Error("Tried to call file system watch without explicit override"); -}); diff --git a/packages/core/src/common/fs/watch/watch.injectable.ts b/packages/core/src/common/fs/watch/watch.injectable.ts deleted file mode 100644 index 084197769d..0000000000 --- a/packages/core/src/common/fs/watch/watch.injectable.ts +++ /dev/null @@ -1,164 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { watch } from "chokidar"; -import type { Stats } from "fs"; -import type TypedEventEmitter from "typed-emitter"; -import type { SingleOrMany } from "@k8slens/utilities"; - -export interface AlwaysStatWatcherEvents { - add: (path: string, stats: Stats) => void; - addDir: (path: string, stats: Stats) => void; - change: (path: string, stats: Stats) => void; -} - -export interface MaybeStatWatcherEvents { - add: (path: string, stats?: Stats) => void; - addDir: (path: string, stats?: Stats) => void; - change: (path: string, stats?: Stats) => void; -} - -export type WatcherEvents = BaseWatcherEvents - & ( - AlwaysStat extends true - ? AlwaysStatWatcherEvents - : MaybeStatWatcherEvents - ); - -export interface BaseWatcherEvents { - error: (error: Error) => void; - ready: () => void; - unlink: (path: string) => void; - unlinkDir: (path: string) => void; -} - -export interface Watcher extends TypedEventEmitter> { - close: () => Promise; -} - -export type WatcherOptions = { - /** - * Indicates whether the process should continue to run as long as files are being watched. If - * set to `false` when using `fsevents` to watch, no more events will be emitted after `ready`, - * even if the process continues to run. - */ - persistent?: boolean; - - /** - * ([anymatch](https://github.com/micromatch/anymatch)-compatible definition) Defines files/paths to - * be ignored. The whole relative or absolute path is tested, not just filename. If a function - * with two arguments is provided, it gets called twice per path - once with a single argument - * (the path), second time with two arguments (the path and the - * [`fs.Stats`](https://nodejs.org/api/fs.html#fs_class_fs_stats) object of that path). - */ - ignored?: SingleOrMany boolean)>; - - /** - * If set to `false` then `add`/`addDir` events are also emitted for matching paths while - * instantiating the watching as chokidar discovers these file paths (before the `ready` event). - */ - ignoreInitial?: boolean; - - /** - * When `false`, only the symlinks themselves will be watched for changes instead of following - * the link references and bubbling events through the link's path. - */ - followSymlinks?: boolean; - - /** - * The base directory from which watch `paths` are to be derived. Paths emitted with events will - * be relative to this. - */ - cwd?: string; - - /** - * If set to true then the strings passed to .watch() and .add() are treated as literal path - * names, even if they look like globs. Default: false. - */ - disableGlobbing?: boolean; - - /** - * Whether to use fs.watchFile (backed by polling), or fs.watch. If polling leads to high CPU - * utilization, consider setting this to `false`. It is typically necessary to **set this to - * `true` to successfully watch files over a network**, and it may be necessary to successfully - * watch files in other non-standard situations. Setting to `true` explicitly on OS X overrides - * the `useFsEvents` default. - */ - usePolling?: boolean; - - /** - * Whether to use the `fsevents` watching interface if available. When set to `true` explicitly - * and `fsevents` is available this supercedes the `usePolling` setting. When set to `false` on - * OS X, `usePolling: true` becomes the default. - */ - useFsEvents?: boolean; - - /** - * If set, limits how many levels of subdirectories will be traversed. - */ - depth?: number; - - /** - * Interval of file system polling. - */ - interval?: number; - - /** - * Interval of file system polling for binary files. ([see list of binary extensions](https://gi - * thub.com/sindresorhus/binary-extensions/blob/master/binary-extensions.json)) - */ - binaryInterval?: number; - - /** - * Indicates whether to watch files that don't have read permissions if possible. If watching - * fails due to `EPERM` or `EACCES` with this set to `true`, the errors will be suppressed - * silently. - */ - ignorePermissionErrors?: boolean; - - /** - * `true` if `useFsEvents` and `usePolling` are `false`). Automatically filters out artifacts - * that occur when using editors that use "atomic writes" instead of writing directly to the - * source file. If a file is re-added within 100 ms of being deleted, Chokidar emits a `change` - * event rather than `unlink` then `add`. If the default of 100 ms does not work well for you, - * you can override it by setting `atomic` to a custom value, in milliseconds. - */ - atomic?: boolean | number; - - /** - * can be set to an object in order to adjust timing params: - */ - awaitWriteFinish?: AwaitWriteFinishOptions | boolean; -} & (AlwaysStat extends true - ? { - alwaysStat: true; - } - : { - alwaysStat?: false; - } -); - -export interface AwaitWriteFinishOptions { - /** - * Amount of time in milliseconds for a file size to remain constant before emitting its event. - */ - stabilityThreshold?: number; - - /** - * File size polling interval. - */ - pollInterval?: number; -} - -export type Watch = (path: string, options?: WatcherOptions) => Watcher; - -// TODO: Introduce wrapper to allow simpler API -const watchInjectable = getInjectable({ - id: "watch", - instantiate: () => watch as Watch, - causesSideEffects: true, -}); - -export default watchInjectable; diff --git a/packages/core/src/common/fs/write-buffer-sync.injectable.ts b/packages/core/src/common/fs/write-buffer-sync.injectable.ts deleted file mode 100644 index d4d253ae66..0000000000 --- a/packages/core/src/common/fs/write-buffer-sync.injectable.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import getDirnameOfPathInjectable from "../path/get-dirname.injectable"; -import fsInjectable from "./fs.injectable"; - -export type WriteBufferSync = (filePath: string, contents: Buffer) => void; - -const writeBufferSyncInjectable = getInjectable({ - id: "write-buffer-sync", - instantiate: (di): WriteBufferSync => { - const { - writeFileSync, - ensureDirSync, - } = di.inject(fsInjectable); - const getDirnameOfPath = di.inject(getDirnameOfPathInjectable); - - return (filePath, contents) => { - ensureDirSync(getDirnameOfPath(filePath), { - mode: 0o755, - }); - writeFileSync(filePath, contents); - }; - }, -}); - -export default writeBufferSyncInjectable; diff --git a/packages/core/src/common/fs/write-file-sync.injectable.ts b/packages/core/src/common/fs/write-file-sync.injectable.ts deleted file mode 100644 index 3daccaf610..0000000000 --- a/packages/core/src/common/fs/write-file-sync.injectable.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import getDirnameOfPathInjectable from "../path/get-dirname.injectable"; -import fsInjectable from "./fs.injectable"; - -export type WriteFileSync = (filePath: string, contents: string) => void; - -const writeFileSyncInjectable = getInjectable({ - id: "write-file-sync", - instantiate: (di): WriteFileSync => { - const { - writeFileSync, - ensureDirSync, - } = di.inject(fsInjectable); - const getDirnameOfPath = di.inject(getDirnameOfPathInjectable); - - return (filePath, contents) => { - ensureDirSync(getDirnameOfPath(filePath), { - mode: 0o755, - }); - writeFileSync(filePath, contents); - }; - }, -}); - -export default writeFileSyncInjectable; diff --git a/packages/core/src/common/fs/write-file.injectable.ts b/packages/core/src/common/fs/write-file.injectable.ts deleted file mode 100644 index 75e07775e3..0000000000 --- a/packages/core/src/common/fs/write-file.injectable.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { WriteFileOptions } from "fs-extra"; -import getDirnameOfPathInjectable from "../path/get-dirname.injectable"; -import fsInjectable from "./fs.injectable"; - -export type WriteFile = (filePath: string, content: string | Buffer, opts?: WriteFileOptions) => Promise; - -const writeFileInjectable = getInjectable({ - id: "write-file", - - instantiate: (di): WriteFile => { - const { writeFile, ensureDir } = di.inject(fsInjectable); - const getDirnameOfPath = di.inject(getDirnameOfPathInjectable); - - return async (filePath, content, opts = {}) => { - await ensureDir(getDirnameOfPath(filePath), { - mode: 0o755, - ...opts, - }); - - const { encoding = "utf-8", ...options } = opts; - - await writeFile(filePath, content, { - encoding: encoding as BufferEncoding, - ...options, - }); - }; - }, -}); - -export default writeFileInjectable; diff --git a/packages/core/src/common/fs/write-json-file.injectable.ts b/packages/core/src/common/fs/write-json-file.injectable.ts deleted file mode 100644 index 5491487849..0000000000 --- a/packages/core/src/common/fs/write-json-file.injectable.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import getDirnameOfPathInjectable from "../path/get-dirname.injectable"; -import fsInjectable from "./fs.injectable"; - -export type WriteJson = (filePath: string, contents: unknown) => Promise; - -const writeJsonFileInjectable = getInjectable({ - id: "write-json-file", - - instantiate: (di): WriteJson => { - const { writeJson, ensureDir } = di.inject(fsInjectable); - const getDirnameOfPath = di.inject(getDirnameOfPathInjectable); - - return async (filePath, content) => { - await ensureDir(getDirnameOfPath(filePath), { mode: 0o755 }); - - await writeJson(filePath, content, { - encoding: "utf-8", - spaces: 2, - }); - }; - }, -}); - -export default writeJsonFileInjectable; diff --git a/packages/core/src/common/fs/write-json-sync.injectable.ts b/packages/core/src/common/fs/write-json-sync.injectable.ts deleted file mode 100644 index eb4abc3936..0000000000 --- a/packages/core/src/common/fs/write-json-sync.injectable.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import getDirnameOfPathInjectable from "../path/get-dirname.injectable"; -import fsInjectable from "./fs.injectable"; - -export type WriteJsonSync = (filePath: string, contents: unknown) => void; - -const writeJsonSyncInjectable = getInjectable({ - id: "write-json-sync", - instantiate: (di): WriteJsonSync => { - const { - writeJsonSync, - ensureDirSync, - } = di.inject(fsInjectable); - const getDirnameOfPath = di.inject(getDirnameOfPathInjectable); - - return (filePath, content) => { - ensureDirSync(getDirnameOfPath(filePath), { mode: 0o755 }); - - writeJsonSync(filePath, content, { - encoding: "utf-8", - spaces: 2, - }); - }; - }, -}); - -export default writeJsonSyncInjectable; diff --git a/packages/core/src/common/get-configuration-file-model/get-configuration-file-model.global-override-for-injectable.ts b/packages/core/src/common/get-configuration-file-model/get-configuration-file-model.global-override-for-injectable.ts deleted file mode 100644 index 5b83b7b573..0000000000 --- a/packages/core/src/common/get-configuration-file-model/get-configuration-file-model.global-override-for-injectable.ts +++ /dev/null @@ -1,132 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import assert from "assert"; -import path from "path"; -import { getGlobalOverride } from "@k8slens/test-utils"; -import getConfigurationFileModelInjectable from "./get-configuration-file-model.injectable"; -import type Config from "conf"; -import readJsonSyncInjectable from "../fs/read-json-sync.injectable"; -import writeJsonSyncInjectable from "../fs/write-json-sync.injectable"; -import { get, has, set } from "lodash"; -import semver from "semver"; - -const MIGRATION_KEY = `__internal__.migrations.version`; - -const _isVersionInRangeFormat = (version: string) => { - return semver.clean(version) === null; -}; - -const _shouldPerformMigration = (candidateVersion: string, previousMigratedVersion: string, versionToMigrate: string) => { - if (_isVersionInRangeFormat(candidateVersion)) { - if (previousMigratedVersion !== "0.0.0" && semver.satisfies(previousMigratedVersion, candidateVersion)) { - return false; - } - - return semver.satisfies(versionToMigrate, candidateVersion); - } - - if (semver.lte(candidateVersion, previousMigratedVersion)) { - return false; - } - - if (semver.gt(candidateVersion, versionToMigrate)) { - return false; - } - - return true; -}; - -export default getGlobalOverride(getConfigurationFileModelInjectable, (di) => { - const readJsonSync = di.inject(readJsonSyncInjectable); - const writeJsonSync = di.inject(writeJsonSyncInjectable); - - return (options) => { - assert(options.cwd, "Missing options.cwd"); - assert(options.configName, "Missing options.configName"); - assert(options.projectVersion, "Missing options.projectVersion"); - - const configFilePath = path.posix.join(options.cwd, `${options.configName}.json`); - let store: object = {}; - - try { - store = readJsonSync(configFilePath); - } catch { - // ignore - } - - const config = { - get store() { - return store; - }, - path: configFilePath, - get: (key: string) => get(store, key), - set: (key: string, value: unknown) => { - let currentState: Partial>; - - try { - currentState = readJsonSync(configFilePath); - } catch { - currentState = {}; - } - - writeJsonSync(configFilePath, { - ...currentState, - [key]: value, - }); - store = readJsonSync(configFilePath); - }, - delete: (key: string) => { - let currentState: Partial>; - - try { - currentState = readJsonSync(configFilePath); - } catch { - currentState = {}; - } - - delete currentState[key]; - - writeJsonSync(configFilePath, currentState); - store = readJsonSync(configFilePath); - }, - has: (key: string) => has(store, key), - clear: () => { - writeJsonSync(configFilePath, {}); - store = readJsonSync(configFilePath); - }, - } as Partial as Config; - - // Migrate - { - const migrations = options.migrations ?? []; - const versionToMigrate = options.projectVersion; - let previousMigratedVersion = get(store, MIGRATION_KEY) || "0.0.0"; - const newerVersions = Object.entries(migrations) - .filter(([candidateVersion]) => _shouldPerformMigration(candidateVersion, previousMigratedVersion, versionToMigrate)); - - let storeBackup = { ...store }; - - for (const [version, migration] of newerVersions) { - try { - migration(config); - set(store, MIGRATION_KEY, version); - previousMigratedVersion = version; - storeBackup = { ...store }; - } - catch (error) { - store = storeBackup; - throw new Error(`Something went wrong during the migration! Changes applied to the store until this failed migration will be restored. ${error}`); - } - } - - if (_isVersionInRangeFormat(previousMigratedVersion) || !semver.eq(previousMigratedVersion, versionToMigrate)) { - set(store, MIGRATION_KEY, versionToMigrate); - } - } - - return config; - }; -}); diff --git a/packages/core/src/common/get-configuration-file-model/get-configuration-file-model.injectable.ts b/packages/core/src/common/get-configuration-file-model/get-configuration-file-model.injectable.ts deleted file mode 100644 index e167e464ef..0000000000 --- a/packages/core/src/common/get-configuration-file-model/get-configuration-file-model.injectable.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import Config from "conf"; -import type { Options as ConfOptions } from "conf/dist/source/types"; - -export type GetConfigurationFileModel = (content: ConfOptions) => Config; - -const getConfigurationFileModelInjectable = getInjectable({ - id: "get-configuration-file-model", - instantiate: (): GetConfigurationFileModel => (content) => new Config(content), - causesSideEffects: true, -}); - -export default getConfigurationFileModelInjectable; diff --git a/packages/core/src/common/helm/add-helm-repository-channel.ts b/packages/core/src/common/helm/add-helm-repository-channel.ts deleted file mode 100644 index 1744192059..0000000000 --- a/packages/core/src/common/helm/add-helm-repository-channel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { HelmRepo } from "./helm-repo"; -import type { Result } from "@k8slens/utilities"; -import { getRequestChannel } from "@k8slens/messaging"; - -export const addHelmRepositoryChannel = getRequestChannel< - HelmRepo, - Result ->("add-helm-repository-channel"); diff --git a/packages/core/src/common/helm/get-active-helm-repositories-channel.ts b/packages/core/src/common/helm/get-active-helm-repositories-channel.ts deleted file mode 100644 index ba4e0ae956..0000000000 --- a/packages/core/src/common/helm/get-active-helm-repositories-channel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { HelmRepo } from "./helm-repo"; -import type { AsyncResult } from "@k8slens/utilities"; -import { getRequestChannel } from "@k8slens/messaging"; - -export const getActiveHelmRepositoriesChannel = getRequestChannel< - void, - AsyncResult ->("get-helm-active-list-repositories"); diff --git a/packages/core/src/common/helm/helm-repo.ts b/packages/core/src/common/helm/helm-repo.ts deleted file mode 100644 index cb4af3449b..0000000000 --- a/packages/core/src/common/helm/helm-repo.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export interface HelmRepo { - name: string; - url: string; - cacheFilePath: string; - caFile?: string; - certFile?: string; - insecureSkipTlsVerify?: boolean; - keyFile?: string; - username?: string; - password?: string; -} diff --git a/packages/core/src/common/helm/remove-helm-repository-channel.ts b/packages/core/src/common/helm/remove-helm-repository-channel.ts deleted file mode 100644 index 09c7630f34..0000000000 --- a/packages/core/src/common/helm/remove-helm-repository-channel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { AsyncResult } from "@k8slens/utilities"; -import { getRequestChannel } from "@k8slens/messaging"; -import type { HelmRepo } from "./helm-repo"; - -export const removeHelmRepositoryChannel = getRequestChannel< - HelmRepo, - AsyncResult ->("remove-helm-repository-channel"); diff --git a/packages/core/src/common/initializable-state/create.test.ts b/packages/core/src/common/initializable-state/create.test.ts deleted file mode 100644 index d93848cdcc..0000000000 --- a/packages/core/src/common/initializable-state/create.test.ts +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { AsyncFnMock } from "@async-fn/jest"; -import asyncFn from "@async-fn/jest"; -import type { Runnable } from "@k8slens/run-many"; -import { runManyFor } from "@k8slens/run-many"; -import type { DiContainer, InjectionToken } from "@ogre-tools/injectable"; -import { createContainer, getInjectionToken } from "@ogre-tools/injectable"; -import type { ImplInitializableInjectionTokensArgs, Initializable } from "./create"; -import { getInjectablesForInitializable, getInitializable } from "./create"; - -describe("InitializableTokens technical tests", () => { - let di: DiContainer; - let initializableToken: Initializable; - let phase: InjectionToken, void>; - - beforeEach(() => { - di = createContainer("irrelevant"); - - initializableToken = getInitializable("some-root-id"); - phase = getInjectionToken({ id: "some-runnable-phase" }); - }); - - it("throws given attempting to inject the state token", () => { - expect(() => di.inject(initializableToken.stateToken)).toThrowErrorMatchingInlineSnapshot( - `"Tried to inject non-registered injectable "irrelevant" -> "some-root-id-state-token"."`, - ); - }); - - describe("given some implementation for initializableToken is registered", () => { - let mockInit: AsyncFnMock["init"]>; - - beforeEach(() => { - mockInit = asyncFn(); - - const { initializationInjectable, stateInjectable } = getInjectablesForInitializable({ - init: mockInit, - phase, - token: initializableToken, - }); - - di.register(initializationInjectable, stateInjectable); - }); - - it("throws given attempting to inject the state token", () => { - expect(() => di.inject(initializableToken.stateToken)).toThrowErrorMatchingInlineSnapshot( - `"Tried to inject "some-root-id" before initialization was complete"`, - ); - }); - - describe("given the phase is started to be run", () => { - let runManyPromise: Promise; - - beforeEach(() => { - runManyPromise = runManyFor(di)(phase)(); - }); - - it("throws given attempting to inject the state token", () => { - expect(() => di.inject(initializableToken.stateToken)).toThrowErrorMatchingInlineSnapshot( - `"Tried to inject "some-root-id" before initialization was complete"`, - ); - }); - - describe("when initialization is complete", () => { - beforeEach(async () => { - await mockInit.resolve(10); - }); - - it("initializes the state", () => { - expect(di.inject(initializableToken.stateToken)).toBe(10); - }); - - it("allows the runMany to complete", async () => { - await runManyPromise; - }); - }); - }); - }); -}); diff --git a/packages/core/src/common/initializable-state/create.ts b/packages/core/src/common/initializable-state/create.ts deleted file mode 100644 index 51e0d8ed25..0000000000 --- a/packages/core/src/common/initializable-state/create.ts +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { Runnable } from "@k8slens/run-many"; -import type { DiContainerForInjection, Injectable, InjectionToken } from "@ogre-tools/injectable"; -import { getInjectionToken, getInjectable } from "@ogre-tools/injectable"; -import assert from "assert"; - -export interface Initializable { - readonly rootId: string; - readonly stateToken: InjectionToken; -} - -export const getInitializable = (rootId: string): Initializable => ({ - rootId, - stateToken: getInjectionToken({ - id: `${rootId}-state-token`, - }), -}); - -type InitState = { set: true; value: T } | { set: false }; - -export type ImplInitializableInjectionTokensArgs = { - token: Initializable; - init: (di: DiContainerForInjection) => T | Promise; -} & ( - | { - phase: InjectionToken, void>; - runAfter?: Injectable, Runnable, void>[]; - } - | { - runAfter: Injectable, Runnable, void>; - phase?: undefined; - } -); - -export const getInjectablesForInitializable = ({ - init, - token: { - rootId, - stateToken, - }, - ...rest -}: ImplInitializableInjectionTokensArgs) => { - let state: InitState = { set: false }; - - const stateInjectable = getInjectable({ - id: `${rootId}-state`, - instantiate: () => { - assert(state.set, `Tried to inject "${rootId}" before initialization was complete`); - - return state.value; - }, - injectionToken: stateToken, - }); - const initializationInjectable = getInjectable({ - id: `${rootId}-initialization`, - instantiate: (di) => ({ - run: async () => { - state = { - set: true, - value: await init(di), - }; - }, - runAfter: rest.runAfter, - }), - injectionToken: (() => { - if (rest.runAfter && !Array.isArray(rest.runAfter)) { - return rest.runAfter.injectionToken; - } - - return rest.phase; - })(), - }); - - return { - stateInjectable, - initializationInjectable, - }; -}; diff --git a/packages/core/src/common/ipc/broadcast-message.global-override-for-injectable.ts b/packages/core/src/common/ipc/broadcast-message.global-override-for-injectable.ts deleted file mode 100644 index 519d0761ed..0000000000 --- a/packages/core/src/common/ipc/broadcast-message.global-override-for-injectable.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverrideForFunction } from "@k8slens/test-utils"; -import broadcastMessageInjectable from "./broadcast-message.injectable"; - -export default getGlobalOverrideForFunction(broadcastMessageInjectable); diff --git a/packages/core/src/common/ipc/broadcast-message.injectable.ts b/packages/core/src/common/ipc/broadcast-message.injectable.ts deleted file mode 100644 index 41db749d65..0000000000 --- a/packages/core/src/common/ipc/broadcast-message.injectable.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { broadcastMessage } from "./ipc"; - -export type BroadcastMessage = (channel: string, ...args: any[]) => Promise; - -const broadcastMessageInjectable = getInjectable({ - id: "broadcast-message", - instantiate: (): BroadcastMessage => broadcastMessage, - causesSideEffects: true, -}); - -export default broadcastMessageInjectable; diff --git a/packages/core/src/common/ipc/catalog.ts b/packages/core/src/common/ipc/catalog.ts deleted file mode 100644 index 3d316d211c..0000000000 --- a/packages/core/src/common/ipc/catalog.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -/** - * This is used to activate a specific entity in the renderer main frame - */ -export const catalogEntityRunListener = "catalog-entity:run"; - -/** - * This is broadcast on whenever there is an update to any catalog item - */ -export const catalogItemsChannel = "catalog:items"; - -/** - * This can be sent from renderer to main to initialize a broadcast of ITEMS - */ -export const catalogInitChannel = "catalog:init"; diff --git a/packages/core/src/common/ipc/cluster.ts b/packages/core/src/common/ipc/cluster.ts deleted file mode 100644 index fa637a190a..0000000000 --- a/packages/core/src/common/ipc/cluster.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export const clusterSetFrameIdHandler = "cluster:set-frame-id"; -export const clusterVisibilityHandler = "cluster:visibility"; -export const clusterStates = "cluster:states"; - -/** - * This channel is broadcast on whenever the cluster fails to list namespaces - * during a refresh and no `accessibleNamespaces` have been set. - */ -export const clusterListNamespaceForbiddenChannel = "cluster:list-namespace-forbidden"; - -export type ListNamespaceForbiddenArgs = [clusterId: string]; - -export function isListNamespaceForbiddenArgs(args: unknown[]): args is ListNamespaceForbiddenArgs { - return args.length === 1 && typeof args[0] === "string"; -} diff --git a/packages/core/src/common/ipc/extension-handling.ts b/packages/core/src/common/ipc/extension-handling.ts deleted file mode 100644 index 1474a6d18d..0000000000 --- a/packages/core/src/common/ipc/extension-handling.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export const extensionDiscoveryStateChannel = "extension-discovery:state"; -export const bundledExtensionsLoaded = "extension-loader:bundled-extensions-loaded"; -export const extensionLoaderFromMainChannel = "extension-loader:main:state"; -export const extensionLoaderFromRendererChannel = "extension-loader:renderer:state"; diff --git a/packages/core/src/common/ipc/hotbar.ts b/packages/core/src/common/ipc/hotbar.ts deleted file mode 100644 index 3617ebd6c5..0000000000 --- a/packages/core/src/common/ipc/hotbar.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export const hotbarTooManyItemsChannel = "hotbar:too-many-items"; diff --git a/packages/core/src/common/ipc/index.ts b/packages/core/src/common/ipc/index.ts deleted file mode 100644 index aa2a538560..0000000000 --- a/packages/core/src/common/ipc/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export * from "./ipc"; -export * from "./invalid-kubeconfig"; diff --git a/packages/core/src/common/ipc/invalid-kubeconfig/index.ts b/packages/core/src/common/ipc/invalid-kubeconfig/index.ts deleted file mode 100644 index 04ebcb9a4a..0000000000 --- a/packages/core/src/common/ipc/invalid-kubeconfig/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export const InvalidKubeconfigChannel = "invalid-kubeconfig"; - -export type InvalidKubeConfigArgs = [clusterId: string]; diff --git a/packages/core/src/common/ipc/ipc-main-injection-token.ts b/packages/core/src/common/ipc/ipc-main-injection-token.ts deleted file mode 100644 index 932c700c97..0000000000 --- a/packages/core/src/common/ipc/ipc-main-injection-token.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectionToken } from "@ogre-tools/injectable"; -import type { IpcMain } from "electron"; - -const ipcMainInjectionToken = getInjectionToken({ - id: "ipc-main-injection-token", -}); - -export default ipcMainInjectionToken; diff --git a/packages/core/src/common/ipc/ipc.ts b/packages/core/src/common/ipc/ipc.ts deleted file mode 100644 index 10a5fb33fc..0000000000 --- a/packages/core/src/common/ipc/ipc.ts +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -// Inter-process communications (main <-> renderer) -// https://www.electronjs.org/docs/api/ipc-main -// https://www.electronjs.org/docs/api/ipc-renderer - -import { ipcMain, ipcRenderer, webContents } from "electron"; -import { toJS } from "../utils/toJS"; -import type { Disposer } from "@k8slens/utilities"; -import { getLegacyGlobalDiForExtensionApi } from "@k8slens/legacy-global-di"; -import ipcRendererInjectable from "../../renderer/utils/channel/ipc-renderer.injectable"; -import { loggerInjectionToken } from "@k8slens/logger"; -import ipcMainInjectionToken from "./ipc-main-injection-token"; -import clusterFramesInjectable from "../cluster-frames.injectable"; - -export const broadcastMainChannel = "ipc:broadcast-main"; - -export function ipcMainHandle(channel: string, listener: (event: Electron.IpcMainInvokeEvent, ...args: any[]) => any) { - const di = getLegacyGlobalDiForExtensionApi(); - - const ipcMain = di.inject(ipcMainInjectionToken); - - ipcMain.handle(channel, async (event, ...args) => { - return sanitizePayload(await listener(event, ...args)); - }); -} - -export async function broadcastMessage(channel: string, ...args: any[]): Promise { - if (ipcRenderer) { - return ipcRenderer.invoke(broadcastMainChannel, channel, ...args.map(sanitizePayload)); - } - - if (!webContents) { - return; - } - - const di = getLegacyGlobalDiForExtensionApi(); - const logger = di.inject(loggerInjectionToken); - const clusterFrames = di.inject(clusterFramesInjectable); - - ipcMain.listeners(channel).forEach((func) => func({ - processId: undefined, frameId: undefined, sender: undefined, senderFrame: undefined, - }, ...args)); - - const views = webContents.getAllWebContents(); - - if (!views || !Array.isArray(views) || views.length === 0) return; - - args = args.map(sanitizePayload); - - for (const view of views) { - let viewType = "unknown"; - - // There will be a uncaught exception if the view is destroyed. - try { - viewType = view.getType(); - } catch { - // We can ignore the view destroyed exception as viewType is only used for logging. - } - - // Send message to views. - try { - logger.silly(`[IPC]: broadcasting "${channel}" to ${viewType}=${view.id}`, { args }); - view.send(channel, ...args); - } catch (error) { - logger.error(`[IPC]: failed to send IPC message "${channel}" to view "${viewType}=${view.id}"`, { error }); - } - - // Send message to subFrames of views. - for (const frameInfo of clusterFrames.values()) { - logger.silly(`[IPC]: broadcasting "${channel}" to subframe "frameInfo.processId"=${frameInfo.processId} "frameInfo.frameId"=${frameInfo.frameId}`, { args }); - - try { - view.sendToFrame([frameInfo.processId, frameInfo.frameId], channel, ...args); - } catch (error) { - logger.error(`[IPC]: failed to send IPC message "${channel}" to view "${viewType}=${view.id}"'s subframe "frameInfo.processId"=${frameInfo.processId} "frameInfo.frameId"=${frameInfo.frameId}`, { error: String(error) }); - } - } - } -} - -export function ipcMainOn(channel: string, listener: (event: Electron.IpcMainEvent, ...args: any[]) => any): Disposer { - const di = getLegacyGlobalDiForExtensionApi(); - - const ipcMain = di.inject(ipcMainInjectionToken); - - ipcMain.on(channel, listener); - - return () => ipcMain.off(channel, listener); -} - -export function ipcRendererOn(channel: string, listener: (event: Electron.IpcRendererEvent, ...args: any[]) => any): Disposer { - const di = getLegacyGlobalDiForExtensionApi(); - - const ipcRenderer = di.inject(ipcRendererInjectable); - - ipcRenderer.on(channel, listener); - - return () => ipcRenderer.off(channel, listener); -} - -/** - * Sanitizing data for IPC-messaging before send. - * Removes possible observable values to avoid exceptions like "can't clone object". - */ -function sanitizePayload(data: any): T { - return toJS(data); -} diff --git a/packages/core/src/common/ipc/navigation-events.ts b/packages/core/src/common/ipc/navigation-events.ts deleted file mode 100644 index 452d16af9b..0000000000 --- a/packages/core/src/common/ipc/navigation-events.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -// -export const enum IpcRendererNavigationEvents { - NAVIGATE_IN_APP = "renderer:navigate", - NAVIGATE_IN_CLUSTER = "renderer:navigate-in-cluster", - LOADED = "renderer:loaded", -} diff --git a/packages/core/src/common/ipc/window.ts b/packages/core/src/common/ipc/window.ts deleted file mode 100644 index 23a83177c6..0000000000 --- a/packages/core/src/common/ipc/window.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export const windowActionHandleChannel = "window:window-action"; -export const windowOpenAppMenuAsContextMenuChannel = "window:open-app-context-menu"; -export const windowLocationChangedChannel = "window:location-changed"; - -/** - * The supported actions on the current window. The argument for `windowActionHandleChannel` - */ -export enum WindowAction { - /** - * Request that the current window goes back one step of browser history - */ - GO_BACK = "back", - - /** - * Request that the current window goes forward one step of browser history - */ - GO_FORWARD = "forward", - - /** - * Request that the current window is minimized - */ - MINIMIZE = "minimize", - - /** - * Request that the current window is maximized if it isn't, or unmaximized - * if it is - */ - TOGGLE_MAXIMIZE = "toggle-maximize", - - /** - * Request that the current window is closed - */ - CLOSE = "close", -} diff --git a/packages/core/src/common/item.store.ts b/packages/core/src/common/item.store.ts deleted file mode 100644 index cb9b27ed2e..0000000000 --- a/packages/core/src/common/item.store.ts +++ /dev/null @@ -1,212 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { ItemObject } from "@k8slens/list-layout"; -import autoBind from "auto-bind"; -import orderBy from "lodash/orderBy"; -import { action, computed, observable, when, makeObservable } from "mobx"; - - -export abstract class ItemStore { - protected defaultSorting = (item: Item) => item.getName(); - - @observable failedLoading = false; - @observable isLoading = false; - @observable isLoaded = false; - @observable items = observable.array([], { deep: false }); - @observable selectedItemsIds = observable.set(); - - constructor() { - makeObservable(this); - autoBind(this); - } - - @computed get selectedItems(): Item[] { - return this.pickOnlySelected(this.items); - } - - public pickOnlySelected(items: Item[]): Item[] { - return items.filter(item => this.selectedItemsIds.has(item.getId())); - } - - public getItems(): Item[] { - return Array.from(this.items); - } - - public getTotalCount(): number { - return this.items.length; - } - - getByName(name: string): Item | undefined { - return this.items.find(item => item.getName() === name); - } - - getIndexById(id: string): number { - return this.items.findIndex(item => item.getId() === id); - } - - /** - * Return `items` sorted by the given ordering functions. If two elements of - * `items` are sorted to the same "index" then the next sorting function is used - * to determine where to place them relative to each other. Once the `sorting` - * functions have been all exhausted then the order is unchanged (ie a stable sort). - * @param items the items to be sorted (default: the current items in this store) - * @param sorting list of functions to determine sort order (default: sorting by name) - * @param order whether to sort from least to greatest (`"asc"` (default)) or vice-versa (`"desc"`) - */ - @action - protected sortItems(items: Item[] = this.items, sorting: ((item: Item) => any)[] = [this.defaultSorting], order?: "asc" | "desc"): Item[] { - return orderBy(items, sorting, order); - } - - protected async createItem(...args: any[]): Promise; - @action - protected async createItem(request: () => Promise) { - const newItem = await request(); - const item = this.items.find(item => item.getId() === newItem.getId()); - - if (item) { - return item; - } else { - const items = this.sortItems([...this.items, newItem]); - - this.items.replace(items); - - return newItem; - } - } - - protected async loadItems(...args: any[]): Promise; - /** - * Load items to this.items - * @param request Function to return the items to be loaded. - * @param sortItems If true, items will be sorted. - * @param concurrency If true, concurrent loadItems() calls will all be executed. If false, only the first. - * @returns - */ - @action - protected async loadItems(request: () => Promise, sortItems = true, concurrency = false) { - if (this.isLoading) { - await when(() => !this.isLoading); - - // If concurrency for loading is disabled, return instead of loading - if (!concurrency) { - return; - } - } - this.isLoading = true; - - try { - let items = await request(); - - if (sortItems) items = this.sortItems(items); - this.items.replace(items); - this.isLoaded = true; - } finally { - this.isLoading = false; - } - } - - @action - protected async loadItem(request: () => Promise, sortItems = true) { - const item = await Promise.resolve(request()).catch(() => null); - - if (item) { - const existingItem = this.items.find(el => el.getId() === item.getId()); - - if (existingItem) { - const index = this.items.findIndex(item => item === existingItem); - - this.items.splice(index, 1, item); - } else { - let items = [...this.items, item]; - - if (sortItems) items = this.sortItems(items); - this.items.replace(items); - } - } - - return item; - } - - @action - protected async updateItem(item: Item, request: () => Promise) { - const updatedItem = await request(); - const index = this.items.findIndex(i => i.getId() === item.getId()); - - this.items.splice(index, 1, updatedItem); - - return updatedItem; - } - - @action - protected async removeItem(item: Item, request: () => Promise) { - await request(); - this.items.remove(item); - this.selectedItemsIds.delete(item.getId()); - } - - isSelected(item: Item) { - return this.selectedItemsIds.has(item.getId()); - } - - @action - select(item: Item) { - this.selectedItemsIds.add(item.getId()); - } - - @action - unselect(item: Item) { - this.selectedItemsIds.delete(item.getId()); - } - - @action - toggleSelection(item: Item) { - if (this.isSelected(item)) { - this.unselect(item); - } else { - this.select(item); - } - } - - @action - toggleSelectionAll(visibleItems: Item[] = this.items) { - const allSelected = visibleItems.every(this.isSelected); - - if (allSelected) { - visibleItems.forEach(this.unselect); - } else { - visibleItems.forEach(this.select); - } - } - - isSelectedAll(visibleItems: Item[] = this.items) { - if (!visibleItems.length) return false; - - return visibleItems.every(this.isSelected); - } - - @action - resetSelection() { - this.selectedItemsIds.clear(); - } - - @action - reset() { - this.resetSelection(); - this.items.clear(); - this.selectedItemsIds.clear(); - this.isLoaded = false; - this.isLoading = false; - } - - async removeSelectedItems?(): Promise; - - async removeItems?(items: Item[]): Promise; - - * [Symbol.iterator]() { - yield* this.items; - } -} diff --git a/packages/core/src/common/k8s-api/__tests__/api-manager.test.ts b/packages/core/src/common/k8s-api/__tests__/api-manager.test.ts deleted file mode 100644 index e71603591e..0000000000 --- a/packages/core/src/common/k8s-api/__tests__/api-manager.test.ts +++ /dev/null @@ -1,226 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { DiContainer } from "@ogre-tools/injectable"; -import { getInjectable } from "@ogre-tools/injectable"; -import clusterFrameContextForNamespacedResourcesInjectable from "../../../renderer/cluster-frame-context/for-namespaced-resources.injectable"; -import hostedClusterInjectable from "../../../renderer/cluster-frame-context/hosted-cluster.injectable"; -import { getDiForUnitTesting } from "../../../renderer/getDiForUnitTesting"; -import storesAndApisCanBeCreatedInjectable from "../../../renderer/stores-apis-can-be-created.injectable"; -import directoryForKubeConfigsInjectable from "../../app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable"; -import directoryForUserDataInjectable from "../../app-paths/directory-for-user-data/directory-for-user-data.injectable"; -import { logErrorInjectionToken, loggerInjectionToken, logInfoInjectionToken, logWarningInjectionToken } from "@k8slens/logger"; -import type { ApiManager } from "../api-manager"; -import apiManagerInjectable from "../api-manager/manager.injectable"; -import { KubeApi } from "@k8slens/kube-api"; -import { KubeObject } from "@k8slens/kube-object"; -import { KubeObjectStore } from "../kube-object.store"; - -// eslint-disable-next-line no-restricted-imports -import { KubeApi as ExternalKubeApi } from "../../../extensions/common-api/k8s-api"; -import { Cluster } from "../../cluster/cluster"; -import { runInAction } from "mobx"; -import { customResourceDefinitionApiInjectionToken } from "../api-manager/crd-api-token"; -import assert from "assert"; -import { maybeKubeApiInjectable } from "@k8slens/kube-api-specifics"; - -class TestApi extends KubeApi { - protected checkPreferredVersion() { - return Promise.resolve(); - } -} - -class TestStore extends KubeObjectStore { - -} - -describe("ApiManager", () => { - let apiManager: ApiManager; - let di: DiContainer; - - beforeEach(() => { - di = getDiForUnitTesting(); - - di.override(directoryForUserDataInjectable, () => "/some-user-store-path"); - di.override(directoryForKubeConfigsInjectable, () => "/some-kube-configs"); - di.override(storesAndApisCanBeCreatedInjectable, () => true); - - di.override(hostedClusterInjectable, () => new Cluster({ - contextName: "some-context-name", - id: "some-cluster-id", - kubeConfigPath: "/some-path-to-a-kubeconfig", - })); - - apiManager = di.inject(apiManagerInjectable); - }); - - describe("registerApi", () => { - it("re-register store if apiBase changed", () => { - const apiBase = "api/v1/foo"; - const fallbackApiBase = "/apis/extensions/v1beta1/foo"; - const kubeApi = new TestApi({ - logError: di.inject(logErrorInjectionToken), - logInfo: di.inject(logInfoInjectionToken), - logWarn: di.inject(logWarningInjectionToken), - maybeKubeApi: di.inject(maybeKubeApiInjectable), - }, { - objectConstructor: KubeObject, - apiBase, - kind: "foo", - fallbackApiBases: [fallbackApiBase], - checkPreferredVersion: true, - }); - const kubeStore = new TestStore({ - context: di.inject(clusterFrameContextForNamespacedResourcesInjectable), - logger: di.inject(loggerInjectionToken), - }, kubeApi); - - apiManager.registerApi(kubeApi); - - // Define to use test api for ingress store - Object.defineProperty(kubeStore, "api", { value: kubeApi }); - apiManager.registerStore(kubeStore); - - // Test that store is returned with original apiBase - expect(apiManager.getStore(kubeApi)).toBe(kubeStore); - - // Change apiBase similar as checkPreferredVersion does - Object.defineProperty(kubeApi, "apiBase", { value: fallbackApiBase }); - apiManager.registerApi(kubeApi); - - // Test that store is returned with new apiBase - expect(apiManager.getStore(kubeApi)).toBe(kubeStore); - }); - }); - - describe("technical tests for autorun", () => { - it("given two extensions register apis with the same apibase, settle into using the second", () => { - const apiBase = "/apis/aquasecurity.github.io/v1alpha1/vulnerabilityreports"; - const firstApi = Object.assign(new ExternalKubeApi({ - objectConstructor: KubeObject, - apiBase, - kind: "VulnerabilityReport", - }), { - myField: 1, - }); - const secondApi = Object.assign(new ExternalKubeApi({ - objectConstructor: KubeObject, - apiBase, - kind: "VulnerabilityReport", - }), { - myField: 2, - }); - - void firstApi; - void secondApi; - - expect(apiManager.getApi(apiBase)).toMatchObject({ - myField: 2, - }); - }); - }); - - describe("given than a CRD has a default KubeApi registered for it", () => { - const apiBase = "/apis/aquasecurity.github.io/v1alpha1/vulnerabilityreports"; - - beforeEach(() => { - runInAction(() => { - di.register(getInjectable({ - id: `default-kube-api-for-custom-resource-definition-${apiBase}`, - instantiate: (di) => { - const objectConstructor = class extends KubeObject { - static readonly kind = "VulnerabilityReport"; - static readonly namespaced = true; - static readonly apiBase = apiBase; - }; - - return Object.assign( - new KubeApi({ - logError: di.inject(logErrorInjectionToken), - logInfo: di.inject(logInfoInjectionToken), - logWarn: di.inject(logWarningInjectionToken), - maybeKubeApi: di.inject(maybeKubeApiInjectable), - }, { objectConstructor }), - { - myField: 1, - }, - ); - }, - injectionToken: customResourceDefinitionApiInjectionToken, - })); - }); - }); - - it("can be retrieved from apiManager", () => { - expect(apiManager.getApi(apiBase)).toMatchObject({ - myField: 1, - }); - }); - - it("can have a default KubeObjectStore instance retrieved for it", () => { - expect(apiManager.getStore(apiBase)).toBeInstanceOf(KubeObjectStore); - }); - - describe("given that an extension registers an api with the same apibase", () => { - beforeEach(() => { - void Object.assign(new ExternalKubeApi({ - objectConstructor: KubeObject, - apiBase, - kind: "VulnerabilityReport", - }), { - myField: 2, - }); - }); - - it("the extension's instance is retrievable instead from apiManager", () => { - expect(apiManager.getApi(apiBase)).toMatchObject({ - myField: 2, - }); - }); - - it("can have a default KubeObjectStore instance retrieved for it", () => { - expect(apiManager.getStore(apiBase)).toBeInstanceOf(KubeObjectStore); - }); - - describe("given that an extension registers a store for the same apibase", () => { - beforeEach(() => { - const api = apiManager.getApi(apiBase); - - assert(api); - - apiManager.registerStore(Object.assign( - new KubeObjectStore({ - context: di.inject(clusterFrameContextForNamespacedResourcesInjectable), - logger: di.inject(loggerInjectionToken), - }, api), - { - someField: 2, - }, - )); - }); - - it("can gets the custom KubeObjectStore instance instead", () => { - expect(apiManager.getStore(apiBase)).toMatchObject({ - someField: 2, - }); - }); - }); - }); - }); -}); - -describe("ApiManger without storesAndApisCanBeCreated", () => { - let di: DiContainer; - - beforeEach(() => { - di = getDiForUnitTesting(); - - di.override(storesAndApisCanBeCreatedInjectable, () => false); - }); - - it("should not throw when creating apiManager", () => { - di.inject(apiManagerInjectable); - }); -}); diff --git a/packages/core/src/common/k8s-api/__tests__/crd.test.ts b/packages/core/src/common/k8s-api/__tests__/crd.test.ts deleted file mode 100644 index 0942e637c0..0000000000 --- a/packages/core/src/common/k8s-api/__tests__/crd.test.ts +++ /dev/null @@ -1,177 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { CustomResourceDefinitionSpec } from "@k8slens/kube-object"; -import { CustomResourceDefinition } from "@k8slens/kube-object"; - -describe("Crds", () => { - describe("getVersion()", () => { - it("should throw if none of the versions are served", () => { - const crd = new CustomResourceDefinition({ - apiVersion: "apiextensions.k8s.io/v1", - kind: "CustomResourceDefinition", - metadata: { - name: "foo", - resourceVersion: "12345", - uid: "12345", - selfLink: "/apis/apiextensions.k8s.io/v1/customresourcedefinitions/foo", - }, - spec: { - group: "foo.bar", - names: { - kind: "Foo", - plural: "foos", - }, - scope: "Namespaced", - versions: [ - { - name: "123", - served: false, - storage: false, - }, - { - name: "1234", - served: false, - storage: false, - }, - ], - }, - }); - - expect(() => crd.getVersion()).toThrowError("Failed to find a version for CustomResourceDefinition foo"); - }); - - it("should get the version that is both served and stored", () => { - const crd = new CustomResourceDefinition({ - apiVersion: "apiextensions.k8s.io/v1", - kind: "CustomResourceDefinition", - metadata: { - name: "foo", - resourceVersion: "12345", - uid: "12345", - selfLink: "/apis/apiextensions.k8s.io/v1/customresourcedefinitions/foo", - }, - spec: { - group: "foo.bar", - names: { - kind: "Foo", - plural: "foos", - }, - scope: "Namespaced", - versions: [ - { - name: "123", - served: true, - storage: true, - }, - { - name: "1234", - served: false, - storage: false, - }, - ], - }, - }); - - expect(crd.getVersion()).toBe("123"); - }); - - it("should get the version that is only stored", () => { - const crd = new CustomResourceDefinition({ - apiVersion: "apiextensions.k8s.io/v1", - kind: "CustomResourceDefinition", - metadata: { - name: "foo", - resourceVersion: "12345", - uid: "12345", - selfLink: "/apis/apiextensions.k8s.io/v1/customresourcedefinitions/foo", - }, - spec: { - group: "foo.bar", - names: { - kind: "Foo", - plural: "foos", - }, - scope: "Namespaced", - versions: [ - { - name: "123", - served: false, - storage: true, - }, - { - name: "1234", - served: false, - storage: false, - }, - ], - }, - }); - - expect(crd.getVersion()).toBe("123"); - }); - - it("should get the version that is both served and stored even with version field", () => { - const crd = new CustomResourceDefinition({ - apiVersion: "apiextensions.k8s.io/v1", - kind: "CustomResourceDefinition", - metadata: { - name: "foo", - resourceVersion: "12345", - uid: "12345", - selfLink: "/apis/apiextensions.k8s.io/v1/customresourcedefinitions/foo", - }, - spec: { - group: "foo.bar", - names: { - kind: "Foo", - plural: "foos", - }, - scope: "Namespaced", - version: "abc", - versions: [ - { - name: "123", - served: true, - storage: true, - }, - { - name: "1234", - served: false, - storage: false, - }, - ], - }, - }); - - expect(crd.getVersion()).toBe("123"); - }); - - it("should get the version name from the version field, ignoring versions on v1beta", () => { - const crd = new CustomResourceDefinition({ - apiVersion: "apiextensions.k8s.io/v1beta1", - kind: "CustomResourceDefinition", - metadata: { - name: "foo", - resourceVersion: "12345", - uid: "12345", - selfLink: "/apis/apiextensions.k8s.io/v1/customresourcedefinitions/foo", - }, - spec: { - version: "abc", - versions: [ - { - name: "foobar", - served: true, - storage: true, - }, - ], - } as CustomResourceDefinitionSpec, - }); - - expect(crd.getVersion()).toBe("abc"); - }); - }); -}); diff --git a/packages/core/src/common/k8s-api/__tests__/endpoint.api.test.ts b/packages/core/src/common/k8s-api/__tests__/endpoint.api.test.ts deleted file mode 100644 index 56144873c5..0000000000 --- a/packages/core/src/common/k8s-api/__tests__/endpoint.api.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { formatEndpointSubset } from "@k8slens/kube-object"; - -describe("endpoint tests", () => { - describe("EndpointSubset", () => { - it("formatEndpointSubset should be addresses X ports", () => { - const formatted = formatEndpointSubset({ - addresses: [{ - ip: "1.1.1.1", - }, { - ip: "1.1.1.2", - }], - notReadyAddresses: [], - ports: [{ - port: 81, - }, { - port: 82, - }], - }); - - expect(formatted).toBe("1.1.1.1:81, 1.1.1.1:82, 1.1.1.2:81, 1.1.1.2:82"); - }); - }); -}); diff --git a/packages/core/src/common/k8s-api/__tests__/helm-charts.api.test.ts b/packages/core/src/common/k8s-api/__tests__/helm-charts.api.test.ts deleted file mode 100644 index e7a4cb9439..0000000000 --- a/packages/core/src/common/k8s-api/__tests__/helm-charts.api.test.ts +++ /dev/null @@ -1,275 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { anyObject } from "jest-mock-extended"; -import { HelmChart } from "../endpoints/helm-charts.api"; - -describe("HelmChart tests", () => { - describe("HelmChart.create() tests", () => { - it("should throw on non-object input", () => { - expect(() => HelmChart.create("" as never)).toThrowError('"value" must be of type object'); - expect(() => HelmChart.create(1 as never)).toThrowError('"value" must be of type object'); - expect(() => HelmChart.create(false as never)).toThrowError('"value" must be of type object'); - expect(() => HelmChart.create([] as never)).toThrowError('"value" must be of type object'); - expect(() => HelmChart.create(Symbol() as never)).toThrowError('"value" must be of type object'); - }); - - it("should throw on missing fields", () => { - expect(() => HelmChart.create({} as never)).toThrowError('"apiVersion" is required'); - expect(() => HelmChart.create({ - apiVersion: "!", - } as never)).toThrowError('"name" is required'); - expect(() => HelmChart.create({ - apiVersion: "!", - name: "!", - } as never)).toThrowError('"version" is required'); - expect(() => HelmChart.create({ - apiVersion: "!", - name: "!", - version: "!", - } as never)).toThrowError('"repo" is required'); - expect(() => HelmChart.create({ - apiVersion: "!", - name: "!", - version: "!", - repo: "!", - } as never)).toThrowError('"created" is required'); - }); - - it("should throw on fields being wrong type", () => { - expect(() => HelmChart.create({ - apiVersion: 1, - name: "!", - version: "!", - repo: "!", - created: "!", - digest: "!", - } as never)).toThrowError('"apiVersion" must be a string'); - expect(() => HelmChart.create({ - apiVersion: "1", - name: 1, - version: "!", - repo: "!", - created: "!", - digest: "!", - } as never)).toThrowError('"name" must be a string'); - expect(() => HelmChart.create({ - apiVersion: "!", - name: "!", - version: "!", - repo: "!", - created: "!", - digest: 1, - } as never)).toThrowError('"digest" must be a string'); - expect(() => HelmChart.create({ - apiVersion: "1", - name: "", - version: 1, - repo: "!", - created: "!", - digest: "!", - } as never)).toThrowError('"version" must be a string'); - expect(() => HelmChart.create({ - apiVersion: "1", - name: "1", - version: "1", - repo: 1, - created: "!", - digest: "!", - } as never)).toThrowError('"repo" must be a string'); - expect(() => HelmChart.create({ - apiVersion: "1", - name: "1", - version: "1", - repo: "1", - created: 1, - digest: "a", - } as never)).toThrowError('"created" must be a string'); - expect(() => HelmChart.create({ - apiVersion: "1", - name: "1", - version: "1", - repo: "1", - created: "!", - digest: 1, - } as never)).toThrowError('"digest" must be a string'); - expect(() => HelmChart.create({ - apiVersion: "1", - name: "1", - version: "1", - repo: "1", - digest: "1", - created: "!", - kubeVersion: 1, - } as never)).toThrowError('"kubeVersion" must be a string'); - expect(() => HelmChart.create({ - apiVersion: "1", - name: "1", - version: "1", - repo: "1", - digest: "1", - created: "!", - description: 1, - } as never)).toThrowError('"description" must be a string'); - expect(() => HelmChart.create({ - apiVersion: "1", - name: "1", - version: "1", - repo: "1", - digest: "1", - created: "!", - home: 1, - } as never)).toThrowError('"home" must be a string'); - expect(() => HelmChart.create({ - apiVersion: "1", - name: "1", - version: "1", - repo: "1", - digest: "1", - created: "!", - engine: 1, - } as never)).toThrowError('"engine" must be a string'); - expect(() => HelmChart.create({ - apiVersion: "1", - name: "1", - version: "1", - repo: "1", - digest: "1", - created: "!", - icon: 1, - } as never)).toThrowError('"icon" must be a string'); - expect(() => HelmChart.create({ - apiVersion: "1", - name: "1", - version: "1", - repo: "1", - digest: "1", - created: "!", - appVersion: 1, - } as never)).toThrowError('"appVersion" must be a string'); - expect(() => HelmChart.create({ - apiVersion: "1", - name: "1", - version: "1", - repo: "1", - digest: "1", - created: "!", - tillerVersion: 1, - } as never)).toThrowError('"tillerVersion" must be a string'); - expect(() => HelmChart.create({ - apiVersion: "1", - name: "1", - version: "1", - repo: "1", - digest: "1", - created: "!", - deprecated: 1, - } as never)).toThrowError('"deprecated" must be a boolean'); - expect(() => HelmChart.create({ - apiVersion: "1", - name: "1", - version: "1", - repo: "1", - digest: "1", - created: "!", - keywords: 1, - } as never)).toThrowError('"keywords" must be an array'); - expect(() => HelmChart.create({ - apiVersion: "1", - name: "1", - version: "1", - repo: "1", - digest: "1", - created: "!", - sources: 1, - } as never)).toThrowError('"sources" must be an array'); - expect(() => HelmChart.create({ - apiVersion: "1", - name: "1", - version: "1", - repo: "1", - digest: "1", - created: "!", - maintainers: 1, - } as never)).toThrowError('"maintainers" must be an array'); - }); - - it("should filter non-string keywords", () => { - const chart = HelmChart.create({ - apiVersion: "1", - name: "1", - version: "1", - repo: "1", - digest: "1", - created: "!", - keywords: [1, "a", false, {}, "b"] as never, - }); - - expect(chart?.keywords).toStrictEqual(["a", "b"]); - }); - - it("should filter non-string sources", () => { - const chart = HelmChart.create({ - apiVersion: "1", - name: "1", - version: "1", - repo: "1", - digest: "1", - created: "!", - sources: [1, "a", false, {}, "b"] as never, - }); - - expect(chart?.sources).toStrictEqual(["a", "b"]); - }); - - it("should filter invalid maintainers", () => { - const chart = HelmChart.create({ - apiVersion: "1", - name: "1", - version: "1", - repo: "1", - digest: "1", - created: "!", - maintainers: [{ - name: "a", - email: "b", - url: "c", - }] as never, - }); - - expect(chart?.maintainers).toStrictEqual([{ - name: "a", - email: "b", - url: "c", - }]); - }); - - it("should warn on unknown fields", () => { - const { warn } = console; - const warnFn = console.warn = jest.fn(); - - HelmChart.create({ - apiVersion: "1", - name: "1", - version: "1", - repo: "1", - digest: "1", - created: "!", - maintainers: [{ - name: "a", - email: "b", - url: "c", - }] as never, - "asdjhajksdhadjks": 1, - } as never); - - expect(warnFn).toHaveBeenCalledWith("HelmChart data has unexpected fields", { - original: anyObject(), - unknownFields: ["asdjhajksdhadjks"], - }); - console.warn = warn; - }); - }); -}); diff --git a/packages/core/src/common/k8s-api/__tests__/ingress.api.test.ts b/packages/core/src/common/k8s-api/__tests__/ingress.api.test.ts deleted file mode 100644 index 96c2dfce7a..0000000000 --- a/packages/core/src/common/k8s-api/__tests__/ingress.api.test.ts +++ /dev/null @@ -1,164 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { computeRuleDeclarations, Ingress } from "@k8slens/kube-object"; - -describe("Ingress", () => { - it("given no loadbalancer ingresses in status property, loadbalancers should be an empty array", () => { - const ingress = new Ingress({ - apiVersion: "networking.k8s.io/v1", - kind: "Ingress", - metadata: { - name: "foo", - resourceVersion: "1", - uid: "bar", - namespace: "default", - selfLink: "/apis/networking.k8s.io/v1/ingresses/default/foo", - }, - status: { - loadBalancer: {}, - }, - }); - - expect(ingress.getLoadBalancers()).toEqual([]); - }); - - it("given loadbalancer ingresses in status property, loadbalancers should be flat array of ip adresses and hostnames", () => { - const ingress = new Ingress({ - apiVersion: "networking.k8s.io/v1", - kind: "Ingress", - metadata: { - name: "foo", - resourceVersion: "1", - uid: "bar", - namespace: "default", - selfLink: "/apis/networking.k8s.io/v1/ingresses/default/foo", - }, - status: { - loadBalancer: { - ingress: [{ - ip: "10.0.0.27", - }, - { - hostname: "localhost", - }], - }, - }, - }); - - expect(ingress.getLoadBalancers()).toEqual(["10.0.0.27", "localhost"]); - }); -}); - -describe("computeRuleDeclarations", () => { - it("given no tls field, should format links as http://", () => { - const ingress = new Ingress({ - apiVersion: "networking.k8s.io/v1", - kind: "Ingress", - metadata: { - name: "foo", - resourceVersion: "1", - uid: "bar", - namespace: "default", - selfLink: "/apis/networking.k8s.io/v1/ingresses/default/foo", - }, - }); - - const result = computeRuleDeclarations(ingress, { - host: "foo.bar", - http: { - paths: [{ - pathType: "Exact", - backend: { - service: { - name: "my-service", - port: { - number: 8080, - }, - }, - }, - }], - }, - }); - - expect(result[0].url).toBe("http://foo.bar/"); - }); - - it("given no tls entries, should format links as http://", () => { - const ingress = new Ingress({ - apiVersion: "networking.k8s.io/v1", - kind: "Ingress", - metadata: { - name: "foo", - resourceVersion: "1", - uid: "bar", - namespace: "default", - selfLink: "/apis/networking.k8s.io/v1/ingresses/default/foo", - }, - }); - - ingress.spec = { - tls: [], - }; - - const result = computeRuleDeclarations(ingress, { - host: "foo.bar", - http: { - paths: [{ - pathType: "Exact", - backend: { - service: { - name: "my-service", - port: { - number: 8080, - }, - }, - }, - }], - }, - }); - - expect(result[0].url).toBe("http://foo.bar/"); - }); - - it("given some tls entries, should format links as https://", () => { - const ingress = new Ingress({ - apiVersion: "networking.k8s.io/v1", - kind: "Ingress", - metadata: { - name: "foo", - resourceVersion: "1", - uid: "bar", - namespace: "default", - selfLink: "/apis/networking.k8s.io/v1/ingresses/default/foo", - }, - }); - - ingress.spec = { - tls: [{ - secretName: "my-secret", - }], - }; - - const result = computeRuleDeclarations(ingress, { - host: "foo.bar", - http: { - paths: [{ - pathType: "Exact", - backend: { - service: { - name: "my-service", - port: { - number: 8080, - }, - }, - }, - }], - }, - }); - - expect(result[0].url).toBe("https://foo.bar/"); - }); -}); diff --git a/packages/core/src/common/k8s-api/__tests__/kube-api-version-detection.test.ts b/packages/core/src/common/k8s-api/__tests__/kube-api-version-detection.test.ts deleted file mode 100644 index 7bc404f79d..0000000000 --- a/packages/core/src/common/k8s-api/__tests__/kube-api-version-detection.test.ts +++ /dev/null @@ -1,829 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { ApiManager } from "../api-manager"; -import type { IngressApi } from "@k8slens/kube-api"; -import { HorizontalPodAutoscalerApi } from "@k8slens/kube-api"; -import { Ingress } from "@k8slens/kube-object"; -import { getDiForUnitTesting } from "../../../renderer/getDiForUnitTesting"; -import type { Fetch } from "../../fetch/fetch.injectable"; -import fetchInjectable from "../../fetch/fetch.injectable"; -import type { AsyncFnMock } from "@async-fn/jest"; -import asyncFn from "@async-fn/jest"; -import { flushPromises } from "@k8slens/test-utils"; -import setupAutoRegistrationInjectable from "../../../renderer/before-frame-starts/runnables/setup-auto-registration.injectable"; -import { createMockResponseFromString } from "../../../test-utils/mock-responses"; -import storesAndApisCanBeCreatedInjectable from "../../../renderer/stores-apis-can-be-created.injectable"; -import directoryForUserDataInjectable from "../../app-paths/directory-for-user-data/directory-for-user-data.injectable"; -import hostedClusterInjectable from "../../../renderer/cluster-frame-context/hosted-cluster.injectable"; -import directoryForKubeConfigsInjectable from "../../app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable"; -import apiManagerInjectable from "../api-manager/manager.injectable"; -import type { DiContainer } from "@ogre-tools/injectable"; -import { ingressApiInjectable, maybeKubeApiInjectable } from "@k8slens/kube-api-specifics"; -import { logErrorInjectionToken, logInfoInjectionToken, logWarningInjectionToken } from "@k8slens/logger"; -import { Cluster } from "../../cluster/cluster"; - -describe("KubeApi", () => { - let fetchMock: AsyncFnMock; - let apiManager: ApiManager; - let di: DiContainer; - - beforeEach(async () => { - di = getDiForUnitTesting(); - - fetchMock = asyncFn(); - di.override(fetchInjectable, () => fetchMock); - - di.override(directoryForUserDataInjectable, () => "/some-user-store-path"); - di.override(directoryForKubeConfigsInjectable, () => "/some-kube-configs"); - di.override(storesAndApisCanBeCreatedInjectable, () => true); - - di.override(hostedClusterInjectable, () => new Cluster({ - contextName: "some-context-name", - id: "some-cluster-id", - kubeConfigPath: "/some-path-to-a-kubeconfig", - })); - - apiManager = di.inject(apiManagerInjectable); - - const setupAutoRegistration = di.inject(setupAutoRegistrationInjectable); - - setupAutoRegistration.run(); - }); - - describe("on first call to IngressApi.get()", () => { - let ingressApi: IngressApi; - let getCall: Promise; - - beforeEach(async () => { - ingressApi = di.inject(ingressApiInjectable); - getCall = ingressApi.get({ - name: "foo", - namespace: "default", - }); - - // This is needed because of how JS promises work - await flushPromises(); - }); - - it("requests version list from the api group from the initial apiBase", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "https://127.0.0.1:12345/api-kube/apis/networking.k8s.io", - { - headers: { - "content-type": "application/json", - }, - method: "get", - }, - ]); - }); - - describe("when the version list from the api group resolves", () => { - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/networking.k8s.io"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/networking.k8s.io", JSON.stringify({ - apiVersion: "v1", - kind: "APIGroup", - name: "networking.k8s.io", - versions: [ - { - groupVersion: "networking.k8s.io/v1", - version: "v1", - }, - { - groupVersion: "networking.k8s.io/v1beta1", - version: "v1beta1", - }, - ], - preferredVersion: { - groupVersion: "networking.k8s.io/v1", - version: "v1", - }, - })), - ); - }); - - it("requests resources from the versioned api group from the initial apiBase", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1", - { - headers: { - "content-type": "application/json", - }, - method: "get", - }, - ]); - }); - - describe("when resource request fulfills with a resource", () => { - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1", JSON.stringify({ - resources: [{ - name: "ingresses", - }], - })), - ); - }); - - it("makes the request to get the resource", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1/namespaces/default/ingresses/foo", - { - headers: { - "content-type": "application/json", - }, - method: "get", - }, - ]); - }); - - it("sets fields in the api instance", () => { - expect(ingressApi).toEqual(expect.objectContaining({ - apiVersionPreferred: "v1", - apiPrefix: "/apis", - apiGroup: "networking.k8s.io", - })); - }); - - it("api is retrievable with the new apiBase", () => { - expect(apiManager.getApi("/apis/networking.k8s.io/v1/ingresses")).toBeDefined(); - }); - - describe("when the request resolves with no data", () => { - let result: Ingress | null; - - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1/namespaces/default/ingresses/foo"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1/namespaces/default/ingresses/foo", JSON.stringify({})), - ); - result = await getCall; - }); - - it("results in the get call resolving to null", () => { - expect(result).toBeNull(); - }); - - describe("on the second call to IngressApi.get()", () => { - let getCall: Promise; - - beforeEach(async () => { - getCall = ingressApi.get({ - name: "foo1", - namespace: "default", - }); - - // This is needed because of how JS promises work - await flushPromises(); - }); - - it("makes the request to get the resource", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1/namespaces/default/ingresses/foo1", - { - headers: { - "content-type": "application/json", - }, - method: "get", - }, - ]); - }); - - describe("when the request resolves with no data", () => { - let result: Ingress | null; - - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1/namespaces/default/ingresses/foo1"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1/namespaces/default/ingresses/foo1", JSON.stringify({})), - ); - result = await getCall; - }); - - it("results in the get call resolving to null", () => { - expect(result).toBeNull(); - }); - }); - }); - }); - - describe("when the request resolves with data", () => { - let result: Ingress | null; - - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1/namespaces/default/ingresses/foo"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1/namespaces/default/ingresses/foo", JSON.stringify({ - apiVersion: "v1", - kind: "Ingress", - metadata: { - name: "foo", - namespace: "default", - resourceVersion: "1", - uid: "12345", - }, - })), - ); - result = await getCall; - }); - - it("results in the get call resolving to an instance", () => { - expect(result).toBeInstanceOf(Ingress); - }); - - describe("on the second call to IngressApi.get()", () => { - let getCall: Promise; - - beforeEach(async () => { - getCall = ingressApi.get({ - name: "foo1", - namespace: "default", - }); - - // This is needed because of how JS promises work - await flushPromises(); - }); - - it("makes the request to get the resource", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1/namespaces/default/ingresses/foo1", - { - headers: { - "content-type": "application/json", - }, - method: "get", - }, - ]); - }); - - describe("when the request resolves with no data", () => { - let result: Ingress | null; - - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1/namespaces/default/ingresses/foo1"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1/namespaces/default/ingresses/foo1", JSON.stringify({})), - ); - result = await getCall; - }); - - it("results in the get call resolving to null", () => { - expect(result).toBeNull(); - }); - }); - }); - }); - }); - - describe("when resource request fulfills with no resource", () => { - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1", JSON.stringify({ - resources: [], - })), - ); - }); - - it("requests resources from the second versioned api group from the initial apiBase", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1beta1", - { - headers: { - "content-type": "application/json", - }, - method: "get", - }, - ]); - }); - - - - describe("when resource request fulfills with a resource", () => { - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1beta1"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1beta1", JSON.stringify({ - resources: [{ - name: "ingresses", - }], - })), - ); - }); - - it("makes the request to get the resource", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1beta1/namespaces/default/ingresses/foo", - { - headers: { - "content-type": "application/json", - }, - method: "get", - }, - ]); - }); - - it("sets fields in the api instance", () => { - expect(ingressApi).toEqual(expect.objectContaining({ - apiVersionPreferred: "v1beta1", - apiPrefix: "/apis", - apiGroup: "networking.k8s.io", - })); - }); - - it("api is retrievable with the new apiBase", () => { - expect(apiManager.getApi("/apis/networking.k8s.io/v1beta1/ingresses")).toBeDefined(); - }); - - it("api is retrievable with the old apiBase", () => { - expect(apiManager.getApi("/apis/networking.k8s.io/v1/ingresses")).toBeDefined(); - }); - - describe("when the request resolves with no data", () => { - let result: Ingress | null; - - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1beta1/namespaces/default/ingresses/foo"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1beta1/namespaces/default/ingresses/foo", JSON.stringify({})), - ); - result = await getCall; - }); - - it("results in the get call resolving to null", () => { - expect(result).toBeNull(); - }); - - describe("on the second call to IngressApi.get()", () => { - let getCall: Promise; - - beforeEach(async () => { - getCall = ingressApi.get({ - name: "foo1", - namespace: "default", - }); - - // This is needed because of how JS promises work - await flushPromises(); - }); - - it("makes the request to get the resource", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1beta1/namespaces/default/ingresses/foo1", - { - headers: { - "content-type": "application/json", - }, - method: "get", - }, - ]); - }); - - describe("when the request resolves with no data", () => { - let result: Ingress | null; - - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1beta1/namespaces/default/ingresses/foo1"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1beta1/namespaces/default/ingresses/foo1", JSON.stringify({})), - ); - result = await getCall; - }); - - it("results in the get call resolving to null", () => { - expect(result).toBeNull(); - }); - }); - }); - }); - - describe("when the request resolves with data", () => { - let result: Ingress | null; - - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1beta1/namespaces/default/ingresses/foo"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1beta1/namespaces/default/ingresses/foo", JSON.stringify({ - apiVersion: "v1", - kind: "Ingress", - metadata: { - name: "foo", - namespace: "default", - resourceVersion: "1", - uid: "12345", - }, - })), - ); - result = await getCall; - }); - - it("results in the get call resolving to an instance", () => { - expect(result).toBeInstanceOf(Ingress); - }); - - describe("on the second call to IngressApi.get()", () => { - let getCall: Promise; - - beforeEach(async () => { - getCall = ingressApi.get({ - name: "foo1", - namespace: "default", - }); - - // This is needed because of how JS promises work - await flushPromises(); - }); - - it("makes the request to get the resource", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1beta1/namespaces/default/ingresses/foo1", - { - headers: { - "content-type": "application/json", - }, - method: "get", - }, - ]); - }); - - describe("when the request resolves with no data", () => { - let result: Ingress | null; - - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1beta1/namespaces/default/ingresses/foo1"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/networking.k8s.io/v1beta1/namespaces/default/ingresses/foo1", JSON.stringify({})), - ); - result = await getCall; - }); - - it("results in the get call resolving to null", () => { - expect(result).toBeNull(); - }); - }); - }); - }); - }); - }); - }); - - describe("when the version list from the api group resolves with no versions", () => { - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/networking.k8s.io"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/networking.k8s.io", JSON.stringify({ - "metadata": {}, - "status": "Failure", - "message": "the server could not find the requested resource", - "reason": "NotFound", - "details": { - "causes": [ - { - "reason": "UnexpectedServerResponse", - "message": "404 page not found", - }, - ], - }, - "code": 404, - }), 404), - ); - }); - - it("requests the resources from the base api url from the fallback api", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "https://127.0.0.1:12345/api-kube/apis/extensions", - { - headers: { - "content-type": "application/json", - }, - method: "get", - }, - ]); - }); - - describe("when resource request fulfills with a resource", () => { - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/extensions"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/extensions", JSON.stringify({ - apiVersion: "v1", - kind: "APIGroup", - name: "extensions", - versions: [ - { - groupVersion: "extensions/v1beta1", - version: "v1beta1", - }, - ], - preferredVersion: { - groupVersion: "extensions/v1beta1", - version: "v1beta1", - }, - })), - ); - }); - - it("requests resource versions from the versioned api group from the fallback apiBase", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "https://127.0.0.1:12345/api-kube/apis/extensions/v1beta1", - { - headers: { - "content-type": "application/json", - }, - method: "get", - }, - ]); - }); - - describe("when the preferred version request resolves to v1beta1", () => { - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/extensions/v1beta1"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/extensions", JSON.stringify({ - resources: [{ - name: "ingresses", - }], - })), - ); - }); - - it("makes the request to get the resource", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "https://127.0.0.1:12345/api-kube/apis/extensions/v1beta1/namespaces/default/ingresses/foo", - { - headers: { - "content-type": "application/json", - }, - method: "get", - }, - ]); - }); - - it("sets fields in the api instance", () => { - expect(ingressApi).toEqual(expect.objectContaining({ - apiVersionPreferred: "v1beta1", - apiPrefix: "/apis", - apiGroup: "extensions", - })); - }); - - it("api is retrievable with the new apiBase", () => { - expect(apiManager.getApi("/apis/extensions/v1beta1/ingresses")).toBeDefined(); - }); - - describe("when the request resolves with no data", () => { - let result: Ingress | null; - - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/extensions/v1beta1/namespaces/default/ingresses/foo"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/extensions/v1beta1/namespaces/default/ingresses/foo", JSON.stringify({})), - ); - result = await getCall; - }); - - it("results in the get call resolving to null", () => { - expect(result).toBeNull(); - }); - - describe("on the second call to IngressApi.get()", () => { - let getCall: Promise; - - beforeEach(async () => { - getCall = ingressApi.get({ - name: "foo1", - namespace: "default", - }); - - // This is needed because of how JS promises work - await flushPromises(); - }); - - it("makes the request to get the resource", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "https://127.0.0.1:12345/api-kube/apis/extensions/v1beta1/namespaces/default/ingresses/foo1", - { - headers: { - "content-type": "application/json", - }, - method: "get", - }, - ]); - }); - - describe("when the request resolves with no data", () => { - let result: Ingress | null; - - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/extensions/v1beta1/namespaces/default/ingresses/foo1"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/extensions/v1beta1/namespaces/default/ingresses/foo1", JSON.stringify({})), - ); - result = await getCall; - }); - - it("results in the get call resolving to null", () => { - expect(result).toBeNull(); - }); - }); - }); - }); - - describe("when the request resolves with data", () => { - let result: Ingress | null; - - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/extensions/v1beta1/namespaces/default/ingresses/foo"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/extensions/v1beta1/namespaces/default/ingresses/foo", JSON.stringify({ - apiVersion: "v1beta1", - kind: "Ingress", - metadata: { - name: "foo", - namespace: "default", - resourceVersion: "1", - uid: "12345", - }, - })), - ); - result = await getCall; - }); - - it("results in the get call resolving to an instance", () => { - expect(result).toBeInstanceOf(Ingress); - }); - - describe("on the second call to IngressApi.get()", () => { - let getCall: Promise; - - beforeEach(async () => { - getCall = ingressApi.get({ - name: "foo1", - namespace: "default", - }); - - // This is needed because of how JS promises work - await flushPromises(); - }); - - it("makes the request to get the resource", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "https://127.0.0.1:12345/api-kube/apis/extensions/v1beta1/namespaces/default/ingresses/foo1", - { - headers: { - "content-type": "application/json", - }, - method: "get", - }, - ]); - }); - - describe("when the request resolves with no data", () => { - let result: Ingress | null; - - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/extensions/v1beta1/namespaces/default/ingresses/foo1"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/extensions/v1beta1/namespaces/default/ingresses/foo1", JSON.stringify({})), - ); - result = await getCall; - }); - - it("results in the get call resolving to null", () => { - expect(result).toBeNull(); - }); - }); - }); - }); - }); - }); - }); - }); - - describe("on first call to HorizontalPodAutoscalerApi.get()", () => { - let horizontalPodAutoscalerApi: HorizontalPodAutoscalerApi; - - beforeEach(async () => { - horizontalPodAutoscalerApi = new HorizontalPodAutoscalerApi({ - logError: di.inject(logErrorInjectionToken), - logInfo: di.inject(logInfoInjectionToken), - logWarn: di.inject(logWarningInjectionToken), - maybeKubeApi: di.inject(maybeKubeApiInjectable), - }, { - allowedUsableVersions: { - autoscaling: [ - "v2", - "v2beta2", - "v2beta1", - "v1", - ], - }, - }); - horizontalPodAutoscalerApi.get({ - name: "foo", - namespace: "default", - }); - - // This is needed because of how JS promises work - await flushPromises(); - }); - - it("requests version list from the api group from the initial apiBase", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "https://127.0.0.1:12345/api-kube/apis/autoscaling", - { - headers: { - "content-type": "application/json", - }, - method: "get", - }, - ]); - }); - - describe("when the version list from the api group resolves with preferredVersion in allowed version", () => { - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/autoscaling"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/autoscaling", JSON.stringify({ - apiVersion: "v1", - kind: "APIGroup", - name: "autoscaling", - versions: [ - { - groupVersion: "autoscaling/v1", - version: "v1", - }, - { - groupVersion: "autoscaling/v1beta1", - version: "v2beta1", - }, - ], - preferredVersion: { - groupVersion: "autoscaling/v1", - version: "v1", - }, - })), - ); - }); - - it("requests resources from the preferred version api group from the initial apiBase", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "https://127.0.0.1:12345/api-kube/apis/autoscaling/v1", - { - headers: { - "content-type": "application/json", - }, - method: "get", - }, - ]); - }); - }); - - describe("when the version list from the api group resolves with preferredVersion not allowed version", () => { - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:12345/api-kube/apis/autoscaling"], - createMockResponseFromString("https://127.0.0.1:12345/api-kube/apis/autoscaling", JSON.stringify({ - apiVersion: "v1", - kind: "APIGroup", - name: "autoscaling", - versions: [ - { - groupVersion: "autoscaling/v2", - version: "v2", - }, - { - groupVersion: "autoscaling/v2beta1", - version: "v2beta1", - }, - { - groupVersion: "autoscaling/v3", - version: "v3", - }, - ], - preferredVersion: { - groupVersion: "autoscaling/v3", - version: "v3", - }, - })), - ); - }); - - it("requests resources from the non preferred version from the initial apiBase", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "https://127.0.0.1:12345/api-kube/apis/autoscaling/v2", - { - headers: { - "content-type": "application/json", - }, - method: "get", - }, - ]); - }); - }); - }); -}); diff --git a/packages/core/src/common/k8s-api/__tests__/kube-api.test.ts b/packages/core/src/common/k8s-api/__tests__/kube-api.test.ts deleted file mode 100644 index 7c81ae3480..0000000000 --- a/packages/core/src/common/k8s-api/__tests__/kube-api.test.ts +++ /dev/null @@ -1,218 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { KubeApi, PodApi } from "@k8slens/kube-api"; -import { Pod } from "@k8slens/kube-object"; -import { getDiForUnitTesting } from "../../../renderer/getDiForUnitTesting"; -import type { Fetch } from "../../fetch/fetch.injectable"; -import fetchInjectable from "../../fetch/fetch.injectable"; -import type { CreateKubeApiForRemoteCluster } from "../create-kube-api-for-remote-cluster.injectable"; -import createKubeApiForRemoteClusterInjectable from "../create-kube-api-for-remote-cluster.injectable"; -import type { AsyncFnMock } from "@async-fn/jest"; -import asyncFn from "@async-fn/jest"; -import { flushPromises } from "@k8slens/test-utils"; -import createKubeJsonApiInjectable from "../create-kube-json-api.injectable"; -import type { KubeStatusData } from "@k8slens/kube-object"; -import setupAutoRegistrationInjectable from "../../../renderer/before-frame-starts/runnables/setup-auto-registration.injectable"; -import { createMockResponseFromString } from "../../../test-utils/mock-responses"; -import storesAndApisCanBeCreatedInjectable from "../../../renderer/stores-apis-can-be-created.injectable"; -import directoryForUserDataInjectable from "../../app-paths/directory-for-user-data/directory-for-user-data.injectable"; -import hostedClusterInjectable from "../../../renderer/cluster-frame-context/hosted-cluster.injectable"; -import directoryForKubeConfigsInjectable from "../../app-paths/directory-for-kube-configs/directory-for-kube-configs.injectable"; -import apiKubeInjectable from "../../../renderer/k8s/api-kube.injectable"; -import type { DiContainer } from "@ogre-tools/injectable"; -import { podApiInjectable } from "@k8slens/kube-api-specifics"; - -// NOTE: this is fine because we are testing something that only exported -// eslint-disable-next-line no-restricted-imports -import { PodsApi } from "../../../extensions/common-api/k8s-api"; -import { Cluster } from "../../cluster/cluster"; - -describe("createKubeApiForRemoteCluster", () => { - let createKubeApiForRemoteCluster: CreateKubeApiForRemoteCluster; - let fetchMock: AsyncFnMock; - - beforeEach(() => { - const di = getDiForUnitTesting(); - - di.override(directoryForUserDataInjectable, () => "/some-user-store-path"); - di.override(directoryForKubeConfigsInjectable, () => "/some-kube-configs"); - di.override(storesAndApisCanBeCreatedInjectable, () => true); - - di.override(hostedClusterInjectable, () => new Cluster({ - contextName: "some-context-name", - id: "some-cluster-id", - kubeConfigPath: "/some-path-to-a-kubeconfig", - })); - - fetchMock = asyncFn(); - di.override(fetchInjectable, () => fetchMock); - - createKubeApiForRemoteCluster = di.inject(createKubeApiForRemoteClusterInjectable); - }); - - it("builds api client for KubeObject", () => { - const api = createKubeApiForRemoteCluster({ - cluster: { - server: "https://127.0.0.1:6443", - }, - user: { - token: "daa", - }, - }, Pod); - - expect(api).toBeInstanceOf(KubeApi); - }); - - describe("when building for remote cluster with specific constructor", () => { - let api: PodApi; - - beforeEach(() => { - api = createKubeApiForRemoteCluster({ - cluster: { - server: "https://127.0.0.1:6443", - }, - user: { - token: "daa", - }, - }, Pod, PodsApi); - }); - - it("uses the constructor", () => { - expect(api).toBeInstanceOf(PodApi); - }); - - describe("when calling list without namespace", () => { - let listRequest: Promise; - - beforeEach(async () => { - listRequest = api.list(); - - // This is required because of how JS promises work - await flushPromises(); - }); - - it("should request pods from default namespace", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "https://127.0.0.1:6443/api/v1/pods", - { - headers: { - "content-type": "application/json", - }, - method: "get", - }, - ]); - }); - - describe("when request resolves with data", () => { - beforeEach(async () => { - await fetchMock.resolveSpecific( - ["https://127.0.0.1:6443/api/v1/pods"], - createMockResponseFromString("https://127.0.0.1:6443/api/v1/pods", JSON.stringify({ - kind: "PodList", - apiVersion: "v1", - metadata:{ - resourceVersion: "452899", - }, - items: [], - })), - ); - }); - - it("resolves the list call", async () => { - expect(await listRequest).toEqual([]); - }); - }); - }); - }); -}); - -describe("KubeApi", () => { - let fetchMock: AsyncFnMock; - let di: DiContainer; - - beforeEach(() => { - di = getDiForUnitTesting(); - - di.override(directoryForUserDataInjectable, () => "/some-user-store-path"); - di.override(directoryForKubeConfigsInjectable, () => "/some-kube-configs"); - di.override(storesAndApisCanBeCreatedInjectable, () => true); - - fetchMock = asyncFn(); - di.override(fetchInjectable, () => fetchMock); - - const createKubeJsonApi = di.inject(createKubeJsonApiInjectable); - - di.override(hostedClusterInjectable, () => new Cluster({ - contextName: "some-context-name", - id: "some-cluster-id", - kubeConfigPath: "/some-path-to-a-kubeconfig", - })); - - di.override(apiKubeInjectable, () => createKubeJsonApi({ - serverAddress: `http://127.0.0.1:9999`, - apiBase: "/api-kube", - })); - - const setupAutoRegistration = di.inject(setupAutoRegistrationInjectable); - - setupAutoRegistration.run(); - }); - - describe("deleting pods (namespace scoped resource)", () => { - let api: PodApi; - - beforeEach(() => { - api = di.inject(podApiInjectable); - }); - - describe("eviction-api as better replacement for pod.delete() request", () => { - let evictRequest: Promise; - - beforeEach(() => { - evictRequest = api.evict({ name: "foo", namespace: "test" }); - }); - - it("requests evicting a pod in given namespace", () => { - expect(fetchMock.mock.lastCall).toMatchObject([ - "http://127.0.0.1:9999/api-kube/api/v1/namespaces/test/pods/foo/eviction", - { - headers: { - "content-type": "application/json", - }, - method: "post", - }, - ]); - }); - - it("should resolve the call with >=200 <300 http code", async () => { - void fetchMock.resolveSpecific( - ["http://127.0.0.1:9999/api-kube/api/v1/namespaces/test/pods/foo/eviction"], - createMockResponseFromString("http://127.0.0.1:9999/api-kube/api/v1/namespaces/test/pods/foo/eviction", JSON.stringify({ - apiVersion: "policy/v1", - kind: "Status", - code: 201, - status: "all good", - } as KubeStatusData)), - ); - - expect(await evictRequest).toBe("201: all good"); - }); - - it("should throw in case of error", async () => { - void fetchMock.resolveSpecific( - ["http://127.0.0.1:9999/api-kube/api/v1/namespaces/test/pods/foo/eviction"], - createMockResponseFromString("http://127.0.0.1:9999/api-kube/api/v1/namespaces/test/pods/foo/eviction", JSON.stringify({ - apiVersion: "policy/v1", - kind: "Status", - code: 500, - status: "something went wrong", - } as KubeStatusData)), - ); - - await expect(async () => evictRequest).rejects.toBe("500: something went wrong"); - }); - }); - }); -}); diff --git a/packages/core/src/common/k8s-api/__tests__/kube-object.store.test.ts b/packages/core/src/common/k8s-api/__tests__/kube-object.store.test.ts deleted file mode 100644 index 608d3a2d5b..0000000000 --- a/packages/core/src/common/k8s-api/__tests__/kube-object.store.test.ts +++ /dev/null @@ -1,156 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { noop } from "@k8slens/utilities"; -import type { KubeApi } from "@k8slens/kube-api"; -import { KubeObject } from "@k8slens/kube-object"; -import type { KubeObjectStoreLoadingParams } from "../kube-object.store"; -import { KubeObjectStore } from "../kube-object.store"; - -class FakeKubeObjectStore extends KubeObjectStore { - constructor(private readonly _loadItems: (params: KubeObjectStoreLoadingParams) => KubeObject[], api: Partial>) { - super({ - context: { - allNamespaces: [], - contextNamespaces: [], - hasSelectedAll: false, - isGlobalWatchEnabled: () => true, - isLoadingAll: () => true, - }, - logger: { - debug: noop, - error: noop, - info: noop, - silly: noop, - warn: noop, - }, - }, api as KubeApi); - } - - async loadItems(params: KubeObjectStoreLoadingParams) { - return Promise.resolve(this._loadItems(params)); - } -} - -describe("KubeObjectStore", () => { - it("should remove an object from the list of items after it is not returned from listing the same namespace again", async () => { - const loadItems = jest.fn(); - const obj = new KubeObject({ - apiVersion: "v1", - kind: "Foo", - metadata: { - name: "some-obj-name", - resourceVersion: "1", - uid: "some-uid", - namespace: "default", - selfLink: "/some/self/link", - }, - }); - const store = new FakeKubeObjectStore(loadItems, { - isNamespaced: true, - }); - - loadItems.mockImplementationOnce(() => [obj]); - - await store.loadAll({ - namespaces: ["default"], - }); - - expect(store.items).toContain(obj); - - loadItems.mockImplementationOnce(() => []); - - await store.loadAll({ - namespaces: ["default"], - }); - - expect(store.items).not.toContain(obj); - }); - - it("should not remove an object that is not returned, if it is in a different namespace", async () => { - const loadItems = jest.fn(); - const objInDefaultNamespace = new KubeObject({ - apiVersion: "v1", - kind: "Foo", - metadata: { - name: "some-obj-name", - resourceVersion: "1", - uid: "some-uid", - namespace: "default", - selfLink: "/some/self/link", - }, - }); - const objNotInDefaultNamespace = new KubeObject({ - apiVersion: "v1", - kind: "Foo", - metadata: { - name: "some-obj-name", - resourceVersion: "1", - uid: "some-uid", - namespace: "not-default", - selfLink: "/some/self/link", - }, - }); - const store = new FakeKubeObjectStore(loadItems, { - isNamespaced: true, - }); - - loadItems.mockImplementationOnce(() => [objInDefaultNamespace]); - - await store.loadAll({ - namespaces: ["default"], - }); - - expect(store.items).toContain(objInDefaultNamespace); - - loadItems.mockImplementationOnce(() => [objNotInDefaultNamespace]); - - await store.loadAll({ - namespaces: ["not-default"], - }); - - expect(store.items).toContain(objInDefaultNamespace); - }); - - it("should remove all objects not returned if the api is cluster-scoped", async () => { - const loadItems = jest.fn(); - const clusterScopedObject1 = new KubeObject({ - apiVersion: "v1", - kind: "Foo", - metadata: { - name: "some-obj-name", - resourceVersion: "1", - uid: "some-uid", - selfLink: "/some/self/link", - }, - }); - const clusterScopedObject2 = new KubeObject({ - apiVersion: "v1", - kind: "Foo", - metadata: { - name: "some-obj-name", - resourceVersion: "1", - uid: "some-uid", - namespace: "not-default", - selfLink: "/some/self/link", - }, - }); - const store = new FakeKubeObjectStore(loadItems, { - isNamespaced: false, - }); - - loadItems.mockImplementationOnce(() => [clusterScopedObject1]); - - await store.loadAll({}); - - expect(store.items).toContain(clusterScopedObject1); - - loadItems.mockImplementationOnce(() => [clusterScopedObject2]); - - await store.loadAll({}); - - expect(store.items).not.toContain(clusterScopedObject1); - }); -}); diff --git a/packages/core/src/common/k8s-api/__tests__/kube-object.test.ts b/packages/core/src/common/k8s-api/__tests__/kube-object.test.ts deleted file mode 100644 index 5d458f7446..0000000000 --- a/packages/core/src/common/k8s-api/__tests__/kube-object.test.ts +++ /dev/null @@ -1,219 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { KubeObject } from "@k8slens/kube-object"; - -describe("KubeObject", () => { - describe("isJsonApiData", () => { - { - type TestCase = [any]; - const tests: TestCase[] = [ - [false], - [true], - [null], - [undefined], - [""], - [1], - [(): unknown => void 0], - [Symbol("hello")], - [{}], - ]; - - it.each(tests)("should reject invalid value: %p", (input) => { - expect(KubeObject.isJsonApiData(input)).toBe(false); - }); - } - - { - type TestCase = [string, any]; - const tests: TestCase[] = [ - ["kind", { apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "" }}], - ["apiVersion", { kind: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "" }}], - ["metadata", { kind: "", apiVersion: "" }], - ["metadata.uid", { kind: "", apiVersion: "", metadata: { name: "", resourceVersion: "", selfLink: "" }}], - ["metadata.name", { kind: "", apiVersion: "", metadata: { uid: "", resourceVersion: "", selfLink: "" }}], - ["metadata.resourceVersion", { kind: "", apiVersion: "", metadata: { uid: "", name: "", selfLink: "" }}], - ]; - - it.each(tests)("should reject with missing: %s", (missingField, input) => { - expect(KubeObject.isJsonApiData(input)).toBe(false); - }); - } - - { - type TestCase = [string, any]; - const tests: TestCase[] = [ - ["kind", { kind: 1, apiVersion: "", metadata: {}}], - ["apiVersion", { apiVersion: 1, kind: "", metadata: {}}], - ["metadata", { kind: "", apiVersion: "", metadata: "" }], - ["metadata.uid", { kind: "", apiVersion: "", metadata: { uid: 1 }}], - ["metadata.name", { kind: "", apiVersion: "", metadata: { uid: "", name: 1 }}], - ["metadata.resourceVersion", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: 1 }}], - ["metadata.selfLink", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: 1 }}], - ["metadata.namespace", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", namespace: 1 }}], - ["metadata.creationTimestamp", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", creationTimestamp: 1 }}], - ["metadata.continue", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", continue: 1 }}], - ["metadata.finalizers", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", finalizers: 1 }}], - ["metadata.finalizers", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", finalizers: [1] }}], - ["metadata.finalizers", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", finalizers: {}}}], - ["metadata.labels", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", labels: 1 }}], - ["metadata.labels", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", labels: { food: 1 }}}], - ["metadata.annotations", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", annotations: 1 }}], - ["metadata.annotations", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", annotations: { food: 1 }}}], - ]; - - it.each(tests)("should reject with wrong type for field: %s", (missingField, input) => { - expect(KubeObject.isJsonApiData(input)).toBe(false); - }); - } - - it("should accept valid KubeJsonApiData (ignoring other fields)", () => { - const valid = { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", annotations: { food: "" }}}; - - expect(KubeObject.isJsonApiData(valid)).toBe(true); - }); - }); - - describe("isPartialJsonApiData", () => { - { - type TestCase = [any]; - const tests: TestCase[] = [ - [false], - [true], - [null], - [undefined], - [""], - [1], - [(): unknown => void 0], - [Symbol("hello")], - ]; - - it.each(tests)("should reject invalid value: %p", (input) => { - expect(KubeObject.isPartialJsonApiData(input)).toBe(false); - }); - } - - it("should accept {}", () => { - expect(KubeObject.isPartialJsonApiData({})).toBe(true); - }); - - { - type TestCase = [string, any]; - const tests: TestCase[] = [ - ["kind", { apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "" }}], - ["apiVersion", { kind: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "" }}], - ["metadata", { kind: "", apiVersion: "" }], - ]; - - it.each(tests)("should not reject with missing top level field: %s", (missingField, input) => { - expect(KubeObject.isPartialJsonApiData(input)).toBe(true); - }); - } - - { - type TestCase = [string, any]; - const tests: TestCase[] = [ - ["kind", { kind: 1, apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "" }}], - ["apiVersion", { apiVersion: 1, kind: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "" }}], - ["metadata", { kind: "", apiVersion: "", metadata: "" }], - ["metadata.uid", { kind: "", apiVersion: "", metadata: { uid: 1, name: "", resourceVersion: "", selfLink: "" }}], - ["metadata.name", { kind: "", apiVersion: "", metadata: { uid: "", name: 1, resourceVersion: "", selfLink: "" }}], - ["metadata.resourceVersion", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: 1, selfLink: "" }}], - ["metadata.selfLink", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: 1 }}], - ["metadata.namespace", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", namespace: 1 }}], - ["metadata.creationTimestamp", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", creationTimestamp: 1 }}], - ["metadata.continue", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", continue: 1 }}], - ["metadata.finalizers", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", finalizers: 1 }}], - ["metadata.finalizers", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", finalizers: [1] }}], - ["metadata.finalizers", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", finalizers: {}}}], - ["metadata.labels", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", labels: 1 }}], - ["metadata.labels", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", labels: { food: 1 }}}], - ["metadata.annotations", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", annotations: 1 }}], - ["metadata.annotations", { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", annotations: { food: 1 }}}], - ]; - - it.each(tests)("should reject with wrong type for field: %s", (missingField, input) => { - expect(KubeObject.isPartialJsonApiData(input)).toBe(false); - }); - } - - it("should accept valid Partial (ignoring other fields)", () => { - const valid = { kind: "", apiVersion: "", metadata: { uid: "", name: "", resourceVersion: "", selfLink: "", annotations: { food: "" }}}; - - expect(KubeObject.isPartialJsonApiData(valid)).toBe(true); - }); - }); - - describe("isJsonApiDataList", () => { - function isAny(val: unknown): val is any { - return true; - } - - function isNotAny(val: unknown): val is any { - return false; - } - - function isBoolean(val: unknown): val is boolean { - return typeof val === "boolean"; - } - - { - type TestCase = [any]; - const tests: TestCase[] = [ - [false], - [true], - [null], - [undefined], - [""], - [1], - [(): unknown => void 0], - [Symbol("hello")], - [{}], - ]; - - it.each(tests)("should reject invalid value: %p", (input) => { - expect(KubeObject.isJsonApiDataList(input, isAny)).toBe(false); - }); - } - - { - type TestCase = [string, any]; - const tests: TestCase[] = [ - ["kind", { apiVersion: "", items: [], metadata: { resourceVersion: "", selfLink: "" }}], - ["apiVersion", { kind: "", items: [], metadata: { resourceVersion: "", selfLink: "" }}], - ["metadata", { kind: "", items: [], apiVersion: "" }], - ]; - - it.each(tests)("should reject with missing: %s", (missingField, input) => { - expect(KubeObject.isJsonApiDataList(input, isAny)).toBe(false); - }); - } - - { - type TestCase = [string, any]; - const tests: TestCase[] = [ - ["kind", { kind: 1, items: [], apiVersion: "", metadata: { resourceVersion: "", selfLink: "" }}], - ["apiVersion", { kind: "", items: [], apiVersion: 1, metadata: { resourceVersion: "", selfLink: "" }}], - ["metadata", { kind: "", items: [], apiVersion: "", metadata: 1 }], - ["metadata.resourceVersion", { kind: "", items: [], apiVersion: "", metadata: { resourceVersion: 1, selfLink: "" }}], - ["metadata.selfLink", { kind: "", items: [], apiVersion: "", metadata: { resourceVersion: "", selfLink: 1 }}], - ["items", { kind: "", items: 1, apiVersion: "", metadata: { resourceVersion: "", selfLink: "" }}], - ["items", { kind: "", items: "", apiVersion: "", metadata: { resourceVersion: "", selfLink: "" }}], - ["items", { kind: "", items: {}, apiVersion: "", metadata: { resourceVersion: "", selfLink: "" }}], - ["items[0]", { kind: "", items: [""], apiVersion: "", metadata: { resourceVersion: "", selfLink: "" }}], - ]; - - it.each(tests)("should reject with wrong type for field: %s", (missingField, input) => { - expect(KubeObject.isJsonApiDataList(input, isNotAny)).toBe(false); - }); - } - - it("should accept valid KubeJsonApiDataList (ignoring other fields)", () => { - const valid = { kind: "", items: [false], apiVersion: "", metadata: { resourceVersion: "", selfLink: "" }}; - - expect(KubeObject.isJsonApiDataList(valid, isBoolean)).toBe(true); - }); - }); -}); diff --git a/packages/core/src/common/k8s-api/__tests__/pods.api.test.ts b/packages/core/src/common/k8s-api/__tests__/pods.api.test.ts deleted file mode 100644 index 5f6ad20498..0000000000 --- a/packages/core/src/common/k8s-api/__tests__/pods.api.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { Pod } from "@k8slens/kube-object"; - -describe("Pod tests", () => { - it("getAllContainers() should never throw", () => { - const pod = new Pod({ - apiVersion: "foo", - kind: "Pod", - metadata: { - name: "foobar", - resourceVersion: "foobar", - uid: "foobar", - namespace: "default", - selfLink: "/api/v1/pods/default/foobar", - }, - }); - - expect(pod.getAllContainers()).toStrictEqual([]); - }); -}); diff --git a/packages/core/src/common/k8s-api/api-base-configs.ts b/packages/core/src/common/k8s-api/api-base-configs.ts deleted file mode 100644 index 5ac67229ec..0000000000 --- a/packages/core/src/common/k8s-api/api-base-configs.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getInjectionToken } from "@ogre-tools/injectable"; - -export const apiBaseServerAddressInjectionToken = getInjectionToken({ - id: "api-base-config-server-address-token", -}); - -export const apiBaseHostHeaderInjectionToken = getInjectionToken({ - id: "api-base-host-header-token", -}); diff --git a/packages/core/src/common/k8s-api/api-base.injectable.ts b/packages/core/src/common/k8s-api/api-base.injectable.ts deleted file mode 100644 index b340882672..0000000000 --- a/packages/core/src/common/k8s-api/api-base.injectable.ts +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { apiPrefix } from "../vars"; -import isDebuggingInjectable from "../vars/is-debugging.injectable"; -import isDevelopmentInjectable from "../vars/is-development.injectable"; -import { apiBaseHostHeaderInjectionToken, apiBaseServerAddressInjectionToken } from "./api-base-configs"; -import createJsonApiInjectable from "./create-json-api.injectable"; - -const apiBaseInjectable = getInjectable({ - id: "api-base", - instantiate: (di) => { - const createJsonApi = di.inject(createJsonApiInjectable); - const isDebugging = di.inject(isDebuggingInjectable); - const isDevelopment = di.inject(isDevelopmentInjectable); - const serverAddress = di.inject(apiBaseServerAddressInjectionToken); - const hostHeaderValue = di.inject(apiBaseHostHeaderInjectionToken); - - return createJsonApi({ - serverAddress, - apiBase: apiPrefix, - debug: isDevelopment || isDebugging, - }, { - headers: { - "Host": hostHeaderValue, - }, - }); - }, -}); - -export default apiBaseInjectable; diff --git a/packages/core/src/common/k8s-api/api-manager/api-manager.ts b/packages/core/src/common/k8s-api/api-manager/api-manager.ts deleted file mode 100644 index a42e29a5b5..0000000000 --- a/packages/core/src/common/k8s-api/api-manager/api-manager.ts +++ /dev/null @@ -1,210 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { KubeObjectStore } from "../kube-object.store"; - -import type { IComputedValue } from "mobx"; -import { autorun, action, observable } from "mobx"; -import type { KubeApi } from "@k8slens/kube-api"; -import type { KubeObject, ObjectReference } from "@k8slens/kube-object"; -import { parseKubeApi, createKubeApiURL } from "@k8slens/kube-api"; -import { getOrInsertWith, iter } from "@k8slens/utilities"; -import type { CreateCustomResourceStore } from "./create-custom-resource-store.injectable"; - -export type RegisterableStore = Store extends KubeObjectStore - ? Store - : never; -export type RegisterableApi = Api extends KubeApi - ? Api - : never; -export type KubeObjectStoreFrom = Api extends KubeApi - ? KubeObjectStore - : never; - -export type FindApiCallback = (api: KubeApi) => boolean; - -export interface ApiManagerDependencies { - readonly apis: IComputedValue; - readonly crdApis: IComputedValue; - readonly stores: IComputedValue; - createCustomResourceStore: CreateCustomResourceStore; -} - -export class ApiManager { - private readonly externalApis = observable.array(); - private readonly externalStores = observable.array(); - private readonly defaultCrdStores = observable.map(); - private readonly apis = observable.map(); - - constructor(private readonly dependencies: ApiManagerDependencies) { - // NOTE: this is done to preserve the old behaviour of an API being discoverable using all previous apiBases - autorun(() => { - const apis = iter.chain(this.dependencies.apis.get().values()) - .concat(this.externalApis.values()); - const removedApis = new Set(this.apis.values()); - const newState = new Map(this.apis); - - for (const api of apis) { - removedApis.delete(api); - newState.set(api.apiBase, api); - } - - for (const api of removedApis) { - for (const [apiBase, storedApi] of newState) { - if (storedApi === api) { - newState.delete(apiBase); - } - } - } - - for (const crdApi of this.dependencies.crdApis.get()) { - if (!newState.has(crdApi.apiBase)) { - newState.set(crdApi.apiBase, crdApi); - } - } - - this.apis.replace(newState); - }); - } - - getApi(pathOrCallback: string | FindApiCallback) { - if (typeof pathOrCallback === "function") { - return iter.find(this.apis.values(), pathOrCallback); - } - - const parsedApi = parseKubeApi(pathOrCallback); - - if (!parsedApi) { - return undefined; - } - - return this.apis.get(parsedApi.apiBase); - } - - getApiByKind(kind: string, apiVersion: string) { - return this.getApi(api => api.kind === kind && api.apiVersionWithGroup === apiVersion); - } - - registerApi(api: RegisterableApi): void; - /** - * @deprecated Just register the `api` by itself - */ - registerApi(apiBase: string, api: RegisterableApi): void; - registerApi(...args: [RegisterableApi] | [string, RegisterableApi]) { - if (args.length === 1) { - this.externalApis.push(args[0]); - } else { - this.externalApis.push(args[1]); - } - } - - unregisterApi(apiOrBase: string | KubeApi) { - if (typeof apiOrBase === "string") { - const api = this.externalApis.find(api => api.apiBase === apiOrBase); - - if (api) { - this.externalApis.remove(api); - } - } else { - this.unregisterApi(apiOrBase.apiBase); - } - } - - registerStore(store: RegisterableStore): void; - /** - * @deprecated KubeObjectStore's should only every be about a single KubeApi type - */ - registerStore(store: RegisterableStore, apis: KubeApi[]): void; - - @action - registerStore(store: RegisterableStore): void { - this.externalStores.push(store); - } - - private apiIsDefaultCrdApi(api: KubeApi): boolean { - for (const crdApi of this.dependencies.crdApis.get()) { - if (crdApi.apiBase === api.apiBase) { - return true; - } - } - - return false; - } - - getStore(api: string | undefined): KubeObjectStore | undefined; - getStore(api: RegisterableApi): KubeObjectStoreFrom | undefined; - /** - * @deprecated use an actual cast instead of hiding it with this unused type param - */ - getStore(api: string | KubeApi): Store | undefined ; - getStore(apiOrBase: string | KubeApi | undefined): KubeObjectStore | undefined { - if (!apiOrBase) { - return undefined; - } - - const { apiBase } = typeof apiOrBase === "string" - ? parseKubeApi(apiOrBase) ?? {} - : apiOrBase; - - const api = apiBase && this.getApi(apiBase); - - if (!api) { - return undefined; - } - - const defaultResult = iter.chain(this.dependencies.stores.get().values()) - .concat(this.externalStores.values()) - .find(store => store.api.apiBase === api.apiBase); - - if (defaultResult) { - return defaultResult; - } - - if (this.apiIsDefaultCrdApi(api)) { - return getOrInsertWith(this.defaultCrdStores, api.apiBase, () => this.dependencies.createCustomResourceStore(api)); - } - - return undefined; - } - - lookupApiLink(ref: ObjectReference, parentObject?: KubeObject): string { - const { - kind, apiVersion = "v1", name, - namespace = parentObject?.getNs(), - } = ref; - - if (!kind) return ""; - - // search in registered apis by 'kind' & 'apiVersion' - const api = this.getApi(api => api.kind === kind && api.apiVersionWithGroup == apiVersion); - - if (api) { - return api.formatUrlForNotListing({ namespace, name }); - } - - // lookup api by generated resource link - const apiPrefixes = ["/apis", "/api"]; - const resource = kind.endsWith("s") ? `${kind.toLowerCase()}es` : `${kind.toLowerCase()}s`; - - for (const apiPrefix of apiPrefixes) { - const apiLink = createKubeApiURL({ apiPrefix, apiVersion, name, namespace, resource }); - - if (this.getApi(apiLink)) { - return apiLink; - } - } - - // resolve by kind only (hpa's might use refs to older versions of resources for example) - const apiByKind = this.getApi(api => api.kind === kind); - - if (apiByKind) { - return apiByKind.formatUrlForNotListing({ name, namespace }); - } - - // otherwise generate link with default prefix - // resource still might exists in k8s, but api is not registered in the app - return createKubeApiURL({ apiVersion, name, namespace, resource }); - } -} diff --git a/packages/core/src/common/k8s-api/api-manager/auto-registration-emitter.injectable.ts b/packages/core/src/common/k8s-api/api-manager/auto-registration-emitter.injectable.ts deleted file mode 100644 index 47e53cd98c..0000000000 --- a/packages/core/src/common/k8s-api/api-manager/auto-registration-emitter.injectable.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import EventEmitter from "events"; -import type TypedEventEmitter from "typed-emitter"; -import type { KubeApi } from "@k8slens/kube-api"; - -export interface LegacyAutoRegistration { - kubeApi: (api: KubeApi) => void; -} - -/** - * This is used to remove dependency cycles from auto registering of instances - * - * - Custom Resource Definitions get their own registered store (will need in the future) - * - All KubeApi's get auto registered (this should be changed in the future) - */ -const autoRegistrationEmitterInjectable = getInjectable({ - id: "auto-registration-emitter", - instantiate: (): TypedEventEmitter => new EventEmitter(), -}); - -export default autoRegistrationEmitterInjectable; diff --git a/packages/core/src/common/k8s-api/api-manager/crd-api-token.ts b/packages/core/src/common/k8s-api/api-manager/crd-api-token.ts deleted file mode 100644 index ea01fa18f6..0000000000 --- a/packages/core/src/common/k8s-api/api-manager/crd-api-token.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getInjectionToken } from "@ogre-tools/injectable"; -import type { KubeApi } from "@k8slens/kube-api"; - -export const customResourceDefinitionApiInjectionToken = getInjectionToken({ - id: "custom-resource-definition-api-token", -}); diff --git a/packages/core/src/common/k8s-api/api-manager/create-custom-resource-store.injectable.ts b/packages/core/src/common/k8s-api/api-manager/create-custom-resource-store.injectable.ts deleted file mode 100644 index 52ff80fc4c..0000000000 --- a/packages/core/src/common/k8s-api/api-manager/create-custom-resource-store.injectable.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import clusterFrameContextForNamespacedResourcesInjectable from "../../../renderer/cluster-frame-context/for-namespaced-resources.injectable"; -import { loggerInjectionToken } from "@k8slens/logger"; -import type { KubeApi } from "@k8slens/kube-api"; -import type { KubeObject } from "@k8slens/kube-object"; -import type { KubeObjectStoreDependencies } from "../kube-object.store"; -import { CustomResourceStore } from "./resource.store"; - -export type CreateCustomResourceStore = (api: KubeApi) => CustomResourceStore; - -const createCustomResourceStoreInjectable = getInjectable({ - id: "create-custom-resource-store", - instantiate: (di): CreateCustomResourceStore => { - const deps: KubeObjectStoreDependencies = { - context: di.inject(clusterFrameContextForNamespacedResourcesInjectable), - logger: di.inject(loggerInjectionToken), - }; - - return (api) => new CustomResourceStore(deps, api); - }, -}); - -export default createCustomResourceStoreInjectable; diff --git a/packages/core/src/common/k8s-api/api-manager/index.ts b/packages/core/src/common/k8s-api/api-manager/index.ts deleted file mode 100644 index 56182e815b..0000000000 --- a/packages/core/src/common/k8s-api/api-manager/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export * from "./api-manager"; diff --git a/packages/core/src/common/k8s-api/api-manager/kube-object-store-token.ts b/packages/core/src/common/k8s-api/api-manager/kube-object-store-token.ts deleted file mode 100644 index bbf272db24..0000000000 --- a/packages/core/src/common/k8s-api/api-manager/kube-object-store-token.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectionToken } from "@ogre-tools/injectable"; -import type { KubeObjectStore } from "../kube-object.store"; - -export const kubeObjectStoreInjectionToken = getInjectionToken>({ - id: "kube-object-store-token", -}); diff --git a/packages/core/src/common/k8s-api/api-manager/manager.injectable.ts b/packages/core/src/common/k8s-api/api-manager/manager.injectable.ts deleted file mode 100644 index 20a26bd00d..0000000000 --- a/packages/core/src/common/k8s-api/api-manager/manager.injectable.ts +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { ApiManager } from "./api-manager"; -import { computedInjectManyInjectable } from "@ogre-tools/injectable-extension-for-mobx"; -import { kubeObjectStoreInjectionToken } from "./kube-object-store-token"; -import { kubeApiInjectionToken, storesAndApisCanBeCreatedInjectionToken } from "@k8slens/kube-api-specifics"; -import { computed } from "mobx"; -import { customResourceDefinitionApiInjectionToken } from "./crd-api-token"; -import createCustomResourceStoreInjectable from "./create-custom-resource-store.injectable"; - -const apiManagerInjectable = getInjectable({ - id: "api-manager", - instantiate: (di) => { - const computedInjectMany = di.inject(computedInjectManyInjectable); - const storesAndApisCanBeCreated = di.inject(storesAndApisCanBeCreatedInjectionToken); - - return new ApiManager(( - storesAndApisCanBeCreated - ? { - apis: computedInjectMany(kubeApiInjectionToken), - stores: computedInjectMany(kubeObjectStoreInjectionToken), - crdApis: computedInjectMany(customResourceDefinitionApiInjectionToken), - createCustomResourceStore: di.inject(createCustomResourceStoreInjectable), - } - : { - apis: computed(() => []), - stores: computed(() => []), - crdApis: computed(() => []), - createCustomResourceStore: () => { - throw new Error("Tried to create a KubeObjectStore for a CustomResource in a disallowed environment"); - }, - } - )); - }, -}); - -export default apiManagerInjectable; diff --git a/packages/core/src/common/k8s-api/api-manager/resource.store.ts b/packages/core/src/common/k8s-api/api-manager/resource.store.ts deleted file mode 100644 index aca1d38109..0000000000 --- a/packages/core/src/common/k8s-api/api-manager/resource.store.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { KubeApi } from "@k8slens/kube-api"; -import type { KubeObjectStoreDependencies } from "../kube-object.store"; -import { KubeObjectStore } from "../kube-object.store"; -import type { KubeObject } from "@k8slens/kube-object"; - -export class CustomResourceStore extends KubeObjectStore> { - constructor(deps: KubeObjectStoreDependencies, api: KubeApi) { - super(deps, api); - } -} diff --git a/packages/core/src/common/k8s-api/create-json-api.injectable.ts b/packages/core/src/common/k8s-api/create-json-api.injectable.ts deleted file mode 100644 index b8a67a424d..0000000000 --- a/packages/core/src/common/k8s-api/create-json-api.injectable.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { Agent } from "https"; -import type { RequestInit } from "@k8slens/node-fetch"; -import lensProxyCertificateInjectable from "../certificate/lens-proxy-certificate.injectable"; -import fetchInjectable from "../fetch/fetch.injectable"; -import { loggerInjectionToken } from "@k8slens/logger"; -import type { JsonApiConfig, JsonApiData, JsonApiDependencies, JsonApiParams } from "@k8slens/json-api"; -import { JsonApi } from "@k8slens/json-api"; - -export type CreateJsonApi = = JsonApiParams>(config: JsonApiConfig, reqInit?: RequestInit) => JsonApi; - -const createJsonApiInjectable = getInjectable({ - id: "create-json-api", - instantiate: (di): CreateJsonApi => { - const deps: JsonApiDependencies = { - fetch: di.inject(fetchInjectable), - logger: di.inject(loggerInjectionToken), - }; - const lensProxyCert = di.inject(lensProxyCertificateInjectable); - - return (config, reqInit) => { - if (!config.getRequestOptions) { - config.getRequestOptions = async () => { - const agent = new Agent({ - ca: lensProxyCert.get().cert, - }); - - return { - agent, - }; - }; - } - - return new JsonApi(deps, config, reqInit); - }; - }, -}); - -export default createJsonApiInjectable; diff --git a/packages/core/src/common/k8s-api/create-kube-api-for-cluster.injectable.ts b/packages/core/src/common/k8s-api/create-kube-api-for-cluster.injectable.ts deleted file mode 100644 index d9fbc2d872..0000000000 --- a/packages/core/src/common/k8s-api/create-kube-api-for-cluster.injectable.ts +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { logErrorInjectionToken, logInfoInjectionToken, logWarningInjectionToken } from "@k8slens/logger"; -import { apiKubePrefix } from "../vars"; -import isDevelopmentInjectable from "../vars/is-development.injectable"; -import apiBaseInjectable from "./api-base.injectable"; -import type { KubeApiConstructor } from "./create-kube-api-for-remote-cluster.injectable"; -import createKubeJsonApiInjectable from "./create-kube-json-api.injectable"; -import { KubeApi } from "@k8slens/kube-api"; -import type { KubeJsonApiDataFor, KubeObject, KubeObjectConstructor } from "@k8slens/kube-object"; - -export interface CreateKubeApiForLocalClusterConfig { - metadata: { - uid: string; - }; -} - -export interface CreateKubeApiForCluster { - , Data extends KubeJsonApiDataFor>( - cluster: CreateKubeApiForLocalClusterConfig, - kubeClass: KubeObjectConstructor, - apiClass: KubeApiConstructor, - ): Api; - >( - cluster: CreateKubeApiForLocalClusterConfig, - kubeClass: KubeObjectConstructor, - apiClass?: KubeApiConstructor>, - ): KubeApi; -} - -const createKubeApiForClusterInjectable = getInjectable({ - id: "create-kube-api-for-cluster", - instantiate: (di): CreateKubeApiForCluster => { - const apiBase = di.inject(apiBaseInjectable); - const isDevelopment = di.inject(isDevelopmentInjectable); - const createKubeJsonApi = di.inject(createKubeJsonApiInjectable); - const logError = di.inject(logErrorInjectionToken); - const logInfo = di.inject(logInfoInjectionToken); - const logWarn = di.inject(logWarningInjectionToken); - - return ( - cluster: CreateKubeApiForLocalClusterConfig, - kubeClass: KubeObjectConstructor>, - apiClass?: KubeApiConstructor>, - ) => { - const request = createKubeJsonApi( - { - serverAddress: apiBase.config.serverAddress, - apiBase: apiKubePrefix, - debug: isDevelopment, - }, { - headers: { - "Host": `${cluster.metadata.uid}.lens.app:${new URL(apiBase.config.serverAddress).port}`, - }, - }); - - if (apiClass) { - return new apiClass({ - objectConstructor: kubeClass, - request, - }); - } - - return new KubeApi( - { - logError, - logInfo, - logWarn, - maybeKubeApi: undefined, - }, - { - objectConstructor: kubeClass, - request, - }, - ); - }; - }, -}); - -export default createKubeApiForClusterInjectable; diff --git a/packages/core/src/common/k8s-api/create-kube-api-for-remote-cluster.injectable.ts b/packages/core/src/common/k8s-api/create-kube-api-for-remote-cluster.injectable.ts deleted file mode 100644 index d3b9f26e91..0000000000 --- a/packages/core/src/common/k8s-api/create-kube-api-for-remote-cluster.injectable.ts +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { AgentOptions } from "https"; -import { Agent } from "https"; -import type { RequestInit } from "@k8slens/node-fetch"; -import { logErrorInjectionToken, logInfoInjectionToken, logWarningInjectionToken } from "@k8slens/logger"; -import isDevelopmentInjectable from "../vars/is-development.injectable"; -import createKubeJsonApiInjectable from "./create-kube-json-api.injectable"; -import type { KubeApiOptions } from "@k8slens/kube-api"; -import { KubeApi } from "@k8slens/kube-api"; -import type { KubeJsonApiDataFor, KubeObject, KubeObjectConstructor } from "@k8slens/kube-object"; - -export interface CreateKubeApiForRemoteClusterConfig { - cluster: { - server: string; - caData?: string; - skipTLSVerify?: boolean; - }; - user: { - token?: string | (() => Promise); - clientCertificateData?: string; - clientKeyData?: string; - }; - /** - * Custom instance of https.agent to use for the requests - * - * @remarks the custom agent replaced default agent, options skipTLSVerify, - * clientCertificateData, clientKeyData and caData are ignored. - */ - agent?: Agent; -} - -export type KubeApiConstructor> = new (apiOpts: KubeApiOptions) => Api; - -export interface CreateKubeApiForRemoteCluster { - , Data extends KubeJsonApiDataFor>( - config: CreateKubeApiForRemoteClusterConfig, - kubeClass: KubeObjectConstructor, - apiClass: KubeApiConstructor, - ): Api; - >( - config: CreateKubeApiForRemoteClusterConfig, - kubeClass: KubeObjectConstructor, - apiClass?: KubeApiConstructor>, - ): KubeApi; -} - -const createKubeApiForRemoteClusterInjectable = getInjectable({ - id: "create-kube-api-for-remote-cluster", - instantiate: (di): CreateKubeApiForRemoteCluster => { - const isDevelopment = di.inject(isDevelopmentInjectable); - const createKubeJsonApi = di.inject(createKubeJsonApiInjectable); - const logError = di.inject(logErrorInjectionToken); - const logInfo = di.inject(logInfoInjectionToken); - const logWarn = di.inject(logWarningInjectionToken); - - return ( - config: CreateKubeApiForRemoteClusterConfig, - kubeClass: KubeObjectConstructor>, - apiClass?: KubeApiConstructor>, - ) => { - const reqInit: RequestInit = {}; - const agentOptions: AgentOptions = {}; - - if (config.cluster.skipTLSVerify === true) { - agentOptions.rejectUnauthorized = false; - } - - if (config.user.clientCertificateData) { - agentOptions.cert = config.user.clientCertificateData; - } - - if (config.user.clientKeyData) { - agentOptions.key = config.user.clientKeyData; - } - - if (config.cluster.caData) { - agentOptions.ca = config.cluster.caData; - } - - if (Object.keys(agentOptions).length > 0) { - reqInit.agent = new Agent(agentOptions); - } - - if (config.agent) { - reqInit.agent = config.agent; - } - - const token = config.user.token; - const request = createKubeJsonApi({ - serverAddress: config.cluster.server, - apiBase: "", - debug: isDevelopment, - ...(token ? { - getRequestOptions: async () => ({ - headers: { - "Authorization": `Bearer ${typeof token === "function" ? await token() : token}`, - }, - }), - } : {}), - }, reqInit); - - if (apiClass) { - return new apiClass({ - objectConstructor: kubeClass, - request, - }); - } - - return new KubeApi( - { - logError, - logInfo, - logWarn, - maybeKubeApi: undefined, - }, - { - objectConstructor: kubeClass, - request, - }, - ); - }; - }, -}); - -export default createKubeApiForRemoteClusterInjectable; diff --git a/packages/core/src/common/k8s-api/create-kube-api.injectable.ts b/packages/core/src/common/k8s-api/create-kube-api.injectable.ts deleted file mode 100644 index c92c8796cc..0000000000 --- a/packages/core/src/common/k8s-api/create-kube-api.injectable.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { logErrorInjectionToken, logInfoInjectionToken, logWarningInjectionToken } from "@k8slens/logger"; -import type { DerivedKubeApiOptions, KubeApiDependencies } from "@k8slens/kube-api"; -import { maybeKubeApiInjectable } from "@k8slens/kube-api-specifics"; - -export interface CreateKubeApi { - (ctor: new (deps: KubeApiDependencies, opts: DerivedKubeApiOptions) => Api, opts?: DerivedKubeApiOptions): Api; -} - -const createKubeApiInjectable = getInjectable({ - id: "create-kube-api", - instantiate: (di): CreateKubeApi => { - const deps: KubeApiDependencies = { - logError: di.inject(logErrorInjectionToken), - logInfo: di.inject(logInfoInjectionToken), - logWarn: di.inject(logWarningInjectionToken), - maybeKubeApi: di.inject(maybeKubeApiInjectable), - }; - - return (ctor, opts) => new ctor(deps, opts ?? {}); - }, -}); - -export default createKubeApiInjectable; diff --git a/packages/core/src/common/k8s-api/create-kube-json-api-for-cluster.injectable.ts b/packages/core/src/common/k8s-api/create-kube-json-api-for-cluster.injectable.ts deleted file mode 100644 index f561cd016c..0000000000 --- a/packages/core/src/common/k8s-api/create-kube-json-api-for-cluster.injectable.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { apiKubePrefix } from "../vars"; -import isDebuggingInjectable from "../vars/is-debugging.injectable"; -import { apiBaseHostHeaderInjectionToken, apiBaseServerAddressInjectionToken } from "./api-base-configs"; -import createKubeJsonApiInjectable from "./create-kube-json-api.injectable"; -import type { KubeJsonApi } from "@k8slens/kube-api"; - -export type CreateKubeJsonApiForCluster = (clusterId: string) => KubeJsonApi; - -const createKubeJsonApiForClusterInjectable = getInjectable({ - id: "create-kube-json-api-for-cluster", - instantiate: (di): CreateKubeJsonApiForCluster => { - const createKubeJsonApi = di.inject(createKubeJsonApiInjectable); - const isDebugging = di.inject(isDebuggingInjectable); - - return (clusterId) => createKubeJsonApi( - { - serverAddress: di.inject(apiBaseServerAddressInjectionToken), - apiBase: apiKubePrefix, - debug: isDebugging, - }, - { - headers: { - "Host": `${clusterId}.${di.inject(apiBaseHostHeaderInjectionToken)}`, - }, - }, - ); - }, -}); - -export default createKubeJsonApiForClusterInjectable; diff --git a/packages/core/src/common/k8s-api/create-kube-json-api.injectable.ts b/packages/core/src/common/k8s-api/create-kube-json-api.injectable.ts deleted file mode 100644 index 235f381771..0000000000 --- a/packages/core/src/common/k8s-api/create-kube-json-api.injectable.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { Agent } from "https"; -import type { RequestInit } from "@k8slens/node-fetch"; -import lensProxyCertificateInjectable from "../certificate/lens-proxy-certificate.injectable"; -import fetchInjectable from "../fetch/fetch.injectable"; -import { loggerInjectionToken } from "@k8slens/logger"; -import type { JsonApiConfig, JsonApiDependencies } from "@k8slens/json-api"; -import { KubeJsonApi } from "@k8slens/kube-api"; - -export type CreateKubeJsonApi = (config: JsonApiConfig, reqInit?: RequestInit) => KubeJsonApi; - -const createKubeJsonApiInjectable = getInjectable({ - id: "create-kube-json-api", - instantiate: (di): CreateKubeJsonApi => { - const dependencies: JsonApiDependencies = { - fetch: di.inject(fetchInjectable), - logger: di.inject(loggerInjectionToken), - }; - const lensProxyCert = di.inject(lensProxyCertificateInjectable); - - return (config, reqInit) => { - if (!config.getRequestOptions) { - config.getRequestOptions = async () => { - const agent = new Agent({ - ca: lensProxyCert.get().cert, - }); - - return { - agent, - }; - }; - } - - return new KubeJsonApi(dependencies, config, reqInit); - }; - }, -}); - -export default createKubeJsonApiInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/helm-charts.api.ts b/packages/core/src/common/k8s-api/endpoints/helm-charts.api.ts deleted file mode 100644 index da2d8ab00c..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/helm-charts.api.ts +++ /dev/null @@ -1,335 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { array } from "@k8slens/utilities"; -import autoBind from "auto-bind"; -import Joi from "joi"; - -export interface RawHelmChart { - apiVersion: string; - name: string; - version: string; - repo: string; - created: string; - digest?: string; - kubeVersion?: string; - description?: string; - home?: string; - engine?: string; - icon?: string; - appVersion?: string; - type?: string; - tillerVersion?: string; - deprecated?: boolean; - keywords?: string[]; - sources?: string[]; - urls?: string[]; - maintainers?: HelmChartMaintainer[]; - dependencies?: RawHelmChartDependency[]; - annotations?: Record; -} - -const helmChartMaintainerValidator = Joi.object({ - name: Joi - .string() - .required(), - email: Joi - .string() - .required(), - url: Joi - .string() - .optional(), -}); - -const helmChartDependencyValidator = Joi.object({ - name: Joi - .string() - .required(), - repository: Joi - .string() - .required(), - condition: Joi - .string() - .optional(), - version: Joi - .string() - .required(), - tags: Joi - .array() - .items(Joi.string()) - .default(() => ([])), -}); - -const helmChartValidator = Joi.object({ - apiVersion: Joi - .string() - .required(), - name: Joi - .string() - .required(), - version: Joi - .string() - .required(), - repo: Joi - .string() - .required(), - created: Joi - .string() - .required(), - digest: Joi - .string() - .optional(), - kubeVersion: Joi - .string() - .optional(), - description: Joi - .string() - .default(""), - home: Joi - .string() - .optional(), - engine: Joi - .string() - .optional(), - icon: Joi - .string() - .optional(), - appVersion: Joi - .string() - .optional(), - tillerVersion: Joi - .string() - .optional(), - type: Joi - .string() - .optional(), - deprecated: Joi - .boolean() - .default(false), - keywords: Joi - .array() - .items(Joi.string()) - .options({ - stripUnknown: { - arrays: true, - }, - }) - .default(() => ([])), - sources: Joi - .array() - .items(Joi.string()) - .options({ - stripUnknown: { - arrays: true, - }, - }) - .default(() => ([])), - urls: Joi - .array() - .items(Joi.string()) - .options({ - stripUnknown: { - arrays: true, - }, - }) - .default(() => ([])), - maintainers: Joi - .array() - .items(helmChartMaintainerValidator) - .options({ - stripUnknown: { - arrays: true, - }, - }) - .default(() => ([])), - dependencies: Joi - .array() - .items(helmChartDependencyValidator) - .options({ - stripUnknown: { - arrays: true, - }, - }) - .default(() => ([])), - annotations: Joi - .object({}) - .pattern(/.*/, Joi.string()) - .default(() => ({})), -}); - -export interface HelmChartCreateOpts { - onError?: "throw" | "log"; -} - -export interface HelmChartMaintainer { - name: string; - email: string; - url?: string; -} - -export interface RawHelmChartDependency { - name: string; - repository: string; - condition?: string; - version: string; - tags?: string[]; -} - -export type HelmChartDependency = Required> - & Pick; - -export interface HelmChartData { - apiVersion: string; - name: string; - version: string; - repo: string; - created: string; - description: string; - keywords: string[]; - sources: string[]; - urls: string[]; - annotations: Record; - dependencies: HelmChartDependency[]; - maintainers: HelmChartMaintainer[]; - deprecated: boolean; - kubeVersion?: string; - digest?: string; - home?: string; - engine?: string; - icon?: string; - appVersion?: string; - type?: string; - tillerVersion?: string; -} - -export class HelmChart implements HelmChartData { - apiVersion: string; - name: string; - version: string; - repo: string; - created: string; - description: string; - keywords: string[]; - sources: string[]; - urls: string[]; - annotations: Record; - dependencies: HelmChartDependency[]; - maintainers: HelmChartMaintainer[]; - deprecated: boolean; - kubeVersion?: string; - digest?: string; - home?: string; - engine?: string; - icon?: string; - appVersion?: string; - type?: string; - tillerVersion?: string; - - private constructor(value: HelmChart | HelmChartData) { - this.apiVersion = value.apiVersion; - this.name = value.name; - this.version = value.version; - this.repo = value.repo; - this.kubeVersion = value.kubeVersion; - this.created = value.created; - this.description = value.description; - this.digest = value.digest; - this.keywords = value.keywords; - this.home = value.home; - this.sources = value.sources; - this.maintainers = value.maintainers; - this.engine = value.engine; - this.icon = value.icon; - this.apiVersion = value.apiVersion; - this.deprecated = value.deprecated; - this.tillerVersion = value.tillerVersion; - this.annotations = value.annotations; - this.urls = value.urls; - this.dependencies = value.dependencies; - this.type = value.type; - - autoBind(this); - } - - static create(data: RawHelmChart): HelmChart; - static create(data: RawHelmChart, opts?: HelmChartCreateOpts): HelmChart | undefined; - static create(data: RawHelmChart, { onError = "throw" }: HelmChartCreateOpts = {}): HelmChart | undefined { - const result = helmChartValidator.validate(data, { - abortEarly: false, - }); - - if (!result.error) { - return new HelmChart(result.value); - } - - const [actualErrors, unknownDetails] = array.bifurcate(result.error.details, ({ type }) => type === "object.unknown"); - - if (unknownDetails.length > 0) { - console.warn("HelmChart data has unexpected fields", { original: data, unknownFields: unknownDetails.flatMap(d => d.path) }); - } - - if (actualErrors.length === 0) { - return new HelmChart(result.value as unknown as HelmChartData); - } - - const validationError = new Joi.ValidationError(actualErrors.map(er => er.message).join(". "), actualErrors, result.error._original); - - if (onError === "throw") { - throw validationError; - } - - console.warn("[HELM-CHART]: failed to validate data", data, validationError); - - return undefined; - } - - getId(): string { - const digestPart = this.digest - ? `+${this.digest}` - : ""; - - return `${this.repo}:${this.apiVersion}/${this.name}@${this.getAppVersion()}${digestPart}`; - } - - getName(): string { - return this.name; - } - - getFullName(seperator = "/"): string { - return [this.getRepository(), this.getName()].join(seperator); - } - - getDescription(): string { - return this.description; - } - - getIcon(): string | undefined { - return this.icon; - } - - getHome(): string | undefined { - return this.home; - } - - getMaintainers(): HelmChartMaintainer[] { - return this.maintainers; - } - - getVersion(): string { - return this.version; - } - - getRepository(): string { - return this.repo; - } - - getAppVersion(): string | undefined { - return this.appVersion; - } - - getKeywords(): string[] { - return this.keywords; - } -} diff --git a/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-charts.injectable.ts b/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-charts.injectable.ts deleted file mode 100644 index 246b628ea0..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-charts.injectable.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { RawHelmChart } from "../helm-charts.api"; -import { HelmChart } from "../helm-charts.api"; -import { isDefined } from "@k8slens/utilities"; -import apiBaseInjectable from "../../api-base.injectable"; - -export type RequestHelmCharts = () => Promise; -export type RepoHelmChartList = Record; - -/** - * Get a list of all helm charts from all saved helm repos - */ -const requestHelmChartsInjectable = getInjectable({ - id: "request-helm-charts", - instantiate: (di) => { - const apiBase = di.inject(apiBaseInjectable); - - return async () => { - const data = await apiBase.get>("/v2/charts"); - - return Object - .values(data) - .reduce((allCharts, repoCharts) => allCharts.concat(Object.values(repoCharts)), new Array()) - .map(([chart]) => HelmChart.create(chart, { onError: "log" })) - .filter(isDefined); - }; - }, -}); - -export default requestHelmChartsInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-readme.injectable.ts b/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-readme.injectable.ts deleted file mode 100644 index d6977fc5ca..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-readme.injectable.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { AsyncResult } from "@k8slens/utilities"; -import { urlBuilderFor } from "@k8slens/utilities"; -import apiBaseInjectable from "../../api-base.injectable"; - -const requestReadmeEndpoint = urlBuilderFor("/v2/charts/:repo/:name/readme"); - -export type RequestHelmChartReadme = (repo: string, name: string, version?: string) => AsyncResult; - -const requestHelmChartReadmeInjectable = getInjectable({ - id: "request-helm-chart-readme", - instantiate: (di): RequestHelmChartReadme => { - const apiBase = di.inject(apiBaseInjectable); - - return (repo, name, version) => ( - apiBase.get(requestReadmeEndpoint.compile({ name, repo }, { version })) - ); - }, -}); - -export default requestHelmChartReadmeInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-values.injectable.ts b/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-values.injectable.ts deleted file mode 100644 index 2d4e77bf33..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-values.injectable.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { AsyncResult } from "@k8slens/utilities"; -import { urlBuilderFor } from "@k8slens/utilities"; -import apiBaseInjectable from "../../api-base.injectable"; - -const requestValuesEndpoint = urlBuilderFor("/v2/charts/:repo/:name/values"); - -export type RequestHelmChartValues = (repo: string, name: string, version: string) => AsyncResult; - -const requestHelmChartValuesInjectable = getInjectable({ - id: "request-helm-chart-values", - instantiate: (di): RequestHelmChartValues => { - const apiBase = di.inject(apiBaseInjectable); - - return (repo, name, version) => ( - apiBase.get(requestValuesEndpoint.compile({ repo, name }, { version })) - ); - }, -}); - -export default requestHelmChartValuesInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-versions.injectable.ts b/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-versions.injectable.ts deleted file mode 100644 index f7527c093a..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/helm-charts.api/request-versions.injectable.ts +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { urlBuilderFor, isDefined } from "@k8slens/utilities"; -import { HelmChart } from "../helm-charts.api"; -import type { RawHelmChart } from "../helm-charts.api"; -import apiBaseInjectable from "../../api-base.injectable"; - -const requestVersionsEndpoint = urlBuilderFor("/v2/charts/:repo/:name/versions"); - -export type RequestHelmChartVersions = (repo: string, chartName: string) => Promise; - -const requestHelmChartVersionsInjectable = getInjectable({ - id: "request-helm-chart-versions", - instantiate: (di): RequestHelmChartVersions => { - const apiBase = di.inject(apiBaseInjectable); - - return async (repo, name) => { - const rawVersions = await apiBase.get(requestVersionsEndpoint.compile({ name, repo })) as RawHelmChart[]; - - return rawVersions - .map(version => HelmChart.create(version, { onError: "log" })) - .filter(isDefined); - }; - }, -}); - -export default requestHelmChartVersionsInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/helm-releases.api.ts b/packages/core/src/common/k8s-api/endpoints/helm-releases.api.ts deleted file mode 100644 index a3a1c0f866..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/helm-releases.api.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { ItemObject } from "@k8slens/list-layout"; -import type { HelmReleaseData } from "../../../features/helm-releases/common/channels"; - -export interface HelmReleaseUpdateDetails { - log: string; - release: HelmReleaseData; -} - -export interface HelmRelease extends ItemObject { - appVersion: string; - name: string; - namespace: string; - chart: string; - status: string; - updated: string; - revision: string; - getNs: () => string; - getChart: (withVersion?: boolean) => string; - getRevision: () => number; - getStatus: () => string; - getVersion: () => string; - getUpdated: (humanize?: boolean, compact?: boolean) => string | number; -} diff --git a/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-configuration.global-override-for-injectable.ts b/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-configuration.global-override-for-injectable.ts deleted file mode 100644 index 631d4c5e17..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-configuration.global-override-for-injectable.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "@k8slens/test-utils"; -import requestHelmReleaseConfigurationInjectable from "./request-configuration.injectable"; - -export default getGlobalOverride(requestHelmReleaseConfigurationInjectable, () => () => { - throw new Error("Tried to call requestHelmReleaseConfiguration with no override"); -}); diff --git a/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-configuration.injectable.ts b/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-configuration.injectable.ts deleted file mode 100644 index b9e6de7b0c..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-configuration.injectable.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { urlBuilderFor } from "@k8slens/utilities"; -import apiBaseInjectable from "../../api-base.injectable"; - -export type RequestHelmReleaseConfiguration = ( - name: string, - namespace: string, - all: boolean -) => Promise; - -const requestConfigurationEnpoint = urlBuilderFor("/v2/releases/:namespace/:name/values"); - -const requestHelmReleaseConfigurationInjectable = getInjectable({ - id: "request-helm-release-configuration", - - instantiate: (di): RequestHelmReleaseConfiguration => { - const apiBase = di.inject(apiBaseInjectable); - - return (name, namespace, all: boolean) => ( - apiBase.get(requestConfigurationEnpoint.compile({ name, namespace }, { all })) - ); - }, -}); - -export default requestHelmReleaseConfigurationInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-create.injectable.ts b/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-create.injectable.ts deleted file mode 100644 index 253e97bf72..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-create.injectable.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import yaml from "js-yaml"; -import { getInjectable } from "@ogre-tools/injectable"; -import type { HelmReleaseUpdateDetails } from "../helm-releases.api"; -import { urlBuilderFor } from "@k8slens/utilities"; -import apiBaseInjectable from "../../api-base.injectable"; - -interface HelmReleaseCreatePayload { - name?: string; - repo: string; - chart: string; - namespace: string; - version: string; - values: string; -} - -export type RequestCreateHelmRelease = (payload: HelmReleaseCreatePayload) => Promise; - -const requestCreateEndpoint = urlBuilderFor("/v2/releases"); - -const requestCreateHelmReleaseInjectable = getInjectable({ - id: "request-create-helm-release", - - instantiate: (di): RequestCreateHelmRelease => { - const apiBase = di.inject(apiBaseInjectable); - - return ({ repo, chart, values, ...data }) => { - return apiBase.post(requestCreateEndpoint.compile({}), { - data: { - chart: `${repo}/${chart}`, - values: yaml.load(values), - ...data, - }, - }); - }; - }, -}); - -export default requestCreateHelmReleaseInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-delete.injectable.ts b/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-delete.injectable.ts deleted file mode 100644 index 3b48f2d9b7..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-delete.injectable.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { urlBuilderFor } from "@k8slens/utilities"; -import apiBaseInjectable from "../../api-base.injectable"; - -export type RequestDeleteHelmRelease = (name: string, namespace: string) => Promise; - -const requestDeleteEndpoint = urlBuilderFor("/v2/releases/:namespace/:name"); - -const requestDeleteHelmReleaseInjectable = getInjectable({ - id: "request-delete-helm-release", - instantiate: (di): RequestDeleteHelmRelease => { - const apiBase = di.inject(apiBaseInjectable); - - return (name, namespace) => apiBase.del(requestDeleteEndpoint.compile({ name, namespace })); - }, -}); - -export default requestDeleteHelmReleaseInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-history.injectable.ts b/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-history.injectable.ts deleted file mode 100644 index 9a9a3159ea..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-history.injectable.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { urlBuilderFor } from "@k8slens/utilities"; -import apiBaseInjectable from "../../api-base.injectable"; - -export interface HelmReleaseRevision { - revision: number; - updated: string; - status: string; - chart: string; - app_version: string; - description: string; -} - -export type RequestHelmReleaseHistory = (name: string, namespace: string) => Promise; - -const requestHistoryEnpoint = urlBuilderFor("/v2/releases/:namespace/:name/history"); - -const requestHelmReleaseHistoryInjectable = getInjectable({ - id: "request-helm-release-history", - instantiate: (di): RequestHelmReleaseHistory => { - const apiBase = di.inject(apiBaseInjectable); - - return (name, namespace) => apiBase.get(requestHistoryEnpoint.compile({ name, namespace })); - }, -}); - -export default requestHelmReleaseHistoryInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-rollback.injectable.ts b/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-rollback.injectable.ts deleted file mode 100644 index 6409ab4855..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-rollback.injectable.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { urlBuilderFor } from "@k8slens/utilities"; -import apiBaseInjectable from "../../api-base.injectable"; - -export type RequestHelmReleaseRollback = (name: string, namespace: string, revision: number) => Promise; - -const requestRollbackEndpoint = urlBuilderFor("/v2/releases/:namespace/:name/rollback"); - -const requestHelmReleaseRollbackInjectable = getInjectable({ - id: "request-helm-release-rollback", - instantiate: (di): RequestHelmReleaseRollback => { - const apiBase = di.inject(apiBaseInjectable); - - return async (name, namespace, revision) => { - await apiBase.put( - requestRollbackEndpoint.compile({ name, namespace }), - { data: { revision }}, - ); - }; - }, -}); - -export default requestHelmReleaseRollbackInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-update.injectable.ts b/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-update.injectable.ts deleted file mode 100644 index 3a23536673..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-update.injectable.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { urlBuilderFor } from "@k8slens/utilities"; -import type { AsyncResult } from "@k8slens/utilities"; -import apiBaseInjectable from "../../api-base.injectable"; - -interface HelmReleaseUpdatePayload { - repo: string; - chart: string; - version: string; - values: string; -} - -export type RequestHelmReleaseUpdate = ( - name: string, - namespace: string, - payload: HelmReleaseUpdatePayload -) => AsyncResult; - -const requestUpdateEndpoint = urlBuilderFor("/v2/releases/:namespace/:name"); - -const requestHelmReleaseUpdateInjectable = getInjectable({ - id: "request-helm-release-update", - - instantiate: (di): RequestHelmReleaseUpdate => { - const apiBase = di.inject(apiBaseInjectable); - - return async (name, namespace, { repo, chart, values, version }) => { - try { - await apiBase.put(requestUpdateEndpoint.compile({ name, namespace }), { - data: { - chart: `${repo}/${chart}`, - values, - version, - }, - }); - } catch (e) { - return { callWasSuccessful: false, error: e }; - } - - return { callWasSuccessful: true }; - }; - }, -}); - -export default requestHelmReleaseUpdateInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-values.injectable.ts b/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-values.injectable.ts deleted file mode 100644 index a1668b993e..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/helm-releases.api/request-values.injectable.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { urlBuilderFor } from "@k8slens/utilities"; -import apiBaseInjectable from "../../api-base.injectable"; - -export type RequestHelmReleaseValues = (name: string, namespace: string, all?: boolean) => Promise; - -const requestValuesEndpoint = urlBuilderFor("/v2/release/:namespace/:name/values"); - -const requestHelmReleaseValuesInjectable = getInjectable({ - id: "request-helm-release-values", - instantiate: (di): RequestHelmReleaseValues => { - const apiBase = di.inject(apiBaseInjectable); - - return (name, namespace, all) => apiBase.get(requestValuesEndpoint.compile({ name, namespace }, { all })); - }, -}); - -export default requestHelmReleaseValuesInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/metrics.api.ts b/packages/core/src/common/k8s-api/endpoints/metrics.api.ts deleted file mode 100644 index 69465bbf6e..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/metrics.api.ts +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -// Metrics api - -import moment from "moment"; -import { isDefined, object } from "@k8slens/utilities"; - -export interface MetricData { - status: string; - data: { - resultType: string; - result: MetricResult[]; - }; -} - -export interface MetricResult { - metric: { - [name: string]: string | undefined; - instance?: string; - node?: string; - pod?: string; - kubernetes?: string; - kubernetes_node?: string; - kubernetes_namespace?: string; - }; - values: [number, string][]; -} - -export function normalizeMetrics(metrics: MetricData | undefined | null, frames = 60): MetricData { - if (!metrics?.data?.result) { - return { - data: { - resultType: "", - result: [{ - metric: {}, - values: [], - }], - }, - status: "", - }; - } - - const { result } = metrics.data; - - if (result.length) { - if (frames > 0) { - // fill the gaps - result.forEach(res => { - if (!res.values || !res.values.length) return; - - let now = moment().startOf("minute").subtract(1, "minute").unix(); - let timestamp = res.values[0][0]; - - while (timestamp <= now) { - timestamp = moment.unix(timestamp).add(1, "minute").unix(); - - if (!res.values.find((value) => value[0] === timestamp)) { - res.values.push([timestamp, "0"]); - } - } - - while (res.values.length < frames) { - const timestamp = moment.unix(res.values[0][0]).subtract(1, "minute").unix(); - - if (!res.values.find((value) => value[0] === timestamp)) { - res.values.unshift([timestamp, "0"]); - } - now = timestamp; - } - }); - } - } - else { - // always return at least empty values array - result.push({ - metric: {}, - values: [], - } as MetricResult); - } - - return metrics; -} - -export function isMetricsEmpty(metrics: Partial>) { - return Object.values(metrics).every(metric => !metric?.data?.result?.length); -} - -export function getItemMetrics(metrics: Partial> | null | undefined, itemName: string): Partial> | undefined { - if (!metrics) { - return undefined; - } - - const itemMetrics = { ...metrics }; - - for (const metric in metrics) { - if (!metrics[metric]?.data?.result) { - continue; - } - const results = metrics[metric]?.data.result; - const result = results?.find(res => Object.values(res.metric)[0] == itemName); - - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - itemMetrics[metric]!.data.result = result ? [result] : []; - } - - return itemMetrics; -} - -export function getMetricLastPoints(metrics: Partial>): Partial> { - return object.fromEntries( - object.entries(metrics) - .map(([metricName, metric]) => { - try { - return [metricName, +metric.data.result[0].values.slice(-1)[0][1]] as const; - } catch { - return undefined; - } - }) - .filter(isDefined), - ); -} diff --git a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-cluster-metrics-by-node-names.injectable.ts b/packages/core/src/common/k8s-api/endpoints/metrics.api/request-cluster-metrics-by-node-names.injectable.ts deleted file mode 100644 index 84268e3f6a..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-cluster-metrics-by-node-names.injectable.ts +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { MetricData } from "../metrics.api"; -import type { RequestMetricsParams } from "./request-metrics.injectable"; -import requestMetricsInjectable from "./request-metrics.injectable"; - -export interface ClusterMetricData { - memoryUsage: MetricData; - memoryRequests: MetricData; - memoryLimits: MetricData; - memoryCapacity: MetricData; - memoryAllocatableCapacity: MetricData; - cpuUsage: MetricData; - cpuRequests: MetricData; - cpuLimits: MetricData; - cpuCapacity: MetricData; - cpuAllocatableCapacity: MetricData; - podUsage: MetricData; - podCapacity: MetricData; - podAllocatableCapacity: MetricData; - fsSize: MetricData; - fsUsage: MetricData; -} - -export type RequestClusterMetricsByNodeNames = (nodeNames: string[], params?: RequestMetricsParams) => Promise; - -const requestClusterMetricsByNodeNamesInjectable = getInjectable({ - id: "get-cluster-metrics-by-node-names", - instantiate: (di): RequestClusterMetricsByNodeNames => { - const requestMetrics = di.inject(requestMetricsInjectable); - - return (nodeNames, params) => { - const opts = { - category: "cluster", - nodes: nodeNames.join("|"), - }; - - return requestMetrics({ - memoryUsage: opts, - workloadMemoryUsage: opts, - memoryRequests: opts, - memoryLimits: opts, - memoryCapacity: opts, - memoryAllocatableCapacity: opts, - cpuUsage: opts, - cpuRequests: opts, - cpuLimits: opts, - cpuCapacity: opts, - cpuAllocatableCapacity: opts, - podUsage: opts, - podCapacity: opts, - podAllocatableCapacity: opts, - fsSize: opts, - fsUsage: opts, - }, params); - }; - }, -}); - -export default requestClusterMetricsByNodeNamesInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-ingress-metrics.injectable.ts b/packages/core/src/common/k8s-api/endpoints/metrics.api/request-ingress-metrics.injectable.ts deleted file mode 100644 index 8167a6bef4..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-ingress-metrics.injectable.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { MetricData } from "../metrics.api"; -import requestMetricsInjectable from "./request-metrics.injectable"; - -export interface IngressMetricData { - bytesSentSuccess: MetricData; - bytesSentFailure: MetricData; - requestDurationSeconds: MetricData; - responseDurationSeconds: MetricData; -} - -export type RequestIngressMetrics = (ingress: string, namespace: string) => Promise; - -const requestIngressMetricsInjectable = getInjectable({ - id: "request-ingress-metrics", - instantiate: (di): RequestIngressMetrics => { - const requestMetrics = di.inject(requestMetricsInjectable); - - return (ingress, namespace) => { - const opts = { category: "ingress", ingress, namespace }; - - return requestMetrics({ - bytesSentSuccess: opts, - bytesSentFailure: opts, - requestDurationSeconds: opts, - responseDurationSeconds: opts, - }, { - namespace, - }); - }; - }, -}); - -export default requestIngressMetricsInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-metrics-for-all-nodes.injectable.ts b/packages/core/src/common/k8s-api/endpoints/metrics.api/request-metrics-for-all-nodes.injectable.ts deleted file mode 100644 index 6789d6debc..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-metrics-for-all-nodes.injectable.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { MetricData } from "../metrics.api"; -import requestMetricsInjectable from "./request-metrics.injectable"; - -export interface NodeMetricData { - memoryUsage: MetricData; - workloadMemoryUsage: MetricData; - memoryCapacity: MetricData; - memoryAllocatableCapacity: MetricData; - cpuUsage: MetricData; - cpuCapacity: MetricData; - fsUsage: MetricData; - fsSize: MetricData; -} - -export type RequestAllNodeMetrics = () => Promise; - -const requestAllNodeMetricsInjectable = getInjectable({ - id: "request-all-node-metrics", - instantiate: (di): RequestAllNodeMetrics => { - const requestMetrics = di.inject(requestMetricsInjectable); - - return () => { - const opts = { category: "nodes" }; - - return requestMetrics({ - memoryUsage: opts, - workloadMemoryUsage: opts, - memoryCapacity: opts, - memoryAllocatableCapacity: opts, - cpuUsage: opts, - cpuCapacity: opts, - fsSize: opts, - fsUsage: opts, - }); - }; - }, -}); - -export default requestAllNodeMetricsInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-metrics.injectable.ts b/packages/core/src/common/k8s-api/endpoints/metrics.api/request-metrics.injectable.ts deleted file mode 100644 index 003c5ca692..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-metrics.injectable.ts +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { getSecondsFromUnixEpoch } from "../../../utils/date/get-current-date-time"; -import apiBaseInjectable from "../../api-base.injectable"; -import type { MetricData } from "../metrics.api"; - -export interface RequestMetricsParams { - /** - * timestamp in seconds or valid date-string - */ - start?: number | string; - - /** - * timestamp in seconds or valid date-string - */ - end?: number | string; - - /** - * step in seconds - * @default 60 (1 minute) - */ - step?: number; - - /** - * time-range in seconds for data aggregation - * @default 3600 (1 hour) - */ - range?: number; - - /** - * rbac-proxy validation param - */ - namespace?: string; -} - -export type RequestMetrics = ReturnType; - -const requestMetricsInjectable = getInjectable({ - id: "request-metrics", - instantiate: (di) => { - const apiBase = di.inject(apiBaseInjectable); - - function requestMetrics(query: string, params?: RequestMetricsParams): Promise; - function requestMetrics(query: string[], params?: RequestMetricsParams): Promise; - function requestMetrics(query: Record>>, params?: RequestMetricsParams): Promise>; - async function requestMetrics(query: string | string[] | Partial>>>, params: RequestMetricsParams = {}): Promise>> { - const { range = 3600, step = 60, namespace } = params; - let { start, end } = params; - - if (!start && !end) { - const now = getSecondsFromUnixEpoch(); - - start = now - range; - end = now; - } - - return apiBase.post("/metrics", { - data: query, - query: { - start, end, step, - "kubernetes_namespace": namespace, - }, - }); - } - - return requestMetrics; - }, -}); - -export default requestMetricsInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-persistent-volume-claim-metrics.injectable.ts b/packages/core/src/common/k8s-api/endpoints/metrics.api/request-persistent-volume-claim-metrics.injectable.ts deleted file mode 100644 index 3291e02922..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-persistent-volume-claim-metrics.injectable.ts +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { MetricData } from "../metrics.api"; -import type { PersistentVolumeClaim } from "@k8slens/kube-object"; -import requestMetricsInjectable from "./request-metrics.injectable"; - -export interface PersistentVolumeClaimMetricData { - diskUsage: MetricData; - diskCapacity: MetricData; -} - -export type RequestPersistentVolumeClaimMetrics = (claim: PersistentVolumeClaim) => Promise; - -const requestPersistentVolumeClaimMetricsInjectable = getInjectable({ - id: "request-persistent-volume-claim-metrics", - instantiate: (di): RequestPersistentVolumeClaimMetrics => { - const requestMetrics = di.inject(requestMetricsInjectable); - - return (claim) => { - const opts = { category: "pvc", pvc: claim.getName(), namespace: claim.getNs() }; - - return requestMetrics({ - diskUsage: opts, - diskCapacity: opts, - }, { - namespace: opts.namespace, - }); - }; - }, -}); - -export default requestPersistentVolumeClaimMetricsInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics-for-daemon-sets.injectable.ts b/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics-for-daemon-sets.injectable.ts deleted file mode 100644 index dcd41cbdb8..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics-for-daemon-sets.injectable.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { DaemonSet } from "@k8slens/kube-object"; -import type { MetricData } from "../metrics.api"; -import requestMetricsInjectable from "./request-metrics.injectable"; - -export interface DaemonSetPodMetricData { - cpuUsage: MetricData; - memoryUsage: MetricData; - fsUsage: MetricData; - fsWrites: MetricData; - fsReads: MetricData; - networkReceive: MetricData; - networkTransmit: MetricData; -} - -export type RequestPodMetricsForDaemonSets = (daemonsets: DaemonSet[], namespace: string, selector?: string) => Promise; - -const requestPodMetricsForDaemonSetsInjectable = getInjectable({ - id: "request-pod-metrics-for-daemon-sets", - instantiate: (di): RequestPodMetricsForDaemonSets => { - const requestMetrics = di.inject(requestMetricsInjectable); - - return (daemonSets, namespace, selector = "") => { - const podSelector = daemonSets.map(daemonSet => `${daemonSet.getName()}-[[:alnum:]]{5}`).join("|"); - const opts = { category: "pods", pods: podSelector, namespace, selector }; - - return requestMetrics({ - cpuUsage: opts, - memoryUsage: opts, - fsUsage: opts, - fsWrites: opts, - fsReads: opts, - networkReceive: opts, - networkTransmit: opts, - }, { - namespace, - }); - }; - }, -}); - -export default requestPodMetricsForDaemonSetsInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics-for-deployments.injectable.ts b/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics-for-deployments.injectable.ts deleted file mode 100644 index d44b97d5db..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics-for-deployments.injectable.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { Deployment } from "@k8slens/kube-object"; -import type { MetricData } from "../metrics.api"; -import requestMetricsInjectable from "./request-metrics.injectable"; - -export interface DeploymentPodMetricData { - cpuUsage: MetricData; - memoryUsage: MetricData; - fsUsage: MetricData; - fsWrites: MetricData; - fsReads: MetricData; - networkReceive: MetricData; - networkTransmit: MetricData; -} - -export type RequestPodMetricsForDeployments = (deployments: Deployment[], namespace: string, selector?: string) => Promise; - -const requestPodMetricsForDeploymentsInjectable = getInjectable({ - id: "request-pod-metrics-for-deployments", - instantiate: (di): RequestPodMetricsForDeployments => { - const requestMetrics = di.inject(requestMetricsInjectable); - - return (deployments, namespace, selector = "") => { - const podSelector = deployments.map(deployment => `${deployment.getName()}-[[:alnum:]]{9,}-[[:alnum:]]{5}`).join("|"); - const opts = { category: "pods", pods: podSelector, namespace, selector }; - - return requestMetrics({ - cpuUsage: opts, - memoryUsage: opts, - fsUsage: opts, - fsWrites: opts, - fsReads: opts, - networkReceive: opts, - networkTransmit: opts, - }, { - namespace, - }); - }; - }, -}); - -export default requestPodMetricsForDeploymentsInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics-for-jobs.injectable.ts b/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics-for-jobs.injectable.ts deleted file mode 100644 index a0bff54465..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics-for-jobs.injectable.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { Job } from "@k8slens/kube-object"; -import type { MetricData } from "../metrics.api"; -import requestMetricsInjectable from "./request-metrics.injectable"; - -export interface JobPodMetricData { - cpuUsage: MetricData; - memoryUsage: MetricData; - fsUsage: MetricData; - fsWrites: MetricData; - fsReads: MetricData; - networkReceive: MetricData; - networkTransmit: MetricData; -} - -export type RequestPodMetricsForJobs = (jobs: Job[], namespace: string, selector?: string) => Promise; - -const requestPodMetricsForJobsInjectable = getInjectable({ - id: "request-pod-metrics-for-jobs", - instantiate: (di): RequestPodMetricsForJobs => { - const requestMetrics = di.inject(requestMetricsInjectable); - - return (jobs, namespace, selector = "") => { - const podSelector = jobs.map(job => `${job.getName()}-[[:alnum:]]{5}`).join("|"); - const opts = { category: "pods", pods: podSelector, namespace, selector }; - - return requestMetrics({ - cpuUsage: opts, - memoryUsage: opts, - fsUsage: opts, - fsWrites: opts, - fsReads: opts, - networkReceive: opts, - networkTransmit: opts, - }, { - namespace, - }); - }; - }, -}); - -export default requestPodMetricsForJobsInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics-for-replica-sets.injectable.ts b/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics-for-replica-sets.injectable.ts deleted file mode 100644 index f3d6fad3a5..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics-for-replica-sets.injectable.ts +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { MetricData } from "../metrics.api"; -import type { ReplicaSet } from "@k8slens/kube-object"; -import requestMetricsInjectable from "./request-metrics.injectable"; - -export interface ReplicaSetPodMetricData { - cpuUsage: MetricData; - memoryUsage: MetricData; - fsUsage: MetricData; - fsWrites: MetricData; - fsReads: MetricData; - networkReceive: MetricData; - networkTransmit: MetricData; -} - -export type RequestPodMetricsForReplicaSets = (replicaSets: ReplicaSet[], namespace: string, selector?: string) => Promise; - -const requestPodMetricsForReplicaSetsInjectable = getInjectable({ - id: "request-pod-metrics-for-replica-sets", - instantiate: (di): RequestPodMetricsForReplicaSets => { - const requestMetrics = di.inject(requestMetricsInjectable); - - return (replicaSets, namespace, selector = "") => { - const podSelector = replicaSets.map(replicaSet => `${replicaSet.getName()}-[[:alnum:]]{5}`).join("|"); - const opts = { category: "pods", pods: podSelector, namespace, selector }; - - return requestMetrics({ - cpuUsage: opts, - memoryUsage: opts, - fsUsage: opts, - fsWrites: opts, - fsReads: opts, - networkReceive: opts, - networkTransmit: opts, - }, { - namespace, - }); - }; - }, -}); - -export default requestPodMetricsForReplicaSetsInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics-for-stateful-sets.injectable.ts b/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics-for-stateful-sets.injectable.ts deleted file mode 100644 index 15971743dc..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics-for-stateful-sets.injectable.ts +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { MetricData } from "../metrics.api"; -import type { StatefulSet } from "@k8slens/kube-object"; -import requestMetricsInjectable from "./request-metrics.injectable"; - -export interface StatefulSetPodMetricData { - cpuUsage: MetricData; - memoryUsage: MetricData; - fsUsage: MetricData; - fsWrites: MetricData; - fsReads: MetricData; - networkReceive: MetricData; - networkTransmit: MetricData; -} - -export type RequestPodMetricsForStatefulSets = (statefulSets: StatefulSet[], namespace: string, selector?: string) => Promise; - -const requestPodMetricsForStatefulSetsInjectable = getInjectable({ - id: "request-pod-metrics-for-stateful-sets", - instantiate: (di): RequestPodMetricsForStatefulSets => { - const requestMetrics = di.inject(requestMetricsInjectable); - - return (statefulSets, namespace, selector = "") => { - const podSelector = statefulSets.map(statefulset => `${statefulset.getName()}-[[:digit:]]+`).join("|"); - const opts = { category: "pods", pods: podSelector, namespace, selector }; - - return requestMetrics({ - cpuUsage: opts, - memoryUsage: opts, - fsUsage: opts, - fsWrites: opts, - fsReads: opts, - networkReceive: opts, - networkTransmit: opts, - }, { - namespace, - }); - }; - }, -}); - -export default requestPodMetricsForStatefulSetsInjectable; - diff --git a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics-in-namespace.injectable.ts b/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics-in-namespace.injectable.ts deleted file mode 100644 index 872ffd740e..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics-in-namespace.injectable.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { MetricData } from "../metrics.api"; -import requestMetricsInjectable from "./request-metrics.injectable"; - -export interface PodMetricInNamespaceData { - cpuUsage: MetricData; - memoryUsage: MetricData; - fsUsage: MetricData; - fsWrites: MetricData; - fsReads: MetricData; - networkReceive: MetricData; - networkTransmit: MetricData; -} - -export type RequestPodMetricsInNamespace = (namespace: string, selector?: string) => Promise; - -const requestPodMetricsInNamespaceInjectable = getInjectable({ - id: "request-pod-metrics-in-namespace", - instantiate: (di): RequestPodMetricsInNamespace => { - const requestMetrics = di.inject(requestMetricsInjectable); - - return (namespace, selector) => { - const opts = { category: "pods", pods: ".*", namespace, selector }; - - return requestMetrics({ - cpuUsage: opts, - memoryUsage: opts, - fsUsage: opts, - fsWrites: opts, - fsReads: opts, - networkReceive: opts, - networkTransmit: opts, - }, { - namespace, - }); - }; - }, -}); - -export default requestPodMetricsInNamespaceInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics.injectable.ts b/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics.injectable.ts deleted file mode 100644 index ca181e1f2b..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-pod-metrics.injectable.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { MetricData } from "../metrics.api"; -import type { Pod, Container } from "@k8slens/kube-object"; -import requestMetricsInjectable from "./request-metrics.injectable"; - -export interface PodMetricData { - cpuUsage: MetricData; - memoryUsage: MetricData; - fsUsage: MetricData; - fsWrites: MetricData; - fsReads: MetricData; - networkReceive: MetricData; - networkTransmit: MetricData; - cpuRequests: MetricData; - cpuLimits: MetricData; - memoryRequests: MetricData; - memoryLimits: MetricData; -} - -export type RequestPodMetrics = (pods: Pod[], namespace: string, container?: Container, selector?: string) => Promise; - -const requestPodMetricsInjectable = getInjectable({ - id: "request-pod-metrics", - instantiate: (di): RequestPodMetrics => { - const requestMetrics = di.inject(requestMetricsInjectable); - - return (pods, namespace, container, selector = "pod, namespace") => { - const podSelector = pods.map(pod => pod.getName()).join("|"); - const opts = { category: "pods", pods: podSelector, container: container?.name, namespace, selector }; - - return requestMetrics({ - cpuUsage: opts, - cpuRequests: opts, - cpuLimits: opts, - memoryUsage: opts, - memoryRequests: opts, - memoryLimits: opts, - fsUsage: opts, - fsWrites: opts, - fsReads: opts, - networkReceive: opts, - networkTransmit: opts, - }, { - namespace, - }); - }; - }, -}); - -export default requestPodMetricsInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-providers.injectable.ts b/packages/core/src/common/k8s-api/endpoints/metrics.api/request-providers.injectable.ts deleted file mode 100644 index 0c74c4d58d..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/metrics.api/request-providers.injectable.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getInjectable } from "@ogre-tools/injectable"; -import apiBaseInjectable from "../../api-base.injectable"; - -export interface MetricProviderInfo { - name: string; - id: string; - isConfigurable: boolean; -} - -export type RequestMetricsProviders = () => Promise; - -const requestMetricsProvidersInjectable = getInjectable({ - id: "request-metrics-providers", - instantiate: (di): RequestMetricsProviders => { - const apiBase = di.inject(apiBaseInjectable); - - return () => apiBase.get("/metrics/providers"); - }, -}); - -export default requestMetricsProvidersInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/resource-applier.api/request-patch.injectable.ts b/packages/core/src/common/k8s-api/endpoints/resource-applier.api/request-patch.injectable.ts deleted file mode 100644 index cd07058da8..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/resource-applier.api/request-patch.injectable.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { Patch } from "rfc6902"; -import apiBaseInjectable from "../../api-base.injectable"; -import type { AsyncResult, Result } from "@k8slens/utilities"; -import type { KubeJsonApiData } from "@k8slens/kube-object"; - -export type RequestKubeObjectPatch = (name: string, kind: string, ns: string | undefined, patch: Patch) => AsyncResult; - -const requestKubeObjectPatchInjectable = getInjectable({ - id: "request-kube-object-patch", - instantiate: (di): RequestKubeObjectPatch => { - const apiBase = di.inject(apiBaseInjectable); - - return async (name, kind, ns, patch) => { - const result = (await apiBase.patch("/stack", { - data: { - name, - kind, - ns, - patch, - }, - })) as Result; - - if (!result.callWasSuccessful) { - return result; - } - - try { - const response = JSON.parse(result.response) as KubeJsonApiData; - - return { - callWasSuccessful: true, - response, - }; - } catch (error) { - return { - callWasSuccessful: false, - error: String(error), - }; - } - }; - }, -}); - -export default requestKubeObjectPatchInjectable; diff --git a/packages/core/src/common/k8s-api/endpoints/resource-applier.api/request-update.injectable.ts b/packages/core/src/common/k8s-api/endpoints/resource-applier.api/request-update.injectable.ts deleted file mode 100644 index 5e094c7a80..0000000000 --- a/packages/core/src/common/k8s-api/endpoints/resource-applier.api/request-update.injectable.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import apiBaseInjectable from "../../api-base.injectable"; -import type { AsyncResult, Result } from "@k8slens/utilities"; -import type { KubeJsonApiData } from "@k8slens/kube-object"; - -export type RequestKubeObjectCreation = (resourceDescriptor: string) => AsyncResult; - -const requestKubeObjectCreationInjectable = getInjectable({ - id: "request-kube-object-creation", - instantiate: (di): RequestKubeObjectCreation => { - const apiBase = di.inject(apiBaseInjectable); - - return async (data) => { - const result = await apiBase.post("/stack", { data }) as Result; - - if (!result.callWasSuccessful) { - return result; - } - - try { - const response = JSON.parse(result.response); - - return { - callWasSuccessful: true, - response, - }; - } catch (error) { - return { - callWasSuccessful: false, - error: String(error), - }; - } - }; - }, -}); - -export default requestKubeObjectCreationInjectable; diff --git a/packages/core/src/common/k8s-api/kube-api/get-kube-api-from-path.injectable.ts b/packages/core/src/common/k8s-api/kube-api/get-kube-api-from-path.injectable.ts deleted file mode 100644 index ae82fe9ec5..0000000000 --- a/packages/core/src/common/k8s-api/kube-api/get-kube-api-from-path.injectable.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { parseKubeApi } from "@k8slens/kube-api"; -import { kubeApiInjectionToken } from "@k8slens/kube-api-specifics"; -import type { KubeApi } from "@k8slens/kube-api"; - -export type GetKubeApiFromPath = (apiPath: string) => KubeApi | undefined; - -const getKubeApiFromPathInjectable = getInjectable({ - id: "get-kube-api-from-path", - - instantiate: (di): GetKubeApiFromPath => { - const kubeApis = di.injectMany(kubeApiInjectionToken); - - return (apiPath: string) => { - const parsed = parseKubeApi(apiPath); - - return kubeApis.find((api) => api.apiBase === parsed?.apiBase); - }; - }, -}); - -export default getKubeApiFromPathInjectable; diff --git a/packages/core/src/common/k8s-api/kube-object-status.ts b/packages/core/src/common/k8s-api/kube-object-status.ts deleted file mode 100644 index 200bf35b5d..0000000000 --- a/packages/core/src/common/k8s-api/kube-object-status.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export interface KubeObjectStatus { - level: KubeObjectStatusLevel; - text: string; - timestamp?: string; -} - -export enum KubeObjectStatusLevel { - INFO = 1, - WARNING = 2, - CRITICAL = 3, -} diff --git a/packages/core/src/common/k8s-api/kube-object.store.ts b/packages/core/src/common/k8s-api/kube-object.store.ts deleted file mode 100644 index 78cf4f7fe2..0000000000 --- a/packages/core/src/common/k8s-api/kube-object.store.ts +++ /dev/null @@ -1,543 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { action, computed, makeObservable, observable, reaction } from "mobx"; -import type { Disposer } from "@k8slens/utilities"; -import { waitUntilDefined, includes, rejectPromiseBy, object } from "@k8slens/utilities"; -import type { KubeJsonApiDataFor, KubeObject } from "@k8slens/kube-object"; -import { KubeStatus } from "@k8slens/kube-object"; -import type { IKubeWatchEvent, KubeApiQueryParams, KubeApi, KubeApiWatchCallback } from "@k8slens/kube-api"; -import { ItemStore } from "../item.store"; -import { parseKubeApi } from "@k8slens/kube-api"; -import type { RequestInit } from "@k8slens/node-fetch"; -import type { Patch } from "rfc6902"; -import type { Logger } from "@k8slens/logger"; -import assert from "assert"; -import type { PartialDeep } from "type-fest"; -import type { ClusterContext } from "../../renderer/cluster-frame-context/cluster-frame-context"; -import autoBind from "auto-bind"; - -export type OnLoadFailure = (error: unknown) => void; - -export interface KubeObjectStoreLoadingParams { - namespaces: string[]; - reqInit?: RequestInit; - - /** - * A function that is called when listing fails. If set then blocks errors - * being rejected with - */ - onLoadFailure?: OnLoadFailure; -} - -export interface KubeObjectStoreLoadAllParams { - namespaces?: string[]; - merge?: boolean; - reqInit?: RequestInit; - - /** - * A function that is called when listing fails. If set then blocks errors - * being rejected with - */ - onLoadFailure?: OnLoadFailure; -} - -export interface KubeObjectStoreSubscribeParams { - /** - * A function that is called when listing fails. If set then blocks errors - * being rejected with - */ - onLoadFailure?: OnLoadFailure; - - /** - * An optional parent abort controller - */ - abortController?: AbortController; -} - -export interface MergeItemsOptions { - merge?: boolean; - updateStore?: boolean; - sort?: boolean; - filter?: boolean; - namespaces: string[]; -} - -export interface StatusProvider { - getStatuses(items: K[]): Record; -} - -export interface KubeObjectStoreOptions { - limit?: number; - bufferSize?: number; -} - -export type KubeApiDataFrom = A extends KubeApi - ? D extends KubeJsonApiDataFor - ? D - : never - : never; - -export type JsonPatch = Patch; - -export interface KubeObjectStoreDependencies { - readonly context: ClusterContext; - readonly logger: Logger; -} - -export class KubeObjectStore< - K extends KubeObject = KubeObject, - A extends KubeApi = KubeApi>, - D extends KubeJsonApiDataFor = KubeApiDataFrom, -> extends ItemStore { - public readonly limit: number | undefined; - public readonly bufferSize: number; - - private readonly loadedNamespaces = observable.box(); - - constructor( - protected readonly dependencies: KubeObjectStoreDependencies, - public readonly api: A, - opts?: KubeObjectStoreOptions, - ) { - super(); - this.limit = opts?.limit; - this.bufferSize = opts?.bufferSize ?? 50_000; - - makeObservable(this); - autoBind(this); - this.bindWatchEventsUpdater(); - } - - // TODO: Circular dependency: KubeObjectStore -> ClusterFrameContext -> NamespaceStore -> KubeObjectStore - @computed get contextItems(): K[] { - const namespaces = this.dependencies.context.contextNamespaces; - - return this.items.filter(item => { - const itemNamespace = item.getNs(); - - return !itemNamespace /* cluster-wide */ || namespaces.includes(itemNamespace); - }); - } - - getTotalCount(): number { - return this.contextItems.length; - } - - get query(): KubeApiQueryParams { - const { limit } = this; - - if (!limit) { - return {}; - } - - return { limit }; - } - - getAllByNs(namespace: string | string[], strict = false): K[] { - const namespaces = [namespace].flat(); - - if (namespaces.length) { - return this.items.filter(item => includes(namespaces, item.getNs())); - } - - if (!strict) { - return this.items; - } - - return []; - } - - getById(id: string): K | undefined { - return this.items.find(item => item.getId() === id); - } - - getByName(name: string, namespace?: string): K | undefined { - return this.items.find(item => { - return item.getName() === name && ( - namespace ? item.getNs() === namespace : true - ); - }); - } - - getByPath(path: string): K | undefined { - return this.items.find(item => item.selfLink === path); - } - - getByLabel(labels: string[] | Partial>): K[] { - if (Array.isArray(labels)) { - return this.items.filter((item: K) => { - const itemLabels = item.getLabels(); - - return labels.every(label => itemLabels.includes(label)); - }); - } else { - return this.items.filter((item: K) => { - const itemLabels = item.metadata.labels || {}; - - return object.entries(labels) - .every(([key, value]) => itemLabels[key] === value); - }); - } - } - - protected async loadItems({ namespaces, reqInit, onLoadFailure }: KubeObjectStoreLoadingParams): Promise { - const isLoadingAll = this.dependencies.context.isLoadingAll(namespaces); - - if (!this.api.isNamespaced || isLoadingAll) { - if (this.api.isNamespaced) { - this.loadedNamespaces.set([]); - } - - const res = this.api.list({ reqInit }, this.query); - - if (onLoadFailure) { - try { - return await res ?? []; - } catch (error) { - onLoadFailure(new Error(`Failed to load ${this.api.apiBase}`, { cause: error })); - - // reset the store because we are loading all, so that nothing is displayed - this.items.clear(); - this.selectedItemsIds.clear(); - - return []; - } - } - - return await res ?? []; - } - - this.loadedNamespaces.set(namespaces); - - const results = await Promise.allSettled( - namespaces.map(namespace => this.api.list({ namespace, reqInit }, this.query)), - ); - const res: K[] = []; - - for (const result of results) { - switch (result.status) { - case "fulfilled": - res.push(...result.value ?? []); - break; - - case "rejected": - if (onLoadFailure) { - onLoadFailure(new Error(`Failed to load ${this.api.apiBase}`, { cause: result.reason })); - } else { - // if onLoadFailure is not provided then preserve old behaviour - throw result.reason; - } - } - } - - return res; - } - - protected filterItemsOnLoad(items: K[]) { - return items; - } - - @action - async loadAll({ namespaces, merge = true, reqInit, onLoadFailure }: KubeObjectStoreLoadAllParams = {}): Promise { - namespaces ??= this.dependencies.context.contextNamespaces; - this.isLoading = true; - - try { - const items = await this.loadItems({ namespaces, reqInit, onLoadFailure }); - - this.mergeItems(items, { merge, namespaces }); - - this.isLoaded = true; - this.failedLoading = false; - - return items; - } catch (error) { - console.warn("[KubeObjectStore] loadAll failed", this.api.apiBase, error); - this.resetOnError(error); - this.failedLoading = true; - } finally { - this.isLoading = false; - } - - return undefined; - } - - @action - async reloadAll(opts: { force?: boolean; namespaces?: string[]; merge?: boolean } = {}): Promise { - const { force = false, ...loadingOptions } = opts; - - if (this.isLoading || (this.isLoaded && !force)) { - return undefined; - } - - return this.loadAll(loadingOptions); - } - - @action - protected mergeItems(partialItems: K[], { merge = true, updateStore = true, sort = true, filter = true, namespaces }: MergeItemsOptions): K[] { - let items = partialItems; - - // update existing items - if (merge && this.api.isNamespaced) { - const ns = new Set(namespaces); - - items = [ - ...this.items.filter(item => !ns.has(item.getNs() as string)), - ...partialItems, - ]; - } - - if (filter) items = this.filterItemsOnLoad(items); - if (sort) items = this.sortItems(items); - if (updateStore) this.items.replace(items); - - return items; - } - - protected resetOnError(error: any) { - if (error) this.reset(); - } - - protected async loadItem(params: { name: string; namespace?: string }): Promise { - return this.api.get(params); - } - - @action - async load(params: { name: string; namespace?: string }): Promise { - const { name, namespace } = params; - let item: K | null | undefined = this.getByName(name, namespace); - - if (!item) { - item = await this.loadItem(params); - assert(item, "Failed to load item from kube"); - const newItems = this.sortItems([...this.items, item]); - - this.items.replace(newItems); - } - - return item; - } - - @action - async loadFromPath(resourcePath: string) { - const parsedApi = parseKubeApi(resourcePath); - - assert(parsedApi, "resourcePath must be a valid kube api"); - - const { namespace, name } = parsedApi; - - assert(name, "name must be part of resourcePath"); - - return this.load({ name, namespace }); - } - - protected async createItem(params: { name: string; namespace?: string }, data?: PartialDeep): Promise { - return this.api.create(params, data); - } - - async create(params: { name: string; namespace?: string }, data?: PartialDeep): Promise { - const newItem = await this.createItem(params, data); - - assert(newItem, "Failed to create item from kube"); - const items = this.sortItems([...this.items, newItem]); - - this.items.replace(items); - - return newItem; - } - - private postUpdate(newItem: K): K { - const index = this.items.findIndex(item => item.getId() === newItem.getId()); - - if (index < 0) { - this.items.push(newItem); - } else { - this.items[index] = newItem; - } - - return newItem; - } - - async patch(item: K, patch: JsonPatch): Promise { - const rawItem = await this.api.patch( - { - name: item.getName(), namespace: item.getNs(), - }, - patch, - "json", - ); - - assert(rawItem, `Failed to patch ${item.getScopedName()} of ${item.kind} ${item.apiVersion}`); - - return this.postUpdate(rawItem); - } - - async update(item: K, data: PartialDeep): Promise { - const rawItem = await this.api.update( - { - name: item.getName(), - namespace: item.getNs(), - }, - data, - ); - - assert(rawItem, `Failed to update ${item.getScopedName()} of ${item.kind} ${item.apiVersion}`); - - return this.postUpdate(rawItem); - } - - async remove(item: K) { - // Some k8s apis might implement special more fine-grained "delete" request for resources (e.g. pod.api.ts) - // See also: https://kubernetes.io/docs/concepts/scheduling-eviction/api-eviction/ - await this.api.evict({ name: item.getName(), namespace: item.getNs() }); - this.selectedItemsIds.delete(item.getId()); - } - - async removeSelectedItems() { - await Promise.all(this.selectedItems.map(item => this.remove(item))); - } - - async removeItems(items: K[]) { - await Promise.all(items.map(item => this.remove(item))); - } - - // collect items from watch-api events to avoid UI blowing up with huge streams of data - protected readonly eventsBuffer = observable.array>([], { deep: false }); - - protected bindWatchEventsUpdater(delay = 1000) { - reaction(() => [...this.eventsBuffer], () => this.updateFromEventsBuffer(), { - delay, - }); - } - - subscribe({ onLoadFailure, abortController = new AbortController() }: KubeObjectStoreSubscribeParams = {}): Disposer { - if (this.api.isNamespaced) { - void (async () => { - try { - const loadedNamespaces = await Promise.race([ - rejectPromiseBy(abortController.signal), - waitUntilDefined(() => this.loadedNamespaces.get()), - ]); - - if (this.dependencies.context.isGlobalWatchEnabled() && loadedNamespaces.length === 0) { - this.watchNamespace("", abortController, { onLoadFailure }); - } else { - for (const namespace of loadedNamespaces) { - this.watchNamespace(namespace, abortController, { onLoadFailure }); - } - } - } catch (error) { - console.error(`[KUBE-OBJECT-STORE]: failed to subscribe to ${this.api.apiBase}`, error); - } - })(); - } else { - this.watchNamespace("", abortController, { onLoadFailure }); - } - - return () => abortController.abort(); - } - - private watchNamespace(namespace: string, abortController: AbortController, opts: KubeObjectStoreSubscribeParams) { - if (!this.api.getResourceVersion(namespace)) { - return; - } - - let timedRetry: NodeJS.Timeout; - const startNewWatch = () => this.api.watch({ - namespace, - abortController, - callback, - }); - - const signal = abortController.signal; - - const callback: KubeApiWatchCallback = (data, error) => { - if (!this.isLoaded || (error as Record | null)?.type === "aborted") return; - - if (error instanceof Response) { - if (error.status === 404 || error.status === 401) { - // api has gone, or credentials are not permitted, let's not retry - return; - } - - // not sure what to do, best to retry - clearTimeout(timedRetry); - timedRetry = setTimeout(startNewWatch, 5000); - } else if (error instanceof KubeStatus && error.code === 410) { - clearTimeout(timedRetry); - // resourceVersion has gone, let's try to reload - timedRetry = setTimeout(() => { - void ( - namespace - ? this.loadAll({ namespaces: [namespace], reqInit: { signal }, ...opts }) - : this.loadAll({ merge: false, reqInit: { signal }, ...opts }) - ).then(startNewWatch); - }, 1000); - } else if (error) { // not sure what to do, best to retry - clearTimeout(timedRetry); - timedRetry = setTimeout(startNewWatch, 5000); - } - - if (data) { - this.eventsBuffer.push(data); - } - }; - - signal.addEventListener("abort", () => clearTimeout(timedRetry)); - startNewWatch(); - } - - @action - protected updateFromEventsBuffer() { - const items = this.getItems(); - - for (const event of this.eventsBuffer.clear()) { - if (event.type === "ERROR") { - continue; - } - - try { - const { type, object } = event; - - if (!object.metadata?.uid) { - this.dependencies.logger.warn("[KUBE-STORE]: watch event did not have defined .metadata.uid, skipping", { event }); - // Other parts of the code will break if this happens - continue; - } - - const index = items.findIndex(item => item.getId() === object.metadata.uid); - const item = items[index]; - - switch (type) { - case "ADDED": - - // fallthrough - case "MODIFIED": { - const newItem = new this.api.objectConstructor(object); - - if (!item) { - items.push(newItem); - } else { - items[index] = newItem; - } - - break; - } - case "DELETED": - if (item) { - items.splice(index, 1); - } - break; - } - } catch (error) { - this.dependencies.logger.error("[KUBE-STORE]: failed to handle event from watch buffer", { error, event }); - } - } - - // update items - this.items.replace(this.sortItems(items.slice(-this.bufferSize))); - } -} diff --git a/packages/core/src/common/k8s-api/selected-filter-namespaces.injectable.ts b/packages/core/src/common/k8s-api/selected-filter-namespaces.injectable.ts deleted file mode 100644 index a89c181769..0000000000 --- a/packages/core/src/common/k8s-api/selected-filter-namespaces.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { storesAndApisCanBeCreatedInjectionToken } from "@k8slens/kube-api-specifics"; -import { getInjectable } from "@ogre-tools/injectable"; -import { computed } from "mobx"; -import clusterFrameContextForNamespacedResourcesInjectable from "../../renderer/cluster-frame-context/for-namespaced-resources.injectable"; - -const selectedFilterNamespacesInjectable = getInjectable({ - id: "selected-filter-namespaces", - instantiate: (di) => { - if (!di.inject(storesAndApisCanBeCreatedInjectionToken)) { - // Dummy value so that this works in all environments - return computed(() => []); - } - - const context = di.inject(clusterFrameContextForNamespacedResourcesInjectable); - - return computed(() => [...context.contextNamespaces]); - }, -}); - -export default selectedFilterNamespacesInjectable; diff --git a/packages/core/src/common/k8s-api/window-location.global-override-for-injectable.ts b/packages/core/src/common/k8s-api/window-location.global-override-for-injectable.ts deleted file mode 100644 index 3a75fb6134..0000000000 --- a/packages/core/src/common/k8s-api/window-location.global-override-for-injectable.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "@k8slens/test-utils"; -import windowLocationInjectable from "./window-location.injectable"; - -export default getGlobalOverride(windowLocationInjectable, () => ({ - host: "localhost", - port: "12345", -})); diff --git a/packages/core/src/common/k8s-api/window-location.injectable.ts b/packages/core/src/common/k8s-api/window-location.injectable.ts deleted file mode 100644 index 80bcd44be6..0000000000 --- a/packages/core/src/common/k8s-api/window-location.injectable.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; - -const windowLocationInjectable = getInjectable({ - id: "window-location", - instantiate: () => { - const { host, port } = window.location; - - return { host, port }; - }, - causesSideEffects: true, -}); - -export default windowLocationInjectable; diff --git a/packages/core/src/common/k8s/create-resource-stack.injectable.ts b/packages/core/src/common/k8s/create-resource-stack.injectable.ts deleted file mode 100644 index c1b042c902..0000000000 --- a/packages/core/src/common/k8s/create-resource-stack.injectable.ts +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { KubernetesCluster } from "../catalog-entities"; -import readDirectoryInjectable from "../fs/read-directory.injectable"; -import readFileInjectable from "../fs/read-file.injectable"; -import { kubectlApplyAllInjectionToken, kubectlDeleteAllInjectionToken } from "../kube-helpers/channels"; -import { loggerInjectionToken } from "@k8slens/logger"; -import joinPathsInjectable from "../path/join-paths.injectable"; -import type { ResourceApplyingStack, ResourceStackDependencies } from "./resource-stack"; -import { ResourceStack } from "./resource-stack"; - -export type CreateResourceStack = (cluster: KubernetesCluster, name: string) => ResourceApplyingStack; - -const createResourceStackInjectable = getInjectable({ - id: "create-resource-stack", - instantiate: (di): CreateResourceStack => { - const deps: ResourceStackDependencies = { - joinPaths: di.inject(joinPathsInjectable), - kubectlApplyAll: di.inject(kubectlApplyAllInjectionToken), - kubectlDeleteAll: di.inject(kubectlDeleteAllInjectionToken), - logger: di.inject(loggerInjectionToken), - readDirectory: di.inject(readDirectoryInjectable), - readFile: di.inject(readFileInjectable), - }; - - return (cluster, name) => new ResourceStack(deps, cluster, name); - }, -}); - -export default createResourceStackInjectable; diff --git a/packages/core/src/common/k8s/resource-stack.ts b/packages/core/src/common/k8s/resource-stack.ts deleted file mode 100644 index 7ad0e8088a..0000000000 --- a/packages/core/src/common/k8s/resource-stack.ts +++ /dev/null @@ -1,143 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import hb from "handlebars"; -import type { KubernetesCluster } from "../catalog-entities"; -import yaml from "js-yaml"; -import { getLegacyGlobalDiForExtensionApi } from "@k8slens/legacy-global-di"; -import productNameInjectable from "../vars/product-name.injectable"; -import type { AsyncResult } from "@k8slens/utilities"; -import type { Logger } from "@k8slens/logger"; -import type { KubectlApplyAll, KubectlDeleteAll } from "../kube-helpers/channels"; -import type { ReadDirectory } from "../fs/read-directory.injectable"; -import type { JoinPaths } from "../path/join-paths.injectable"; -import type { ReadFile } from "../fs/read-file.injectable"; -import { hasTypedProperty, isObject } from "@k8slens/utilities"; - -export interface ResourceApplyingStack { - kubectlApplyFolder(folderPath: string, templateContext?: any, extraArgs?: string[]): Promise; - kubectlDeleteFolder(folderPath: string, templateContext?: any, extraArgs?: string[]): Promise; -} - -export interface ResourceStackDependencies { - readonly logger: Logger; - kubectlApplyAll: KubectlApplyAll; - kubectlDeleteAll: KubectlDeleteAll; - readDirectory: ReadDirectory; - joinPaths: JoinPaths; - readFile: ReadFile; -} - -export class ResourceStack { - constructor( - protected readonly dependencies: ResourceStackDependencies, - protected readonly cluster: KubernetesCluster, - protected readonly name: string, - ) {} - - /** - * - * @param folderPath folder path that is searched for files defining kubernetes resources. - * @param templateContext sets the template parameters that are to be applied to any templated kubernetes resources that are to be applied. - */ - async kubectlApplyFolder(folderPath: string, templateContext?: any, extraArgs?: string[]): Promise { - const resources = await this.renderTemplates(folderPath, templateContext); - const result = await this.applyResources(resources, extraArgs); - - if (result.callWasSuccessful) { - return result.response; - } - - this.dependencies.logger.warn(`[RESOURCE-STACK]: failed to apply resources: ${result.error}`); - - throw new Error(result.error); - } - - /** - * - * @param folderPath folder path that is searched for files defining kubernetes resources. - * @param templateContext sets the template parameters that are to be applied to any templated kubernetes resources that are to be applied. - */ - async kubectlDeleteFolder(folderPath: string, templateContext?: any, extraArgs?: string[]): Promise { - const resources = await this.renderTemplates(folderPath, templateContext); - const result = await this.deleteResources(resources, extraArgs); - - if (result.callWasSuccessful) { - return result.response; - } - - this.dependencies.logger.warn(`[RESOURCE-STACK]: failed to delete resources: ${result.error}`); - - return ""; - } - - protected async applyResources(resources: string[], extraArgs: string[] = []): AsyncResult { - const kubectlArgs = [...extraArgs, ...this.getAdditionalArgs(extraArgs)]; - - return this.dependencies.kubectlApplyAll({ - clusterId: this.cluster.getId(), - resources, - extraArgs: kubectlArgs, - }); - } - - protected async deleteResources(resources: string[], extraArgs: string[] = []): AsyncResult { - const kubectlArgs = [...extraArgs, ...this.getAdditionalArgs(extraArgs)]; - - return this.dependencies.kubectlDeleteAll({ - clusterId: this.cluster.getId(), - resources, - extraArgs: kubectlArgs, - }); - } - - protected getAdditionalArgs(kubectlArgs: string[]): string[] { - if (!kubectlArgs.includes("-l") && !kubectlArgs.includes("--label")) { - return ["-l", `app.kubernetes.io/name=${this.name}`]; - } - - return []; - } - - protected async renderTemplates(folderPath: string, templateContext: any): Promise { - const resources: string[] = []; - const di = getLegacyGlobalDiForExtensionApi(); - const productName = di.inject(productNameInjectable); - - this.dependencies.logger.info(`[RESOURCE-STACK]: render templates from ${folderPath}`); - const files = await this.dependencies.readDirectory(folderPath); - - for (const filename of files) { - const file = this.dependencies.joinPaths(folderPath, filename); - const raw = await this.dependencies.readFile(file); - const data = ( - filename.endsWith(".hb") - ? hb.compile(raw)(templateContext) - : raw - ).trim(); - - if (!data) { - continue; - } - - for (const entry of yaml.loadAll(data)) { - if (typeof entry !== "object" || !entry) { - continue; - } - - if (hasTypedProperty(entry, "metadata", isObject)) { - const labels = (entry.metadata.labels ??= {}) as Partial>; - - labels["app.kubernetes.io/name"] = this.name; - labels["app.kubernetes.io/managed-by"] = productName; - labels["app.kubernetes.io/created-by"] = "resource-stack"; - } - - resources.push(yaml.dump(entry)); - } - } - - return resources; - } -} diff --git a/packages/core/src/common/kube-helpers.ts b/packages/core/src/common/kube-helpers.ts deleted file mode 100644 index 0e42425f1c..0000000000 --- a/packages/core/src/common/kube-helpers.ts +++ /dev/null @@ -1,276 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { KubeConfig } from "@kubernetes/client-node"; -import yaml from "js-yaml"; -import type { Cluster, Context, User } from "@kubernetes/client-node/dist/config_types"; -import { newClusters, newContexts, newUsers } from "@kubernetes/client-node/dist/config_types"; -import { isDefined } from "@k8slens/utilities"; -import Joi from "joi"; -import type { PartialDeep } from "type-fest"; - -const clusterSchema = Joi.object({ - name: Joi - .string() - .min(1) - .required(), - cluster: Joi - .object({ - server: Joi - .string() - .min(1) - .required(), - }) - .required(), -}); - -const userSchema = Joi.object({ - name: Joi.string() - .min(1) - .required(), -}); - -const contextSchema = Joi.object({ - name: Joi.string() - .min(1) - .required(), - context: Joi.object({ - cluster: Joi.string() - .min(1) - .required(), - user: Joi.string() - .min(1) - .required(), - }), -}); - -const kubeConfigSchema = Joi.object({ - users: Joi - .array() - .items(userSchema) - .optional(), - clusters: Joi - .array() - .items(clusterSchema) - .optional(), - contexts: Joi - .array() - .items(contextSchema) - .optional(), - "current-context": Joi - .string() - .min(1) - .optional(), -}) - .required(); - -interface KubeConfigOptions { - clusters: Cluster[]; - users: User[]; - contexts: Context[]; - currentContext?: string; -} - -interface OptionsResult { - options: KubeConfigOptions; - error: Joi.ValidationError | undefined; -} - -function loadToOptions(rawYaml: string): OptionsResult { - const parsed = yaml.load(rawYaml); - const { error } = kubeConfigSchema.validate(parsed, { - abortEarly: false, - allowUnknown: true, - }); - const { value } = kubeConfigSchema.validate(parsed, { - abortEarly: false, - allowUnknown: true, - stripUnknown: { - arrays: true, - }, - }); - const { - clusters: rawClusters, - users: rawUsers, - contexts: rawContexts, - "current-context": currentContext, - } = value ?? {}; - const clusters = newClusters(rawClusters); - const users = newUsers(rawUsers); - const contexts = newContexts(rawContexts); - - return { - options: { clusters, users, contexts, currentContext }, - error, - }; -} - -export function loadFromOptions(options: KubeConfigOptions): KubeConfig { - const kc = new KubeConfig(); - - // need to load using the kubernetes client to generate a kubeconfig object - kc.loadFromOptions(options); - - return kc; -} - -export interface ConfigResult { - config: KubeConfig; - error: Joi.ValidationError | undefined; -} - -export function loadConfigFromString(content: string): ConfigResult { - const { options, error } = loadToOptions(content); - - return { - config: loadFromOptions(options), - error, - }; -} - -export function loadValidatedConfig(content: string, contextName: string): ValidateKubeConfigResult { - const { options, error } = loadToOptions(content); - - if (error) { - return { error }; - } - - return validateKubeConfig(loadFromOptions(options), contextName); -} - -export interface SplitConfigEntry { - config: KubeConfig; - validationResult: ValidateKubeConfigResult; -} - -/** - * Breaks kube config into several configs. Each context as it own KubeConfig object - */ -export function splitConfig(kubeConfig: KubeConfig): SplitConfigEntry[] { - return kubeConfig.getContexts().map(ctx => { - const config = new KubeConfig(); - const cluster = kubeConfig.getCluster(ctx.cluster); - const user = kubeConfig.getUser(ctx.user); - const context = kubeConfig.getContextObject(ctx.name); - - if (cluster) { - config.addCluster(cluster); - } - - if (user) { - config.addUser(user); - } - - if (context) { - config.addContext(context); - } - - config.setCurrentContext(ctx.name); - - return { - config, - validationResult: validateKubeConfig(config, ctx.name), - }; - }); -} - -/** - * Pretty format the object as human readable yaml, such as would be on the filesystem - * @param kubeConfig The kubeconfig object to format as pretty yaml - * @returns The yaml representation of the kubeconfig object - */ -export function dumpConfigYaml(kubeConfig: PartialDeep): string { - const clusters = kubeConfig.clusters - ?.filter(isDefined) - .map(cluster => ({ - name: cluster.name, - cluster: { - "certificate-authority-data": cluster.caData, - "certificate-authority": cluster.caFile, - server: cluster.server, - "insecure-skip-tls-verify": cluster.skipTLSVerify, - }, - })); - const contexts = kubeConfig.contexts - ?.filter(isDefined) - .map(context => ({ - name: context.name, - context: { - cluster: context.cluster, - user: context.user, - namespace: context.namespace, - }, - })); - const users = kubeConfig.users - ?.filter(isDefined) - .map(user => ({ - name: user.name, - user: { - "client-certificate-data": user.certData, - "client-certificate": user.certFile, - "client-key-data": user.keyData, - "client-key": user.keyFile, - "auth-provider": user.authProvider, - exec: user.exec, - token: user.token, - username: user.username, - password: user.password, - }, - })); - const config = { - apiVersion: "v1", - kind: "Config", - preferences: {}, - "current-context": kubeConfig.currentContext, - clusters, - contexts, - users, - }; - - // skipInvalid: true makes dump ignore undefined values - return yaml.dump(config, { skipInvalid: true }); -} - -export type ValidateKubeConfigResult = { - error: Error; -} | { - error?: undefined; - context: Context; - cluster: Cluster; - user: User; -}; - -/** - * Checks if `config` has valid `Context`, `User`, `Cluster`, and `exec` fields (if present when required) - * - * Note: This function returns an error instead of throwing it, returning `undefined` if the validation passes - */ -export function validateKubeConfig(config: KubeConfig, contextName: string): ValidateKubeConfigResult { - const context = config.getContextObject(contextName); - - if (!context) { - return { - error: new Error(`No valid context object provided in kubeconfig for context '${contextName}'`), - }; - } - - const cluster = config.getCluster(context.cluster); - - if (!cluster) { - return { - error: new Error(`No valid cluster object provided in kubeconfig for context '${contextName}'`), - }; - } - - const user = config.getUser(context.user); - - if (!user) { - return { - error: new Error(`No valid user object provided in kubeconfig for context '${contextName}'`), - }; - } - - return { cluster, user, context }; -} diff --git a/packages/core/src/common/kube-helpers/channels.ts b/packages/core/src/common/kube-helpers/channels.ts deleted file mode 100644 index c5df4d7358..0000000000 --- a/packages/core/src/common/kube-helpers/channels.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getInjectionToken } from "@ogre-tools/injectable"; -import type { ClusterId } from "../cluster-types"; -import type { AsyncResult, Result } from "@k8slens/utilities"; -import { getRequestChannel } from "@k8slens/messaging"; - -export interface KubectlApplyAllArgs { - clusterId: ClusterId; - resources: string[]; - extraArgs: string[]; -} - -export const kubectlApplyAllChannel = getRequestChannel< - KubectlApplyAllArgs, - Result ->("kubectl-apply-all"); - -export type KubectlApplyAll = (req: KubectlApplyAllArgs) => AsyncResult; - -export const kubectlApplyAllInjectionToken = getInjectionToken({ - id: "kubectl-apply-all", -}); - -export interface KubectlDeleteAllArgs { - clusterId: ClusterId; - resources: string[]; - extraArgs: string[]; -} - -export const kubectlDeleteAllChannel = getRequestChannel< - KubectlDeleteAllArgs, - Result ->("kubectl-delete-all"); - -export type KubectlDeleteAll = (req: KubectlDeleteAllArgs) => AsyncResult; - -export const kubectlDeleteAllInjectionToken = getInjectionToken({ - id: "kubectl-delete-all", -}); diff --git a/packages/core/src/common/kube-helpers/load-config-from-file.injectable.ts b/packages/core/src/common/kube-helpers/load-config-from-file.injectable.ts deleted file mode 100644 index f78b5961da..0000000000 --- a/packages/core/src/common/kube-helpers/load-config-from-file.injectable.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import readFileInjectable from "../fs/read-file.injectable"; -import type { ConfigResult } from "../kube-helpers"; -import { loadConfigFromString } from "../kube-helpers"; -import resolveTildeInjectable from "../path/resolve-tilde.injectable"; - -export type LoadConfigFromFile = (filePath: string) => Promise; - -const loadConfigFromFileInjectable = getInjectable({ - id: "load-config-from-file", - instantiate: (di): LoadConfigFromFile => { - const readFile = di.inject(readFileInjectable); - const resolveTilde = di.inject(resolveTildeInjectable); - - return async (filePath) => loadConfigFromString(await readFile(resolveTilde(filePath))); - }, -}); - -export default loadConfigFromFileInjectable; diff --git a/packages/core/src/common/kube-helpers/load-validated-config-from-file.injectable.ts b/packages/core/src/common/kube-helpers/load-validated-config-from-file.injectable.ts deleted file mode 100644 index ee0b9ed9b0..0000000000 --- a/packages/core/src/common/kube-helpers/load-validated-config-from-file.injectable.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { Cluster } from "../cluster/cluster"; -import readFileInjectable from "../fs/read-file.injectable"; -import type { ValidateKubeConfigResult } from "../kube-helpers"; -import { loadValidatedConfig } from "../kube-helpers"; -import resolveTildeInjectable from "../path/resolve-tilde.injectable"; - -export type LoadValidatedClusterConfig = (cluster: Cluster) => Promise; - -const loadValidatedClusterConfigInjectable = getInjectable({ - id: "load-validated-cluster-config", - instantiate: (di): LoadValidatedClusterConfig => { - const readFile = di.inject(readFileInjectable); - const resolveTilde = di.inject(resolveTildeInjectable); - - return async (cluster) => { - const data = await readFile(resolveTilde(cluster.kubeConfigPath.get())); - - return loadValidatedConfig(data, cluster.contextName.get()); - }; - }, -}); - -export default loadValidatedClusterConfigInjectable; diff --git a/packages/core/src/common/log-error.global-override-for-injectable.ts b/packages/core/src/common/log-error.global-override-for-injectable.ts deleted file mode 100644 index 95fa0ac16f..0000000000 --- a/packages/core/src/common/log-error.global-override-for-injectable.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getGlobalOverrideForFunction } from "@k8slens/test-utils"; -import logErrorInjectable from "./log-error.injectable"; - -// Note: this should remain as it is, and throw if called. Logging error is something -// that cannot happen without a unit test explicitly causing it. It cannot be allowed -// to happen without author of unit test knowing it. -export default getGlobalOverrideForFunction(logErrorInjectable); diff --git a/packages/core/src/common/log-error.injectable.ts b/packages/core/src/common/log-error.injectable.ts deleted file mode 100644 index 93b9faa29f..0000000000 --- a/packages/core/src/common/log-error.injectable.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { loggerInjectionToken } from "@k8slens/logger"; - -const logErrorInjectable = getInjectable({ - id: "log-error", - instantiate: (di) => di.inject(loggerInjectionToken).error, - decorable: false, -}); - -export default logErrorInjectable; diff --git a/packages/core/src/common/logger.global-override-for-injectable.ts b/packages/core/src/common/logger.global-override-for-injectable.ts deleted file mode 100644 index 369a95d80e..0000000000 --- a/packages/core/src/common/logger.global-override-for-injectable.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { loggerInjectionToken } from "@k8slens/logger"; -import { getGlobalOverride } from "@k8slens/test-utils"; - -export default getGlobalOverride(loggerInjectionToken, () => ({ - warn: () => {}, - debug: () => {}, - error: () => {}, - info: () => {}, - silly: () => {}, -})); diff --git a/packages/core/src/common/os/home-directory-path.injectable.ts b/packages/core/src/common/os/home-directory-path.injectable.ts deleted file mode 100644 index c8831eebab..0000000000 --- a/packages/core/src/common/os/home-directory-path.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import userInfoInjectable from "../vars/user-info.injectable"; - -const homeDirectoryPathInjectable = getInjectable({ - id: "home-directory-path", - instantiate: (di) => di.inject(userInfoInjectable).homedir, -}); - -export default homeDirectoryPathInjectable; diff --git a/packages/core/src/common/os/temp-directory-path.global-override-for-injectable.ts b/packages/core/src/common/os/temp-directory-path.global-override-for-injectable.ts deleted file mode 100644 index dde5e3008c..0000000000 --- a/packages/core/src/common/os/temp-directory-path.global-override-for-injectable.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "@k8slens/test-utils"; -import tempDirectoryPathInjectable from "./temp-directory-path.injectable"; - -export default getGlobalOverride(tempDirectoryPathInjectable, () => "/some-temp-directory"); diff --git a/packages/core/src/common/os/temp-directory-path.injectable.ts b/packages/core/src/common/os/temp-directory-path.injectable.ts deleted file mode 100644 index 46fc5db67d..0000000000 --- a/packages/core/src/common/os/temp-directory-path.injectable.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { tmpdir } from "os"; - -const tempDirectoryPathInjectable = getInjectable({ - id: "temp-directory-path", - instantiate: () => tmpdir(), - causesSideEffects: true, -}); - -export default tempDirectoryPathInjectable; diff --git a/packages/core/src/common/path/get-absolute-path.global-override-for-injectable.ts b/packages/core/src/common/path/get-absolute-path.global-override-for-injectable.ts deleted file mode 100644 index 6ebbd34bd8..0000000000 --- a/packages/core/src/common/path/get-absolute-path.global-override-for-injectable.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import path from "path"; -import { getGlobalOverride } from "@k8slens/test-utils"; -import getAbsolutePathInjectable from "./get-absolute-path.injectable"; - -export default getGlobalOverride(getAbsolutePathInjectable, () => path.posix.resolve); diff --git a/packages/core/src/common/path/get-absolute-path.injectable.ts b/packages/core/src/common/path/get-absolute-path.injectable.ts deleted file mode 100644 index 8919605942..0000000000 --- a/packages/core/src/common/path/get-absolute-path.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import path from "path"; - -export type GetAbsolutePath = (...args: string[]) => string; - -const getAbsolutePathInjectable = getInjectable({ - id: "get-absolute-path", - - instantiate: (): GetAbsolutePath => path.resolve, - - // This causes side effect e.g. Windows creates different kinds of - // absolute paths than linux - causesSideEffects: true, -}); - -export default getAbsolutePathInjectable; diff --git a/packages/core/src/common/path/get-basename.global-override-for-injectable.ts b/packages/core/src/common/path/get-basename.global-override-for-injectable.ts deleted file mode 100644 index 76c45ae30f..0000000000 --- a/packages/core/src/common/path/get-basename.global-override-for-injectable.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import path from "path"; -import { getGlobalOverride } from "@k8slens/test-utils"; -import getBasenameOfPathInjectable from "./get-basename.injectable"; - -export default getGlobalOverride(getBasenameOfPathInjectable, () => path.posix.basename); diff --git a/packages/core/src/common/path/get-basename.injectable.ts b/packages/core/src/common/path/get-basename.injectable.ts deleted file mode 100644 index be92bde7f5..0000000000 --- a/packages/core/src/common/path/get-basename.injectable.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import path from "path"; - -export type GetBasenameOfPath = (path: string) => string; - -const getBasenameOfPathInjectable = getInjectable({ - id: "get-basename-of-path", - instantiate: (): GetBasenameOfPath => path.basename, - causesSideEffects: true, -}); - -export default getBasenameOfPathInjectable; diff --git a/packages/core/src/common/path/get-dirname.global-override-for-injectable.ts b/packages/core/src/common/path/get-dirname.global-override-for-injectable.ts deleted file mode 100644 index 5579636551..0000000000 --- a/packages/core/src/common/path/get-dirname.global-override-for-injectable.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import path from "path"; -import { getGlobalOverride } from "@k8slens/test-utils"; -import getDirnameOfPathInjectable from "./get-dirname.injectable"; - -export default getGlobalOverride(getDirnameOfPathInjectable, () => path.posix.dirname); diff --git a/packages/core/src/common/path/get-dirname.injectable.ts b/packages/core/src/common/path/get-dirname.injectable.ts deleted file mode 100644 index 93b4496767..0000000000 --- a/packages/core/src/common/path/get-dirname.injectable.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import path from "path"; - -export type GetDirnameOfPath = (path: string) => string; - -const getDirnameOfPathInjectable = getInjectable({ - id: "get-dirname-of-path", - instantiate: (): GetDirnameOfPath => path.dirname, - causesSideEffects: true, -}); - -export default getDirnameOfPathInjectable; diff --git a/packages/core/src/common/path/get-relative-path.global-override-for-injectable.ts b/packages/core/src/common/path/get-relative-path.global-override-for-injectable.ts deleted file mode 100644 index 987165af15..0000000000 --- a/packages/core/src/common/path/get-relative-path.global-override-for-injectable.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import path from "path"; -import { getGlobalOverride } from "@k8slens/test-utils"; -import getRelativePathInjectable from "./get-relative-path.injectable"; - -export default getGlobalOverride(getRelativePathInjectable, () => path.posix.relative); diff --git a/packages/core/src/common/path/get-relative-path.injectable.ts b/packages/core/src/common/path/get-relative-path.injectable.ts deleted file mode 100644 index 18b5d832de..0000000000 --- a/packages/core/src/common/path/get-relative-path.injectable.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import path from "path"; - -export type GetRelativePath = (from: string, to: string) => string; - -const getRelativePathInjectable = getInjectable({ - id: "get-relative-path", - instantiate: (): GetRelativePath => path.relative, - causesSideEffects: true, -}); - -export default getRelativePathInjectable; diff --git a/packages/core/src/common/path/is-logical-child-path.injectable.ts b/packages/core/src/common/path/is-logical-child-path.injectable.ts deleted file mode 100644 index 1a52b66c0f..0000000000 --- a/packages/core/src/common/path/is-logical-child-path.injectable.ts +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import getAbsolutePathInjectable from "./get-absolute-path.injectable"; -import getDirnameOfPathInjectable from "./get-dirname.injectable"; - -/** - * Checks if `testPath` represents a potential filesystem entry that would be - * logically "within" the `parentPath` directory. - * - * This function will return `true` in the above case, and `false` otherwise. - * It will return `false` if the two paths are the same (after resolving them). - * - * The function makes no FS calls and is platform dependant. Meaning that the - * results are only guaranteed to be correct for the platform you are running - * on. - * @param parentPath The known path of a directory - * @param testPath The path that is to be tested - */ -export type IsLogicalChildPath = (parentPath: string, testPath: string) => boolean; - -const isLogicalChildPathInjectable = getInjectable({ - id: "is-logical-child-path", - instantiate: (di): IsLogicalChildPath => { - const getAbsolutePath = di.inject(getAbsolutePathInjectable); - const getDirnameOfPath = di.inject(getDirnameOfPathInjectable); - - return (parentPath, testPath) => { - const resolvedParentPath = getAbsolutePath(parentPath); - let resolvedTestPath = getAbsolutePath(testPath); - - if (resolvedParentPath === resolvedTestPath) { - return false; - } - - while (resolvedTestPath.length >= resolvedParentPath.length) { - if (resolvedTestPath === resolvedParentPath) { - return true; - } - - resolvedTestPath = getDirnameOfPath(resolvedTestPath); - } - - return false; - }; - }, -}); - -export default isLogicalChildPathInjectable; diff --git a/packages/core/src/common/path/join-paths.global-override-for-injectable.ts b/packages/core/src/common/path/join-paths.global-override-for-injectable.ts deleted file mode 100644 index 320490c0f3..0000000000 --- a/packages/core/src/common/path/join-paths.global-override-for-injectable.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import path from "path"; -import { getGlobalOverride } from "@k8slens/test-utils"; -import joinPathsInjectable from "./join-paths.injectable"; - -export default getGlobalOverride(joinPathsInjectable, () => path.posix.join); diff --git a/packages/core/src/common/path/join-paths.injectable.ts b/packages/core/src/common/path/join-paths.injectable.ts deleted file mode 100644 index dc63b48307..0000000000 --- a/packages/core/src/common/path/join-paths.injectable.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import path from "path"; - -export type JoinPaths = (...args: string[]) => string; - -const joinPathsInjectable = getInjectable({ - id: "join-paths", - instantiate: (): JoinPaths => path.join, - - // This causes side effect e.g. Windows uses different separator than e.g. linux - causesSideEffects: true, -}); - -export default joinPathsInjectable; diff --git a/packages/core/src/common/path/parse.global-override-for-injectable.ts b/packages/core/src/common/path/parse.global-override-for-injectable.ts deleted file mode 100644 index 9dbc434bca..0000000000 --- a/packages/core/src/common/path/parse.global-override-for-injectable.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import path from "path"; -import { getGlobalOverride } from "@k8slens/test-utils"; -import parsePathInjectable from "./parse.injectable"; - -export default getGlobalOverride(parsePathInjectable, () => path.posix.parse); diff --git a/packages/core/src/common/path/parse.injectable.ts b/packages/core/src/common/path/parse.injectable.ts deleted file mode 100644 index a32dfb3fa5..0000000000 --- a/packages/core/src/common/path/parse.injectable.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import path from "path"; - -const parsePathInjectable = getInjectable({ - id: "parse-path", - instantiate: () => path.parse, - causesSideEffects: true, -}); - -export default parsePathInjectable; diff --git a/packages/core/src/common/path/resolve-path.injectable.ts b/packages/core/src/common/path/resolve-path.injectable.ts deleted file mode 100644 index 75a1e98c59..0000000000 --- a/packages/core/src/common/path/resolve-path.injectable.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import getAbsolutePathInjectable from "./get-absolute-path.injectable"; -import resolveTildeInjectable from "./resolve-tilde.injectable"; - -export type ResolvePath = (path: string) => string; - -const resolvePathInjectable = getInjectable({ - id: "resolve-path", - instantiate: (di): ResolvePath => { - const getAbsolutePath = di.inject(getAbsolutePathInjectable); - const resolveTilde = di.inject(resolveTildeInjectable); - - return (filePath) => getAbsolutePath(resolveTilde(filePath)); - }, -}); - -export default resolvePathInjectable; diff --git a/packages/core/src/common/path/resolve-tilde.injectable.ts b/packages/core/src/common/path/resolve-tilde.injectable.ts deleted file mode 100644 index 86d267aa4f..0000000000 --- a/packages/core/src/common/path/resolve-tilde.injectable.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import homeDirectoryPathInjectable from "../os/home-directory-path.injectable"; -import fileSystemSeparatorInjectable from "./separator.injectable"; - -export type ResolveTilde = (path: string) => string; - -const resolveTildeInjectable = getInjectable({ - id: "resolve-tilde", - instantiate: (di): ResolveTilde => { - const homeDirectoryPath = di.inject(homeDirectoryPathInjectable); - const fileSystemSeparator = di.inject(fileSystemSeparatorInjectable); - - return (filePath) => { - if (filePath === "~") { - return homeDirectoryPath; - } - - if (filePath === `~${fileSystemSeparator}`) { - return `${homeDirectoryPath}${filePath.slice(1)}`; - } - - return filePath; - }; - }, -}); - -export default resolveTildeInjectable; diff --git a/packages/core/src/common/path/separator.global-override-for-injectable.ts b/packages/core/src/common/path/separator.global-override-for-injectable.ts deleted file mode 100644 index 25d0700481..0000000000 --- a/packages/core/src/common/path/separator.global-override-for-injectable.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import path from "path"; -import { getGlobalOverride } from "@k8slens/test-utils"; -import fileSystemSeparatorInjectable from "./separator.injectable"; - -export default getGlobalOverride(fileSystemSeparatorInjectable, () => path.posix.sep); diff --git a/packages/core/src/common/path/separator.injectable.ts b/packages/core/src/common/path/separator.injectable.ts deleted file mode 100644 index 5b0413b56f..0000000000 --- a/packages/core/src/common/path/separator.injectable.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import path from "path"; - -const fileSystemSeparatorInjectable = getInjectable({ - id: "file-system-separator", - instantiate: () => path.sep, - causesSideEffects: true, -}); - -export default fileSystemSeparatorInjectable; diff --git a/packages/core/src/common/protocol-handler/error.ts b/packages/core/src/common/protocol-handler/error.ts deleted file mode 100644 index 707c8d420b..0000000000 --- a/packages/core/src/common/protocol-handler/error.ts +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type Url from "url-parse"; - -export enum RoutingErrorType { - INVALID_PROTOCOL = "invalid-protocol", - INVALID_HOST = "invalid-host", - INVALID_PATHNAME = "invalid-pathname", - NO_HANDLER = "no-handler", - NO_EXTENSION_ID = "no-ext-id", - MISSING_EXTENSION = "missing-ext", -} - -export class RoutingError extends Error { - /** - * Will be set if the routing error originated in an extension route table - */ - public extensionName?: string; - - constructor(public type: RoutingErrorType, public url: Url) { - super("routing error"); - } - - toString(): string { - switch (this.type) { - case RoutingErrorType.INVALID_HOST: - return "invalid host"; - case RoutingErrorType.INVALID_PROTOCOL: - return "invalid protocol"; - case RoutingErrorType.INVALID_PATHNAME: - return "invalid pathname"; - case RoutingErrorType.NO_EXTENSION_ID: - return "no extension ID"; - case RoutingErrorType.MISSING_EXTENSION: - return "extension not found"; - default: - return `unknown error: ${this.type}`; - } - } -} diff --git a/packages/core/src/common/protocol-handler/index.ts b/packages/core/src/common/protocol-handler/index.ts deleted file mode 100644 index b329c09046..0000000000 --- a/packages/core/src/common/protocol-handler/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export * from "./error"; -export * from "./router"; diff --git a/packages/core/src/common/protocol-handler/registration.ts b/packages/core/src/common/protocol-handler/registration.ts deleted file mode 100644 index 9fdf390bee..0000000000 --- a/packages/core/src/common/protocol-handler/registration.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -/** - * ProtocolHandlerRegistration is the data required for an extension to register - * a handler to a specific path or dynamic path. - */ -export interface ProtocolHandlerRegistration { - pathSchema: string; - handler: RouteHandler; -} - -/** - * The collection of the dynamic parts of a URI which initiated a `lens://` - * protocol request - */ -export interface RouteParams { - /** - * the parts of the URI query string - */ - search: Record; - - /** - * the matching parts of the path. The dynamic parts of the URI path. - */ - pathname: Record; - - /** - * if the most specific path schema that is matched does not cover the whole - * of the URI's path. Then this field will be set to the remaining path - * segments. - * - * Example: - * - * If the path schema `/landing/:type` is the matched schema for the URI - * `/landing/soft/easy` then this field will be set to `"/easy"`. - */ - tail?: string; -} - -/** - * RouteHandler represents the function signature of the handler function for - * `lens://` protocol routing. - */ -export interface RouteHandler { - (params: RouteParams): void; -} diff --git a/packages/core/src/common/protocol-handler/router.ts b/packages/core/src/common/protocol-handler/router.ts deleted file mode 100644 index 5e265ed0a9..0000000000 --- a/packages/core/src/common/protocol-handler/router.ts +++ /dev/null @@ -1,277 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { match } from "react-router"; -import { matchPath } from "react-router"; -import { countBy } from "lodash"; -import { isDefined, iter } from "@k8slens/utilities"; -import { pathToRegexp } from "path-to-regexp"; -import type Url from "url-parse"; -import { RoutingError, RoutingErrorType } from "./error"; -import type { ExtensionLoader } from "../../extensions/extension-loader"; -import type { LensExtension } from "../../extensions/lens-extension"; -import type { RouteHandler, RouteParams } from "./registration"; -import { when } from "mobx"; -import { ipcRenderer } from "electron"; -import type { Logger } from "@k8slens/logger"; -import type { IsExtensionEnabled } from "../../features/extensions/enabled/common/is-enabled.injectable"; - -// IPC channel for protocol actions. Main broadcasts the open-url events to this channel. -export const ProtocolHandlerIpcPrefix = "protocol-handler"; - -export const ProtocolHandlerInternal = `${ProtocolHandlerIpcPrefix}:internal`; -export const ProtocolHandlerExtension = `${ProtocolHandlerIpcPrefix}:extension`; -export const ProtocolHandlerInvalid = `${ProtocolHandlerIpcPrefix}:invalid`; - -/** - * These two names are long and cumbersome by design so as to decrease the chances - * of an extension using the same names. - * - * Though under the current (2021/01/18) implementation, these are never matched - * against in the final matching so their names are less of a concern. - */ -export const EXTENSION_PUBLISHER_MATCH = "LENS_INTERNAL_EXTENSION_PUBLISHER_MATCH"; -export const EXTENSION_NAME_MATCH = "LENS_INTERNAL_EXTENSION_NAME_MATCH"; - -/** - * Returned from routing attempts - */ -export enum RouteAttempt { - /** - * A handler was found in the set of registered routes - */ - MATCHED = "matched", - /** - * A handler was not found within the set of registered routes - */ - MISSING = "missing", - /** - * The extension that was matched in the route was not activated - */ - MISSING_EXTENSION = "no-extension", -} - -export function foldAttemptResults(mainAttempt: RouteAttempt, rendererAttempt: RouteAttempt): RouteAttempt { - switch (mainAttempt) { - case RouteAttempt.MATCHED: - return RouteAttempt.MATCHED; - case RouteAttempt.MISSING: - case RouteAttempt.MISSING_EXTENSION: - return rendererAttempt; - } -} - -export interface LensProtocolRouterDependencies { - readonly extensionLoader: ExtensionLoader; - readonly logger: Logger; - isExtensionEnabled: IsExtensionEnabled; -} - -export abstract class LensProtocolRouter { - // Map between path schemas and the handlers - protected internalRoutes = new Map(); - - public static readonly LoggingPrefix = "[PROTOCOL ROUTER]"; - - static readonly ExtensionUrlSchema = `/:${EXTENSION_PUBLISHER_MATCH}(@[A-Za-z0-9_]+)?/:${EXTENSION_NAME_MATCH}`; - - constructor(protected readonly dependencies: LensProtocolRouterDependencies) {} - - /** - * Attempts to route the given URL to all internal routes that have been registered - * @param url the parsed URL that initiated the `lens://` protocol - * @returns true if a route has been found - */ - protected _routeToInternal(url: Url>): RouteAttempt { - return this._route(this.internalRoutes.entries(), url); - } - - /** - * match against all matched URIs, returning either the first exact match or - * the most specific match if none are exact. - * @param routes the array of path schemas, handler pairs to match against - * @param url the url (in its current state) - */ - protected _findMatchingRoute(routes: Iterable<[string, RouteHandler]>, url: Url>): null | [match>, RouteHandler] { - const matches: [match>, RouteHandler][] = []; - - for (const [schema, handler] of routes) { - const match = matchPath(url.pathname, { path: schema }); - - if (!match) { - continue; - } - - // prefer an exact match - if (match.isExact) { - return [match, handler]; - } - - matches.push([match, handler]); - } - - // if no exact match pick the one that is the most specific - return matches.sort(([a], [b]) => { - if (a.path === "/") { - return 1; - } - - if (b.path === "/") { - return -1; - } - - return countBy(b.path)["/"] - countBy(a.path)["/"]; - })[0] ?? null; - } - - /** - * find the most specific matching handler and call it - * @param routes the array of (path schemas, handler) pairs to match against - * @param url the url (in its current state) - */ - protected _route(routes: Iterable<[string, RouteHandler]>, url: Url>, extensionName?: string): RouteAttempt { - const route = this._findMatchingRoute(routes, url); - - if (!route) { - const data: Record = { url: url.toString() }; - - if (extensionName) { - data.extensionName = extensionName; - } - - this.dependencies.logger.info(`${LensProtocolRouter.LoggingPrefix}: No handler found`, data); - - return RouteAttempt.MISSING; - } - - const [match, handler] = route; - - const params: RouteParams = { - pathname: match.params, - search: url.query, - }; - - if (!match.isExact) { - params.tail = url.pathname.slice(match.url.length); - } - - handler(params); - - return RouteAttempt.MATCHED; - } - - /** - * Tries to find the matching LensExtension instance - * - * Note: this needs to be async so that `main`'s overloaded version can also be async - * @param url the protocol request URI that was "open"-ed - * @returns either the found name or the instance of `LensExtension` - */ - protected async _findMatchingExtensionByName(url: Url>): Promise { - interface ExtensionUrlMatch { - [EXTENSION_PUBLISHER_MATCH]: string; - [EXTENSION_NAME_MATCH]: string; - } - - const match = matchPath(url.pathname, LensProtocolRouter.ExtensionUrlSchema); - - if (!match) { - throw new RoutingError(RoutingErrorType.NO_EXTENSION_ID, url); - } - - const { [EXTENSION_PUBLISHER_MATCH]: publisher, [EXTENSION_NAME_MATCH]: partialName } = match.params; - const name = [publisher, partialName].filter(isDefined).join("/"); - - const extensionLoader = this.dependencies.extensionLoader; - - try { - /** - * Note, if `getInstanceByName` returns `null` that means we won't be getting an instance - */ - await when(() => extensionLoader.getInstanceByName(name) !== void 0, { - timeout: 5_000, - }); - } catch (error) { - this.dependencies.logger.info( - `${LensProtocolRouter.LoggingPrefix}: Extension ${name} matched, but not installed (${error})`, - ); - - return name; - } - - const extension = extensionLoader.getInstanceByName(name) as LensExtension | undefined; - - if (!extension) { - this.dependencies.logger.info(`${LensProtocolRouter.LoggingPrefix}: Extension ${name} matched, but does not have a class for ${ipcRenderer ? "renderer" : "main"}`); - - return name; - } - - if (!extension.isBundled && !this.dependencies.isExtensionEnabled(extension.id)) { - this.dependencies.logger.info(`${LensProtocolRouter.LoggingPrefix}: Extension ${name} matched, but not enabled`); - - return name; - } - - this.dependencies.logger.info(`${LensProtocolRouter.LoggingPrefix}: Extension ${name} matched`); - - return extension; - } - - /** - * Find a matching extension by the first one or two path segments of `url` and then try to `_route` - * its correspondingly registered handlers. - * - * If no handlers are found or the extension is not enabled then `_missingHandlers` is called before - * checking if more handlers have been added. - * - * Note: this function modifies its argument, do not reuse - * @param url the protocol request URI that was "open"-ed - */ - protected async _routeToExtension(url: Url>): Promise { - const extension = await this._findMatchingExtensionByName(url); - - if (typeof extension === "string") { - // failed to find an extension, it returned its name - return RouteAttempt.MISSING_EXTENSION; - } - - // remove the extension name from the path name so we don't need to match on it anymore - url.set("pathname", url.pathname.slice(extension.name.length + 1)); - - try { - const handlers = iter.map(extension.protocolHandlers, ({ pathSchema, handler }) => [pathSchema, handler] as [string, RouteHandler]); - - return this._route(handlers, url, extension.name); - } catch (error) { - if (error instanceof RoutingError) { - error.extensionName = extension.name; - } - - throw error; - } - } - - /** - * Add a handler under the `lens://app` tree of routing. - * @param pathSchema the URI path schema to match against for this handler - * @param handler a function that will be called if a protocol path matches - */ - public addInternalHandler(urlSchema: string, handler: RouteHandler): this { - pathToRegexp(urlSchema); // verify now that the schema is valid - this.dependencies.logger.info(`${LensProtocolRouter.LoggingPrefix}: internal registering ${urlSchema}`); - this.internalRoutes.set(urlSchema, handler); - - return this; - } - - /** - * Remove an internal protocol handler. - * @param pathSchema the path schema that the handler was registered under - */ - public removeInternalHandler(urlSchema: string): void { - this.internalRoutes.delete(urlSchema); - } -} diff --git a/packages/core/src/common/rbac.ts b/packages/core/src/common/rbac.ts deleted file mode 100644 index f42b07e775..0000000000 --- a/packages/core/src/common/rbac.ts +++ /dev/null @@ -1,229 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export type KubeResource = - "namespaces" | "nodes" | "events" | "resourcequotas" | "services" | "limitranges" | "leases" | - "secrets" | "configmaps" | "ingresses" | "ingressclasses" | "networkpolicies" | "persistentvolumeclaims" | "persistentvolumes" | "storageclasses" | - "pods" | "daemonsets" | "deployments" | "statefulsets" | "replicasets" | "replicationcontrollers" | "jobs" | "cronjobs" | - "endpoints" | "customresourcedefinitions" | "horizontalpodautoscalers" | "verticalpodautoscalers" | "podsecuritypolicies" | "poddisruptionbudgets" | - "priorityclasses" | "runtimeclasses" | - "roles" | "clusterroles" | "rolebindings" | "clusterrolebindings" | "serviceaccounts" | "mutatingwebhookconfigurations" | "validatingwebhookconfigurations"; - -export interface KubeApiResource { - kind: string; - group: string; // api-group, if empty then "core" - apiName: string; - namespaced: boolean; -} - -export interface KubeApiResourceDescriptor { - apiName: string; - group: string; // api-group, if empty then "core" -} - -export const formatKubeApiResource = (desc: KubeApiResourceDescriptor) => ( - desc.group - ? `${desc.group}/${desc.apiName}` - : desc.apiName -); - -export interface KubeApiResourceData { - kind: string; // resource type (e.g. "Namespace") - group: string; // api-group, if empty then "core" - namespaced: boolean; -} - -export const apiResourceRecord: Record = { - clusterroles: { - kind: "ClusterRole", - group: "rbac.authorization.k8s.io", - namespaced: false, - }, - clusterrolebindings: { - kind: "ClusterRoleBinding", - group: "rbac.authorization.k8s.io", - namespaced: false, - }, - configmaps: { - kind: "ConfigMap", - group: "", - namespaced: true, - }, - cronjobs: { - kind: "CronJob", - group: "batch", - namespaced: true, - }, - customresourcedefinitions: { - kind: "CustomResourceDefinition", - group: "apiextensions.k8s.io", - namespaced: false, - }, - daemonsets: { - kind: "DaemonSet", - group: "apps", - namespaced: true, - }, - deployments: { - kind: "Deployment", - group: "apps", - namespaced: true, - }, - endpoints: { - kind: "Endpoint", - group: "", - namespaced: true, - }, - events: { - kind: "Event", - group: "", - namespaced: true, - }, - horizontalpodautoscalers: { - kind: "HorizontalPodAutoscaler", - group: "autoscaling", - namespaced: true, - }, - ingresses: { - kind: "Ingress", - group: "networking.k8s.io", - namespaced: true, - }, - ingressclasses: { - kind: "IngressClass", - group: "networking.k8s.io", - namespaced: false, - }, - jobs: { - kind: "Job", - group: "batch", - namespaced: true, - }, - namespaces: { - kind: "Namespace", - group: "", - namespaced: false, - }, - limitranges: { - kind: "LimitRange", - group: "", - namespaced: true, - }, - leases: { - kind: "Lease", - group: "", - namespaced: true, - }, - mutatingwebhookconfigurations: { - kind: "MutatingWebhookConfiguration", - group: "admissionregistration.k8s.io/v1", - namespaced: false, - }, - validatingwebhookconfigurations: { - kind: "ValidatingWebhookConfiguration", - group: "admissionregistration.k8s.io/v1", - namespaced: false, - }, - networkpolicies: { - kind: "NetworkPolicy", - group: "networking.k8s.io", - namespaced: true, - }, - nodes: { - kind: "Node", - group: "", - namespaced: false, - }, - persistentvolumes: { - kind: "PersistentVolume", - group: "", - namespaced: false, - }, - persistentvolumeclaims: { - kind: "PersistentVolumeClaim", - group: "", - namespaced: true, - }, - pods: { - kind: "Pod", - group: "", - namespaced: true, - }, - poddisruptionbudgets: { - kind: "PodDisruptionBudget", - group: "policy", - namespaced: true, - }, - podsecuritypolicies: { - kind: "PodSecurityPolicy", - group: "policy", - namespaced: false, - }, - priorityclasses: { - kind: "PriorityClass", - group: "scheduling.k8s.io", - namespaced: false, - }, - runtimeclasses: { - kind: "RuntimeClass", - group: "node.k8s.io", - namespaced: false, - }, - resourcequotas: { - kind: "ResourceQuota", - group: "", - namespaced: true, - }, - replicasets: { - kind: "ReplicaSet", - group: "apps", - namespaced: true, - }, - replicationcontrollers: { - kind: "ReplicationController", - group: "", // core - namespaced: true, - }, - roles: { - kind: "Role", - group: "rbac.authorization.k8s.io", - namespaced: true, - }, - rolebindings: { - kind: "RoleBinding", - group: "rbac.authorization.k8s.io", - namespaced: true, - }, - secrets: { - kind: "Secret", - group: "", - namespaced: true, - }, - serviceaccounts: { - kind: "ServiceAccount", - group: "", - namespaced: true, - }, - services: { - kind: "Service", - group: "", - namespaced: true, - }, - statefulsets: { - kind: "StatefulSet", - group: "apps", - namespaced: true, - }, - storageclasses: { - kind: "StorageClass", - group: "storage.k8s.io", - namespaced: false, - }, - verticalpodautoscalers: { - kind: "VerticalPodAutoscaler", - group: "autoscaling.k8s.io", - namespaced: true, - }, -}; diff --git a/packages/core/src/common/root-frame/root-frame-rendered-channel.ts b/packages/core/src/common/root-frame/root-frame-rendered-channel.ts deleted file mode 100644 index c4dc0cefa6..0000000000 --- a/packages/core/src/common/root-frame/root-frame-rendered-channel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { MessageChannel } from "@k8slens/messaging"; - -export type RootFrameHasRenderedChannel = MessageChannel; - -export const rootFrameHasRenderedChannel: RootFrameHasRenderedChannel = { - id: "root-frame-rendered", -}; diff --git a/packages/core/src/common/terminal/channels.ts b/packages/core/src/common/terminal/channels.ts deleted file mode 100644 index f958c9c696..0000000000 --- a/packages/core/src/common/terminal/channels.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - - -export enum TerminalChannels { - STDIN = "stdin", - STDOUT = "stdout", - CONNECTED = "connected", - RESIZE = "resize", - PING = "ping", -} - -export type TerminalMessage = { - type: TerminalChannels.STDIN; - data: string; -} | { - type: TerminalChannels.STDOUT; - data: string; -} | { - type: TerminalChannels.CONNECTED; -} | { - type: TerminalChannels.RESIZE; - data: { - width: number; - height: number; - }; -} | { - type: TerminalChannels.PING; -}; diff --git a/packages/core/src/common/utils/__tests__/cluster-id-url-parsing.test.ts b/packages/core/src/common/utils/__tests__/cluster-id-url-parsing.test.ts deleted file mode 100644 index 3a4ccf605b..0000000000 --- a/packages/core/src/common/utils/__tests__/cluster-id-url-parsing.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getClusterIdFromHost } from "../cluster-id-url-parsing"; - -describe("getClusterIdFromHost", () => { - const clusterFakeId = "fe540901-0bd6-4f6c-b472-bce1559d7c4a"; - - it("should return undefined for non cluster frame hosts", () => { - expect(getClusterIdFromHost("lens.app:45345")).toBeUndefined(); - }); - - it("should return ClusterId for cluster frame hosts", () => { - expect(getClusterIdFromHost(`${clusterFakeId}.lens.app:59110`)).toBe(clusterFakeId); - }); - - it("should return ClusterId for cluster frame hosts with additional subdomains", () => { - expect(getClusterIdFromHost(`abc.${clusterFakeId}.lens.app:59110`)).toBe(clusterFakeId); - expect(getClusterIdFromHost(`abc.def.${clusterFakeId}.lens.app:59110`)).toBe(clusterFakeId); - expect(getClusterIdFromHost(`abc.def.ghi.${clusterFakeId}.lens.app:59110`)).toBe(clusterFakeId); - expect(getClusterIdFromHost(`abc.def.ghi.jkl.${clusterFakeId}.lens.app:59110`)).toBe(clusterFakeId); - expect(getClusterIdFromHost(`abc.def.ghi.jkl.mno.${clusterFakeId}.lens.app:59110`)).toBe(clusterFakeId); - expect(getClusterIdFromHost(`abc.def.ghi.jkl.mno.pqr.${clusterFakeId}.lens.app:59110`)).toBe(clusterFakeId); - expect(getClusterIdFromHost(`abc.def.ghi.jkl.mno.pqr.stu.${clusterFakeId}.lens.app:59110`)).toBe(clusterFakeId); - expect(getClusterIdFromHost(`abc.def.ghi.jkl.mno.pqr.stu.vwx.${clusterFakeId}.lens.app:59110`)).toBe(clusterFakeId); - expect(getClusterIdFromHost(`abc.def.ghi.jkl.mno.pqr.stu.vwx.yz.${clusterFakeId}.lens.app:59110`)).toBe(clusterFakeId); - }); -}); diff --git a/packages/core/src/common/utils/__tests__/paths.test.ts b/packages/core/src/common/utils/__tests__/paths.test.ts deleted file mode 100644 index 5a52843432..0000000000 --- a/packages/core/src/common/utils/__tests__/paths.test.ts +++ /dev/null @@ -1,137 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { DiContainer } from "@ogre-tools/injectable"; -import path from "path"; -import { getDiForUnitTesting } from "../../../main/getDiForUnitTesting"; -import getAbsolutePathInjectable from "../../path/get-absolute-path.injectable"; -import getDirnameOfPathInjectable from "../../path/get-dirname.injectable"; -import type { IsLogicalChildPath } from "../../path/is-logical-child-path.injectable"; -import isLogicalChildPathInjectable from "../../path/is-logical-child-path.injectable"; - -describe("isLogicalChildPath", () => { - let di: DiContainer; - let isLogicalChildPath: IsLogicalChildPath; - - beforeEach(() => { - di = getDiForUnitTesting(); - }); - - describe("when using win32 paths", () => { - beforeEach(() => { - di.override(getAbsolutePathInjectable, () => path.win32.resolve); - di.override(getDirnameOfPathInjectable, () => path.win32.dirname); - isLogicalChildPath = di.inject(isLogicalChildPathInjectable); - }); - - it.each([ - { - parentPath: "C:\\Foo", - testPath: "C:\\Foo\\Bar", - expected: true, - }, - { - parentPath: "C:\\Foo", - testPath: "C:\\Bar", - expected: false, - }, - { - parentPath: "C:\\Foo", - testPath: "C:/Bar", - expected: false, - }, - { - parentPath: "C:\\Foo", - testPath: "C:/Foo/Bar", - expected: true, - }, - { - parentPath: "C:\\Foo", - testPath: "D:\\Foo\\Bar", - expected: false, - }, - ])("test %#", (testData) => { - expect(isLogicalChildPath(testData.parentPath, testData.testPath)).toBe(testData.expected); - }); - }); - - describe("when using posix paths", () => { - beforeEach(() => { - di.override(getAbsolutePathInjectable, () => path.posix.resolve); - di.override(getDirnameOfPathInjectable, () => path.posix.dirname); - isLogicalChildPath = di.inject(isLogicalChildPathInjectable); - }); - - it.each([ - { - parentPath: "/foo", - testPath: "/foo", - expected: false, - }, - { - parentPath: "/foo", - testPath: "/bar", - expected: false, - }, - { - parentPath: "/foo", - testPath: "/foobar", - expected: false, - }, - { - parentPath: "/foo", - testPath: "/foo/bar", - expected: true, - }, - { - parentPath: "/foo", - testPath: "/foo/../bar", - expected: false, - }, - { - parentPath: "/foo", - testPath: "/foo/./bar", - expected: true, - }, - { - parentPath: "/foo", - testPath: "/foo/.bar", - expected: true, - }, - { - parentPath: "/foo", - testPath: "/foo/..bar", - expected: true, - }, - { - parentPath: "/foo", - testPath: "/foo/...bar", - expected: true, - }, - { - parentPath: "/foo", - testPath: "/foo/..\\.bar", - expected: true, - }, - { - parentPath: "/bar/../foo", - testPath: "/foo/bar", - expected: true, - }, - { - parentPath: "/foo", - testPath: "/foo/\\bar", - expected: true, - }, - { - parentPath: "/foo", - testPath: "./bar", - expected: false, - }, - ])("test %#", (testData) => { - expect(isLogicalChildPath(testData.parentPath, testData.testPath)).toBe(testData.expected); - }); - }); -}); diff --git a/packages/core/src/common/utils/__tests__/toJS.test.ts b/packages/core/src/common/utils/__tests__/toJS.test.ts deleted file mode 100644 index 1704ed7e25..0000000000 --- a/packages/core/src/common/utils/__tests__/toJS.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { isObservable, observable } from "mobx"; -import { toJS } from "../toJS"; - -describe("utils/toJS(data: any)", () => { - const y = { y: 2 }; - - const data = observable({ x: 1, y }, {}, { - deep: false, // this will keep ref to "y" - }); - const data2 = { - x: 1, // partially observable - y: observable(y), - }; - - test("converts mobx-observable to corresponding js struct with links preserving", () => { - expect(toJS(data).y).toBe(y); - expect(isObservable(toJS(data).y)).toBeFalsy(); - }); - - test("converts partially observable js struct", () => { - expect(toJS(data2).y).not.toBe(y); - expect(toJS(data2).y).toEqual(y); - expect(isObservable(toJS(data2).y)).toBeFalsy(); - }); -}); diff --git a/packages/core/src/common/utils/add-separator/add-separator.test.ts b/packages/core/src/common/utils/add-separator/add-separator.test.ts deleted file mode 100644 index 8a45b45739..0000000000 --- a/packages/core/src/common/utils/add-separator/add-separator.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { addSeparator } from "./add-separator"; - -describe("add-separator", () => { - it("given multiple items, adds separators", () => { - const items = ["first", "second", "third"]; - - const actual = addSeparator((left, right) => `separator-between-${left}-and-${right}`, items); - - expect(actual).toEqual([ - "first", - "separator-between-first-and-second", - "second", - "separator-between-second-and-third", - "third", - ]); - }); - - it("given multiple items including falsy ones, adds separators", () => { - const items = [false, undefined, null, NaN]; - - const actual = addSeparator((left, right) => `separator-between-${left}-and-${right}`, items); - - expect(actual).toEqual([ - false, - "separator-between-false-and-undefined", - undefined, - "separator-between-undefined-and-null", - null, - "separator-between-null-and-NaN", - NaN, - ]); - }); - - it("given no items, does not add separator", () => { - const items: any[] = []; - - const actual = addSeparator(() => "separator", items); - - expect(actual).toEqual([]); - }); - - it("given one item, does not add separator", () => { - const items = ["first"]; - - const actual = addSeparator(() => "separator", items); - - expect(actual).toEqual(["first"]); - }); -}); diff --git a/packages/core/src/common/utils/add-separator/add-separator.ts b/packages/core/src/common/utils/add-separator/add-separator.ts deleted file mode 100644 index 6fd6b14642..0000000000 --- a/packages/core/src/common/utils/add-separator/add-separator.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export type GetSeparator = (left: Item, right: Item) => Separator; - -export const addSeparator = ( - getSeparator: GetSeparator, - items: Item[], -) => items.flatMap(toSeparatedTupleUsing(getSeparator)); - -const toSeparatedTupleUsing = - (getSeparator: GetSeparator) => - (leftItem: Item, index: number, arr: Item[]) => { - const itemIsLast = arr.length === index + 1; - - if (itemIsLast) { - return [leftItem]; - } - - const rightItem = arr[index + 1]; - const separator = getSeparator(leftItem, rightItem); - - return [leftItem, separator]; - }; diff --git a/packages/core/src/common/utils/binary-name.injectable.ts b/packages/core/src/common/utils/binary-name.injectable.ts deleted file mode 100644 index d240b3aae0..0000000000 --- a/packages/core/src/common/utils/binary-name.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; -import normalizedPlatformInjectable from "../vars/normalized-platform.injectable"; - -const binaryNameInjectable = getInjectable({ - id: "binary-name", - instantiate: (di, binaryName) => { - const normalizedPlatform = di.inject(normalizedPlatformInjectable); - - if (normalizedPlatform === "windows") { - return `${binaryName}.exe`; - } - - return binaryName; - }, - lifecycle: lifecycleEnum.keyedSingleton({ - getInstanceKey: (di, binaryName: string) => binaryName, - }), -}); - -export default binaryNameInjectable; diff --git a/packages/core/src/common/utils/bundled-binary-path.injectable.ts b/packages/core/src/common/utils/bundled-binary-path.injectable.ts deleted file mode 100644 index 42ecbca0d9..0000000000 --- a/packages/core/src/common/utils/bundled-binary-path.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; -import joinPathsInjectable from "../path/join-paths.injectable"; -import baseBundledBinariesDirectoryInjectable from "../vars/base-bundled-binaries-dir.injectable"; -import binaryNameInjectable from "./binary-name.injectable"; - -const bundledBinaryPathInjectable = getInjectable({ - id: "bundled-binary-path", - instantiate: (di, name) => { - const joinPaths = di.inject(joinPathsInjectable); - const binaryName = di.inject(binaryNameInjectable, name); - const baseBundledBinariesDirectory = di.inject(baseBundledBinariesDirectoryInjectable); - - return joinPaths(baseBundledBinariesDirectory, binaryName); - }, - lifecycle: lifecycleEnum.keyedSingleton({ - getInstanceKey: (di, binaryName: string) => binaryName, - }), -}); - -export default bundledBinaryPathInjectable; diff --git a/packages/core/src/common/utils/cluster-id-url-parsing.ts b/packages/core/src/common/utils/cluster-id-url-parsing.ts deleted file mode 100644 index 393a791f09..0000000000 --- a/packages/core/src/common/utils/cluster-id-url-parsing.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { ClusterId } from "../cluster-types"; - -/** - * Grab the `ClusterId` out of a host that was generated by `getClusterFrameUrl`, or nothing - * @param host The host section of a URL - * @returns The `ClusterId` part of the host, or `undefined` - */ -export function getClusterIdFromHost(host: string): ClusterId | undefined { - // e.g host == "%clusterId.localhost:45345" - const subDomains = host.split(":")[0].split("."); - - return subDomains.slice(-3, -2)[0]; // ClusterId or undefined -} - -/** - * Get the OpenLens backend routing host for a given `ClusterId` - * @param clusterId The ID to put in front of the current host - * @returns a new URL host section - */ -export function getClusterFrameUrl(clusterId: ClusterId) { - return `//${clusterId}.${location.host}`; -} diff --git a/packages/core/src/common/utils/composable-responsibilities/discriminable/discriminable.ts b/packages/core/src/common/utils/composable-responsibilities/discriminable/discriminable.ts deleted file mode 100644 index 7976004ee6..0000000000 --- a/packages/core/src/common/utils/composable-responsibilities/discriminable/discriminable.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -// See: https://www.typescriptlang.org/docs/handbook/2/narrowing.html#discriminated-unions -export interface Discriminable { readonly kind: T } - -// Note: this will fail at transpilation time, if all kinds are not instructed in switch/case. -// See: https://www.typescriptlang.org/docs/handbook/2/narrowing.html#exhaustiveness-checking -export const checkThatAllDiscriminablesAreExhausted = (value: T) => { - const _exhaustiveCheck: never = value; - - return new Error( - `Tried to exhaust discriminables, but no instructions were found for ${(_exhaustiveCheck as any).kind}`, - ); -}; diff --git a/packages/core/src/common/utils/composable-responsibilities/labelable/labelable.ts b/packages/core/src/common/utils/composable-responsibilities/labelable/labelable.ts deleted file mode 100644 index e0f2d98c21..0000000000 --- a/packages/core/src/common/utils/composable-responsibilities/labelable/labelable.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -export interface Labelable { - readonly label: string; -} diff --git a/packages/core/src/common/utils/composable-responsibilities/showable/showable.ts b/packages/core/src/common/utils/composable-responsibilities/showable/showable.ts deleted file mode 100644 index c31f1cd8ee..0000000000 --- a/packages/core/src/common/utils/composable-responsibilities/showable/showable.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { isBoolean } from "@k8slens/utilities"; -import type { IComputedValue } from "mobx"; - -export interface Showable { - readonly isShown: IComputedValue | boolean; -} - -export type MaybeShowable = Showable | object; - -export const isShown = (showable: MaybeShowable) => { - if (!("isShown" in showable)) { - return true; - } - - if (showable.isShown === undefined) { - return true; - } - - if (isBoolean(showable.isShown)) { - return showable.isShown; - } - - return showable.isShown.get(); -}; diff --git a/packages/core/src/common/utils/composite/composite-has-descendant/composite-has-descendant.test.ts b/packages/core/src/common/utils/composite/composite-has-descendant/composite-has-descendant.test.ts deleted file mode 100644 index 0b7f07bf2d..0000000000 --- a/packages/core/src/common/utils/composite/composite-has-descendant/composite-has-descendant.test.ts +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { Composite } from "../get-composite/get-composite"; -import { compositeHasDescendant } from "./composite-has-descendant"; -import { getCompositeFor } from "../get-composite/get-composite"; - -describe("composite-has-descendant, given composite with children and grand children", () => { - let composite: Composite<{ id: string; parentId?: string }>; - - beforeEach(() => { - const items = [ - { id: "some-root-id", parentId: undefined }, - { id: "some-child-item", parentId: "some-root-id" }, - - { - id: "some-grand-child-item", - parentId: "some-child-item", - }, - ]; - - const getComposite = getCompositeFor<{ - id: string; - parentId?: string; - }>({ - rootId: "some-root-id", - getId: (x) => x.id, - getParentId: (x) => x.parentId, - }); - - composite = getComposite(items); - }); - - it("has a child as descendant", () => { - const actual = compositeHasDescendant( - (referenceComposite) => referenceComposite.value.id === "some-child-item", - )(composite); - - expect(actual).toBe(true); - }); - - it("has a grand child as descendant", () => { - const actual = compositeHasDescendant( - (referenceComposite) => - referenceComposite.value.id === "some-grand-child-item", - )(composite); - - expect(actual).toBe(true); - }); - - it("does not have an unrelated descendant", () => { - const actual = compositeHasDescendant( - (referenceComposite) => - referenceComposite.value.id === "some-unknown-item", - )(composite); - - expect(actual).toBe(false); - }); -}); diff --git a/packages/core/src/common/utils/composite/composite-has-descendant/composite-has-descendant.ts b/packages/core/src/common/utils/composite/composite-has-descendant/composite-has-descendant.ts deleted file mode 100644 index 030f79ad74..0000000000 --- a/packages/core/src/common/utils/composite/composite-has-descendant/composite-has-descendant.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { Composite } from "../get-composite/get-composite"; - -const compositeHasDescendant = ( - predicate: (referenceComposite: Composite) => boolean, -) => { - const _compositeHasDescendant = (composite: Composite): boolean => - predicate(composite) || - !!composite.children.find((childComposite) => - _compositeHasDescendant(childComposite), - ); - - return _compositeHasDescendant; -}; - -export { compositeHasDescendant }; diff --git a/packages/core/src/common/utils/composite/find-composite/find-composite.test.ts b/packages/core/src/common/utils/composite/find-composite/find-composite.test.ts deleted file mode 100644 index 5b4147070e..0000000000 --- a/packages/core/src/common/utils/composite/find-composite/find-composite.test.ts +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { Composite } from "../get-composite/get-composite"; -import { findComposite } from "./find-composite"; -import { getCompositeFor } from "../get-composite/get-composite"; - -describe("find-composite", () => { - let composite: Composite<{ id: string; parentId?: string }>; - - beforeEach(() => { - const getComposite = getCompositeFor<{ - id: string; - parentId?: string; - }>({ - rootId: "some-root-id", - getId: (x) => x.id, - getParentId: (x) => x.parentId, - }); - - composite = getComposite([ - { id: "some-root-id" }, - { id: "some-child-id", parentId: "some-root-id" }, - { id: "some-grandchild-id", parentId: "some-child-id" }, - { id: "some-other-grandchild-id", parentId: "some-child-id" }, - ]); - }); - - it("when finding root using path, does so", () => { - const actual = findComposite("some-root-id")(composite); - - expect(actual.id).toBe("some-root-id"); - }); - - it("when finding child using path, does so", () => { - const actual = findComposite("some-root-id", "some-child-id")(composite); - - expect(actual.id).toBe("some-child-id"); - }); - - it("when finding grandchild using path, does so", () => { - const actual = findComposite( - "some-root-id", - "some-child-id", - "some-grandchild-id", - )(composite); - - expect(actual.id).toBe("some-grandchild-id"); - }); - - it("when finding with non existing leaf-level path, throws", () => { - expect(() => { - findComposite( - "some-root-id", - "some-child-id", - "some-non-existing-grandchild-id", - )(composite); - }).toThrow(`Tried to find 'some-root-id -> some-child-id -> some-non-existing-grandchild-id' from a composite, but found nothing. - -Node 'some-root-id -> some-child-id' had only following children: -some-grandchild-id -some-other-grandchild-id`); - }); - - it("when finding with non-existing mid-level path, throws", () => { - expect(() => { - findComposite( - "some-root-id", - "some-non-existing-child-id", - "some-non-existing-grandchild-id", - )(composite); - }).toThrow(`Tried to find 'some-root-id -> some-non-existing-child-id -> some-non-existing-grandchild-id' from a composite, but found nothing. - -Node 'some-root-id' had only following children: -some-child-id`); - }); - - it("when finding with non-existing root-level path, throws", () => { - expect(() => { - findComposite( - "some-non-existing-root-id", - "some-non-existing-child-id", - "some-non-existing-grandchild-id", - )(composite); - }).toThrow(`Tried to find 'some-non-existing-root-id -> some-non-existing-child-id -> some-non-existing-grandchild-id' from a composite, but found nothing. - -Node 'some-root-id' had only following children: -some-child-id`); - }); -}); diff --git a/packages/core/src/common/utils/composite/find-composite/find-composite.ts b/packages/core/src/common/utils/composite/find-composite/find-composite.ts deleted file mode 100644 index 71dcf5baa3..0000000000 --- a/packages/core/src/common/utils/composite/find-composite/find-composite.ts +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { Composite } from "../get-composite/get-composite"; - -const _findComposite = (currentLeftIds: string[], currentId: string, currentRightIds: string[], composite: Composite): Composite => { - const [nextId, ...nextRightIds] = currentRightIds; - const nextLeftIds = [...currentLeftIds, currentId]; - - if (currentRightIds.length === 0 && composite.id === currentId) { - return composite; - } - - const foundChildComposite = composite.children.find((child) => child.id === nextId); - - if (foundChildComposite) { - return _findComposite(nextLeftIds, nextId, nextRightIds, foundChildComposite); - } - - const fullPathString = [...currentLeftIds, currentId, ...currentRightIds].join(" -> "); - - throw new Error(`Tried to find '${fullPathString}' from a composite, but found nothing. - -Node '${[...currentLeftIds, composite.id].join(" -> ")}' had only following children: -${composite.children.map((child) => child.id).join("\n")}`); -}; - -export const findComposite = - (...path: string[]) => - (composite: Composite): Composite => { - const [currentId, ...rightIds] = path; - const leftIds: string[] = []; - - return _findComposite(leftIds, currentId, rightIds, composite); - }; diff --git a/packages/core/src/common/utils/composite/get-composite-normalization/get-composite-normalization.test.ts b/packages/core/src/common/utils/composite/get-composite-normalization/get-composite-normalization.test.ts deleted file mode 100644 index ac88973251..0000000000 --- a/packages/core/src/common/utils/composite/get-composite-normalization/get-composite-normalization.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getCompositeNormalization } from "./get-composite-normalization"; -import { getCompositeFor } from "../get-composite/get-composite"; - - -describe("get-composite-normalization", () => { - it("given a composite, flattens it to paths and composites", () => { - const someRootItem = { - id: "some-root-id", - parentId: undefined, - }; - - const someItem = { - id: "some-id", - parentId: "some-root-id", - }; - - const someNestedItem = { - id: "some-child-id", - parentId: "some-id", - }; - - const items = [someRootItem, someItem, someNestedItem]; - - const getComposite = getCompositeFor<{ - id: string; - parentId?: string; - orderNumber?: number; - }>({ - rootId: "some-root-id", - getId: (x) => x.id, - getParentId: (x) => x.parentId, - }); - - const composite = getComposite(items); - - const actual = getCompositeNormalization(composite); - - expect(actual).toEqual([ - [["some-root-id"], expect.objectContaining({ value: someRootItem })], - - [["some-root-id", "some-id"], expect.objectContaining({ value: someItem })], - - [ - ["some-root-id", "some-id", "some-child-id"], - expect.objectContaining({ value: someNestedItem }), - ], - ]); - }); -}); diff --git a/packages/core/src/common/utils/composite/get-composite-normalization/get-composite-normalization.ts b/packages/core/src/common/utils/composite/get-composite-normalization/get-composite-normalization.ts deleted file mode 100644 index eb5628171a..0000000000 --- a/packages/core/src/common/utils/composite/get-composite-normalization/get-composite-normalization.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { Composite } from "../get-composite/get-composite"; - -export const getCompositeNormalization = (composite: Composite) => { - const _normalizeComposite = ( - composite: Composite, - previousPath: string[] = [], - ): (readonly [path: string[], composite: Composite])[] => { - const currentPath = [...previousPath, composite.id]; - - const pathAndCompositeTuple = [currentPath, composite] as const; - - return [ - pathAndCompositeTuple, - - ...composite.children.flatMap((child) => - _normalizeComposite(child, currentPath), - ), - ]; - }; - - return _normalizeComposite(composite); -}; diff --git a/packages/core/src/common/utils/composite/get-composite-paths/get-composite-paths.test.ts b/packages/core/src/common/utils/composite/get-composite-paths/get-composite-paths.test.ts deleted file mode 100644 index 079f7e1b83..0000000000 --- a/packages/core/src/common/utils/composite/get-composite-paths/get-composite-paths.test.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getCompositePaths } from "./get-composite-paths"; -import { sortBy } from "lodash/fp"; -import { getCompositeFor } from "../get-composite/get-composite"; - -describe("get-composite-paths", () => { - it("given composite with transformed children, returns paths of transformed children in hierarchical order", () => { - const someRootItem = { - id: "some-root-id", - }; - - const someChildItem1 = { - id: "some-child-id-1", - parentId: "some-root-id", - orderNumber: 1, - }; - - const someChildItem2 = { - id: "some-child-id-2", - parentId: "some-root-id", - orderNumber: 2, - }; - - const someGrandchildItem1 = { - id: "some-grandchild-id-1", - parentId: "some-child-id-1", - orderNumber: 1, - }; - - const someGrandchildItem2 = { - id: "some-grandchild-id-2", - parentId: "some-child-id-1", - orderNumber: 2, - }; - - const items = [ - someRootItem, - // Note: not in order yet. - someChildItem2, - someChildItem1, - someGrandchildItem2, - someGrandchildItem1, - ]; - - const getComposite = getCompositeFor<{ - id: string; - parentId?: string; - orderNumber?: number; - }>({ - rootId: "some-root-id", - getId: (x) => x.id, - getParentId: (x) => x.parentId, - transformChildren: children => sortBy(child => child.orderNumber, children), - }); - - const composite = getComposite(items); - - const actual = getCompositePaths(composite); - - expect(actual).toEqual([ - ["some-root-id"], - ["some-root-id", "some-child-id-1"], - ["some-root-id", "some-child-id-1", "some-grandchild-id-1"], - ["some-root-id", "some-child-id-1", "some-grandchild-id-2"], - ["some-root-id", "some-child-id-2"], - ]); - }); -}); diff --git a/packages/core/src/common/utils/composite/get-composite-paths/get-composite-paths.ts b/packages/core/src/common/utils/composite/get-composite-paths/get-composite-paths.ts deleted file mode 100644 index 2b97467431..0000000000 --- a/packages/core/src/common/utils/composite/get-composite-paths/get-composite-paths.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { pipeline } from "@ogre-tools/fp"; -import { map } from "lodash/fp"; -import type { Composite } from "../get-composite/get-composite"; -import { getCompositeNormalization } from "../get-composite-normalization/get-composite-normalization"; - -export const getCompositePaths = ( - composite: Composite, -): string[][] => pipeline(composite, getCompositeNormalization, map(([path]) => path)); diff --git a/packages/core/src/common/utils/composite/get-composite/get-composite.test.ts b/packages/core/src/common/utils/composite/get-composite/get-composite.test.ts deleted file mode 100644 index 594d0f3d01..0000000000 --- a/packages/core/src/common/utils/composite/get-composite/get-composite.test.ts +++ /dev/null @@ -1,363 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { Composite } from "./get-composite"; -import { getCompositePaths } from "../get-composite-paths/get-composite-paths"; -import { sortBy } from "lodash/fp"; -import { getCompositeFor } from "./get-composite"; - -interface SomeItem { - id: string; - parentId?: string; - orderNumber?: number; -} - -describe("get-composite", () => { - it("given items and an explicit root id, creates a composite", () => { - const someRootItem = { - id: "some-root-id", - someProperty: "some-root-content", - }; - - const someIrrelevantRootItem = { - id: "some-irrelevant-root-id", - someProperty: "some-other-root-content", - }; - - const someItem = { - id: "some-id", - parentId: "some-root-id", - someProperty: "some-content", - }; - - const someNestedItem = { - id: "some-nested-id", - parentId: "some-id", - someProperty: "some-nested-content", - }; - - const items = [someRootItem, someIrrelevantRootItem, someItem, someNestedItem]; - - const getComposite = getCompositeFor({ - rootId: "some-root-id", - getId: (x) => x.id, - getParentId: (x) => x.parentId, - }); - - const composite = getComposite(items); - - expect(composite).toEqual({ - id: "some-root-id", - value: someRootItem, - - children: [ - { - id: "some-id", - parentId: "some-root-id", - value: someItem, - - children: [ - { - id: "some-nested-id", - parentId: "some-id", - value: someNestedItem, - children: [], - }, - ], - }, - ], - }); - }); - - it("given items and implicit root, creates a composite", () => { - const someRootItem = { - id: "some-root-id", - someProperty: "some-root-content", - // Notice: no "parentId" makes this the implicit root. - parentId: undefined, - }; - - const someItem = { - id: "some-id", - parentId: "some-root-id", - someProperty: "some-content", - }; - - const someNestedItem = { - id: "some-nested-id", - parentId: "some-id", - someProperty: "some-nested-content", - }; - - const items = [someRootItem, someItem, someNestedItem]; - - const getComposite = getCompositeFor({ - // Notice: no root id - // rootId: "some-root-id", - getId: (x) => x.id, - getParentId: (x) => x.parentId, - }); - - const composite = getComposite(items); - - expect(composite).toEqual({ - id: "some-root-id", - value: someRootItem, - - children: [ - { - id: "some-id", - parentId: "some-root-id", - value: someItem, - - children: [ - { - id: "some-nested-id", - parentId: "some-id", - value: someNestedItem, - children: [], - }, - ], - }, - ], - }); - }); - - it("given items and an unspecified root id and multiple items without parent as root, throws", () => { - const someRootItem = { - id: "some-root-id", - // Notice: no "parentId" makes this a root. - parentId: undefined, - }; - - const someOtherRootItem = { - id: "some-other-root-id", - // Notice: no "parentId" makes also this a root. - parentId: undefined, - }; - - const items = [someRootItem, someOtherRootItem]; - - const getComposite = getCompositeFor({ - getId: (x) => x.id, - getParentId: (x) => x.parentId, - }); - - expect(() => { - getComposite(items); - }).toThrow( - 'Tried to get a composite, but multiple roots where encountered: "some-root-id", "some-other-root-id"', - ); - }); - - it("given non-unique ids, throws", () => { - const someItem = { - id: "some-id", - parentId: "irrelevant", - }; - - const someOtherItem = { - id: "some-id", - parentId: "irrelevant", - }; - - const items = [someItem, someOtherItem]; - - const getComposite = getCompositeFor({ - getId: (x) => x.id, - getParentId: (x) => x.parentId, - }); - - expect(() => { - getComposite(items); - }).toThrow( - 'Tried to get a composite but encountered non-unique ids: "some-id"', - ); - }); - - it("given items with missing parent ids, when creating composite without handling for unknown parents, throws", () => { - const someItem = { - id: "some-id", - parentId: undefined, - }; - - const someItemWithMissingParentId = { - id: "some-other-id", - parentId: "some-missing-id", - }; - - const items = [someItem, someItemWithMissingParentId]; - - const getComposite = getCompositeFor({ - getId: (x) => x.id, - getParentId: (x) => x.parentId, - }); - - expect(() => { - getComposite(items); - }).toThrow( - `Tried to get a composite but encountered missing parent ids: "some-missing-id". - -Available parent ids are: -"some-id", -"some-other-id"`, - ); - }); - - describe("given items with missing parents, when creating composite with handling for missing parents", () => { - let composite: Composite; - let handleMissingParentIdMock: jest.Mock; - - beforeEach(() => { - const someItem = { - id: "some-root-id", - }; - - const someItemWithMissingParentId = { - id: "some-orphan-id", - // Note: the item corresponding to this id does not exist, - // making this item have a "missing parent". - parentId: "some-missing-id", - }; - - const items = [someItem, someItemWithMissingParentId]; - - handleMissingParentIdMock = jest.fn(); - - const getComposite = getCompositeFor({ - getId: (x) => x.id, - getParentId: (x) => x.parentId, - handleMissingParentIds: handleMissingParentIdMock, - }); - - composite = getComposite(items); - }); - - it("creates composite without the orphan item, and without throwing", () => { - const paths = getCompositePaths(composite); - - expect(paths).toEqual([["some-root-id"]]); - }); - - it("handles the missing parent ids", () => { - expect(handleMissingParentIdMock).toHaveBeenCalledWith({ - missingParentIds: ["some-missing-id"], - availableParentIds: ["some-root-id", "some-orphan-id"], - }); - }); - }); - - it("given items with same id and parent id, throws", () => { - const someItem = { - id: "some-id", - parentId: "some-id", - }; - - const someRoot = { - id: "root", - parentId: undefined, - }; - - const items = [someItem, someRoot]; - - const getComposite = getCompositeFor({ - getId: (x) => x.id, - getParentId: (x) => x.parentId, - }); - - expect(() => { - getComposite(items); - }).toThrow( - 'Tried to get a composite, but found items with self as parent: "some-id"', - ); - }); - - it("given undefined ids, throws", () => { - const root = { - parentId: undefined, - id: "some-root", - }; - - const someItem = { - parentId: "some-root", - id: undefined, - }; - - const someOtherItem = { - parentId: "some-root", - id: undefined, - }; - - const items = [root, someItem, someOtherItem]; - - const getComposite = getCompositeFor({ - getId: (x) => x.id, - getParentId: (x) => x.parentId, - }); - - expect(() => { - getComposite(items); - }).toThrow("Tried to get a composite but encountered 2 undefined ids"); - }); - - it("given transformed children, creates a composite with transformed children", () => { - const someRootItem = { - id: "some-root-id", - orderNumber: 1, - }; - - const someItem1 = { - id: "some-id-1", - parentId: "some-root-id", - orderNumber: 1, - }; - - const someItem2 = { - id: "some-id-2", - parentId: "some-root-id", - orderNumber: 2, - }; - - const someChildItem1 = { - id: "some-child-id-1", - parentId: "some-id-1", - orderNumber: 1, - }; - - const someChildItem2 = { - id: "some-child-id-2", - parentId: "some-id-1", - orderNumber: 2, - }; - - const items = [ - someRootItem, - // Note: not in order yet. - someItem2, - someItem1, - someChildItem2, - someChildItem1, - ]; - - const getComposite = getCompositeFor({ - getId: (x) => x.id, - getParentId: (x) => x.parentId, - transformChildren: (things) => - sortBy((thing) => thing.orderNumber, things), - }); - - const composite = getComposite(items); - - const orderedPaths = getCompositePaths(composite); - - expect(orderedPaths).toEqual([ - ["some-root-id"], - ["some-root-id", "some-id-1"], - ["some-root-id", "some-id-1", "some-child-id-1"], - ["some-root-id", "some-id-1", "some-child-id-2"], - ["some-root-id", "some-id-2"], - ]); - }); -}); diff --git a/packages/core/src/common/utils/composite/get-composite/get-composite.ts b/packages/core/src/common/utils/composite/get-composite/get-composite.ts deleted file mode 100644 index 7e499ad40a..0000000000 --- a/packages/core/src/common/utils/composite/get-composite/get-composite.ts +++ /dev/null @@ -1,147 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { pipeline } from "@ogre-tools/fp"; -import { - countBy, - filter, - toPairs, - nth, - map, - uniq, - without, - compact, - identity, -} from "lodash/fp"; - -export interface Composite { - id: string; - parentId: string | undefined; - value: T; - children: Composite[]; -} - -interface Configuration { - rootId?: string; - getId: (thing: T) => string; - getParentId: (thing: T) => string | undefined; - transformChildren?: (things: T[]) => T[]; - handleMissingParentIds?: (parentIdsForHandling: ParentIdsForHandling) => void; -} - -export const getCompositeFor = ({ - rootId = undefined, - getId, - getParentId, - transformChildren = identity, - handleMissingParentIds = throwMissingParentIds, -}: Configuration) => (source: T[]) => { - const undefinedIds = pipeline( - source, - filter((x) => getId(x) === undefined), - ); - - if (undefinedIds.length) { - throw new Error( - `Tried to get a composite but encountered ${undefinedIds.length} undefined ids`, - ); - } - - const selfReferencingIds = pipeline( - source, - filter((x) => getId(x) === getParentId(x)), - map(getId), - ); - - if (selfReferencingIds.length) { - throw new Error( - `Tried to get a composite, but found items with self as parent: "${selfReferencingIds.join( - '", ', - )}"`, - ); - } - - const duplicateIds = pipeline( - source, - countBy(getId), - toPairs, - filter(([, count]) => count > 1), - map(nth(0)), - ); - - if (duplicateIds.length) { - throw new Error( - `Tried to get a composite but encountered non-unique ids: "${duplicateIds - .map((x) => String(x)) - .join('", "')}"`, - ); - } - - const allIds = pipeline(source, map(getId)); - - const allParentIds = pipeline(source, map(getParentId), uniq, compact); - - const missingParentIds = without(allIds, allParentIds); - - if (missingParentIds.length) { - handleMissingParentIds({ missingParentIds, availableParentIds: allIds }); - } - - const toComposite = (thing: T): Composite => { - const thingId = getId(thing); - - return { - id: thingId, - parentId: getParentId(thing), - value: thing, - - children: pipeline( - source, - - filter((childThing) => { - const parentId = getParentId(childThing); - - return parentId === thingId; - }), - - transformChildren, - - map(toComposite), - ), - }; - }; - - const isRootId = rootId - ? (thing: T) => getId(thing) === rootId - : (thing: T) => getParentId(thing) === undefined; - - const roots = source.filter(isRootId); - - if (roots.length > 1) { - throw new Error( - `Tried to get a composite, but multiple roots where encountered: "${roots - .map(getId) - .join('", "')}"`, - ); - } - - return toComposite(roots[0]); - }; - -interface ParentIdsForHandling { - missingParentIds: string[]; - availableParentIds: string[]; -} - -const throwMissingParentIds = ({ - missingParentIds, - availableParentIds, -}: ParentIdsForHandling) => { - throw new Error( - `Tried to get a composite but encountered missing parent ids: "${missingParentIds.join( - '", "', - )}".\n\nAvailable parent ids are:\n"${availableParentIds.join('",\n"')}"`, - ); -}; diff --git a/packages/core/src/common/utils/composite/interfaces.ts b/packages/core/src/common/utils/composite/interfaces.ts deleted file mode 100644 index 1c29a0e4ce..0000000000 --- a/packages/core/src/common/utils/composite/interfaces.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export interface ParentOfChildComposite { - id: Id; -} - -export interface ChildOfParentComposite { - parentId: ParentId; -} - -export type RootComposite = - & { parentId: undefined } - & ParentOfChildComposite; diff --git a/packages/core/src/common/utils/date/get-current-date-time.ts b/packages/core/src/common/utils/date/get-current-date-time.ts deleted file mode 100644 index aa4d5e7fa3..0000000000 --- a/packages/core/src/common/utils/date/get-current-date-time.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import moment from "moment"; - -export const getCurrentDateTime = () => moment().utc().format(); - -export const getMillisecondsFromUnixEpoch = () => Date.now(); - -export const getSecondsFromUnixEpoch = () => Math.floor(getMillisecondsFromUnixEpoch() / 1000); diff --git a/packages/core/src/common/utils/enum.ts b/packages/core/src/common/utils/enum.ts deleted file mode 100644 index 64106927c2..0000000000 --- a/packages/core/src/common/utils/enum.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export function enumKeys(obj: O): K[] { - return Object.keys(obj).filter(k => Number.isNaN(+k)) as K[]; -} diff --git a/packages/core/src/common/utils/find-exactly-one/find-exactly-one.test.ts b/packages/core/src/common/utils/find-exactly-one/find-exactly-one.test.ts deleted file mode 100644 index 08dbb9ce72..0000000000 --- a/packages/core/src/common/utils/find-exactly-one/find-exactly-one.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { findExactlyOne } from "./find-exactly-one"; - -describe("find-exactly-one", () => { - it("when predicate matches to single item, returns the item", () => { - const actual = findExactlyOne((item) => item === "some-item")([ - "some-item", - "some-other-item", - ]); - - expect(actual).toBe("some-item"); - }); - - it("when predicate matches to many items, throws", () => { - expect(() => { - findExactlyOne((item) => item === "some-item")([ - "some-item", - "some-item", - ]); - }).toThrow("Tried to find exactly one, but found many"); - }); - - it("when predicate does not match, throws", () => { - expect(() => { - findExactlyOne((item) => item === "some-item")([ - "some-other-item", - ]); - }).toThrow("Tried to find exactly one, but didn't find any"); - }); -}); diff --git a/packages/core/src/common/utils/find-exactly-one/find-exactly-one.ts b/packages/core/src/common/utils/find-exactly-one/find-exactly-one.ts deleted file mode 100644 index 181720d8b1..0000000000 --- a/packages/core/src/common/utils/find-exactly-one/find-exactly-one.ts +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -export const findExactlyOne = (predicate: (item: T) => boolean) => (collection: T[]): T => { - const itemsFound = collection.filter(predicate); - - if (!itemsFound.length) { - throw new Error( - "Tried to find exactly one, but didn't find any", - ); - } - - if (itemsFound.length > 1) { - throw new Error( - "Tried to find exactly one, but found many", - ); - } - - return itemsFound[0]; -}; diff --git a/packages/core/src/common/utils/generate-new-id-for.ts b/packages/core/src/common/utils/generate-new-id-for.ts deleted file mode 100644 index 31aba26e20..0000000000 --- a/packages/core/src/common/utils/generate-new-id-for.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { createHash } from "crypto"; - -export function generateNewIdFor(cluster: { kubeConfigPath: string; contextName: string }): string { - return createHash("md5").update(`${cluster.kubeConfigPath}:${cluster.contextName}`).digest("hex"); -} diff --git a/packages/core/src/common/utils/get-error-message.ts b/packages/core/src/common/utils/get-error-message.ts deleted file mode 100644 index 305d5a9ce9..0000000000 --- a/packages/core/src/common/utils/get-error-message.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { JsonApiErrorParsed } from "@k8slens/json-api"; - -export const getErrorMessage = (error: unknown): string => { - if (typeof error === "string") { - return error; - } - - if (error instanceof Error) { - return error.message; - } - - if (error instanceof JsonApiErrorParsed) { - return error.toString(); - } - - return JSON.stringify(error); -}; diff --git a/packages/core/src/common/utils/get-random-id.global-override-for-injectable.ts b/packages/core/src/common/utils/get-random-id.global-override-for-injectable.ts deleted file mode 100644 index bc2b539fc3..0000000000 --- a/packages/core/src/common/utils/get-random-id.global-override-for-injectable.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "@k8slens/test-utils"; -import { getRandomIdInjectionToken } from "@k8slens/random"; - -export default getGlobalOverride(getRandomIdInjectionToken, () => () => "some-irrelevant-random-id"); diff --git a/packages/core/src/common/utils/index.ts b/packages/core/src/common/utils/index.ts deleted file mode 100644 index d95bd52904..0000000000 --- a/packages/core/src/common/utils/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export * from "./cluster-id-url-parsing"; -export * from "./toJS"; diff --git a/packages/core/src/common/utils/open-link-in-browser.global-override-for-injectable.ts b/packages/core/src/common/utils/open-link-in-browser.global-override-for-injectable.ts deleted file mode 100644 index d7e005020e..0000000000 --- a/packages/core/src/common/utils/open-link-in-browser.global-override-for-injectable.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "@k8slens/test-utils"; -import openLinkInBrowserInjectable from "./open-link-in-browser.injectable"; - -export default getGlobalOverride(openLinkInBrowserInjectable, () => async () => {}); diff --git a/packages/core/src/common/utils/open-link-in-browser.injectable.ts b/packages/core/src/common/utils/open-link-in-browser.injectable.ts deleted file mode 100644 index eaa91939e9..0000000000 --- a/packages/core/src/common/utils/open-link-in-browser.injectable.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { shell } from "electron"; - -const allowedProtocols = new Set(["http:", "https:"]); - -export type OpenLinkInBrowser = (url: string) => Promise; - -const openLinkInBrowserInjectable = getInjectable({ - id: "open-link-in-browser", - instantiate: (): OpenLinkInBrowser => ( - async (url) => { - const { protocol } = new URL(url); - - if (!allowedProtocols.has(protocol)) { - throw new TypeError("not an http(s) URL"); - } - - await shell.openExternal(url); - } - ), - causesSideEffects: true, -}); - -export default openLinkInBrowserInjectable; diff --git a/packages/core/src/common/utils/platform-specific-version.injectable.ts b/packages/core/src/common/utils/platform-specific-version.injectable.ts deleted file mode 100644 index 79abad6a49..0000000000 --- a/packages/core/src/common/utils/platform-specific-version.injectable.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { DiContainerForInjection, InjectionToken } from "@ogre-tools/injectable"; -import { getInjectable } from "@ogre-tools/injectable"; -import platformInjectable from "../vars/platform.injectable"; - -export interface PlatformSpecific { - instantiate: () => T; - readonly platform: NodeJS.Platform; -} - -const platformSpecificVersionInjectable = getInjectable({ - id: "platform-specific-version", - instantiate: (di: DiContainerForInjection) => { - const targetPlatform = di.inject(platformInjectable); - - return (token: InjectionToken, void>) => ( - di.injectMany(token) - .find(impl => impl.platform === targetPlatform) - ?.instantiate() - ); - }, -}); - -export default platformSpecificVersionInjectable; - diff --git a/packages/core/src/common/utils/random-bytes.global-override-for-injectable.ts b/packages/core/src/common/utils/random-bytes.global-override-for-injectable.ts deleted file mode 100644 index d4cc7519cd..0000000000 --- a/packages/core/src/common/utils/random-bytes.global-override-for-injectable.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "@k8slens/test-utils"; -import randomBytesInjectable from "./random-bytes.injectable"; - -export default getGlobalOverride(randomBytesInjectable, () => (size) => { - const res = Buffer.alloc(size); - - for (let i = 0; i < size; i += 1) { - res[i] = i; - } - - return res; -}); diff --git a/packages/core/src/common/utils/random-bytes.injectable.ts b/packages/core/src/common/utils/random-bytes.injectable.ts deleted file mode 100644 index fce3a0d523..0000000000 --- a/packages/core/src/common/utils/random-bytes.injectable.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { randomBytes } from "crypto"; - -export type RandomBytes = (size: number) => Buffer; - -const randomBytesInjectable = getInjectable({ - id: "random-bytes", - instantiate: (): RandomBytes => randomBytes, - causesSideEffects: true, -}); - -export default randomBytesInjectable; diff --git a/packages/core/src/common/utils/reactive-now/reactive-now.test.tsx b/packages/core/src/common/utils/reactive-now/reactive-now.test.tsx deleted file mode 100644 index 5776388516..0000000000 --- a/packages/core/src/common/utils/reactive-now/reactive-now.test.tsx +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { RenderResult } from "@testing-library/react"; -import { render } from "@testing-library/react"; -import type { IComputedValue } from "mobx"; -import { computed, observe } from "mobx"; -import React from "react"; -import { observer } from "mobx-react"; -import { reactiveNow } from "./reactive-now"; -import { advanceFakeTime, testUsingFakeTime } from "../../../test-utils/use-fake-time"; - -describe("reactiveNow", () => { - let someComputed: IComputedValue; - - beforeEach(() => { - testUsingFakeTime("2015-10-21T07:28:00Z"); - - someComputed = computed(() => { - const currentTimestamp = reactiveNow(); - - return currentTimestamp > new Date("2015-10-21T07:28:00Z").getTime(); - }); - }); - - describe("react-context", () => { - let rendered: RenderResult; - - beforeEach(() => { - const TestComponent = observer( - ({ someComputed }: { someComputed: IComputedValue }) => ( -
{someComputed.get() ? "true" : "false"}
- ), - ); - - rendered = render(); - }); - - it("given time passes, works", () => { - advanceFakeTime(1000); - - expect(rendered.container.textContent).toBe("true"); - }); - - it("does not share the state from previous test", () => { - expect(rendered.container.textContent).toBe("false"); - }); - }); - - describe("non-react-context", () => { - let actual: boolean; - - beforeEach(() => { - observe(someComputed, (changed) => { - actual = changed.newValue as boolean; - }, true); - }); - - it("given time passes, works", () => { - advanceFakeTime(1000); - - expect(actual).toBe(true); - }); - - it("does not share the state from previous test", () => { - expect(actual).toBe(false); - }); - }); -}); diff --git a/packages/core/src/common/utils/reactive-now/reactive-now.ts b/packages/core/src/common/utils/reactive-now/reactive-now.ts deleted file mode 100644 index febac37010..0000000000 --- a/packages/core/src/common/utils/reactive-now/reactive-now.ts +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { _isComputingDerivation } from "mobx"; -import type { IResource } from "mobx-utils"; -import { fromResource } from "mobx-utils"; - -// Note: This file is copy-pasted from mobx-utils to fix very specific issue. -// TODO: Remove this file once https://github.com/mobxjs/mobx-utils/issues/306 is fixed. -const tickers: Record> = {}; - -export function reactiveNow(interval?: number | "frame") { - if (interval === void 0) { interval = 1000; } - - if (!_isComputingDerivation()) { - // See #40 - return Date.now(); - } - - // Note: This is the kludge until https://github.com/mobxjs/mobx-utils/issues/306 is fixed - const synchronizationIsEnabled = !process.env.JEST_WORKER_ID; - - if (!tickers[interval] || !synchronizationIsEnabled) { - if (typeof interval === "number") - tickers[interval] = createIntervalTicker(interval); - else - tickers[interval] = createAnimationFrameTicker(); - } - - return tickers[interval].current(); -} - -function createIntervalTicker(interval: number) { - let subscriptionHandle: NodeJS.Timer; - - return fromResource(function (sink) { - sink(Date.now()); - subscriptionHandle = setInterval(function () { return sink(Date.now()); }, interval); - }, function () { - clearInterval(subscriptionHandle); - }, Date.now()); -} - -function createAnimationFrameTicker() { - const frameBasedTicker = fromResource(function (sink) { - sink(Date.now()); - - function scheduleTick() { - window.requestAnimationFrame(function () { - sink(Date.now()); - if (frameBasedTicker.isAlive()) - scheduleTick(); - }); - } - scheduleTick(); - }, function () { }, Date.now()); - - return frameBasedTicker; -} diff --git a/packages/core/src/common/utils/registrator-helper.ts b/packages/core/src/common/utils/registrator-helper.ts deleted file mode 100644 index 4a9cc5c2d2..0000000000 --- a/packages/core/src/common/utils/registrator-helper.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { iter } from "@k8slens/utilities"; -import type { DiContainerForInjection, Injectable } from "@ogre-tools/injectable"; - -// Register new injectables and deregister removed injectables by id - -export const injectableDifferencingRegistratorWith = (di: DiContainerForInjection) => ( - (rawCurrent: Injectable[], rawPrevious: Injectable[] = []) => { - const current = new Map(rawCurrent.map(inj => [inj.id, inj])); - const previous = new Map(rawPrevious.map(inj => [inj.id, inj])); - const toAdd = iter.chain(current.entries()) - .filter(([id]) => !previous.has(id)) - .collect(entries => new Map(entries)); - const toRemove = iter.chain(previous.entries()) - .filter(([id]) => !current.has(id)) - .collect(entries => new Map(entries)); - - di.deregister(...toRemove.values()); - di.register(...toAdd.values()); - } -); diff --git a/packages/core/src/common/utils/replace-observable-object.ts b/packages/core/src/common/utils/replace-observable-object.ts deleted file mode 100644 index 8b88187b6c..0000000000 --- a/packages/core/src/common/utils/replace-observable-object.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { runInAction } from "mobx"; - -export function replaceObservableObject(target: Partial>, source: Partial>): void { - runInAction(() => { - for (const key in target) { - if (!(key in source)) { - delete target[key]; - } - } - - Object.assign(target, source); - }); -} diff --git a/packages/core/src/common/utils/resolve-system-proxy/resolve-system-proxy-channel.ts b/packages/core/src/common/utils/resolve-system-proxy/resolve-system-proxy-channel.ts deleted file mode 100644 index 210112c0b7..0000000000 --- a/packages/core/src/common/utils/resolve-system-proxy/resolve-system-proxy-channel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getRequestChannel } from "@k8slens/messaging"; - -export const resolveSystemProxyChannel = getRequestChannel( - "resolve-system-proxy-channel", -); diff --git a/packages/core/src/common/utils/resolve-system-proxy/resolve-system-proxy-injection-token.ts b/packages/core/src/common/utils/resolve-system-proxy/resolve-system-proxy-injection-token.ts deleted file mode 100644 index 616718ea98..0000000000 --- a/packages/core/src/common/utils/resolve-system-proxy/resolve-system-proxy-injection-token.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getInjectionToken } from "@ogre-tools/injectable"; - -export type ResolveSystemProxy = (url: string) => Promise; - -export const resolveSystemProxyInjectionToken = getInjectionToken({ - id: "resolve-system-proxy", -}); diff --git a/packages/core/src/common/utils/singleton.ts b/packages/core/src/common/utils/singleton.ts deleted file mode 100644 index 0dea1f7526..0000000000 --- a/packages/core/src/common/utils/singleton.ts +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export interface StaticThis { new(...args: R): T } - -/** - * @deprecated This is a form of global shared state - */ -export class Singleton { - private static readonly instances = new WeakMap(); - private static creating = ""; - - constructor() { - if (Singleton.creating.length === 0) { - throw new TypeError("A singleton class must be created by createInstance()"); - } - } - - /** - * Creates the single instance of the child class if one was not already created. - * - * Multiple calls will return the same instance. - * Essentially throwing away the arguments to the subsequent calls. - * - * Note: this is a racy function, if two (or more) calls are racing to call this function - * only the first's arguments will be used. - * @param this Implicit argument that is the child class type - * @param args The constructor arguments for the child class - * @returns An instance of the child class - */ - static createInstance(this: StaticThis, ...args: R): T { - if (!Singleton.instances.has(this)) { - if (Singleton.creating.length > 0) { - throw new TypeError(`Cannot create a second singleton (${this.name}) while creating a first (${Singleton.creating})`); - } - - try { - Singleton.creating = this.name; - Singleton.instances.set(this, new this(...args)); - } finally { - Singleton.creating = ""; - } - } - - return Singleton.instances.get(this) as T; - } - - /** - * Get the instance of the child class that was previously created. - * @param this Implicit argument that is the child class type - * @param strict If false will return `undefined` instead of throwing when an instance doesn't exist. - * Default: `true` - * @returns An instance of the child class - */ - static getInstance(this: StaticThis, strict?: true): T; - static getInstance(this: StaticThis, strict: false): T | undefined; - static getInstance(this: StaticThis, strict = true): T | undefined { - if (!Singleton.instances.has(this) && strict) { - throw new TypeError(`instance of ${this.name} is not created`); - } - - return Singleton.instances.get(this) as (T | undefined); - } - - /** - * Delete the instance of the child class. - * - * Note: this doesn't prevent callers of `getInstance` from storing the result in a global. - * - * There is *no* way in JS or TS to prevent globals like that. - */ - static resetInstance() { - Singleton.instances.delete(this); - } -} - -export default Singleton; diff --git a/packages/core/src/common/utils/sync-box/channel-listener.injectable.ts b/packages/core/src/common/utils/sync-box/channel-listener.injectable.ts deleted file mode 100644 index 482886d178..0000000000 --- a/packages/core/src/common/utils/sync-box/channel-listener.injectable.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { syncBoxChannel } from "./channels"; -import { getMessageChannelListenerInjectable } from "@k8slens/messaging"; -import syncBoxStateInjectable from "./sync-box-state.injectable"; - -const syncBoxChannelListenerInjectable = getMessageChannelListenerInjectable({ - id: "init", - channel: syncBoxChannel, - getHandler: (di) => ({ id, value }) => di.inject(syncBoxStateInjectable, id).set(value), -}); - -export default syncBoxChannelListenerInjectable; diff --git a/packages/core/src/common/utils/sync-box/channels.ts b/packages/core/src/common/utils/sync-box/channels.ts deleted file mode 100644 index 5178ff013c..0000000000 --- a/packages/core/src/common/utils/sync-box/channels.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getMessageChannel, getRequestChannel } from "@k8slens/messaging"; - -export const syncBoxChannel = - getMessageChannel<{ id: string; value: any }>("sync-box-channel"); - -export const syncBoxInitialValueChannel = getRequestChannel< - void, - { id: string; value: any }[] ->("sync-box-initial-value-channel"); diff --git a/packages/core/src/common/utils/sync-box/create-sync-box.injectable.ts b/packages/core/src/common/utils/sync-box/create-sync-box.injectable.ts deleted file mode 100644 index 2a142dc573..0000000000 --- a/packages/core/src/common/utils/sync-box/create-sync-box.injectable.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { IObservableValue } from "mobx"; -import { computed } from "mobx"; -import { syncBoxChannel } from "./channels"; -import { sendMessageToChannelInjectionToken } from "@k8slens/messaging"; -import syncBoxStateInjectable from "./sync-box-state.injectable"; -import type { SyncBox } from "./sync-box-injection-token"; -import { toJS } from "../toJS"; - -const createSyncBoxInjectable = getInjectable({ - id: "create-sync-box", - - instantiate: (di) => { - const messageToChannel = di.inject(sendMessageToChannelInjectionToken); - const getSyncBoxState = (id: string) => di.inject(syncBoxStateInjectable, id); - - return (id: string, initialValue: Value): SyncBox => { - const state = getSyncBoxState(id) as IObservableValue; - - state.set(initialValue); - - return { - id, - - value: computed(() => toJS(state.get())), - - set: (value) => { - state.set(value); - - messageToChannel(syncBoxChannel, { id, value }); - }, - }; - }; - }, -}); - -export default createSyncBoxInjectable; - diff --git a/packages/core/src/common/utils/sync-box/sync-box-injection-token.ts b/packages/core/src/common/utils/sync-box/sync-box-injection-token.ts deleted file mode 100644 index 8db80243d3..0000000000 --- a/packages/core/src/common/utils/sync-box/sync-box-injection-token.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectionToken } from "@ogre-tools/injectable"; -import type { IComputedValue } from "mobx"; -export interface SyncBox { - id: string; - value: IComputedValue; - set: (value: Value) => void; -} - -export const syncBoxInjectionToken = getInjectionToken>({ - id: "sync-box", -}); diff --git a/packages/core/src/common/utils/sync-box/sync-box-state.injectable.ts b/packages/core/src/common/utils/sync-box/sync-box-state.injectable.ts deleted file mode 100644 index e695833da4..0000000000 --- a/packages/core/src/common/utils/sync-box/sync-box-state.injectable.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; -import { observable } from "mobx"; - -const syncBoxStateInjectable = getInjectable({ - id: "sync-box-state", - - instantiate: () => observable.box(), - - lifecycle: lifecycleEnum.keyedSingleton({ - getInstanceKey: (di, id: string) => id, - }), -}); - -export default syncBoxStateInjectable; diff --git a/packages/core/src/common/utils/sync-box/sync-box.test.ts b/packages/core/src/common/utils/sync-box/sync-box.test.ts deleted file mode 100644 index 4697a89f98..0000000000 --- a/packages/core/src/common/utils/sync-box/sync-box.test.ts +++ /dev/null @@ -1,172 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { DiContainer } from "@ogre-tools/injectable"; -import { getInjectable } from "@ogre-tools/injectable"; -import { observe, runInAction } from "mobx"; -import type { ApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder"; -import { getApplicationBuilder } from "../../../renderer/components/test-utils/get-application-builder"; -import createSyncBoxInjectable from "./create-sync-box.injectable"; -import type { SyncBox } from "./sync-box-injection-token"; -import { syncBoxInjectionToken } from "./sync-box-injection-token"; - -describe("sync-box", () => { - let applicationBuilder: ApplicationBuilder; - - beforeEach(() => { - applicationBuilder = getApplicationBuilder(); - - applicationBuilder.beforeApplicationStart(({ mainDi }) => { - runInAction(() => { - mainDi.register(someInjectable); - }); - }); - - applicationBuilder.beforeWindowStart(({ windowDi }) => { - runInAction(() => { - windowDi.register(someInjectable); - }); - }); - }); - - describe("given application is started, when value is set in main", () => { - let valueInMain: string; - let syncBoxInMain: SyncBox; - - beforeEach(async () => { - await applicationBuilder.startHidden(); - - syncBoxInMain = applicationBuilder.mainDi.inject(someInjectable); - - observe(syncBoxInMain.value, ({ newValue }) => { - valueInMain = newValue as string; - }, true); - - runInAction(() => { - syncBoxInMain.set("some-value-from-main"); - }); - }); - - it("knows value in main", () => { - expect(valueInMain).toBe("some-value-from-main"); - }); - - describe("when window starts", () => { - let valueInRenderer: string; - let syncBoxInRenderer: SyncBox; - let rendererDi: DiContainer; - - beforeEach(async () => { - const applicationWindow = - applicationBuilder.applicationWindow.create("some-window-id"); - - await applicationWindow.start(); - - rendererDi = applicationWindow.di; - - syncBoxInRenderer = rendererDi.inject(someInjectable); - - observe(syncBoxInRenderer.value, ({ newValue }) => { - valueInRenderer = newValue as string; - }, true); - }); - - it("has the value from main", () => { - expect(valueInRenderer).toBe("some-value-from-main"); - }); - - describe("when value is set from renderer", () => { - beforeEach(() => { - runInAction(() => { - syncBoxInRenderer.set("some-value-from-renderer"); - }); - }); - - it("has value in main", () => { - expect(valueInMain).toBe("some-value-from-renderer"); - }); - - it("has value in renderer", () => { - expect(valueInRenderer).toBe("some-value-from-renderer"); - }); - }); - }); - }); - - describe("when application starts with a window", () => { - let valueInRenderer: string; - let valueInMain: string; - let syncBoxInMain: SyncBox; - let syncBoxInRenderer: SyncBox; - - beforeEach(async () => { - await applicationBuilder.render(); - - const applicationWindow = applicationBuilder.applicationWindow.only; - - syncBoxInMain = applicationBuilder.mainDi.inject(someInjectable); - syncBoxInRenderer = applicationWindow.di.inject(someInjectable); - - observe(syncBoxInRenderer.value, ({ newValue }) => { - valueInRenderer = newValue as string; - }, true); - - observe(syncBoxInMain.value, ({ newValue }) => { - valueInMain = newValue as string; - }, true); - }); - - it("knows initial value in main", () => { - expect(valueInMain).toBe("some-initial-value"); - }); - - it("knows initial value in renderer", () => { - expect(valueInRenderer).toBe("some-initial-value"); - }); - - describe("when value is set from main", () => { - beforeEach(() => { - runInAction(() => { - syncBoxInMain.set("some-value-from-main"); - }); - }); - - it("has value in main", () => { - expect(valueInMain).toBe("some-value-from-main"); - }); - - it("has value in renderer", () => { - expect(valueInRenderer).toBe("some-value-from-main"); - }); - - describe("when value is set from renderer", () => { - beforeEach(() => { - runInAction(() => { - syncBoxInRenderer.set("some-value-from-renderer"); - }); - }); - - it("has value in main", () => { - expect(valueInMain).toBe("some-value-from-renderer"); - }); - - it("has value in renderer", () => { - expect(valueInRenderer).toBe("some-value-from-renderer"); - }); - }); - }); - }); -}); - -const someInjectable = getInjectable({ - id: "some-injectable", - - instantiate: (di) => { - const createSyncBox = di.inject(createSyncBoxInjectable); - - return createSyncBox("some-sync-box", "some-initial-value"); - }, - - injectionToken: syncBoxInjectionToken, -}); diff --git a/packages/core/src/common/utils/toJS.ts b/packages/core/src/common/utils/toJS.ts deleted file mode 100644 index 2d70f564cb..0000000000 --- a/packages/core/src/common/utils/toJS.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -/** - * Wrapper for mobx.toJS() to support partially observable objects as data-input (>= mobx6). - * Otherwise, output result won't be recursively converted to corresponding plain JS-structure. - * - * @example - * mobx.toJS({one: 1, two: observable.array([2])}); // "data.two" == ObservableArray - */ -import * as mobx from "mobx"; -import { isObservable, observable } from "mobx"; - -/** - * @deprecated Switch to doing toJS on each field instead - */ -export function toJS(data: T): T { - // make data observable for recursive toJS()-output - if (typeof data === "object" && !isObservable(data)) { - return mobx.toJS(observable.box(data).get()); - } - - return mobx.toJS(data); -} diff --git a/packages/core/src/common/utils/wait-for-path.ts b/packages/core/src/common/utils/wait-for-path.ts deleted file mode 100644 index f5a068075b..0000000000 --- a/packages/core/src/common/utils/wait-for-path.ts +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { FSWatcher } from "chokidar"; -import path from "path"; - -/** - * Wait for `filePath` and all parent directories to exist. - * @param pathname The file path to wait until it exists - * - * NOTE: There is technically a race condition in this function of the form - * "time-of-check to time-of-use" because we have to wait for each parent - * directory to exist first. - */ -export async function waitForPath(pathname: string): Promise { - const dirOfPath = path.dirname(pathname); - - if (dirOfPath === pathname) { - // The root of this filesystem, assume it exists - return; - } else { - await waitForPath(dirOfPath); - } - - return new Promise((resolve, reject) => { - const watcher = new FSWatcher({ - depth: 0, - disableGlobbing: true, - }); - const onAddOrAddDir = (filePath: string) => { - if (filePath === pathname) { - watcher.unwatch(dirOfPath); - watcher - .close() - .then(() => resolve()) - .catch(reject); - } - }; - const onError = (error: any) => { - watcher.unwatch(dirOfPath); - watcher - .close() - .then(() => reject(error)) - .catch(() => reject(error)); - }; - - watcher - .on("add", onAddOrAddDir) - .on("addDir", onAddOrAddDir) - .on("error", onError) - .add(dirOfPath); - }); -} diff --git a/packages/core/src/common/utils/with-error-logging/with-error-logging.injectable.ts b/packages/core/src/common/utils/with-error-logging/with-error-logging.injectable.ts deleted file mode 100644 index 37bf7220c7..0000000000 --- a/packages/core/src/common/utils/with-error-logging/with-error-logging.injectable.ts +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import logErrorInjectable from "../../log-error.injectable"; - -export type WithErrorLoggingFor = ( - getErrorMessage: (error: unknown) => string -) => any>( - toBeDecorated: T -) => (...args: Parameters) => ReturnType; - -const withErrorLoggingInjectable = getInjectable({ - id: "with-error-logging", - - instantiate: (di): WithErrorLoggingFor => { - const logError = di.inject(logErrorInjectable); - - return (getErrorMessage) => - (toBeDecorated) => - (...args) => { - let returnValue: ReturnType; - - try { - returnValue = toBeDecorated(...args); - } catch (e) { - const errorMessage = getErrorMessage(e); - - logError(errorMessage, e); - - throw e; - } - - if ((returnValue as any) instanceof Promise) { - return returnValue.catch((e: unknown) => { - const errorMessage = getErrorMessage(e); - - logError(errorMessage, e); - - throw e; - }); - } - - return returnValue; - }; - }, -}); - -export default withErrorLoggingInjectable; diff --git a/packages/core/src/common/utils/with-error-logging/with-error-logging.test.ts b/packages/core/src/common/utils/with-error-logging/with-error-logging.test.ts deleted file mode 100644 index 9cc5899ce6..0000000000 --- a/packages/core/src/common/utils/with-error-logging/with-error-logging.test.ts +++ /dev/null @@ -1,240 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getDiForUnitTesting } from "../../../main/getDiForUnitTesting"; -import withErrorLoggingInjectable from "./with-error-logging.injectable"; -import { pipeline } from "@ogre-tools/fp"; -import type { AsyncFnMock } from "@async-fn/jest"; -import asyncFn from "@async-fn/jest"; -import { getPromiseStatus } from "@k8slens/test-utils"; -import logErrorInjectable from "../../log-error.injectable"; - -describe("with-error-logging", () => { - describe("given decorated sync function", () => { - let toBeDecorated: jest.Mock; - let decorated: (a: string, b: string) => number | undefined; - let logErrorMock: jest.Mock; - - beforeEach(() => { - const di = getDiForUnitTesting(); - - logErrorMock = jest.fn(); - - di.override(logErrorInjectable, () => logErrorMock); - - const withErrorLoggingFor = di.inject(withErrorLoggingInjectable); - - toBeDecorated = jest.fn(); - - decorated = pipeline( - toBeDecorated, - withErrorLoggingFor((error: any) => `some-error-message-for-${error.message}`), - ); - }); - - describe("when function does not throw and returns value", () => { - let returnValue: number | undefined; - - beforeEach(() => { - // eslint-disable-next-line unused-imports/no-unused-vars-ts - toBeDecorated.mockImplementation((_, __) => 42); - - returnValue = decorated("some-parameter", "some-other-parameter"); - }); - - it("passes arguments to decorated function", () => { - expect(toBeDecorated).toHaveBeenCalledWith("some-parameter", "some-other-parameter"); - }); - - it("does not log error", () => { - expect(logErrorMock).not.toHaveBeenCalled(); - }); - - it("returns the value", () => { - expect(returnValue).toBe(42); - }); - }); - - describe("when function does not throw and returns no value", () => { - let returnValue: number | undefined; - - beforeEach(() => { - // eslint-disable-next-line unused-imports/no-unused-vars-ts - toBeDecorated.mockImplementation((_, __) => undefined); - - returnValue = decorated("some-parameter", "some-other-parameter"); - }); - - it("passes arguments to decorated function", () => { - expect(toBeDecorated).toHaveBeenCalledWith("some-parameter", "some-other-parameter"); - }); - - it("does not log error", () => { - expect(logErrorMock).not.toHaveBeenCalled(); - }); - - it("returns nothing", () => { - expect(returnValue).toBeUndefined(); - }); - }); - - describe("when function throws", () => { - let error: Error; - - beforeEach(() => { - // eslint-disable-next-line unused-imports/no-unused-vars-ts - toBeDecorated.mockImplementation((_, __) => { - throw new Error("some-error"); - }); - - try { - decorated("some-parameter", "some-other-parameter"); - } catch (e: any) { - error = e; - } - }); - - it("passes arguments to decorated function", () => { - expect(toBeDecorated).toHaveBeenCalledWith("some-parameter", "some-other-parameter"); - }); - - it("logs the error", () => { - expect(logErrorMock).toHaveBeenCalledWith("some-error-message-for-some-error", error); - }); - - it("throws", () => { - expect(error.message).toBe("some-error"); - }); - }); - }); - - describe("given decorated async function", () => { - let decorated: (a: string, b: string) => Promise; - let toBeDecorated: AsyncFnMock; - let logErrorMock: jest.Mock; - - beforeEach(() => { - const di = getDiForUnitTesting(); - - logErrorMock = jest.fn(); - - di.override(logErrorInjectable, () => logErrorMock); - - const withErrorLoggingFor = di.inject(withErrorLoggingInjectable); - - toBeDecorated = asyncFn(); - - decorated = pipeline( - toBeDecorated, - - withErrorLoggingFor( - (error: any) => - `some-error-message-for-${error.message || error.someProperty}`, - ), - ); - }); - - describe("when called", () => { - let returnValuePromise: Promise; - - beforeEach(() => { - returnValuePromise = decorated("some-parameter", "some-other-parameter"); - }); - - it("passes arguments to decorated function", () => { - expect(toBeDecorated).toHaveBeenCalledWith("some-parameter", "some-other-parameter"); - }); - - it("does not log error yet", () => { - expect(logErrorMock).not.toHaveBeenCalled(); - }); - - it("does not resolve yet", async () => { - const promiseStatus = await getPromiseStatus(returnValuePromise); - - expect(promiseStatus.fulfilled).toBe(false); - }); - - describe("when call rejects with error instance", () => { - beforeEach(() => { - toBeDecorated.reject(new Error("some-error")); - }); - - it("logs the error", async () => { - let error: unknown; - - try { - await returnValuePromise; - } catch (e) { - error = e; - } - - expect(logErrorMock).toHaveBeenCalledWith("some-error-message-for-some-error", error); - }); - - it("rejects", () => { - return expect(returnValuePromise).rejects.toThrow("some-error"); - }); - }); - - describe("when call rejects with something else than error instance", () => { - let error: unknown; - - beforeEach(async () => { - toBeDecorated.reject({ someProperty: "some-rejection" }); - - try { - await returnValuePromise; - } catch (e) { - error = e; - } - }); - - it("logs the rejection", () => { - expect(logErrorMock).toHaveBeenCalledWith( - "some-error-message-for-some-rejection", - error, - ); - }); - - it("rejects", () => { - return expect(returnValuePromise).rejects.toEqual({ someProperty: "some-rejection" }); - }); - }); - - describe("when call resolves with value", () => { - beforeEach(async () => { - await toBeDecorated.resolve(42); - }); - - it("does not log error", () => { - expect(logErrorMock).not.toHaveBeenCalled(); - }); - - it("resolves with the value", async () => { - const returnValue = await returnValuePromise; - - expect(returnValue).toBe(42); - }); - }); - - describe("when call resolves without value", () => { - beforeEach(async () => { - await toBeDecorated.resolve(undefined); - }); - - it("does not log error", () => { - expect(logErrorMock).not.toHaveBeenCalled(); - }); - - it("resolves without value", async () => { - const returnValue = await returnValuePromise; - - expect(returnValue).toBeUndefined(); - }); - }); - }); - }); -}); diff --git a/packages/core/src/common/utils/with-error-suppression/with-error-suppression.test.ts b/packages/core/src/common/utils/with-error-suppression/with-error-suppression.test.ts deleted file mode 100644 index 63232ad06d..0000000000 --- a/packages/core/src/common/utils/with-error-suppression/with-error-suppression.test.ts +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { AsyncFnMock } from "@async-fn/jest"; -import asyncFn from "@async-fn/jest"; -import { getPromiseStatus } from "@k8slens/test-utils"; -import { withErrorSuppression } from "./with-error-suppression"; - -describe("with-error-suppression", () => { - describe("given decorated sync function", () => { - let toBeDecorated: jest.Mock; - let decorated: (a: string, b: string) => void; - - beforeEach(() => { - toBeDecorated = jest.fn(); - - decorated = withErrorSuppression(toBeDecorated); - }); - - describe("when function does not throw", () => { - let returnValue: void; - - beforeEach(() => { - returnValue = decorated("some-parameter", "some-other-parameter"); - }); - - it("passes arguments to decorated function", () => { - expect(toBeDecorated).toHaveBeenCalledWith("some-parameter", "some-other-parameter"); - }); - - it("returns nothing", () => { - expect(returnValue).toBeUndefined(); - }); - }); - - describe("when function throws", () => { - let returnValue: void; - - beforeEach(() => { - // eslint-disable-next-line unused-imports/no-unused-vars-ts - toBeDecorated.mockImplementation((_, __) => { - throw new Error("some-error"); - }); - - returnValue = decorated("some-parameter", "some-other-parameter"); - }); - - it("passes arguments to decorated function", () => { - expect(toBeDecorated).toHaveBeenCalledWith("some-parameter", "some-other-parameter"); - }); - - it("returns nothing", () => { - expect(returnValue).toBeUndefined(); - }); - }); - }); - - describe("given decorated async function", () => { - let decorated: (a: string, b: string) => Promise | Promise; - let toBeDecorated: AsyncFnMock<(a: string, b: string) => Promise>; - - beforeEach(() => { - toBeDecorated = asyncFn(); - - decorated = withErrorSuppression(toBeDecorated); - }); - - describe("when called", () => { - let returnValuePromise: Promise | Promise; - - beforeEach(() => { - returnValuePromise = decorated("some-parameter", "some-other-parameter"); - }); - - it("passes arguments to decorated function", () => { - expect(toBeDecorated).toHaveBeenCalledWith("some-parameter", "some-other-parameter"); - }); - - it("does not resolve yet", async () => { - const promiseStatus = await getPromiseStatus(returnValuePromise); - - expect(promiseStatus.fulfilled).toBe(false); - }); - - it("when call rejects, resolves with nothing", async () => { - await toBeDecorated.reject(new Error("some-error")); - - const returnValue = await returnValuePromise; - - expect(returnValue).toBeUndefined(); - }); - - it("when call resolves, resolves with the value", async () => { - await toBeDecorated.resolve(42); - - const returnValue = await returnValuePromise; - - expect(returnValue).toBe(42); - }); - }); - }); -}); diff --git a/packages/core/src/common/utils/with-error-suppression/with-error-suppression.ts b/packages/core/src/common/utils/with-error-suppression/with-error-suppression.ts deleted file mode 100644 index 22d51b6014..0000000000 --- a/packages/core/src/common/utils/with-error-suppression/with-error-suppression.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { noop } from "lodash/fp"; - -export function withErrorSuppression Promise>(toBeDecorated: TDecorated): (...args: Parameters) => ReturnType | Promise; -export function withErrorSuppression any>(toBeDecorated: TDecorated): (...args: Parameters) => ReturnType | void; - -export function withErrorSuppression(toBeDecorated: any) { - return (...args: any[]) => { - try { - const returnValue = toBeDecorated(...args); - - if ((returnValue as any) instanceof Promise) { - return returnValue.catch(noop); - } - - return returnValue; - } catch (e) { - return undefined; - } - }; -} diff --git a/packages/core/src/common/utils/with-orphan-promise/with-orphan-promise.injectable.ts b/packages/core/src/common/utils/with-orphan-promise/with-orphan-promise.injectable.ts deleted file mode 100644 index 2a005001da..0000000000 --- a/packages/core/src/common/utils/with-orphan-promise/with-orphan-promise.injectable.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import withErrorLoggingInjectable from "../with-error-logging/with-error-logging.injectable"; -import { withErrorSuppression } from "../with-error-suppression/with-error-suppression"; -import { pipeline } from "@ogre-tools/fp"; - -const withOrphanPromiseInjectable = getInjectable({ - id: "with-orphan-promise", - - instantiate: (di) => { - const withErrorLoggingFor = di.inject(withErrorLoggingInjectable); - - return Promise>(toBeDecorated: T) => - (...args: Parameters): void => { - const decorated = pipeline( - toBeDecorated, - withErrorLoggingFor(() => "Orphan promise rejection encountered"), - withErrorSuppression, - ) as ((...args: any[]) => any); - - decorated(...args); - }; - }, -}); - -export default withOrphanPromiseInjectable; diff --git a/packages/core/src/common/utils/with-orphan-promise/with-orphan-promise.test.ts b/packages/core/src/common/utils/with-orphan-promise/with-orphan-promise.test.ts deleted file mode 100644 index a138c152e7..0000000000 --- a/packages/core/src/common/utils/with-orphan-promise/with-orphan-promise.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { AsyncFnMock } from "@async-fn/jest"; -import asyncFn from "@async-fn/jest"; -import { getDiForUnitTesting } from "../../../main/getDiForUnitTesting"; -import withOrphanPromiseInjectable from "./with-orphan-promise.injectable"; -import logErrorInjectable from "../../log-error.injectable"; - -describe("with orphan promise, when called", () => { - let toBeDecorated: AsyncFnMock<(arg1: string, arg2: string) => Promise>; - let actual: void; - let logErrorMock: jest.Mock; - - beforeEach(() => { - const di = getDiForUnitTesting(); - - logErrorMock = jest.fn(); - - di.override(logErrorInjectable, () => logErrorMock); - - const withOrphanPromise = di.inject(withOrphanPromiseInjectable); - - toBeDecorated = asyncFn(); - - const decorated = withOrphanPromise(toBeDecorated); - - actual = decorated("some-argument", "some-other-argument"); - }); - - it("calls decorated with arguments", () => { - expect(toBeDecorated).toHaveBeenCalledWith("some-argument", "some-other-argument"); - }); - - it("given promise returned by decorated has not been fulfilled yet, already returns nothing", () => { - expect(actual).toBeUndefined(); - }); - - it("when decorated function resolves, nothing happens", async () => { - await toBeDecorated.resolve("irrelevant"); - // Note: there is no expect, test is here only for documentation. - }); - - describe("when decorated function rejects", () => { - beforeEach(async () => { - await toBeDecorated.reject("some-error"); - }); - - it("logs the rejection", () => { - expect(logErrorMock).toHaveBeenCalledWith("Orphan promise rejection encountered", "some-error"); - }); - - it("nothing else happens", () => { - // Note: there is no expect, test is here only for documentation. - }); - }); -}); diff --git a/packages/core/src/common/vars.ts b/packages/core/src/common/vars.ts deleted file mode 100644 index 1cb0271ab2..0000000000 --- a/packages/core/src/common/vars.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -// App's common configuration for any process (main, renderer, build pipeline, etc.) -import type { ThemeId } from "../renderer/themes/lens-theme"; - -export const defaultThemeId: ThemeId = "lens-dark"; -export const defaultFontSize = 12; -export const defaultTerminalFontFamily = "RobotoMono"; -export const defaultEditorFontFamily = "RobotoMono"; - -// Apis -export const apiPrefix = "/api"; // local router apis -export const apiKubePrefix = "/api-kube"; // k8s cluster apis - -// Links -export const issuesTrackerUrl = "https://github.com/lensapp/lens/issues" as string; -export const supportUrl = "https://docs.k8slens.dev/support/" as string; -export const docsUrl = "https://docs.k8slens.dev" as string; -export const forumsUrl = "https://forums.k8slens.dev" as string; diff --git a/packages/core/src/common/vars/app-name.injectable.ts b/packages/core/src/common/vars/app-name.injectable.ts deleted file mode 100644 index 4d6d87421c..0000000000 --- a/packages/core/src/common/vars/app-name.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import isDevelopmentInjectable from "./is-development.injectable"; -import productNameInjectable from "./product-name.injectable"; - -const appNameInjectable = getInjectable({ - id: "app-name", - - instantiate: (di) => { - const isDevelopment = di.inject(isDevelopmentInjectable); - const productName = di.inject(productNameInjectable); - - return `${productName}${isDevelopment ? "Dev" : ""}`; - }, -}); - -export default appNameInjectable; diff --git a/packages/core/src/common/vars/application-copyright.injectable.ts b/packages/core/src/common/vars/application-copyright.injectable.ts deleted file mode 100644 index 440a20b5d1..0000000000 --- a/packages/core/src/common/vars/application-copyright.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { applicationInformationToken } from "@k8slens/application"; -import { getInjectable } from "@ogre-tools/injectable"; - -const applicationCopyrightInjectable = getInjectable({ - id: "application-copyright", - instantiate: (di) => di.inject(applicationInformationToken).copyright, -}); - -export default applicationCopyrightInjectable; diff --git a/packages/core/src/common/vars/application-description.injectable.ts b/packages/core/src/common/vars/application-description.injectable.ts deleted file mode 100644 index 2b562df7a1..0000000000 --- a/packages/core/src/common/vars/application-description.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { applicationInformationToken } from "@k8slens/application"; -import { getInjectable } from "@ogre-tools/injectable"; - -const applicationDescriptionInjectable = getInjectable({ - id: "application-description", - instantiate: (di) => di.inject(applicationInformationToken).description, -}); - -export default applicationDescriptionInjectable; diff --git a/packages/core/src/common/vars/base-bundled-binaries-dir.injectable.ts b/packages/core/src/common/vars/base-bundled-binaries-dir.injectable.ts deleted file mode 100644 index 968ccc5c5b..0000000000 --- a/packages/core/src/common/vars/base-bundled-binaries-dir.injectable.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import bundledResourcesDirectoryInjectable from "./bundled-resources-dir.injectable"; -import normalizedPlatformArchitectureInjectable from "./normalized-platform-architecture.injectable"; -import joinPathsInjectable from "../path/join-paths.injectable"; - -const baseBundledBinariesDirectoryInjectable = getInjectable({ - id: "base-bundled-binaries-directory", - instantiate: (di) => { - const bundledResourcesDirectory = di.inject(bundledResourcesDirectoryInjectable); - const normalizedPlatformArchitecture = di.inject(normalizedPlatformArchitectureInjectable); - const joinPaths = di.inject(joinPathsInjectable); - - return joinPaths( - bundledResourcesDirectory, - normalizedPlatformArchitecture, - ); - }, -}); - -export default baseBundledBinariesDirectoryInjectable; diff --git a/packages/core/src/common/vars/bundled-kubectl-version.injectable.ts b/packages/core/src/common/vars/bundled-kubectl-version.injectable.ts deleted file mode 100644 index bf3228e44f..0000000000 --- a/packages/core/src/common/vars/bundled-kubectl-version.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { applicationInformationToken } from "@k8slens/application"; -import { getInjectable } from "@ogre-tools/injectable"; - -const bundledKubectlVersionInjectable = getInjectable({ - id: "bundled-kubectl-version", - instantiate: (di) => di.inject(applicationInformationToken).bundledKubectlVersion, -}); - -export default bundledKubectlVersionInjectable; diff --git a/packages/core/src/common/vars/bundled-resources-dir.injectable.ts b/packages/core/src/common/vars/bundled-resources-dir.injectable.ts deleted file mode 100644 index 2058b1d5d3..0000000000 --- a/packages/core/src/common/vars/bundled-resources-dir.injectable.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import isProductionInjectable from "./is-production.injectable"; -import normalizedPlatformInjectable from "./normalized-platform.injectable"; -import lensResourcesDirInjectable from "./lens-resources-dir.injectable"; -import joinPathsInjectable from "../path/join-paths.injectable"; - -const bundledResourcesDirectoryInjectable = getInjectable({ - id: "bundled-resources-directory", - instantiate: (di) => { - const isProduction = di.inject(isProductionInjectable); - const normalizedPlatform = di.inject(normalizedPlatformInjectable); - const joinPaths = di.inject(joinPathsInjectable); - const lensResourcesDir = di.inject(lensResourcesDirInjectable); - - return isProduction - ? lensResourcesDir - : joinPaths(lensResourcesDir, "binaries", "client", normalizedPlatform); - }, -}); - -export default bundledResourcesDirectoryInjectable; diff --git a/packages/core/src/common/vars/content-security-policy.injectable.ts b/packages/core/src/common/vars/content-security-policy.injectable.ts deleted file mode 100644 index 56d70e3e97..0000000000 --- a/packages/core/src/common/vars/content-security-policy.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { applicationInformationToken } from "@k8slens/application"; -import { getInjectable } from "@ogre-tools/injectable"; - -const contentSecurityPolicyInjectable = getInjectable({ - id: "content-security-policy", - instantiate: (di) => di.inject(applicationInformationToken).contentSecurityPolicy, -}); - -export default contentSecurityPolicyInjectable; diff --git a/packages/core/src/common/vars/current-timezone.global-override-for-injectable.ts b/packages/core/src/common/vars/current-timezone.global-override-for-injectable.ts deleted file mode 100644 index ef831ca3c1..0000000000 --- a/packages/core/src/common/vars/current-timezone.global-override-for-injectable.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "@k8slens/test-utils"; -import currentTimezoneInjectable from "./current-timezone.injectable"; - -export default getGlobalOverride(currentTimezoneInjectable, () => "Etc/GMT"); diff --git a/packages/core/src/common/vars/current-timezone.injectable.ts b/packages/core/src/common/vars/current-timezone.injectable.ts deleted file mode 100644 index 6a6043eaf9..0000000000 --- a/packages/core/src/common/vars/current-timezone.injectable.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import moment from "moment-timezone"; - -const currentTimezoneInjectable = getInjectable({ - id: "current-timezone", - instantiate: () => moment.tz.guess(true), - causesSideEffects: true, -}); - -export default currentTimezoneInjectable; diff --git a/packages/core/src/common/vars/extension-api-version.global-override-for-injectable.ts b/packages/core/src/common/vars/extension-api-version.global-override-for-injectable.ts deleted file mode 100644 index b1a74f47b6..0000000000 --- a/packages/core/src/common/vars/extension-api-version.global-override-for-injectable.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "@k8slens/test-utils"; -import extensionApiVersionInjectable from "./extension-api-version.injectable"; - -export default getGlobalOverride(extensionApiVersionInjectable, () => "6.0.0"); diff --git a/packages/core/src/common/vars/extension-api-version.injectable.ts b/packages/core/src/common/vars/extension-api-version.injectable.ts deleted file mode 100644 index d4ddb92f00..0000000000 --- a/packages/core/src/common/vars/extension-api-version.injectable.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { SemVer } from "semver"; -import packageJson from "../../../package.json"; - -const extensionApiVersionInjectable = getInjectable({ - id: "extension-api-version", - instantiate: () => { - const { major, minor, patch } = new SemVer(packageJson.version); - - return `${major}.${minor}.${patch}`; - }, - causesSideEffects: true, -}); - -export default extensionApiVersionInjectable; diff --git a/packages/core/src/common/vars/is-debugging.global-override-for-injectable.ts b/packages/core/src/common/vars/is-debugging.global-override-for-injectable.ts deleted file mode 100644 index fab25913ed..0000000000 --- a/packages/core/src/common/vars/is-debugging.global-override-for-injectable.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "@k8slens/test-utils"; -import isDebuggingInjectable from "./is-debugging.injectable"; - -export default getGlobalOverride(isDebuggingInjectable, () => false); diff --git a/packages/core/src/common/vars/is-debugging.injectable.ts b/packages/core/src/common/vars/is-debugging.injectable.ts deleted file mode 100644 index 079086e628..0000000000 --- a/packages/core/src/common/vars/is-debugging.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; - -const isDebuggingInjectable = getInjectable({ - id: "is-debugging", - instantiate: () => ["true", "1", "yes", "y", "on"].includes((process.env.DEBUG ?? "").toLowerCase()), - causesSideEffects: true, -}); - -export default isDebuggingInjectable; diff --git a/packages/core/src/common/vars/is-development.injectable.ts b/packages/core/src/common/vars/is-development.injectable.ts deleted file mode 100644 index af7aeb3b91..0000000000 --- a/packages/core/src/common/vars/is-development.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import isProductionInjectable from "./is-production.injectable"; - -const isDevelopmentInjectable = getInjectable({ - id: "is-development", - instantiate: (di) => !di.inject(isProductionInjectable), -}); - -export default isDevelopmentInjectable; diff --git a/packages/core/src/common/vars/is-integration-testing.injectable.ts b/packages/core/src/common/vars/is-integration-testing.injectable.ts deleted file mode 100644 index 7d6d5ce24e..0000000000 --- a/packages/core/src/common/vars/is-integration-testing.injectable.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import commandLineArgumentsInjectable from "../../main/utils/command-line-arguments.injectable"; - -const isIntegrationTestingInjectable = getInjectable({ - id: "is-integration-testing", - - instantiate: (di) => { - const commandLineArguments = di.inject(commandLineArgumentsInjectable); - - return commandLineArguments.includes("--integration-testing"); - }, -}); - -export default isIntegrationTestingInjectable; diff --git a/packages/core/src/common/vars/is-linux.injectable.ts b/packages/core/src/common/vars/is-linux.injectable.ts deleted file mode 100644 index d84165fad5..0000000000 --- a/packages/core/src/common/vars/is-linux.injectable.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import platformInjectable from "./platform.injectable"; - -const isLinuxInjectable = getInjectable({ - id: "is-linux", - - instantiate: (di) => { - const platform = di.inject(platformInjectable); - - return platform === "linux"; - }, -}); - -export default isLinuxInjectable; diff --git a/packages/core/src/common/vars/is-mac.injectable.ts b/packages/core/src/common/vars/is-mac.injectable.ts deleted file mode 100644 index 67a6fda286..0000000000 --- a/packages/core/src/common/vars/is-mac.injectable.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import platformInjectable from "./platform.injectable"; - -const isMacInjectable = getInjectable({ - id: "is-mac", - - instantiate: (di) => { - const platform = di.inject(platformInjectable); - - return platform === "darwin"; - }, -}); - -export default isMacInjectable; diff --git a/packages/core/src/common/vars/is-production.injectable.ts b/packages/core/src/common/vars/is-production.injectable.ts deleted file mode 100644 index 9c1d036bee..0000000000 --- a/packages/core/src/common/vars/is-production.injectable.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { nodeEnvInjectionToken } from "./node-env-injection-token"; - -const isProductionInjectable = getInjectable({ - id: "is-production", - - instantiate: (di) => { - const nodeEnv = di.inject(nodeEnvInjectionToken); - - return nodeEnv === "production"; - }, -}); - -export default isProductionInjectable; diff --git a/packages/core/src/common/vars/is-snap-package.global-override-for-injectable.ts b/packages/core/src/common/vars/is-snap-package.global-override-for-injectable.ts deleted file mode 100644 index a18d89f221..0000000000 --- a/packages/core/src/common/vars/is-snap-package.global-override-for-injectable.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "@k8slens/test-utils"; -import isSnapPackageInjectable from "./is-snap-package.injectable"; - -export default getGlobalOverride(isSnapPackageInjectable, () => false); diff --git a/packages/core/src/common/vars/is-snap-package.injectable.ts b/packages/core/src/common/vars/is-snap-package.injectable.ts deleted file mode 100644 index a2c545870b..0000000000 --- a/packages/core/src/common/vars/is-snap-package.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; - -const isSnapPackageInjectable = getInjectable({ - id: "is-snap", - instantiate: () => Boolean(process.env.SNAP), - causesSideEffects: true, -}); - -export default isSnapPackageInjectable; diff --git a/packages/core/src/common/vars/is-windows.injectable.ts b/packages/core/src/common/vars/is-windows.injectable.ts deleted file mode 100644 index 8eb78dcb58..0000000000 --- a/packages/core/src/common/vars/is-windows.injectable.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import platformInjectable from "./platform.injectable"; - -const isWindowsInjectable = getInjectable({ - id: "is-windows", - - instantiate: (di) => { - const platform = di.inject(platformInjectable); - - return platform === "win32"; - }, -}); - -export default isWindowsInjectable; diff --git a/packages/core/src/common/vars/lens-resources-dir.global-override-for-injectable.ts b/packages/core/src/common/vars/lens-resources-dir.global-override-for-injectable.ts deleted file mode 100644 index f40bbe6cd4..0000000000 --- a/packages/core/src/common/vars/lens-resources-dir.global-override-for-injectable.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "@k8slens/test-utils"; -import lensResourcesDirInjectable from "./lens-resources-dir.injectable"; - -export default getGlobalOverride(lensResourcesDirInjectable, () => "/irrelavent-dir-for-lens-resources"); diff --git a/packages/core/src/common/vars/lens-resources-dir.injectable.ts b/packages/core/src/common/vars/lens-resources-dir.injectable.ts deleted file mode 100644 index 9aebba19b3..0000000000 --- a/packages/core/src/common/vars/lens-resources-dir.injectable.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import isProductionInjectable from "./is-production.injectable"; - -const lensResourcesDirInjectable = getInjectable({ - id: "lens-resources-dir", - - instantiate: (di) => { - const isProduction = di.inject(isProductionInjectable); - - return isProduction - ? process.resourcesPath - : process.cwd(); - }, - - causesSideEffects: true, -}); - -export default lensResourcesDirInjectable; diff --git a/packages/core/src/common/vars/node-env-injection-token.ts b/packages/core/src/common/vars/node-env-injection-token.ts deleted file mode 100644 index 5f50ad2e06..0000000000 --- a/packages/core/src/common/vars/node-env-injection-token.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectionToken } from "@ogre-tools/injectable"; - -export const nodeEnvInjectionToken = getInjectionToken({ - id: "node-env-injection-token", -}); - -export default nodeEnvInjectionToken; diff --git a/packages/core/src/common/vars/normalized-platform-architecture.injectable.ts b/packages/core/src/common/vars/normalized-platform-architecture.injectable.ts deleted file mode 100644 index 6b98856268..0000000000 --- a/packages/core/src/common/vars/normalized-platform-architecture.injectable.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import processArchInjectable from "./process-arch.injectable"; - -const normalizedPlatformArchitectureInjectable = getInjectable({ - id: "normalized-platform-architecture", - instantiate: (di) => { - const platformArch = di.inject(processArchInjectable); - - switch (platformArch) { - case "arm64": - return "arm64"; - case "x64": - case "amd64": - return "x64"; - case "386": - case "x32": - case "ia32": - return "ia32"; - default: - throw new Error(`arch=${platformArch} is unsupported`); - } - }, -}); - -export default normalizedPlatformArchitectureInjectable; diff --git a/packages/core/src/common/vars/normalized-platform.injectable.ts b/packages/core/src/common/vars/normalized-platform.injectable.ts deleted file mode 100644 index ee1bf7fb74..0000000000 --- a/packages/core/src/common/vars/normalized-platform.injectable.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import platformInjectable from "./platform.injectable"; - -export type NormalizedPlatform = "darwin" | "linux" | "windows"; - -const normalizedPlatformInjectable = getInjectable({ - id: "normalized-platform", - - instantiate: (di): NormalizedPlatform => { - const platform = di.inject(platformInjectable); - - switch (platform) { - case "darwin": - return "darwin"; - case "linux": - return "linux"; - case "win32": - return "windows"; - default: - throw new Error(`platform=${platform} is unsupported`); - } - }, -}); - -export default normalizedPlatformInjectable; diff --git a/packages/core/src/common/vars/platform.global-override-for-injectable.ts b/packages/core/src/common/vars/platform.global-override-for-injectable.ts deleted file mode 100644 index 2825ebe8cf..0000000000 --- a/packages/core/src/common/vars/platform.global-override-for-injectable.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "@k8slens/test-utils"; -import platformInjectable from "./platform.injectable"; - -export default getGlobalOverride(platformInjectable, () => "darwin"); diff --git a/packages/core/src/common/vars/platform.injectable.ts b/packages/core/src/common/vars/platform.injectable.ts deleted file mode 100644 index 00d6e42aca..0000000000 --- a/packages/core/src/common/vars/platform.injectable.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; - -export const allPlatforms = ["win32", "darwin", "linux"] as const; - -const platformInjectable = getInjectable({ - id: "platform", - instantiate: () => process.platform as typeof allPlatforms[number], - causesSideEffects: true, -}); - -export default platformInjectable; diff --git a/packages/core/src/common/vars/process-arch.global-override-for-injectable.ts b/packages/core/src/common/vars/process-arch.global-override-for-injectable.ts deleted file mode 100644 index bdc4c5e823..0000000000 --- a/packages/core/src/common/vars/process-arch.global-override-for-injectable.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "@k8slens/test-utils"; -import processArchInjectable from "./process-arch.injectable"; - -export default getGlobalOverride(processArchInjectable, () => "x64"); diff --git a/packages/core/src/common/vars/process-arch.injectable.ts b/packages/core/src/common/vars/process-arch.injectable.ts deleted file mode 100644 index 5504855341..0000000000 --- a/packages/core/src/common/vars/process-arch.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; - -const processArchInjectable = getInjectable({ - id: "process-arch", - instantiate: () => process.arch, - causesSideEffects: true, -}); - -export default processArchInjectable; diff --git a/packages/core/src/common/vars/product-name.injectable.ts b/packages/core/src/common/vars/product-name.injectable.ts deleted file mode 100644 index 6437af3c6c..0000000000 --- a/packages/core/src/common/vars/product-name.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { applicationInformationToken } from "@k8slens/application"; -import { getInjectable } from "@ogre-tools/injectable"; - -const productNameInjectable = getInjectable({ - id: "product-name", - instantiate: (di) => di.inject(applicationInformationToken).productName, -}); - -export default productNameInjectable; diff --git a/packages/core/src/common/vars/sentry-dsn-url.injectable.ts b/packages/core/src/common/vars/sentry-dsn-url.injectable.ts deleted file mode 100644 index 0ca6cab9e5..0000000000 --- a/packages/core/src/common/vars/sentry-dsn-url.injectable.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { applicationInformationToken } from "@k8slens/application"; -import { getInjectable } from "@ogre-tools/injectable"; - -const sentryDataSourceNameInjectable = getInjectable({ - id: "sentry-data-source-name", - instantiate: (di) => di.inject(applicationInformationToken).sentryDsn, -}); - -export default sentryDataSourceNameInjectable; diff --git a/packages/core/src/common/vars/static-files-directory.global-override-for-injectable.ts b/packages/core/src/common/vars/static-files-directory.global-override-for-injectable.ts deleted file mode 100644 index 2ed47dd1a4..0000000000 --- a/packages/core/src/common/vars/static-files-directory.global-override-for-injectable.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getGlobalOverride } from "@k8slens/test-utils"; -import staticFilesDirectoryInjectable from "./static-files-directory.injectable"; - -export default getGlobalOverride(staticFilesDirectoryInjectable, () => "/some-static-directory"); diff --git a/packages/core/src/common/vars/static-files-directory.injectable.ts b/packages/core/src/common/vars/static-files-directory.injectable.ts deleted file mode 100644 index 8ed9967119..0000000000 --- a/packages/core/src/common/vars/static-files-directory.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import appPathsInjectable from "../app-paths/app-paths.injectable"; -import joinPathsInjectable from "../path/join-paths.injectable"; - -const staticFilesDirectoryInjectable = getInjectable({ - id: "static-files-directory", - - instantiate: (di) => { - const joinPaths = di.inject(joinPathsInjectable); - const currentAppDir = di.inject(appPathsInjectable).currentApp; - - return joinPaths(currentAppDir, "static"); - }, -}); - -export default staticFilesDirectoryInjectable; diff --git a/packages/core/src/common/vars/store-migration-version.injectable.ts b/packages/core/src/common/vars/store-migration-version.injectable.ts deleted file mode 100644 index 18ffb08af1..0000000000 --- a/packages/core/src/common/vars/store-migration-version.injectable.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; - -const storeMigrationVersionInjectable = getInjectable({ - id: "store-migration-version", - instantiate: () => "6.5.0", -}); - -export default storeMigrationVersionInjectable; diff --git a/packages/core/src/common/vars/user-info.global-override-for-injectable.ts b/packages/core/src/common/vars/user-info.global-override-for-injectable.ts deleted file mode 100644 index cc650f6de3..0000000000 --- a/packages/core/src/common/vars/user-info.global-override-for-injectable.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getGlobalOverride } from "@k8slens/test-utils"; -import userInfoInjectable from "./user-info.injectable"; - -export default getGlobalOverride(userInfoInjectable, () => ({ - gid: 1, - homedir: "/some-home-dir", - shell: "bash", - uid: 2, - username: "some-user-name", -})); diff --git a/packages/core/src/common/vars/user-info.injectable.ts b/packages/core/src/common/vars/user-info.injectable.ts deleted file mode 100644 index b096da03c5..0000000000 --- a/packages/core/src/common/vars/user-info.injectable.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { userInfo } from "os"; - -const userInfoInjectable = getInjectable({ - id: "user-info", - instantiate: () => userInfo(), - causesSideEffects: true, -}); - -export default userInfoInjectable; diff --git a/packages/core/src/common/winston-logger.global-override-for-injectable.ts b/packages/core/src/common/winston-logger.global-override-for-injectable.ts deleted file mode 100644 index 6dd47b8f9f..0000000000 --- a/packages/core/src/common/winston-logger.global-override-for-injectable.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type winston from "winston"; -import { getGlobalOverride } from "@k8slens/test-utils"; -import { noop } from "@k8slens/utilities"; -import { winstonLoggerInjectable } from "@k8slens/logger"; - -export default getGlobalOverride(winstonLoggerInjectable, () => ({ - log: noop, - add: noop, - remove: noop, - clear: noop, - close: noop, - - warn: noop, - debug: noop, - error: noop, - info: noop, - silly: noop, -}) as winston.Logger); diff --git a/packages/core/src/extensions/__tests__/configurable-directories.test.ts b/packages/core/src/extensions/__tests__/configurable-directories.test.ts deleted file mode 100644 index d663b90973..0000000000 --- a/packages/core/src/extensions/__tests__/configurable-directories.test.ts +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { runInAction } from "mobx"; -import type { ApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; -import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; -import type { FakeExtensionOptions } from "../../renderer/components/test-utils/get-extension-fake"; -import getHashInjectable from "../../extensions/extension-loader/file-system-provisioner-store/get-hash.injectable"; -import fsInjectable from "../../common/fs/fs.injectable"; - -describe("configurable directories for extension files", () => { - let builder: ApplicationBuilder; - - beforeEach(async () => { - builder = getApplicationBuilder(); - - builder.beforeApplicationStart(({ mainDi }) => { - runInAction(() => { - mainDi.override(getHashInjectable, () => x => x); - }); - }); - - await builder.startHidden(); - - const window = builder.applicationWindow.create("some-window-id"); - - await window.start(); - - }); - - describe("when extension with a specific store name is enabled", () => { - let testExtensionOptions: FakeExtensionOptions; - - beforeEach(() => { - - testExtensionOptions = { - id: "some-extension", - name: "some-extension-name", - - mainOptions: { - manifest: { - name: "irrelevant", - storeName: "some-specific-store-name", - version: "0", - engines: { - lens: "0", - }, - }, - }, - }; - - builder.extensions.enable(testExtensionOptions); - }); - - it("creates extension directory for specific store name", async () => { - const fs = builder.mainDi.inject(fsInjectable); - - await builder.extensions.get("some-extension").main.getExtensionFileFolder(); - - const nonHashedExtensionDirectories = await fs.readdir("/some-directory-for-app-data/some-product-name/extension_data"); - - expect(nonHashedExtensionDirectories).toContain("some-specific-store-name"); - }); - }); - - describe("when extension with no specific store name is enabled", () => { - let testExtensionOptions: FakeExtensionOptions; - - beforeEach(() => { - - testExtensionOptions = { - id: "some-extension", - name: "some-extension-name", - - mainOptions: { - manifest: { - name: "some-package-name", - storeName: undefined, - version: "0", - engines: { - lens: "0", - }, - }, - }, - }; - - builder.extensions.enable(testExtensionOptions); - }); - - it("creates extension directory for package name", async () => { - const fs = builder.mainDi.inject(fsInjectable); - - await builder.extensions.get("some-extension").main.getExtensionFileFolder(); - - const nonHashedExtensionDirectories = await fs.readdir("/some-directory-for-app-data/some-product-name/extension_data"); - - expect(nonHashedExtensionDirectories).toContain("some-package-name"); - }); - }); -}); diff --git a/packages/core/src/extensions/__tests__/extension-loader.test.ts b/packages/core/src/extensions/__tests__/extension-loader.test.ts deleted file mode 100644 index 51a43dfeff..0000000000 --- a/packages/core/src/extensions/__tests__/extension-loader.test.ts +++ /dev/null @@ -1,167 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { ExtensionLoader } from "../extension-loader"; -import extensionLoaderInjectable from "../extension-loader/extension-loader.injectable"; -import type { ObservableMap } from "mobx"; -import { runInAction } from "mobx"; -import { delay } from "@k8slens/utilities"; -import { getDiForUnitTesting } from "../../renderer/getDiForUnitTesting"; -import ipcRendererInjectable from "../../renderer/utils/channel/ipc-renderer.injectable"; -import type { IpcRenderer } from "electron"; -import directoryForUserDataInjectable from "../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; -import currentlyInClusterFrameInjectable from "../../renderer/routes/currently-in-cluster-frame.injectable"; -import type { LensExtensionState } from "../../features/extensions/enabled/common/state.injectable"; -import enabledExtensionsStateInjectable from "../../features/extensions/enabled/common/state.injectable"; - -const manifestPath = "manifest/path"; -const manifestPath2 = "manifest/path2"; -const manifestPath3 = "manifest/path3"; - -describe("ExtensionLoader", () => { - let extensionLoader: ExtensionLoader; - let enabledExtensionsState: ObservableMap; - - beforeEach(() => { - const di = getDiForUnitTesting(); - - di.override(directoryForUserDataInjectable, () => "/some-directory-for-user-data"); - di.override(currentlyInClusterFrameInjectable, () => false); - - di.override(ipcRendererInjectable, () => ({ - invoke: jest.fn(async (channel: string) => { - if (channel === "extension-loader:main:state") { - return [ - [ - manifestPath, - { - manifest: { - name: "TestExtension", - version: "1.0.0", - }, - id: manifestPath, - absolutePath: "/test/1", - manifestPath, - isBundled: false, - isEnabled: true, - }, - ], - [ - manifestPath2, - { - manifest: { - name: "TestExtension2", - version: "2.0.0", - }, - id: manifestPath2, - absolutePath: "/test/2", - manifestPath: manifestPath2, - isBundled: false, - isEnabled: true, - }, - ], - ]; - } - - return []; - }), - - on: (channel: string, listener: (event: any, ...args: any[]) => void) => { - if (channel === "extension-loader:main:state") { - // First initialize with extensions 1 and 2 - // and then broadcast event to remove extension 2 and add extension number 3 - setTimeout(() => { - listener({}, [ - [ - manifestPath, - { - manifest: { - name: "TestExtension", - version: "1.0.0", - }, - id: manifestPath, - absolutePath: "/test/1", - manifestPath, - isBundled: false, - isEnabled: true, - }, - ], - [ - manifestPath3, - { - manifest: { - name: "TestExtension3", - version: "3.0.0", - }, - id: manifestPath3, - absolutePath: "/test/3", - manifestPath: manifestPath3, - isBundled: false, - isEnabled: true, - }, - ], - ]); - }, 10); - } - }, - }) as unknown as IpcRenderer); - - extensionLoader = di.inject(extensionLoaderInjectable); - enabledExtensionsState = di.inject(enabledExtensionsStateInjectable); - }); - - it("renderer updates extension after ipc broadcast", async () => { - expect(extensionLoader.userExtensions.get()).toEqual(new Map()); - - await extensionLoader.init(); - await delay(10); - - // Assert the extensions after the extension broadcast event - expect(extensionLoader.userExtensions.get()).toEqual( - new Map([ - ["manifest/path", { - absolutePath: "/test/1", - id: "manifest/path", - isBundled: false, - isEnabled: true, - manifest: { - name: "TestExtension", - version: "1.0.0", - }, - manifestPath: "manifest/path", - }], - ["manifest/path3", { - absolutePath: "/test/3", - id: "manifest/path3", - isBundled: false, - isEnabled: true, - manifest: { - name: "TestExtension3", - version: "3.0.0", - }, - manifestPath: "manifest/path3", - }], - ]), - ); - }); - - it("updates ExtensionsStore after isEnabled is changed", async () => { - await extensionLoader.init(); - - runInAction(() => { - extensionLoader.setIsEnabled("manifest/path", false); - }); - - expect(enabledExtensionsState.size).toBe(2); - expect(enabledExtensionsState.get("manifest/path")).toMatchObject({ - enabled: false, - name: "TestExtension", - }); - expect(enabledExtensionsState.get("manifest/path2")).toMatchObject({ - enabled: true, - name: "TestExtension2", - }); - }); -}); diff --git a/packages/core/src/extensions/__tests__/is-compatible-extension.test.ts b/packages/core/src/extensions/__tests__/is-compatible-extension.test.ts deleted file mode 100644 index 8aa16419bc..0000000000 --- a/packages/core/src/extensions/__tests__/is-compatible-extension.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { LensExtensionManifest } from "@k8slens/legacy-extensions"; -import { isCompatibleExtension } from "../extension-discovery/is-compatible-extension/is-compatible-extension"; - -describe("Extension/App versions compatibility checks", () => { - it("is compatible with exact version matching", () => { - expect(isCompatible({ extLensEngineVersion: "5.5.0", extensionApiVersion: "5.5.0" })).toBeTruthy(); - }); - - it("is compatible with upper %PATCH versions of base app", () => { - expect(isCompatible({ extLensEngineVersion: "5.5.0", extensionApiVersion: "5.5.5" })).toBeTruthy(); - }); - - it("is compatible with higher %MINOR version of base app", () => { - expect(isCompatible({ extLensEngineVersion: "5.5.0", extensionApiVersion: "5.6.0" })).toBeTruthy(); - }); - - it("is not compatible with higher %MAJOR version of base app", () => { - expect(isCompatible({ extLensEngineVersion: "5.6.0", extensionApiVersion: "6.0.0" })).toBeFalsy(); // extension for lens@5 not compatible with lens@6 - expect(isCompatible({ extLensEngineVersion: "6.0.0", extensionApiVersion: "5.6.0" })).toBeFalsy(); - }); - - it("supports short version format for manifest.engines.lens", () => { - expect(isCompatible({ extLensEngineVersion: "5.5", extensionApiVersion: "5.5.1" })).toBeTruthy(); - }); - - it("throws for incorrect or not supported version format", () => { - expect(() => isCompatible({ - extLensEngineVersion: ">=2.0", - extensionApiVersion: "2.0", - })).toThrow(/Invalid format/i); - - expect(() => isCompatible({ - extLensEngineVersion: "~2.0", - extensionApiVersion: "2.0", - })).toThrow(/Invalid format/i); - - expect(() => isCompatible({ - extLensEngineVersion: "*", - extensionApiVersion: "1.0", - })).toThrow(/Invalid format/i); - }); -}); - -function isCompatible({ extLensEngineVersion = "^1.0", extensionApiVersion = "1.0" } = {}): boolean { - const extensionManifestMock = getExtensionManifestMock(extLensEngineVersion); - - return isCompatibleExtension({ extensionApiVersion })(extensionManifestMock); -} - -function getExtensionManifestMock(lensEngine = "1.0"): LensExtensionManifest { - return { - name: "some-extension", - version: "1.0", - engines: { - lens: lensEngine, - }, - }; -} diff --git a/packages/core/src/extensions/__tests__/lens-extension.test.ts b/packages/core/src/extensions/__tests__/lens-extension.test.ts deleted file mode 100644 index 11635818ab..0000000000 --- a/packages/core/src/extensions/__tests__/lens-extension.test.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getApplicationBuilder } from "../../renderer/components/test-utils/get-application-builder"; -import { LensMainExtension } from "../lens-main-extension"; - -describe("lens extension", () => { - let ext: LensMainExtension; - - beforeEach(async () => { - const builder = getApplicationBuilder(); - - /** - * This is required because it sets up `AppPaths` which are required by LensMainExtension. - * - * That type isn't used internally so it needs to use "legacy global DI" to get its dependencies. - */ - await builder.render(); - - ext = new LensMainExtension({ - manifest: { - name: "foo-bar", - version: "0.1.1", - engines: { lens: "^5.5.0" }, - }, - id: "/this/is/fake/package.json", - absolutePath: "/absolute/fake/", - manifestPath: "/this/is/fake/package.json", - isBundled: false, - isEnabled: true, - isCompatible: true, - }); - }); - - describe("name", () => { - it("returns name", () => { - expect(ext.name).toBe("foo-bar"); - }); - }); -}); diff --git a/packages/core/src/extensions/base-extension-store.ts b/packages/core/src/extensions/base-extension-store.ts deleted file mode 100644 index 1a841087ca..0000000000 --- a/packages/core/src/extensions/base-extension-store.ts +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import * as path from "path"; -import type { LensExtension } from "./lens-extension"; -import type { StaticThis } from "../common/utils/singleton"; -import { getOrInsertWith } from "@k8slens/utilities"; -import { getLegacyGlobalDiForExtensionApi } from "@k8slens/legacy-global-di"; -import directoryForUserDataInjectable from "../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; -import assert from "assert"; -import type { Options } from "conf"; -import createPersistentStorageInjectable, { type PersistentStorage } from "../features/persistent-storage/common/create.injectable"; -import type { PersistentStorageParams } from "./common-api/stores"; -import type { Migrations } from "../features/persistent-storage/common/migrations.injectable"; - -export interface ExtensionStoreParams extends Omit, "migrations" | "cwd" | "fromStore" | "toJSON"> { - migrations?: Options["migrations"]; - cwd?: string; -} - -export abstract class BaseExtensionStore { - private static readonly instances = new WeakMap(); - - /** - * @deprecated This is a form of global shared state. Just call `new Store(...)` - */ - static createInstance(this: StaticThis, ...args: R): T { - return getOrInsertWith(BaseExtensionStore.instances, this, () => new this(...args)) as T; - } - - /** - * @deprecated This is a form of global shared state. Just call `new Store(...)` - */ - static getInstance(this: StaticThis, strict?: true): T; - static getInstance(this: StaticThis, strict: false): T | undefined; - static getInstance(this: StaticThis, strict = true): T | undefined { - if (!BaseExtensionStore.instances.has(this) && strict) { - throw new TypeError(`instance of ${this.name} is not created`); - } - - return BaseExtensionStore.instances.get(this) as (T | undefined); - } - - protected persistentStorage?: PersistentStorage; - private readonly dependencies = (() => { - const di = getLegacyGlobalDiForExtensionApi(); - - return { - createPersistentStorage: di.inject(createPersistentStorageInjectable), - directoryForUserData: di.inject(directoryForUserDataInjectable), - } as const; - })(); - - constructor(protected readonly rawParams: ExtensionStoreParams) { } - - /** - * @deprecated This is a form of global shared state. Just call `new Store(...)` - */ - static resetInstance() { - BaseExtensionStore.instances.delete(this); - } - - protected extension?: LensExtension; - - loadExtension(extension: LensExtension) { - this.extension = extension; - const { - projectVersion = this.extension.version, - cwd: _cwd, // This is ignored to maintain backwards compatibility - migrations = {}, - ...params - } = this.rawParams; - - this.persistentStorage = this.dependencies.createPersistentStorage({ - ...params, - cwd: this.cwd(), - projectVersion, - migrations: migrations as Migrations, - fromStore: (data) => this.fromStore(data), - toJSON: () => this.toJSON(), - }); - - this.persistentStorage.loadAndStartSyncing(); - } - - /** - * @deprecated Never use this method. Instead call {@link Common.Store.ExtensionStore.loadExtension} - */ - load() { - this.persistentStorage?.loadAndStartSyncing(); - } - - protected cwd() { - assert(this.extension, "cwd can only be called in loadExtension"); - - return this.rawParams.cwd ?? path.join(this.dependencies.directoryForUserData, "extension-store", this.extension.storeName); - } - - abstract fromStore(data: Partial): void; - abstract toJSON(): T; -} diff --git a/packages/core/src/extensions/common-api/app.ts b/packages/core/src/extensions/common-api/app.ts deleted file mode 100644 index 5877151348..0000000000 --- a/packages/core/src/extensions/common-api/app.ts +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import appNameInjectable from "../../common/vars/app-name.injectable"; -import isLinuxInjectable from "../../common/vars/is-linux.injectable"; -import isMacInjectable from "../../common/vars/is-mac.injectable"; -import isSnapPackageInjectable from "../../common/vars/is-snap-package.injectable"; -import isWindowsInjectable from "../../common/vars/is-windows.injectable"; -import { getLegacyGlobalDiForExtensionApi, asLegacyGlobalForExtensionApi } from "@k8slens/legacy-global-di"; -import { issuesTrackerUrl } from "../../common/vars"; -import enabledExtensionsInjectable from "../../features/extensions/enabled/common/enabled-extensions.injectable"; -import userPreferencesStateInjectable from "../../features/user-preferences/common/state.injectable"; -import { lensBuildEnvironmentInjectionToken } from "@k8slens/application"; -import { buildVersionInitializable } from "../../features/vars/build-version/common/token"; - -const userStore = asLegacyGlobalForExtensionApi(userPreferencesStateInjectable); -const enabledExtensions = asLegacyGlobalForExtensionApi(enabledExtensionsInjectable); - -export const App = { - Preferences: { - getKubectlPath: () => userStore.kubectlBinariesPath, - }, - getEnabledExtensions: () => enabledExtensions.get(), - get version() { - const di = getLegacyGlobalDiForExtensionApi(); - - return di.inject(buildVersionInitializable.stateToken); - }, - get appName() { - const di = getLegacyGlobalDiForExtensionApi(); - - return di.inject(appNameInjectable); - }, - get isSnap() { - const di = getLegacyGlobalDiForExtensionApi(); - - return di.inject(isSnapPackageInjectable); - }, - get isWindows() { - const di = getLegacyGlobalDiForExtensionApi(); - - return di.inject(isWindowsInjectable); - }, - get isMac() { - const di = getLegacyGlobalDiForExtensionApi(); - - return di.inject(isMacInjectable); - }, - get isLinux() { - const di = getLegacyGlobalDiForExtensionApi(); - - return di.inject(isLinuxInjectable); - }, - get lensBuildEnvironment() { - const di = getLegacyGlobalDiForExtensionApi(); - - return di.inject(lensBuildEnvironmentInjectionToken); - }, - /** - * @deprecated This value is now `""` and is left here for backwards compatibility. - */ - slackUrl: "", - issuesTrackerUrl, -} as const; diff --git a/packages/core/src/extensions/common-api/catalog.ts b/packages/core/src/extensions/common-api/catalog.ts deleted file mode 100644 index bc7fd1063d..0000000000 --- a/packages/core/src/extensions/common-api/catalog.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { KubernetesClusterCategory } from "../../common/catalog-entities/kubernetes-cluster"; -import kubernetesClusterCategoryInjectable from "../../common/catalog/categories/kubernetes-cluster.injectable"; -import { asLegacyGlobalForExtensionApi } from "@k8slens/legacy-global-di"; - -export { - KubernetesCluster, - GeneralEntity, - WebLink, -} from "../../common/catalog-entities"; - -export type { - KubernetesClusterCategory, -}; - -export const kubernetesClusterCategory = asLegacyGlobalForExtensionApi(kubernetesClusterCategoryInjectable); - -export type { - KubernetesClusterPrometheusMetrics, - KubernetesClusterSpec, - KubernetesClusterMetadata, - WebLinkSpec, - WebLinkStatus, - WebLinkStatusPhase, - KubernetesClusterStatusPhase, - KubernetesClusterStatus, - GeneralEntitySpec, -} from "../../common/catalog-entities"; - -export * from "../../common/catalog/catalog-entity"; diff --git a/packages/core/src/extensions/common-api/event-bus.ts b/packages/core/src/extensions/common-api/event-bus.ts deleted file mode 100644 index b357a65e88..0000000000 --- a/packages/core/src/extensions/common-api/event-bus.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import appEventBusInjectable from "../../common/app-event-bus/app-event-bus.injectable"; -import { asLegacyGlobalForExtensionApi } from "@k8slens/legacy-global-di"; -import type { AppEvent } from "../../common/app-event-bus/event-bus"; -import type { EventEmitter, EventEmitterCallback, EventEmitterOptions } from "@k8slens/event-emitter"; - -export type { - AppEvent, - EventEmitter, - EventEmitterCallback, - EventEmitterOptions, -}; - -export const appEventBus = asLegacyGlobalForExtensionApi(appEventBusInjectable); diff --git a/packages/core/src/extensions/common-api/index.ts b/packages/core/src/extensions/common-api/index.ts deleted file mode 100644 index 3cf44488a9..0000000000 --- a/packages/core/src/extensions/common-api/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { loggerInjectionToken } from "@k8slens/logger"; -import { asLegacyGlobalForExtensionApi } from "@k8slens/legacy-global-di"; - -// APIs -export { App } from "./app"; -export * as EventBus from "./event-bus"; -export * as Store from "./stores"; -export * as Util from "./utils"; -export * as Catalog from "./catalog"; -export * as Types from "./types"; -export * as Proxy from "./proxy"; - -export type { Logger } from "@k8slens/logger"; -export type { LensExtension } from "../lens-extension"; -export type { PackageJson } from "type-fest"; -export type { LensExtensionManifest, InstalledExtension } from "@k8slens/legacy-extensions"; - -export const logger = asLegacyGlobalForExtensionApi(loggerInjectionToken); diff --git a/packages/core/src/extensions/common-api/k8s-api.ts b/packages/core/src/extensions/common-api/k8s-api.ts deleted file mode 100644 index 7c9e2ad763..0000000000 --- a/packages/core/src/extensions/common-api/k8s-api.ts +++ /dev/null @@ -1,300 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -// NOTE: this file is not currently exported as part of `Common`, but should be. -// It is here to consolidate the common parts which are exported to `Main` -// and to `Renderer` - -import apiManagerInjectable from "../../common/k8s-api/api-manager/manager.injectable"; -import createKubeApiForClusterInjectable from "../../common/k8s-api/create-kube-api-for-cluster.injectable"; -import createKubeApiForRemoteClusterInjectable from "../../common/k8s-api/create-kube-api-for-remote-cluster.injectable"; -import createResourceStackInjectable from "../../common/k8s/create-resource-stack.injectable"; -import type { ResourceApplyingStack } from "../../common/k8s/resource-stack"; -import { asLegacyGlobalFunctionForExtensionApi, asLegacyGlobalForExtensionApi, getLegacyGlobalDiForExtensionApi } from "@k8slens/legacy-global-di"; -import type { KubernetesCluster } from "./catalog"; -import type { KubeApiDataFrom, KubeObjectStoreOptions } from "../../common/k8s-api/kube-object.store"; -import { KubeObjectStore as InternalKubeObjectStore } from "../../common/k8s-api/kube-object.store"; -import type { KubeJsonApiDataFor, KubeObject } from "@k8slens/kube-object"; -import type { DerivedKubeApiOptions, KubeApiDependencies, KubeApiOptions, KubeJsonApi as InternalKubeJsonApi } from "@k8slens/kube-api"; -import clusterFrameContextForNamespacedResourcesInjectable from "../../renderer/cluster-frame-context/for-namespaced-resources.injectable"; -import type { ClusterContext } from "../../renderer/cluster-frame-context/cluster-frame-context"; -import { logErrorInjectionToken, loggerInjectionToken, logInfoInjectionToken, logWarningInjectionToken } from "@k8slens/logger"; -import { maybeKubeApiInjectable, storesAndApisCanBeCreatedInjectionToken } from "@k8slens/kube-api-specifics"; -import { DeploymentApi as InternalDeploymentApi, IngressApi as InternalIngressApi, NodeApi, PersistentVolumeClaimApi, PodApi, KubeApi as InternalKubeApi } from "@k8slens/kube-api"; -import type { JsonApiConfig } from "@k8slens/json-api"; -import createKubeJsonApiInjectable from "../../common/k8s-api/create-kube-json-api.injectable"; -import type { RequestInit } from "@k8slens/node-fetch"; -import createKubeJsonApiForClusterInjectable from "../../common/k8s-api/create-kube-json-api-for-cluster.injectable"; -import getPodsByOwnerIdInjectable from "../../renderer/components/workloads-pods/get-pods-by-owner-id.injectable"; - -export const apiManager = asLegacyGlobalForExtensionApi(apiManagerInjectable); -export const forCluster = asLegacyGlobalFunctionForExtensionApi(createKubeApiForClusterInjectable); -export const forRemoteCluster = asLegacyGlobalFunctionForExtensionApi(createKubeApiForRemoteClusterInjectable); -export const createResourceStack = asLegacyGlobalFunctionForExtensionApi(createResourceStackInjectable); -export const getPodsByOwnerId = asLegacyGlobalFunctionForExtensionApi(getPodsByOwnerIdInjectable); - -const getKubeApiDeps = (): KubeApiDependencies => { - const di = getLegacyGlobalDiForExtensionApi(); - - return { - logError: di.inject(logErrorInjectionToken), - logInfo: di.inject(logInfoInjectionToken), - logWarn: di.inject(logWarningInjectionToken), - maybeKubeApi: di.inject(maybeKubeApiInjectable), - }; -}; - -export interface ExternalKubeApiOptions { - /** - * If `true` then on creation of the `KubeApi`instance a call to `apiManager.registerApi` will be - * made. This is `true` by default to maintain backwards compatibility. - * - * Setting this to `false` might make `KubeObject`'s details drawer stop working. - * - * @default true - */ - autoRegister?: boolean; -} - -// NOTE: this is done to preserve `instanceOf` behaviour -function KubeApiCstr< - Object extends KubeObject = KubeObject, - Data extends KubeJsonApiDataFor = KubeJsonApiDataFor, ->({ autoRegister = true, ...opts }: KubeApiOptions & ExternalKubeApiOptions) { - const api = new InternalKubeApi(getKubeApiDeps(), opts); - - const di = getLegacyGlobalDiForExtensionApi(); - const storesAndApisCanBeCreated = di.inject(storesAndApisCanBeCreatedInjectionToken); - - if (storesAndApisCanBeCreated && autoRegister) { - apiManager.registerApi(api); - } - - return api; -} - -export type KubeApi< - Object extends KubeObject = KubeObject, - Data extends KubeJsonApiDataFor = KubeJsonApiDataFor, -> = InternalKubeApi; - -export const KubeApi = KubeApiCstr as unknown as new< - Object extends KubeObject = KubeObject, - Data extends KubeJsonApiDataFor = KubeJsonApiDataFor, ->(opts: KubeApiOptions & ExternalKubeApiOptions) => InternalKubeApi; - -/** - * @deprecated Switch to using `Common.createResourceStack` instead - */ -export class ResourceStack implements ResourceApplyingStack { - private readonly impl: ResourceApplyingStack; - - constructor(cluster: KubernetesCluster, name: string) { - this.impl = createResourceStack(cluster, name); - } - - kubectlApplyFolder(folderPath: string, templateContext?: any, extraArgs?: string[] | undefined): Promise { - return this.impl.kubectlApplyFolder(folderPath, templateContext, extraArgs); - } - - kubectlDeleteFolder(folderPath: string, templateContext?: any, extraArgs?: string[] | undefined): Promise { - return this.impl.kubectlDeleteFolder(folderPath, templateContext, extraArgs); - } -} - -/** - * @deprecated This type is unused - */ -export interface IKubeApiCluster { - metadata: { - uid: string; - }; -} - -export type { CreateKubeApiForRemoteClusterConfig as IRemoteKubeApiConfig } from "../../common/k8s-api/create-kube-api-for-remote-cluster.injectable"; -export type { CreateKubeApiForLocalClusterConfig as ILocalKubeApiConfig } from "../../common/k8s-api/create-kube-api-for-cluster.injectable"; - -export { - KubeObject, - KubeStatus, - isJsonApiData, - isJsonApiDataList, - isKubeJsonApiListMetadata, - isKubeJsonApiMetadata, - isKubeObjectNonSystem, - isKubeStatusData, - isPartialJsonApiData, - isPartialJsonApiMetadata, - createKubeObject, - stringifyLabels, -} from "@k8slens/kube-object"; -export type { - OwnerReference, - KubeObjectMetadata, - NamespaceScopedMetadata, - ClusterScopedMetadata, - BaseKubeJsonApiObjectMetadata, - KubeJsonApiObjectMetadata, - KubeStatusData, - KubeJsonApiDataFor, - KubeJsonApiData, -} from "@k8slens/kube-object"; - -function KubeJsonApiCstr(config: JsonApiConfig, reqInit?: RequestInit) { - const di = getLegacyGlobalDiForExtensionApi(); - const createKubeJsonApi = di.inject(createKubeJsonApiInjectable); - - return createKubeJsonApi(config, reqInit); -} - -export type KubeJsonApi = InternalKubeJsonApi; - -export const KubeJsonApi = Object.assign( - KubeJsonApiCstr as unknown as new (config: JsonApiConfig, reqInit?: RequestInit) => InternalKubeJsonApi, - { - forCluster: asLegacyGlobalForExtensionApi(createKubeJsonApiForClusterInjectable), - }, -); - -export abstract class KubeObjectStore< - K extends KubeObject = KubeObject, - A extends InternalKubeApi = InternalKubeApi>, - D extends KubeJsonApiDataFor = KubeApiDataFrom, -> extends InternalKubeObjectStore { - /** - * @deprecated This is no longer used and shouldn't have been every really used - */ - static readonly context = { - set: (ctx: ClusterContext) => { - console.warn("Setting KubeObjectStore.context is no longer supported"); - void ctx; - }, - get: () => asLegacyGlobalForExtensionApi(clusterFrameContextForNamespacedResourcesInjectable), - }; - - get context() { - return this.dependencies.context; - } - - constructor(api: A, opts?: KubeObjectStoreOptions); - /** - * @deprecated Supply API instance through constructor - */ - constructor(); - constructor(api?: A, opts?: KubeObjectStoreOptions) { - const di = getLegacyGlobalDiForExtensionApi(); - - super( - { - context: di.inject(clusterFrameContextForNamespacedResourcesInjectable), - logger: di.inject(loggerInjectionToken), - }, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - api!, - opts, - ); - } -} - -export type { - JsonPatch, - KubeObjectStoreLoadAllParams, - KubeObjectStoreLoadingParams, - KubeObjectStoreSubscribeParams, -} from "../../common/k8s-api/kube-object.store"; - -/** - * @deprecated This type is only present for backwards compatible typescript support - */ -export interface IgnoredKubeApiOptions { - /** - * @deprecated this option is overridden and should not be used - */ - objectConstructor?: any; - /** - * @deprecated this option is overridden and should not be used - */ - kind?: any; - /** - * @deprecated this option is overridden and should not be used - */ - isNamespaces?: any; - /** - * @deprecated this option is overridden and should not be used - */ - apiBase?: any; -} - -// NOTE: these *Constructor functions MUST be `function` to work with `new X()` -function PodsApiConstructor(opts?: DerivedKubeApiOptions & IgnoredKubeApiOptions) { - return new PodApi(getKubeApiDeps(), opts); -} - -export type PodsApi = PodApi; -export const PodsApi = PodsApiConstructor as unknown as new (opts?: DerivedKubeApiOptions & IgnoredKubeApiOptions) => PodApi; - -function NodesApiConstructor(opts?: DerivedKubeApiOptions & IgnoredKubeApiOptions) { - return new NodeApi(getKubeApiDeps(), opts); -} - -export type NodesApi = NodeApi; -export const NodesApi = NodesApiConstructor as unknown as new (opts?: DerivedKubeApiOptions & IgnoredKubeApiOptions) => NodeApi; - -function DeploymentApiConstructor(opts?: DerivedKubeApiOptions) { - return new InternalDeploymentApi(getKubeApiDeps(), opts); -} - -export type DeploymentApi = InternalDeploymentApi; -export const DeploymentApi = DeploymentApiConstructor as unknown as new (opts?: DerivedKubeApiOptions) => InternalDeploymentApi; - -function IngressApiConstructor(opts?: DerivedKubeApiOptions & IgnoredKubeApiOptions) { - return new InternalIngressApi(getKubeApiDeps(), opts); -} - -export type IngressApi = InternalIngressApi; -export const IngressApi = IngressApiConstructor as unknown as new (opts?: DerivedKubeApiOptions & IgnoredKubeApiOptions) => InternalIngressApi; - -function PersistentVolumeClaimsApiConstructor(opts?: DerivedKubeApiOptions & IgnoredKubeApiOptions) { - return new PersistentVolumeClaimApi(getKubeApiDeps(), opts); -} - -export type PersistentVolumeClaimsApi = PersistentVolumeClaimApi; -export const PersistentVolumeClaimsApi = PersistentVolumeClaimsApiConstructor as unknown as new (opts?: DerivedKubeApiOptions & IgnoredKubeApiOptions) => PersistentVolumeClaimApi; - -export { - type Container as IPodContainer, - type PodContainerStatus as IPodContainerStatus, - Pod, - Node, - Deployment, - DaemonSet, - StatefulSet, - Job, - CronJob, - ConfigMap, - type SecretReference as ISecretRef, - Secret, - ReplicaSet, - ResourceQuota, - LimitRange, - HorizontalPodAutoscaler, - PodDisruptionBudget, - PriorityClass, - Service, - Endpoints as Endpoint, - Ingress, - NetworkPolicy, - PersistentVolume, - PersistentVolumeClaim, - StorageClass, - Namespace, - KubeEvent, - ServiceAccount, - Role, - RoleBinding, - ClusterRole, - ClusterRoleBinding, - CustomResourceDefinition, -} from "@k8slens/kube-object"; diff --git a/packages/core/src/extensions/common-api/proxy.ts b/packages/core/src/extensions/common-api/proxy.ts deleted file mode 100644 index 950264ee79..0000000000 --- a/packages/core/src/extensions/common-api/proxy.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { asLegacyGlobalFunctionForExtensionApi } from "@k8slens/legacy-global-di"; -import { resolveSystemProxyInjectionToken } from "../../common/utils/resolve-system-proxy/resolve-system-proxy-injection-token"; - -/** - * Resolves URL-specific proxy information from system. See more here: https://www.electronjs.org/docs/latest/api/session#sesresolveproxyurl - * @param url - The URL for proxy information - * @returns Promise for proxy information as string - */ -export const resolveSystemProxy = asLegacyGlobalFunctionForExtensionApi(resolveSystemProxyInjectionToken); diff --git a/packages/core/src/extensions/common-api/stores.ts b/packages/core/src/extensions/common-api/stores.ts deleted file mode 100644 index 5c35b63a7d..0000000000 --- a/packages/core/src/extensions/common-api/stores.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { PersistentStorageParams } from "../../features/persistent-storage/common/create.injectable"; -import type { ExtensionStoreParams } from "../base-extension-store"; -import { BaseExtensionStore as ExtensionStore } from "../base-extension-store"; - -export type { - ExtensionStoreParams, - PersistentStorageParams, -}; - -export { ExtensionStore }; diff --git a/packages/core/src/extensions/common-api/types.ts b/packages/core/src/extensions/common-api/types.ts deleted file mode 100644 index cb464916f5..0000000000 --- a/packages/core/src/extensions/common-api/types.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - - -export type IpcMainInvokeEvent = Electron.IpcMainInvokeEvent; -export type IpcRendererEvent = Electron.IpcRendererEvent; -export type IpcMainEvent = Electron.IpcMainEvent; - -export type { StatusBarRegistration } from "../../renderer/components/status-bar/status-bar-registration"; -export type { KubeObjectMenuRegistration, KubeObjectMenuComponents } from "../../renderer/components/kube-object-menu/kube-object-menu-registration"; -export type { AppPreferenceRegistration, AppPreferenceComponents } from "../../features/preferences/renderer/compliance-for-legacy-extension-api/app-preference-registration"; -export type { KubeObjectDetailRegistration, KubeObjectDetailComponents } from "../../renderer/components/kube-object-details/kube-object-detail-registration"; -export type { KubeObjectStatusRegistration } from "../../renderer/components/kube-object-status-icon/kube-object-status-registration"; -export type { PageRegistration, RegisteredPage, PageParams, PageComponentProps, PageComponents, PageTarget } from "../../renderer/routes/page-registration"; -export type { ClusterPageMenuRegistration, ClusterPageMenuComponents } from "../../renderer/components/layout/cluster-page-menu"; -export type { ProtocolHandlerRegistration, RouteParams as ProtocolRouteParams, RouteHandler as ProtocolRouteHandler } from "../../common/protocol-handler/registration"; -export type { CustomCategoryViewProps, CustomCategoryViewComponents, CustomCategoryViewRegistration } from "../../renderer/components/catalog/custom-views"; -export type { ShellEnvModifier, ShellEnvContext } from "../../main/shell-session/shell-env-modifier/shell-env-modifier-registration"; -export type { KubeObjectContextMenuItem, KubeObjectOnContextMenuOpenContext, KubeObjectOnContextMenuOpen, KubeObjectHandlers, KubeObjectHandlerRegistration } from "../../renderer/kube-object/handler"; -export type { TrayMenuRegistration } from "../../main/tray/tray-menu-registration"; -export type { MenuRegistration } from "../../features/application-menu/main/menu-registration"; diff --git a/packages/core/src/extensions/common-api/utils.ts b/packages/core/src/extensions/common-api/utils.ts deleted file mode 100644 index 0164294fa7..0000000000 --- a/packages/core/src/extensions/common-api/utils.ts +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import openLinkInBrowserInjectable from "../../common/utils/open-link-in-browser.injectable"; -import { buildVersionInitializable } from "../../features/vars/build-version/common/token"; -import { asLegacyGlobalFunctionForExtensionApi, getLegacyGlobalDiForExtensionApi } from "@k8slens/legacy-global-di"; - -export { Singleton } from "../../common/utils/singleton"; - -export { - /** - * @deprecated Switch to using the `@k8slens/utilities` package - */ - prevDefault, - /** - * @deprecated Switch to using the `@k8slens/utilities` package - */ - stopPropagation, - /** - * @deprecated Switch to using the `@k8slens/utilities` package - */ - cssNames, - /** - * @deprecated Switch to using the `@k8slens/utilities` package - */ - disposer, -} from "@k8slens/utilities"; - -export type { - /** - * @deprecated Switch to using the `@k8slens/utilities` package - */ - IClassName, - /** - * @deprecated Switch to using the `@k8slens/utilities` package - */ - IgnoredClassNames, - /** - * @deprecated Switch to using the `@k8slens/utilities` package - */ - Disposer, - /** - * @deprecated Switch to using the `@k8slens/utilities` package - */ - Disposable, - /** - * @deprecated Switch to using the `@k8slens/utilities` package - */ - ExtendableDisposer, -} from "@k8slens/utilities"; - -export type { OpenLinkInBrowser } from "../../common/utils/open-link-in-browser.injectable"; - -export const openExternal = asLegacyGlobalFunctionForExtensionApi(openLinkInBrowserInjectable); -export const openBrowser = asLegacyGlobalFunctionForExtensionApi(openLinkInBrowserInjectable); - -export const getAppVersion = () => { - const di = getLegacyGlobalDiForExtensionApi(); - - return di.inject(buildVersionInitializable.stateToken); -}; diff --git a/packages/core/src/extensions/extension-api.ts b/packages/core/src/extensions/extension-api.ts deleted file mode 100644 index b5165851dc..0000000000 --- a/packages/core/src/extensions/extension-api.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -// Extensions-api types bundle (main + renderer) -// Available for lens-extensions via NPM-package "@k8slens/extensions" - -import * as Common from "./common-api"; -import * as Renderer from "./renderer-api"; -import * as Main from "./main-api"; - -export { - Common, - Renderer, - Main, -}; diff --git a/packages/core/src/extensions/extension-discovery/extension-discovery.injectable.ts b/packages/core/src/extensions/extension-discovery/extension-discovery.injectable.ts deleted file mode 100644 index 856b665ba6..0000000000 --- a/packages/core/src/extensions/extension-discovery/extension-discovery.injectable.ts +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { ExtensionDiscovery } from "./extension-discovery"; -import extensionLoaderInjectable from "../extension-loader/extension-loader.injectable"; -import isCompatibleExtensionInjectable from "./is-compatible-extension/is-compatible-extension.injectable"; -import extensionInstallationStateStoreInjectable from "../extension-installation-state-store/extension-installation-state-store.injectable"; -import installExtensionInjectable from "../install-extension/install-extension.injectable"; -import extensionPackageRootDirectoryInjectable from "../install-extension/extension-package-root-directory.injectable"; -import readJsonFileInjectable from "../../common/fs/read-json-file.injectable"; -import { loggerInjectionToken } from "@k8slens/logger"; -import pathExistsInjectable from "../../common/fs/path-exists.injectable"; -import watchInjectable from "../../common/fs/watch/watch.injectable"; -import accessPathInjectable from "../../common/fs/access-path.injectable"; -import copyInjectable from "../../common/fs/copy.injectable"; -import ensureDirInjectable from "../../common/fs/ensure-dir.injectable"; -import isProductionInjectable from "../../common/vars/is-production.injectable"; -import lstatInjectable from "../../common/fs/lstat.injectable"; -import readDirectoryInjectable from "../../common/fs/read-directory.injectable"; -import fileSystemSeparatorInjectable from "../../common/path/separator.injectable"; -import getBasenameOfPathInjectable from "../../common/path/get-basename.injectable"; -import getDirnameOfPathInjectable from "../../common/path/get-dirname.injectable"; -import getRelativePathInjectable from "../../common/path/get-relative-path.injectable"; -import joinPathsInjectable from "../../common/path/join-paths.injectable"; -import removePathInjectable from "../../common/fs/remove.injectable"; -import homeDirectoryPathInjectable from "../../common/os/home-directory-path.injectable"; -import lensResourcesDirInjectable from "../../common/vars/lens-resources-dir.injectable"; -import isExtensionEnabledInjectable from "../../features/extensions/enabled/common/is-enabled.injectable"; - -const extensionDiscoveryInjectable = getInjectable({ - id: "extension-discovery", - - instantiate: (di) => new ExtensionDiscovery({ - extensionLoader: di.inject(extensionLoaderInjectable), - isExtensionEnabled: di.inject(isExtensionEnabledInjectable), - extensionInstallationStateStore: di.inject(extensionInstallationStateStoreInjectable), - isCompatibleExtension: di.inject(isCompatibleExtensionInjectable), - installExtension: di.inject(installExtensionInjectable), - extensionPackageRootDirectory: di.inject(extensionPackageRootDirectoryInjectable), - resourcesDirectory: di.inject(lensResourcesDirInjectable), - readJsonFile: di.inject(readJsonFileInjectable), - pathExists: di.inject(pathExistsInjectable), - watch: di.inject(watchInjectable), - logger: di.inject(loggerInjectionToken), - accessPath: di.inject(accessPathInjectable), - copy: di.inject(copyInjectable), - removePath: di.inject(removePathInjectable), - ensureDirectory: di.inject(ensureDirInjectable), - isProduction: di.inject(isProductionInjectable), - lstat: di.inject(lstatInjectable), - readDirectory: di.inject(readDirectoryInjectable), - fileSystemSeparator: di.inject(fileSystemSeparatorInjectable), - getBasenameOfPath: di.inject(getBasenameOfPathInjectable), - getDirnameOfPath: di.inject(getDirnameOfPathInjectable), - getRelativePath: di.inject(getRelativePathInjectable), - joinPaths: di.inject(joinPathsInjectable), - homeDirectoryPath: di.inject(homeDirectoryPathInjectable), - }), -}); - -export default extensionDiscoveryInjectable; diff --git a/packages/core/src/extensions/extension-discovery/extension-discovery.test.ts b/packages/core/src/extensions/extension-discovery/extension-discovery.test.ts deleted file mode 100644 index e27d00a34e..0000000000 --- a/packages/core/src/extensions/extension-discovery/extension-discovery.test.ts +++ /dev/null @@ -1,147 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { FSWatcher } from "chokidar"; -import { getDiForUnitTesting } from "../../main/getDiForUnitTesting"; -import extensionDiscoveryInjectable from "../extension-discovery/extension-discovery.injectable"; -import type { ExtensionDiscovery } from "../extension-discovery/extension-discovery"; -import installExtensionInjectable from "../install-extension/install-extension.injectable"; -import directoryForUserDataInjectable from "../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; -import { delay } from "@k8slens/utilities"; -import { observable, runInAction, when } from "mobx"; -import readJsonFileInjectable from "../../common/fs/read-json-file.injectable"; -import pathExistsInjectable from "../../common/fs/path-exists.injectable"; -import watchInjectable from "../../common/fs/watch/watch.injectable"; -import extensionApiVersionInjectable from "../../common/vars/extension-api-version.injectable"; -import removePathInjectable from "../../common/fs/remove.injectable"; -import type { JoinPaths } from "../../common/path/join-paths.injectable"; -import joinPathsInjectable from "../../common/path/join-paths.injectable"; -import homeDirectoryPathInjectable from "../../common/os/home-directory-path.injectable"; -import pathExistsSyncInjectable from "../../common/fs/path-exists-sync.injectable"; -import readJsonSyncInjectable from "../../common/fs/read-json-sync.injectable"; -import writeJsonSyncInjectable from "../../common/fs/write-json-sync.injectable"; - -describe("ExtensionDiscovery", () => { - let extensionDiscovery: ExtensionDiscovery; - let readJsonFileMock: jest.Mock; - let pathExistsMock: jest.Mock; - let watchMock: jest.Mock; - let joinPaths: JoinPaths; - let homeDirectoryPath: string; - - beforeEach(() => { - const di = getDiForUnitTesting(); - - di.override(directoryForUserDataInjectable, () => "/some-directory-for-user-data"); - di.override(installExtensionInjectable, () => () => Promise.resolve()); - di.override(extensionApiVersionInjectable, () => "5.0.0"); - di.override(pathExistsSyncInjectable, () => () => { throw new Error("tried call pathExistsSync without override"); }); - di.override(readJsonSyncInjectable, () => () => { throw new Error("tried call readJsonSync without override"); }); - di.override(writeJsonSyncInjectable, () => () => { throw new Error("tried call writeJsonSync without override"); }); - - joinPaths = di.inject(joinPathsInjectable); - homeDirectoryPath = di.inject(homeDirectoryPathInjectable); - - readJsonFileMock = jest.fn(); - di.override(readJsonFileInjectable, () => readJsonFileMock); - - pathExistsMock = jest.fn(() => Promise.resolve(true)); - di.override(pathExistsInjectable, () => pathExistsMock); - - watchMock = jest.fn(); - di.override(watchInjectable, () => watchMock); - - di.override(removePathInjectable, () => async () => {}); // allow deleting files for now - - extensionDiscovery = di.inject(extensionDiscoveryInjectable); - }); - - it("emits add for added extension", async () => { - const letTestFinish = observable.box(false); - let addHandler!: (filePath: string) => void; - - readJsonFileMock.mockImplementation((p) => { - expect(p).toBe(joinPaths(homeDirectoryPath, ".k8slens/extensions/my-extension/package.json")); - - return { - name: "my-extension", - version: "1.0.0", - engines: { - lens: "5.0.0", - }, - }; - }); - - const mockWatchInstance = { - on: jest.fn((event: string, handler: typeof addHandler) => { - if (event === "add") { - addHandler = handler; - } - - return mockWatchInstance; - }), - } as unknown as FSWatcher; - - watchMock.mockImplementationOnce(() => mockWatchInstance); - - // Need to force isLoaded to be true so that the file watching is started - extensionDiscovery.isLoaded = true; - - await extensionDiscovery.watchExtensions(); - - extensionDiscovery.events.on("add", extension => { - expect(extension).toEqual({ - absolutePath: expect.any(String), - id: "/some-directory-for-user-data/node_modules/my-extension/package.json", - isBundled: false, - isEnabled: false, - isCompatible: true, - manifest: { - name: "my-extension", - version: "1.0.0", - engines: { - lens: "5.0.0", - }, - }, - manifestPath: "/some-directory-for-user-data/node_modules/my-extension/package.json", - }); - runInAction(() => letTestFinish.set(true)); - }); - - addHandler(joinPaths(extensionDiscovery.localFolderPath, "/my-extension/package.json")); - await when(() => letTestFinish.get()); - }); - - it("doesn't emit add for added file under extension", async () => { - let addHandler!: (filePath: string) => void; - - const mockWatchInstance = { - on: jest.fn((event: string, handler: typeof addHandler) => { - if (event === "add") { - addHandler = handler; - } - - return mockWatchInstance; - }), - } as unknown as FSWatcher; - - watchMock.mockImplementationOnce(() => mockWatchInstance); - - // Need to force isLoaded to be true so that the file watching is started - extensionDiscovery.isLoaded = true; - - await extensionDiscovery.watchExtensions(); - - const onAdd = jest.fn(); - - extensionDiscovery.events.on("add", onAdd); - - addHandler(joinPaths(extensionDiscovery.localFolderPath, "/my-extension/node_modules/dep/package.json")); - - await delay(10); - - expect(onAdd).not.toHaveBeenCalled(); - }); -}); diff --git a/packages/core/src/extensions/extension-discovery/extension-discovery.ts b/packages/core/src/extensions/extension-discovery/extension-discovery.ts deleted file mode 100644 index 31ecfc04da..0000000000 --- a/packages/core/src/extensions/extension-discovery/extension-discovery.ts +++ /dev/null @@ -1,421 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { ipcRenderer } from "electron"; -import { EventEmitter } from "events"; -import { makeObservable, observable, reaction, when } from "mobx"; -import { broadcastMessage, ipcMainHandle, ipcRendererOn } from "../../common/ipc"; -import { toJS } from "../../common/utils"; -import { isErrnoException } from "@k8slens/utilities"; -import type { ExtensionLoader } from "../extension-loader"; -import type { InstalledExtension, LensExtensionId, LensExtensionManifest, ExternalInstalledExtension } from "@k8slens/legacy-extensions"; -import type { ExtensionInstallationStateStore } from "../extension-installation-state-store/extension-installation-state-store"; -import { extensionDiscoveryStateChannel } from "../../common/ipc/extension-handling"; -import { requestInitialExtensionDiscovery } from "../../renderer/ipc"; -import type { ReadJson } from "../../common/fs/read-json-file.injectable"; -import type { Logger } from "@k8slens/logger"; -import type { PathExists } from "../../common/fs/path-exists.injectable"; -import type { Watch, Watcher } from "../../common/fs/watch/watch.injectable"; -import type { Stats } from "fs"; -import type { LStat } from "../../common/fs/lstat.injectable"; -import type { ReadDirectory } from "../../common/fs/read-directory.injectable"; -import type { EnsureDirectory } from "../../common/fs/ensure-dir.injectable"; -import type { AccessPath } from "../../common/fs/access-path.injectable"; -import type { Copy } from "../../common/fs/copy.injectable"; -import type { JoinPaths } from "../../common/path/join-paths.injectable"; -import type { GetBasenameOfPath } from "../../common/path/get-basename.injectable"; -import type { GetDirnameOfPath } from "../../common/path/get-dirname.injectable"; -import type { GetRelativePath } from "../../common/path/get-relative-path.injectable"; -import type { RemovePath } from "../../common/fs/remove.injectable"; -import type TypedEventEmitter from "typed-emitter"; -import type { IsExtensionEnabled } from "../../features/extensions/enabled/common/is-enabled.injectable"; - -interface Dependencies { - readonly extensionLoader: ExtensionLoader; - readonly extensionInstallationStateStore: ExtensionInstallationStateStore; - readonly extensionPackageRootDirectory: string; - readonly resourcesDirectory: string; - readonly logger: Logger; - readonly isProduction: boolean; - readonly fileSystemSeparator: string; - readonly homeDirectoryPath: string; - isExtensionEnabled: IsExtensionEnabled; - isCompatibleExtension: (manifest: LensExtensionManifest) => boolean; - installExtension: (name: string) => Promise; - readJsonFile: ReadJson; - pathExists: PathExists; - removePath: RemovePath; - lstat: LStat; - watch: Watch; - readDirectory: ReadDirectory; - ensureDirectory: EnsureDirectory; - accessPath: AccessPath; - copy: Copy; - joinPaths: JoinPaths; - getBasenameOfPath: GetBasenameOfPath; - getDirnameOfPath: GetDirnameOfPath; - getRelativePath: GetRelativePath; -} - -const logModule = "[EXTENSION-DISCOVERY]"; - -export const manifestFilename = "package.json"; - -interface ExtensionDiscoveryChannelMessage { - isLoaded: boolean; -} - -/** - * Returns true if the lstat is for a directory-like file (e.g. isDirectory or symbolic link) - * @param lstat the stats to compare - */ -const isDirectoryLike = (lstat: Stats) => lstat.isDirectory() || lstat.isSymbolicLink(); - -interface ExtensionDiscoveryEvents { - add: (ext: InstalledExtension) => void; - remove: (extId: LensExtensionId) => void; -} - -/** - * Discovers installed bundled and local extensions from the filesystem. - * Also watches for added and removed local extensions by watching the directory. - * Uses ExtensionInstaller to install dependencies for all of the extensions. - * This is also done when a new extension is copied to the local extensions directory. - * .init() must be called to start the directory watching. - * The class emits events for added and removed extensions: - * - "add": When extension is added. The event is of type InstalledExtension - * - "remove": When extension is removed. The event is of type LensExtensionId - */ -export class ExtensionDiscovery { - protected bundledFolderPath!: string; - - private loadStarted = false; - private extensions: Map = new Map(); - - // True if extensions have been loaded from the disk after app startup - @observable isLoaded = false; - - get whenLoaded() { - return when(() => this.isLoaded); - } - - public readonly events: TypedEventEmitter = new EventEmitter(); - - constructor(protected readonly dependencies: Dependencies) { - makeObservable(this); - } - - get localFolderPath(): string { - return this.dependencies.joinPaths(this.dependencies.homeDirectoryPath, ".k8slens", "extensions"); - } - - get packageJsonPath(): string { - return this.dependencies.joinPaths(this.dependencies.extensionPackageRootDirectory, manifestFilename); - } - - get nodeModulesPath(): string { - return this.dependencies.joinPaths(this.dependencies.extensionPackageRootDirectory, "node_modules"); - } - - /** - * Initializes the class and setups the file watcher for added/removed local extensions. - */ - async init(): Promise { - if (ipcRenderer) { - await this.initRenderer(); - } else { - await this.initMain(); - } - } - - async initRenderer(): Promise { - const onMessage = ({ isLoaded }: ExtensionDiscoveryChannelMessage) => { - this.isLoaded = isLoaded; - }; - - requestInitialExtensionDiscovery().then(onMessage); - ipcRendererOn(extensionDiscoveryStateChannel, (_event, message: ExtensionDiscoveryChannelMessage) => { - onMessage(message); - }); - } - - async initMain(): Promise { - ipcMainHandle(extensionDiscoveryStateChannel, () => this.toJSON()); - - reaction(() => this.toJSON(), () => { - this.broadcast(); - }); - } - - private _watch: Watcher|undefined; - - /** - * Watches for added/removed local extensions. - * Dependencies are installed automatically after an extension folder is copied. - */ - async watchExtensions(): Promise { - this.dependencies.logger.info(`${logModule} watching extension add/remove in ${this.localFolderPath}`); - - // Wait until .load() has been called and has been resolved - await this.whenLoaded; - - this._watch = this.dependencies.watch(this.localFolderPath, { - // For adding and removing symlinks to work, the depth has to be 1. - depth: 1, - ignoreInitial: true, - // Try to wait until the file has been completely copied. - // The OS might emit an event for added file even it's not completely written to the file-system. - awaitWriteFinish: { - // Wait 300ms until the file size doesn't change to consider the file written. - // For a small file like package.json this should be plenty of time. - stabilityThreshold: 300, - }, - }) - // Extension add is detected by watching "/package.json" add - .on("add", this.handleWatchFileAdd) - // Extension remove is detected by watching "" unlink - .on("unlinkDir", this.handleWatchUnlinkEvent) - // Extension remove is detected by watching "" unlink - .on("unlink", this.handleWatchUnlinkEvent); - } - - async stopWatchingExtensions() { - this.dependencies.logger.info(`${logModule} stopping the watch for extensions`); - - await this._watch?.close(); - } - - handleWatchFileAdd = async (manifestPath: string): Promise => { - // e.g. "foo/package.json" - const relativePath = this.dependencies.getRelativePath(this.localFolderPath, manifestPath); - - // Converts "foo/package.json" to ["foo", "package.json"], where length of 2 implies - // that the added file is in a folder under local folder path. - // This safeguards against a file watch being triggered under a sub-directory which is not an extension. - const isUnderLocalFolderPath = relativePath.split(this.dependencies.fileSystemSeparator).length === 2; - - if (this.dependencies.getBasenameOfPath(manifestPath) === manifestFilename && isUnderLocalFolderPath) { - try { - this.dependencies.extensionInstallationStateStore.setInstallingFromMain(manifestPath); - const absPath = this.dependencies.getDirnameOfPath(manifestPath); - - // this.loadExtensionFromPath updates this.packagesJson - const extension = await this.loadExtensionFromFolder(absPath); - - if (extension) { - // Install dependencies for the new extension - await this.dependencies.installExtension(extension.absolutePath); - - this.extensions.set(extension.id, extension); - this.dependencies.logger.info(`${logModule} Added extension ${extension.manifest.name}`); - this.events.emit("add", extension); - } - } catch (error) { - this.dependencies.logger.error(`${logModule}: failed to add extension: ${error}`, { error }); - } finally { - this.dependencies.extensionInstallationStateStore.clearInstallingFromMain(manifestPath); - } - } - }; - - /** - * Handle any unlink event, filtering out non-package.json links so the delete code - * only happens once per extension. - * @param filePath The absolute path to either a folder or file in the extensions folder - */ - handleWatchUnlinkEvent = async (filePath: string): Promise => { - // Check that the removed path is directly under this.localFolderPath - // Note that the watcher can create unlink events for subdirectories of the extension - const extensionFolderName = this.dependencies.getBasenameOfPath(filePath); - const expectedPath = this.dependencies.getRelativePath(this.localFolderPath, filePath); - - if (expectedPath !== extensionFolderName) { - return; - } - - for (const extension of this.extensions.values()) { - if (extension.absolutePath !== filePath) { - continue; - } - - const extensionName = extension.manifest.name; - - // If the extension is deleted manually while the application is running, also remove the symlink - await this.removeSymlinkByPackageName(extensionName); - - // The path to the manifest file is the lens extension id - // Note: that we need to use the symlinked path - const lensExtensionId = extension.manifestPath; - - this.extensions.delete(extension.id); - this.dependencies.logger.info(`${logModule} removed extension ${extensionName}`); - this.events.emit("remove", lensExtensionId); - - return; - } - - this.dependencies.logger.warn(`${logModule} extension ${extensionFolderName} not found, can't remove`); - }; - - /** - * Remove the symlink under node_modules if exists. - * If we don't remove the symlink, the uninstall would leave a non-working symlink, - * which wouldn't be fixed if the extension was reinstalled, causing the extension not to work. - * @param name e.g. "@mirantis/lens-extension-cc" - */ - removeSymlinkByPackageName(name: string): Promise { - return this.dependencies.removePath(this.getInstalledPath(name)); - } - - /** - * Uninstalls extension. - * The application will detect the folder unlink and remove the extension from the UI automatically. - * @param extensionId The ID of the extension to uninstall. - */ - async uninstallExtension(extensionId: LensExtensionId): Promise { - const extension = this.extensions.get(extensionId) ?? this.dependencies.extensionLoader.getExtensionById(extensionId); - - if (!extension) { - return void this.dependencies.logger.warn(`${logModule} could not uninstall extension, not found`, { id: extensionId }); - } - - const { manifest, absolutePath } = extension; - - this.dependencies.logger.info(`${logModule} Uninstalling ${manifest.name}`); - - await this.removeSymlinkByPackageName(manifest.name); - - // fs.remove does nothing if the path doesn't exist anymore - await this.dependencies.removePath(absolutePath); - } - - async load(): Promise> { - if (this.loadStarted) { - // The class is simplified by only supporting .load() to be called once - throw new Error("ExtensionDiscovery.load() can be only be called once"); - } - - this.loadStarted = true; - - this.dependencies.logger.info( - `${logModule} loading extensions from ${this.dependencies.extensionPackageRootDirectory}`, - ); - - await this.dependencies.removePath(this.dependencies.joinPaths(this.dependencies.extensionPackageRootDirectory, "package-lock.json")); - await this.dependencies.ensureDirectory(this.nodeModulesPath); - await this.dependencies.ensureDirectory(this.localFolderPath); - - const extensions = await this.ensureExtensions(); - - this.isLoaded = true; - - return extensions; - } - - /** - * Returns the symlinked path to the extension folder, - * e.g. "/Users//Library/Application Support/Lens/node_modules/@publisher/extension" - */ - protected getInstalledPath(name: string): string { - return this.dependencies.joinPaths(this.nodeModulesPath, name); - } - - /** - * Returns the symlinked path to the package.json, - * e.g. "/Users//Library/Application Support/Lens/node_modules/@publisher/extension/package.json" - */ - protected getInstalledManifestPath(name: string): string { - return this.dependencies.joinPaths(this.getInstalledPath(name), manifestFilename); - } - - /** - * Returns InstalledExtension from path to package.json file. - * Also updates this.packagesJson. - */ - protected async loadExtensionFromFolder(folderPath: string): Promise { - const manifestPath = this.dependencies.joinPaths(folderPath, manifestFilename); - - try { - const manifest = await this.dependencies.readJsonFile(manifestPath) as unknown as LensExtensionManifest; - const id = this.getInstalledManifestPath(manifest.name); - const isEnabled = this.dependencies.isExtensionEnabled(id); - const extensionDir = this.dependencies.getDirnameOfPath(manifestPath); - const npmPackage = this.dependencies.joinPaths(extensionDir, `${manifest.name}-${manifest.version}.tgz`); - const absolutePath = this.dependencies.isProduction && await this.dependencies.pathExists(npmPackage) - ? npmPackage - : extensionDir; - const isCompatible = this.dependencies.isCompatibleExtension(manifest); - - return { - id, - absolutePath, - manifestPath: id, - manifest, - isBundled: false, - isEnabled, - isCompatible, - }; - } catch (error) { - if (isErrnoException(error) && error.code === "ENOTDIR") { - // ignore this error, probably from .DS_Store file - this.dependencies.logger.debug(`${logModule}: failed to load extension manifest through a not-dir-like at ${manifestPath}`); - } else { - this.dependencies.logger.error(`${logModule}: can't load extension manifest at ${manifestPath}: ${error}`); - } - - return null; - } - } - - async ensureExtensions(): Promise> { - const userExtensions = await this.loadFromFolder(this.localFolderPath); - - return this.extensions = new Map(userExtensions.map(extension => [extension.id, extension])); - } - - async loadFromFolder(folderPath: string): Promise { - const extensions: ExternalInstalledExtension[] = []; - const paths = await this.dependencies.readDirectory(folderPath); - - for (const fileName of paths) { - const absPath = this.dependencies.joinPaths(folderPath, fileName); - - try { - const lstat = await this.dependencies.lstat(absPath); - - // skip non-directories - if (!isDirectoryLike(lstat)) { - continue; - } - } catch (error) { - if (isErrnoException(error) && error.code === "ENOENT") { - continue; - } - - throw error; - } - - const extension = await this.loadExtensionFromFolder(absPath); - - if (extension) { - extensions.push(extension); - } - } - - this.dependencies.logger.debug(`${logModule}: ${extensions.length} extensions loaded`, { folderPath, extensions }); - - return extensions; - } - - toJSON(): ExtensionDiscoveryChannelMessage { - return toJS({ - isLoaded: this.isLoaded, - }); - } - - broadcast(): void { - broadcastMessage(extensionDiscoveryStateChannel, this.toJSON()); - } -} diff --git a/packages/core/src/extensions/extension-discovery/is-compatible-extension/is-compatible-extension.injectable.ts b/packages/core/src/extensions/extension-discovery/is-compatible-extension/is-compatible-extension.injectable.ts deleted file mode 100644 index de2fd4390f..0000000000 --- a/packages/core/src/extensions/extension-discovery/is-compatible-extension/is-compatible-extension.injectable.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import extensionApiVersionInjectable from "../../../common/vars/extension-api-version.injectable"; -import { isCompatibleExtension } from "./is-compatible-extension"; - -const isCompatibleExtensionInjectable = getInjectable({ - id: "is-compatible-extension", - instantiate: (di) => isCompatibleExtension({ - extensionApiVersion: di.inject(extensionApiVersionInjectable), - }), -}); - -export default isCompatibleExtensionInjectable; diff --git a/packages/core/src/extensions/extension-discovery/is-compatible-extension/is-compatible-extension.ts b/packages/core/src/extensions/extension-discovery/is-compatible-extension/is-compatible-extension.ts deleted file mode 100644 index 9d121317a1..0000000000 --- a/packages/core/src/extensions/extension-discovery/is-compatible-extension/is-compatible-extension.ts +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { LensExtensionManifest } from "@k8slens/legacy-extensions"; -import semver from "semver"; - -interface Dependencies { - extensionApiVersion: string; -} - -export const isCompatibleExtension = ({ extensionApiVersion }: Dependencies): ((manifest: LensExtensionManifest) => boolean) => { - return (manifest: LensExtensionManifest): boolean => { - const manifestLensEngine = manifest.engines.lens; - const validVersion = manifestLensEngine.match(/^[\^0-9]\d*\.\d+\b/); // must start from ^ or number - - if (!validVersion) { - const errorInfo = [ - `Invalid format for "manifest.engines.lens"="${manifestLensEngine}"`, - `Range versions can only be specified starting with '^'.`, - `Otherwise it's recommended to use plain %MAJOR.%MINOR to match with supported Lens version.`, - ].join("\n"); - - throw new Error(errorInfo); - } - - const { major: extMajor, minor: extMinor } = semver.coerce(manifestLensEngine, { - loose: true, - }) as semver.SemVer; - const supportedVersionsByExtension = semver.validRange(`^${extMajor}.${extMinor}`) as string; - - return semver.satisfies(extensionApiVersion, supportedVersionsByExtension, { - loose: true, - includePrerelease: false, - }); - }; -}; diff --git a/packages/core/src/extensions/extension-discovery/stop-watching-extensions-on-quit.injectable.ts b/packages/core/src/extensions/extension-discovery/stop-watching-extensions-on-quit.injectable.ts deleted file mode 100644 index 9f6f7d97c1..0000000000 --- a/packages/core/src/extensions/extension-discovery/stop-watching-extensions-on-quit.injectable.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { onQuitOfBackEndInjectionToken } from "../../main/start-main-application/runnable-tokens/phases"; -import extensionDiscoveryInjectable from "./extension-discovery.injectable"; - -const stopWatchingExtensionsOnQuitInjectable = getInjectable({ - id: "stop-watching-extensions-on-quit", - - instantiate: (di) => ({ - run: async () => { - const extensionDiscovery = di.inject(extensionDiscoveryInjectable); - - await extensionDiscovery.stopWatchingExtensions(); - }, - }), - - injectionToken: onQuitOfBackEndInjectionToken, -}); - -export default stopWatchingExtensionsOnQuitInjectable; diff --git a/packages/core/src/extensions/extension-installation-state-store/extension-installation-state-store.injectable.ts b/packages/core/src/extensions/extension-installation-state-store/extension-installation-state-store.injectable.ts deleted file mode 100644 index 8e0a1ff36b..0000000000 --- a/packages/core/src/extensions/extension-installation-state-store/extension-installation-state-store.injectable.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { loggerInjectionToken } from "@k8slens/logger"; -import { ExtensionInstallationStateStore } from "./extension-installation-state-store"; - -const extensionInstallationStateStoreInjectable = getInjectable({ - id: "extension-installation-state-store", - instantiate: (di) => new ExtensionInstallationStateStore({ - logger: di.inject(loggerInjectionToken), - }), -}); - -export default extensionInstallationStateStoreInjectable; diff --git a/packages/core/src/extensions/extension-installation-state-store/extension-installation-state-store.ts b/packages/core/src/extensions/extension-installation-state-store/extension-installation-state-store.ts deleted file mode 100644 index fac13559ff..0000000000 --- a/packages/core/src/extensions/extension-installation-state-store/extension-installation-state-store.ts +++ /dev/null @@ -1,247 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { action, computed, observable } from "mobx"; -import { disposer } from "@k8slens/utilities"; -import type { ExtendableDisposer } from "@k8slens/utilities"; -import * as uuid from "uuid"; -import { broadcastMessage } from "../../common/ipc"; -import { ipcRenderer } from "electron"; -import type { Logger } from "@k8slens/logger"; - -export enum ExtensionInstallationState { - INSTALLING = "installing", - UNINSTALLING = "uninstalling", - IDLE = "idle", -} - -interface Dependencies { - readonly logger: Logger; -} - -const Prefix = "[ExtensionInstallationStore]"; - -const installingFromMainChannel = "extension-installation-state-store:install"; -const clearInstallingFromMainChannel = "extension-installation-state-store:clear-install"; - -export class ExtensionInstallationStateStore { - private readonly preInstallIds = observable.set(); - private readonly uninstallingExtensions = observable.set(); - private readonly installingExtensions = observable.set(); - - constructor(private readonly dependencies: Dependencies) {} - - bindIpcListeners = () => { - ipcRenderer - .on(installingFromMainChannel, (event, extId) => { - this.setInstalling(extId); - }) - - .on(clearInstallingFromMainChannel, (event, extId) => { - this.clearInstalling(extId); - }); - }; - - /** - * Strictly transitions an extension from not installing to installing - * @param extId the ID of the extension - * @throws if state is not IDLE - */ - @action setInstalling = (extId: string): void => { - this.dependencies.logger.debug(`${Prefix}: trying to set ${extId} as installing`); - - const curState = this.getInstallationState(extId); - - if (curState !== ExtensionInstallationState.IDLE) { - throw new Error( - `${Prefix}: cannot set ${extId} as installing. Is currently ${curState}.`, - ); - } - - this.installingExtensions.add(extId); - }; - - /** - * Broadcasts that an extension is being installed by the main process - * @param extId the ID of the extension - */ - setInstallingFromMain = (extId: string): void => { - broadcastMessage(installingFromMainChannel, extId); - }; - - /** - * Broadcasts that an extension is no longer being installed by the main process - * @param extId the ID of the extension - */ - clearInstallingFromMain = (extId: string): void => { - broadcastMessage(clearInstallingFromMainChannel, extId); - }; - - /** - * Marks the start of a pre-install phase of an extension installation. The - * part of the installation before the tarball has been unpacked and the ID - * determined. - * @returns a disposer which should be called to mark the end of the install phase - */ - @action startPreInstall = (): ExtendableDisposer => { - const preInstallStepId = uuid.v4(); - - this.dependencies.logger.debug( - `${Prefix}: starting a new preinstall phase: ${preInstallStepId}`, - ); - this.preInstallIds.add(preInstallStepId); - - return disposer(() => { - this.preInstallIds.delete(preInstallStepId); - this.dependencies.logger.debug(`${Prefix}: ending a preinstall phase: ${preInstallStepId}`); - }); - }; - - /** - * Strictly transitions an extension from not uninstalling to uninstalling - * @param extId the ID of the extension - * @throws if state is not IDLE - */ - @action setUninstalling = (extId: string): void => { - this.dependencies.logger.debug(`${Prefix}: trying to set ${extId} as uninstalling`); - - const curState = this.getInstallationState(extId); - - if (curState !== ExtensionInstallationState.IDLE) { - throw new Error( - `${Prefix}: cannot set ${extId} as uninstalling. Is currently ${curState}.`, - ); - } - - this.uninstallingExtensions.add(extId); - }; - - /** - * Strictly clears the INSTALLING state of an extension - * @param extId The ID of the extension - * @throws if state is not INSTALLING - */ - @action clearInstalling = (extId: string): void => { - this.dependencies.logger.debug(`${Prefix}: trying to clear ${extId} as installing`); - - const curState = this.getInstallationState(extId); - - switch (curState) { - case ExtensionInstallationState.INSTALLING: - return void this.installingExtensions.delete(extId); - default: - throw new Error( - `${Prefix}: cannot clear INSTALLING state for ${extId}, it is currently ${curState}`, - ); - } - }; - - /** - * Strictly clears the UNINSTALLING state of an extension - * @param extId The ID of the extension - * @throws if state is not UNINSTALLING - */ - @action clearUninstalling = (extId: string): void => { - this.dependencies.logger.debug(`${Prefix}: trying to clear ${extId} as uninstalling`); - - const curState = this.getInstallationState(extId); - - switch (curState) { - case ExtensionInstallationState.UNINSTALLING: - return void this.uninstallingExtensions.delete(extId); - default: - throw new Error( - `${Prefix}: cannot clear UNINSTALLING state for ${extId}, it is currently ${curState}`, - ); - } - }; - - /** - * Returns the current state of the extension. IDLE is default value. - * @param extId The ID of the extension - */ - getInstallationState = (extId: string): ExtensionInstallationState => { - if (this.installingExtensions.has(extId)) { - return ExtensionInstallationState.INSTALLING; - } - - if (this.uninstallingExtensions.has(extId)) { - return ExtensionInstallationState.UNINSTALLING; - } - - return ExtensionInstallationState.IDLE; - }; - - /** - * Returns true if the extension is currently INSTALLING - * @param extId The ID of the extension - */ - isExtensionInstalling = (extId: string): boolean => - this.getInstallationState(extId) === ExtensionInstallationState.INSTALLING; - - /** - * Returns true if the extension is currently UNINSTALLING - * @param extId The ID of the extension - */ - isExtensionUninstalling = (extId: string): boolean => - this.getInstallationState(extId) === - ExtensionInstallationState.UNINSTALLING; - - /** - * Returns true if the extension is currently IDLE - * @param extId The ID of the extension - */ - isExtensionIdle = (extId: string): boolean => - this.getInstallationState(extId) === ExtensionInstallationState.IDLE; - - /** - * The current number of extensions installing - */ - @computed get installing(): number { - return this.installingExtensions.size; - } - - /** - * The current number of extensions uninstalling - */ - get uninstalling(): number { - return this.uninstallingExtensions.size; - } - - /** - * If there is at least one extension currently installing - */ - get anyInstalling(): boolean { - return this.installing > 0; - } - - /** - * If there is at least one extension currently uninstalling - */ - get anyUninstalling(): boolean { - return this.uninstalling > 0; - } - - /** - * The current number of extensions preinstalling - */ - get preinstalling(): number { - return this.preInstallIds.size; - } - - /** - * If there is at least one extension currently downloading - */ - get anyPreinstalling(): boolean { - return this.preinstalling > 0; - } - - /** - * If there is at least one installing or preinstalling step taking place - */ - get anyPreInstallingOrInstalling(): boolean { - return this.anyInstalling || this.anyPreinstalling; - } -} diff --git a/packages/core/src/extensions/extension-loader/entry-point-name.ts b/packages/core/src/extensions/extension-loader/entry-point-name.ts deleted file mode 100644 index 390da4a34a..0000000000 --- a/packages/core/src/extensions/extension-loader/entry-point-name.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getInjectionToken } from "@ogre-tools/injectable"; - -export const extensionEntryPointNameInjectionToken = getInjectionToken<"main" | "renderer">({ - id: "extension-entry-point-name-token", -}); diff --git a/packages/core/src/extensions/extension-loader/extension-instances.injectable.ts b/packages/core/src/extensions/extension-loader/extension-instances.injectable.ts deleted file mode 100644 index 74fb85657d..0000000000 --- a/packages/core/src/extensions/extension-loader/extension-instances.injectable.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { LegacyLensExtension, LensExtensionId } from "@k8slens/legacy-extensions"; -import { getInjectable } from "@ogre-tools/injectable"; -import { observable } from "mobx"; - -const extensionInstancesInjectable = getInjectable({ - id: "extension-instances", - instantiate: () => observable.map(), -}); - -export default extensionInstancesInjectable; diff --git a/packages/core/src/extensions/extension-loader/extension-is-enabled-for-cluster.injectable.ts b/packages/core/src/extensions/extension-loader/extension-is-enabled-for-cluster.injectable.ts deleted file mode 100644 index 23e1c87561..0000000000 --- a/packages/core/src/extensions/extension-loader/extension-is-enabled-for-cluster.injectable.ts +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; -import type { KubernetesCluster } from "../../common/catalog-entities"; -import type { LensRendererExtension } from "../lens-renderer-extension"; - -interface ExtensionIsEnabledForCluster { - extension: LensRendererExtension; - cluster: KubernetesCluster; -} - -const extensionIsEnabledForClusterInjectable = getInjectable({ - id: "extension-is-enabled-for-cluster", - - instantiate: async ( - di, - { extension, cluster }: ExtensionIsEnabledForCluster, - ) => (await extension.isEnabledForCluster(cluster)) as boolean, - - lifecycle: lifecycleEnum.keyedSingleton({ - getInstanceKey: ( - di, - { extension, cluster }: ExtensionIsEnabledForCluster, - ) => `${extension.sanitizedExtensionId}-${cluster.getId()}`, - }), -}); - -export default extensionIsEnabledForClusterInjectable; diff --git a/packages/core/src/extensions/extension-loader/extension-loader.injectable.ts b/packages/core/src/extensions/extension-loader/extension-loader.injectable.ts deleted file mode 100644 index 087e604476..0000000000 --- a/packages/core/src/extensions/extension-loader/extension-loader.injectable.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { ExtensionLoader } from "./extension-loader"; -import extensionInstancesInjectable from "./extension-instances.injectable"; -import extensionInjectable from "./extension/extension.injectable"; -import { loggerInjectionToken } from "@k8slens/logger"; -import joinPathsInjectable from "../../common/path/join-paths.injectable"; -import getDirnameOfPathInjectable from "../../common/path/get-dirname.injectable"; -import { bundledExtensionInjectionToken } from "@k8slens/legacy-extensions"; -import { extensionEntryPointNameInjectionToken } from "./entry-point-name"; -import updateExtensionsStateInjectable from "../../features/extensions/enabled/common/update-state.injectable"; - -const extensionLoaderInjectable = getInjectable({ - id: "extension-loader", - - instantiate: (di) => new ExtensionLoader({ - updateExtensionsState: di.inject(updateExtensionsStateInjectable), - extensionInstances: di.inject(extensionInstancesInjectable), - getExtension: (instance) => di.inject(extensionInjectable, instance), - bundledExtensions: di.injectMany(bundledExtensionInjectionToken), - extensionEntryPointName: di.inject(extensionEntryPointNameInjectionToken), - logger: di.inject(loggerInjectionToken), - joinPaths: di.inject(joinPathsInjectable), - getDirnameOfPath: di.inject(getDirnameOfPathInjectable), - }), -}); - -export default extensionLoaderInjectable; diff --git a/packages/core/src/extensions/extension-loader/extension-loader.ts b/packages/core/src/extensions/extension-loader/extension-loader.ts deleted file mode 100644 index 591f70c25f..0000000000 --- a/packages/core/src/extensions/extension-loader/extension-loader.ts +++ /dev/null @@ -1,392 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { ipcMain, ipcRenderer } from "electron"; -import { isEqual } from "lodash"; -import type { ObservableMap } from "mobx"; -import { runInAction, action, computed, toJS, observable, reaction, when } from "mobx"; -import { broadcastMessage, ipcMainOn, ipcRendererOn, ipcMainHandle } from "../../common/ipc"; -import { isDefined, iter } from "@k8slens/utilities"; -import type { ExternalInstalledExtension, InstalledExtension, LensExtensionConstructor, LensExtensionId, BundledExtension, BundledInstalledExtension, LegacyLensExtension } from "@k8slens/legacy-extensions"; -import type { LensExtension } from "../lens-extension"; -import { extensionLoaderFromMainChannel, extensionLoaderFromRendererChannel } from "../../common/ipc/extension-handling"; -import { requestExtensionLoaderInitialState } from "../../renderer/ipc"; -import assert from "assert"; -import { EventEmitter } from "@k8slens/event-emitter"; -import type { Extension } from "./extension/extension.injectable"; -import type { Logger } from "@k8slens/logger"; -import type { JoinPaths } from "../../common/path/join-paths.injectable"; -import type { GetDirnameOfPath } from "../../common/path/get-dirname.injectable"; -import type { UpdateExtensionsState } from "../../features/extensions/enabled/common/update-state.injectable"; - -const logModule = "[EXTENSIONS-LOADER]"; - -interface Dependencies { - readonly extensionInstances: ObservableMap; - readonly bundledExtensions: BundledExtension[]; - readonly logger: Logger; - readonly extensionEntryPointName: "main" | "renderer"; - updateExtensionsState: UpdateExtensionsState; - getExtension: (instance: LegacyLensExtension) => Extension; - joinPaths: JoinPaths; - getDirnameOfPath: GetDirnameOfPath; -} - -interface ExtensionBeingActivated { - instance: LensExtension; - installedExtension: InstalledExtension; - activated: Promise; -} - -export interface ExtensionLoading { - isBundled: boolean; - loaded: Promise; -} - -/** - * Loads installed extensions to the Lens application - */ -export class ExtensionLoader { - protected readonly extensions = observable.map(); - - /** - * This is the set of extensions that don't come with either - * - Main.LensExtension when running in the main process - * - Renderer.LensExtension when running in the renderer process - */ - protected readonly nonInstancesByName = observable.set(); - - protected readonly instancesByName = computed(() => new Map(( - iter.chain(this.dependencies.extensionInstances.entries()) - .map(([, instance]) => [instance.name, instance]) - ))); - - private readonly onRemoveExtensionId = new EventEmitter<[string]>(); - - readonly isLoaded = observable.box(false); - - constructor(protected readonly dependencies: Dependencies) {} - - readonly userExtensions = computed(() => new Map(( - this.extensions.toJSON() - .filter(([, extension]) => !extension.isBundled) - ))); - - /** - * Get the extension instance by its manifest name - * @param name The name of the extension - * @returns one of the following: - * - the instance of `Main.LensExtension` on the main process if created - * - the instance of `Renderer.LensExtension` on the renderer process if created - * - `null` if no class definition is provided for the current process - * - `undefined` if the name is not known about - */ - getInstanceByName(name: string): LegacyLensExtension | null | undefined { - if (this.nonInstancesByName.has(name)) { - return null; - } - - return this.instancesByName.get().get(name); - } - - // Transform userExtensions to a state object for storing into ExtensionsStore - readonly storeState = computed(() => Array.from( - this.userExtensions.get(), - ([extId, extension]) => [extId, { - enabled: extension.isEnabled, - name: extension.manifest.name, - }] as const, - )); - - async init() { - if (ipcMain) { - await this.initMain(); - } else { - await this.initRenderer(); - } - - await when(() => this.isLoaded.get()); - - // broadcasting extensions between main/renderer processes - reaction(() => this.toJSON(), () => this.broadcastExtensions(), { - fireImmediately: true, - }); - - reaction( - () => this.storeState.get(), - (state) => { - this.dependencies.updateExtensionsState(state); - }, - ); - } - - initExtensions(extensions: Map) { - this.extensions.replace(extensions); - } - - addExtension(extension: InstalledExtension) { - this.extensions.set(extension.id, extension); - } - - @action - removeInstance(lensExtensionId: LensExtensionId) { - this.dependencies.logger.info(`${logModule} deleting extension instance ${lensExtensionId}`); - const instance = this.dependencies.extensionInstances.get(lensExtensionId); - - if (!instance) { - return; - } - - try { - instance.disable(); - - const extension = this.dependencies.getExtension(instance); - - extension.deregister(); - - this.onRemoveExtensionId.emit(instance.id); - this.dependencies.extensionInstances.delete(lensExtensionId); - this.nonInstancesByName.delete(instance.name); - } catch (error) { - this.dependencies.logger.error(`${logModule}: deactivation extension error`, { lensExtensionId, error }); - } - } - - removeExtension(lensExtensionId: LensExtensionId) { - this.removeInstance(lensExtensionId); - - if (!this.extensions.delete(lensExtensionId)) { - throw new Error(`Can't remove extension ${lensExtensionId}, doesn't exist.`); - } - } - - setIsEnabled(lensExtensionId: LensExtensionId, isEnabled: boolean) { - const extension = this.extensions.get(lensExtensionId); - - assert(extension, `Extension "${lensExtensionId}" must be registered before it can be enabled.`); - assert(!extension.isBundled, `Cannot change the enabled state of a bundled extension`); - - extension.isEnabled = isEnabled; - } - - protected async initMain() { - runInAction(() => { - this.isLoaded.set(true); - }); - - await this.autoInitExtensions(); - - ipcMainHandle(extensionLoaderFromMainChannel, () => [...this.toJSON()]); - - ipcMainOn(extensionLoaderFromRendererChannel, (event, extensions: [LensExtensionId, InstalledExtension][]) => { - this.syncExtensions(extensions); - }); - } - - protected async initRenderer() { - const extensionListHandler = (extensions: [LensExtensionId, InstalledExtension][]) => { - runInAction(() => { - this.isLoaded.set(true); - }); - this.syncExtensions(extensions); - - const receivedExtensionIds = extensions.map(([lensExtensionId]) => lensExtensionId); - - // Remove deleted extensions in renderer side only - this.extensions.forEach((_, lensExtensionId) => { - if (!receivedExtensionIds.includes(lensExtensionId)) { - this.removeExtension(lensExtensionId); - } - }); - }; - - requestExtensionLoaderInitialState().then(extensionListHandler); - ipcRendererOn(extensionLoaderFromMainChannel, (event, extensions: [LensExtensionId, InstalledExtension][]) => { - extensionListHandler(extensions); - }); - } - - broadcastExtensions() { - const channel = ipcRenderer - ? extensionLoaderFromRendererChannel - : extensionLoaderFromMainChannel; - - broadcastMessage(channel, Array.from(this.extensions)); - } - - syncExtensions(extensions: [LensExtensionId, InstalledExtension][]) { - extensions.forEach(([lensExtensionId, extension]) => { - if (!isEqual(this.extensions.get(lensExtensionId), extension)) { - this.extensions.set(lensExtensionId, extension); - } - }); - } - - protected async loadBundledExtensions() { - const bundledExtensions = await Promise.all((this.dependencies.bundledExtensions - .map(async extension => { - try { - const LensExtensionClass = await extension[this.dependencies.extensionEntryPointName](); - - if (!LensExtensionClass) { - return null; - } - - const installedExtension: BundledInstalledExtension = { - absolutePath: "irrelevant", - id: extension.manifest.name, - isBundled: true, - isCompatible: true, - isEnabled: true, - manifest: extension.manifest, - manifestPath: "irrelevant", - }; - const instance = new LensExtensionClass(installedExtension); - - this.dependencies.extensionInstances.set(extension.manifest.name, instance); - - return { - instance, - installedExtension, - activated: instance.activate(), - } as ExtensionBeingActivated; - } catch (err) { - this.dependencies.logger.error(`${logModule}: error loading extension`, { ext: extension, err }); - - return null; - } - }) - )); - - return bundledExtensions.filter(isDefined); - } - - protected async loadExtensions(extensions: ExtensionBeingActivated[]): Promise { - // We first need to wait until each extension's `onActivate` is resolved or rejected, - // as this might register new catalog categories. Afterwards we can safely .enable the extension. - await Promise.all( - extensions.map(extension => - // If extension activation fails, log error - extension.activated.catch((error) => { - this.dependencies.logger.error(`${logModule}: activation extension error`, { ext: extension.installedExtension, error }); - }), - ), - ); - - extensions.forEach(({ instance }) => { - const extension = this.dependencies.getExtension(instance); - - extension.register(); - }); - - return extensions.map(extension => { - const loaded = extension.instance.enable().catch((err) => { - this.dependencies.logger.error(`${logModule}: failed to enable`, { ext: extension, err }); - }); - - return { - isBundled: extension.installedExtension.isBundled, - loaded, - }; - }); - } - - protected async loadUserExtensions(installedExtensions: Map) { - // Steps of the function: - // 1. require and call .activate for each Extension - // 2. Wait until every extension's onActivate has been resolved - // 3. Call .enable for each extension - // 4. Return ExtensionLoading[] - - return [...installedExtensions.entries()] - .filter((entry): entry is [string, ExternalInstalledExtension] => !entry[1].isBundled) - .map(([extId, installedExtension]) => { - const alreadyInit = this.dependencies.extensionInstances.has(extId) || this.nonInstancesByName.has(installedExtension.manifest.name); - - if (installedExtension.isCompatible && installedExtension.isEnabled && !alreadyInit) { - try { - const LensExtensionClass = this.requireExtension(installedExtension); - - if (!LensExtensionClass) { - this.nonInstancesByName.add(installedExtension.manifest.name); - - return null; - } - - const instance = new LensExtensionClass(installedExtension); - - this.dependencies.extensionInstances.set(extId, instance); - - return { - instance, - installedExtension, - activated: instance.activate(), - } as ExtensionBeingActivated; - } catch (err) { - this.dependencies.logger.error(`${logModule}: error loading extension`, { ext: installedExtension, err }); - } - } else if (!installedExtension.isEnabled && alreadyInit) { - this.removeInstance(extId); - } - - return null; - }) - .filter(isDefined); - } - - async autoInitExtensions() { - this.dependencies.logger.info(`${logModule}: auto initializing extensions`); - - const bundledExtensions = await this.loadBundledExtensions(); - const userExtensions = await this.loadUserExtensions(this.toJSON()); - const loadedExtensions = await this.loadExtensions([ - ...bundledExtensions, - ...userExtensions, - ]); - - // Setup reaction to load extensions on JSON changes - reaction(() => this.toJSON(), installedExtensions => { - void (async () => { - const userExtensions = await this.loadUserExtensions(installedExtensions); - - await this.loadExtensions(userExtensions); - })(); - }); - - return loadedExtensions; - } - - protected requireExtension(extension: ExternalInstalledExtension): LensExtensionConstructor | null { - const extRelativePath = extension.manifest[this.dependencies.extensionEntryPointName]; - - if (!extRelativePath) { - return null; - } - - const extAbsolutePath = this.dependencies.joinPaths(this.dependencies.getDirnameOfPath(extension.manifestPath), extRelativePath); - - try { - return require(/* webpackIgnore: true */ extAbsolutePath).default; - } catch (error) { - const message = (error instanceof Error ? error.stack : undefined) || error; - - this.dependencies.logger.error(`${logModule}: can't load ${this.dependencies.extensionEntryPointName} for "${extension.manifest.name}": ${message}`, { extension }); - } - - return null; - } - - getExtensionById(extId: LensExtensionId) { - return this.extensions.get(extId); - } - - getInstanceById(extId: LensExtensionId) { - return this.dependencies.extensionInstances.get(extId); - } - - toJSON(): Map { - return toJS(this.extensions); - } -} diff --git a/packages/core/src/extensions/extension-loader/extension-registrator-injection-token.ts b/packages/core/src/extensions/extension-loader/extension-registrator-injection-token.ts deleted file mode 100644 index 7d507debb6..0000000000 --- a/packages/core/src/extensions/extension-loader/extension-registrator-injection-token.ts +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { LegacyLensExtension } from "@k8slens/legacy-extensions"; -import type { Injectable } from "@ogre-tools/injectable"; -import { getInjectionToken } from "@ogre-tools/injectable"; -import type { IComputedValue } from "mobx"; - -export type Injectables = Injectable[]; -export type Registration = Injectables | IComputedValue; -export type ExtensionRegistrator = (extension: LegacyLensExtension) => Registration; - -export const extensionRegistratorInjectionToken = getInjectionToken({ - id: "extension-registrator-token", -}); diff --git a/packages/core/src/extensions/extension-loader/extension/extension.injectable.ts b/packages/core/src/extensions/extension-loader/extension/extension.injectable.ts deleted file mode 100644 index 16b69fa6bd..0000000000 --- a/packages/core/src/extensions/extension-loader/extension/extension.injectable.ts +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; -import { reaction, runInAction } from "mobx"; -import { disposer } from "@k8slens/utilities"; -import { extensionRegistratorInjectionToken } from "../extension-registrator-injection-token"; -import { injectableDifferencingRegistratorWith } from "../../../common/utils/registrator-helper"; -import type { LegacyLensExtension } from "@k8slens/legacy-extensions"; - -export interface Extension { - register: () => void; - deregister: () => void; -} - -const extensionInjectable = getInjectable({ - id: "extension", - - instantiate: (parentDi, instance): Extension => { - const extensionInjectable = getInjectable({ - id: `extension-${instance.sanitizedExtensionId}`, - - instantiate: (childDi) => { - const extensionRegistrators = childDi.injectMany(extensionRegistratorInjectionToken); - const reactionDisposer = disposer(); - const injectableDifferencingRegistrator = injectableDifferencingRegistratorWith(childDi); - - return { - register: () => { - for (const extensionRegistrator of extensionRegistrators) { - const injectables = extensionRegistrator(instance); - - if (Array.isArray(injectables)) { - runInAction(() => { - injectableDifferencingRegistrator(injectables); - }); - } else { - reactionDisposer.push(reaction( - () => injectables.get(), - injectableDifferencingRegistrator, - { - fireImmediately: true, - }, - )); - } - } - }, - - deregister: () => { - reactionDisposer(); - - runInAction(() => { - parentDi.deregister(extensionInjectable); - }); - }, - }; - }, - }); - - runInAction(() => { - parentDi.register(extensionInjectable); - }); - - return parentDi.inject(extensionInjectable); - }, - - lifecycle: lifecycleEnum.keyedSingleton({ - getInstanceKey: (di, instance: LegacyLensExtension) => instance, - }), -}); - -export default extensionInjectable; diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/directory-for-extension-data.injectable.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/directory-for-extension-data.injectable.ts deleted file mode 100644 index 469ed85949..0000000000 --- a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/directory-for-extension-data.injectable.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import directoryForUserDataInjectable from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; -import joinPathsInjectable from "../../../common/path/join-paths.injectable"; - -const directoryForExtensionDataInjectable = getInjectable({ - id: "directory-for-extension-data", - - instantiate: (di) => { - const joinPaths = di.inject(joinPathsInjectable); - const directoryForUserData = di.inject(directoryForUserDataInjectable); - - return joinPaths(directoryForUserData, "extension_data"); - }, -}); - -export default directoryForExtensionDataInjectable; diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.injectable.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.injectable.ts deleted file mode 100644 index 90bad89625..0000000000 --- a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.injectable.ts +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getInjectable } from "@ogre-tools/injectable"; - -import { getOrInsert } from "@k8slens/utilities"; -import randomBytesInjectable from "../../../common/utils/random-bytes.injectable"; -import joinPathsInjectable from "../../../common/path/join-paths.injectable"; -import directoryForExtensionDataInjectable from "./directory-for-extension-data.injectable"; -import ensureDirInjectable from "../../../common/fs/ensure-dir.injectable"; -import getHashInjectable from "./get-hash.injectable"; -import getPathToLegacyPackageJsonInjectable from "./get-path-to-legacy-package-json.injectable"; -import { registeredExtensionsInjectable } from "./registered-extensions.injectable"; - -export type EnsureHashedDirectoryForExtension = (extensionName: string) => Promise; - -const ensureHashedDirectoryForExtensionInjectable = getInjectable({ - id: "ensure-hashed-directory-for-extension", - - instantiate: (di): EnsureHashedDirectoryForExtension => { - const randomBytes = di.inject(randomBytesInjectable); - const joinPaths = di.inject(joinPathsInjectable); - const directoryForExtensionData = di.inject(directoryForExtensionDataInjectable); - const ensureDirectory = di.inject(ensureDirInjectable); - const getHash = di.inject(getHashInjectable); - const getPathToLegacyPackageJson = di.inject(getPathToLegacyPackageJsonInjectable); - const registeredExtensions = di.inject(registeredExtensionsInjectable); - - return async (extensionName) => { - let dirPath: string; - - const legacyDirPath = getPathToLegacyPackageJson(extensionName); - const hashedDirectoryForLegacyDirPath = registeredExtensions.get(legacyDirPath); - - if (hashedDirectoryForLegacyDirPath) { - registeredExtensions.set(extensionName, hashedDirectoryForLegacyDirPath); - registeredExtensions.delete(legacyDirPath); - dirPath = hashedDirectoryForLegacyDirPath; - } else { - const salt = randomBytes(32).toString("hex"); - const hashedName = getHash(`${extensionName}/${salt}`); - - const hashedExtensionDirectory = joinPaths(directoryForExtensionData, hashedName); - - dirPath = getOrInsert(registeredExtensions, extensionName, hashedExtensionDirectory); - } - - await ensureDirectory(dirPath); - - return dirPath; - }; - }, -}); - -export default ensureHashedDirectoryForExtensionInjectable; diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.test.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.test.ts deleted file mode 100644 index 2ba20bab8c..0000000000 --- a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.test.ts +++ /dev/null @@ -1,96 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { ObservableMap } from "mobx"; -import { runInAction } from "mobx"; -import { getDiForUnitTesting } from "../../../main/getDiForUnitTesting"; -import type { EnsureHashedDirectoryForExtension } from "./ensure-hashed-directory-for-extension.injectable"; -import ensureHashedDirectoryForExtensionInjectable from "./ensure-hashed-directory-for-extension.injectable"; -import ensureDirInjectable from "../../../common/fs/ensure-dir.injectable"; -import directoryForExtensionDataInjectable from "./directory-for-extension-data.injectable"; -import directoryForUserDataInjectable from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; -import { registeredExtensionsInjectable } from "./registered-extensions.injectable"; - -describe("ensure-hashed-directory-for-extension", () => { - let ensureHashedDirectoryForExtension: EnsureHashedDirectoryForExtension; - let ensureDirMock: jest.Mock; - let registeredExtensions: ObservableMap; - - beforeEach(() => { - const di = getDiForUnitTesting(); - - ensureDirMock = jest.fn(); - - di.override(ensureDirInjectable, () => ensureDirMock); - di.override(directoryForExtensionDataInjectable, () => "some-directory-for-extension-data"); - di.override(directoryForUserDataInjectable, () => "/some-directory-for-user-data"); - - ensureHashedDirectoryForExtension = di.inject( - ensureHashedDirectoryForExtensionInjectable, - ); - - registeredExtensions = di.inject(registeredExtensionsInjectable); - }); - - it("given registered extension exists, returns existing directory", async () => { - runInAction(() => { - registeredExtensions.set("some-extension-name", "some-directory"); - }); - - const actual = await ensureHashedDirectoryForExtension( - "some-extension-name", - ); - - expect(actual).toBe("some-directory"); - }); - - it("given registered extension does not exist, returns random directory", async () => { - const actual = await ensureHashedDirectoryForExtension( - "some-extension-name", - ); - - expect(actual).toBe("some-directory-for-extension-data/a37a1cfefc0391af3733f23cb6b29443f596a2b8ffe6d116c35df7bc3cd99ef6"); - }); - - describe("given extension directory was saved based on extension's package.json path", () => { - beforeEach(() => { - runInAction(() => { - registeredExtensions.set("/some-directory-for-user-data/node_modules/some-extension-name/package.json", "some-directory"); - }); - ensureDirMock.mockClear(); - }); - - it("returns existing directory", async () => { - const actual = await ensureHashedDirectoryForExtension( - "some-extension-name", - ); - - expect(actual).toBe("some-directory"); - }); - - it("ensure dir is called with some directory", async () => { - await ensureHashedDirectoryForExtension( - "some-extension-name", - ); - - expect(ensureDirMock).toHaveBeenCalledWith("some-directory"); - }); - - it("is migrated to use the extension name as key", async () => { - await ensureHashedDirectoryForExtension( - "some-extension-name", - ); - - expect(registeredExtensions.get("some-extension-name")).toEqual("some-directory"); - }); - - it("old key is removed", async () => { - await ensureHashedDirectoryForExtension( - "some-extension-name", - ); - - expect(registeredExtensions.has("/some-directory-for-user-data/node_modules/some-extension-name/package.json")).toEqual(false); - }); - }); -}); diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store-injection-token.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store-injection-token.ts deleted file mode 100644 index de4e8c242b..0000000000 --- a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store-injection-token.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectionToken } from "@ogre-tools/injectable"; -import type { MigrationDeclaration } from "../../../features/persistent-storage/common/migrations.injectable"; - -export const fileSystemProvisionerStoreMigrationDeclarationInjectionToken = getInjectionToken({ - id: "file-system-provisioner-store-migration-declaration", -}); diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts deleted file mode 100644 index 2f08efa17e..0000000000 --- a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/file-system-provisioner-store.injectable.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { registeredExtensionsInjectable } from "./registered-extensions.injectable"; -import createPersistentStorageInjectable from "../../../features/persistent-storage/common/create.injectable"; -import { action } from "mobx"; -import { object } from "@k8slens/utilities"; -import storeMigrationVersionInjectable from "../../../common/vars/store-migration-version.injectable"; - -const fileSystemProvisionerStoreInjectable = getInjectable({ - id: "file-system-provisioner-store", - - instantiate: (di) => { - const registeredExtensions = di.inject(registeredExtensionsInjectable); - const createPersistentStorage = di.inject(createPersistentStorageInjectable); - const storeMigrationVersion = di.inject(storeMigrationVersionInjectable); - - const store = createPersistentStorage({ - configName: "lens-filesystem-provisioner-store", - accessPropertiesByDotNotation: false, // To make dots safe in cluster context names - projectVersion: storeMigrationVersion, - fromStore: action(({ extensions = {}}) => { - registeredExtensions.replace(object.entries(extensions)); - }), - toJSON: () => ({ - extensions: Object.fromEntries(registeredExtensions), - }), - }); - - return { - load: () => store.loadAndStartSyncing(), - }; - }, -}); - -export default fileSystemProvisionerStoreInjectable; diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/get-hash.injectable.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/get-hash.injectable.ts deleted file mode 100644 index 5d7faa5884..0000000000 --- a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/get-hash.injectable.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getInjectable } from "@ogre-tools/injectable"; -import { SHA256 } from "crypto-js"; - -const getHashInjectable = getInjectable({ - id: "get-hash", - - instantiate: () => (text: string) => SHA256(text).toString(), -}); - -export default getHashInjectable; diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/get-path-to-legacy-package-json.injectable.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/get-path-to-legacy-package-json.injectable.ts deleted file mode 100644 index 668d010afa..0000000000 --- a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/get-path-to-legacy-package-json.injectable.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import directoryForUserDataInjectable from "../../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; -import joinPathsInjectable from "../../../common/path/join-paths.injectable"; - -export type GetPathToLegacyPackageJson = (extensionName: string) => string; - -const getPathToLegacyPackageJson = getInjectable({ - id: "get-path-to-legacy-package-json", - - instantiate: (di): GetPathToLegacyPackageJson => { - const directoryForUserData = di.inject(directoryForUserDataInjectable); - const joinPaths = di.inject(joinPathsInjectable); - - return (extensionName: string) => joinPaths(directoryForUserData, "node_modules", extensionName, "package.json"); - }, -}); - -export default getPathToLegacyPackageJson; diff --git a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/registered-extensions.injectable.ts b/packages/core/src/extensions/extension-loader/file-system-provisioner-store/registered-extensions.injectable.ts deleted file mode 100644 index b10dc51ecd..0000000000 --- a/packages/core/src/extensions/extension-loader/file-system-provisioner-store/registered-extensions.injectable.ts +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { LensExtensionId } from "@k8slens/legacy-extensions"; -import { getInjectable } from "@ogre-tools/injectable"; -import { observable } from "mobx"; - -export const registeredExtensionsInjectable = getInjectable({ - id: "registered-extensions", - instantiate: () => observable.map(), -}); diff --git a/packages/core/src/extensions/extension-loader/index.ts b/packages/core/src/extensions/extension-loader/index.ts deleted file mode 100644 index a1dab46d3b..0000000000 --- a/packages/core/src/extensions/extension-loader/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export * from "./extension-loader"; diff --git a/packages/core/src/extensions/extension-packages-root/extension-packages-root.injectable.ts b/packages/core/src/extensions/extension-packages-root/extension-packages-root.injectable.ts deleted file mode 100644 index 81e91c5e27..0000000000 --- a/packages/core/src/extensions/extension-packages-root/extension-packages-root.injectable.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import directoryForUserDataInjectable - from "../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; - -const extensionPackagesRootInjectable = getInjectable({ - id: "extension-packages-root", - instantiate: (di) => di.inject(directoryForUserDataInjectable), -}); - -export default extensionPackagesRootInjectable; diff --git a/packages/core/src/extensions/extensions.injectable.ts b/packages/core/src/extensions/extensions.injectable.ts deleted file mode 100644 index 3e0f0ad898..0000000000 --- a/packages/core/src/extensions/extensions.injectable.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { iter } from "@k8slens/utilities"; -import { getInjectable } from "@ogre-tools/injectable"; -import { computed } from "mobx"; -import isExtensionEnabledInjectable from "../features/extensions/enabled/common/is-enabled.injectable"; -import extensionInstancesInjectable from "./extension-loader/extension-instances.injectable"; - -const extensionsInjectable = getInjectable({ - id: "extensions", - instantiate: (di) => { - const extensionInstances = di.inject(extensionInstancesInjectable); - const isExtensionEnabled = di.inject(isExtensionEnabledInjectable); - - return computed(() => ( - iter.chain(extensionInstances.values()) - .filter(extension => extension.isBundled || isExtensionEnabled(extension.id)) - .toArray() - )); - }, -}); - -export default extensionsInjectable; diff --git a/packages/core/src/extensions/install-extension/extension-package-root-directory.injectable.ts b/packages/core/src/extensions/install-extension/extension-package-root-directory.injectable.ts deleted file mode 100644 index ffa0a7666d..0000000000 --- a/packages/core/src/extensions/install-extension/extension-package-root-directory.injectable.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import directoryForUserDataInjectable from "../../common/app-paths/directory-for-user-data/directory-for-user-data.injectable"; - -const extensionPackageRootDirectoryInjectable = getInjectable({ - id: "extension-package-root-directory", - - instantiate: (di) => di.inject(directoryForUserDataInjectable), -}); - -export default extensionPackageRootDirectoryInjectable; diff --git a/packages/core/src/extensions/install-extension/install-extension.injectable.ts b/packages/core/src/extensions/install-extension/install-extension.injectable.ts deleted file mode 100644 index 43d4afb50e..0000000000 --- a/packages/core/src/extensions/install-extension/install-extension.injectable.ts +++ /dev/null @@ -1,111 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import { fork } from "child_process"; -import AwaitLock from "await-lock"; -import pathToNpmCliInjectable from "../../common/app-paths/path-to-npm-cli.injectable"; -import extensionPackageRootDirectoryInjectable from "./extension-package-root-directory.injectable"; -import { prefixedLoggerInjectable } from "@k8slens/logger"; -import readJsonFileInjectable from "../../common/fs/read-json-file.injectable"; -import joinPathsInjectable from "../../common/path/join-paths.injectable"; -import type { PackageJson } from "../common-api"; -import writeJsonFileInjectable from "../../common/fs/write-json-file.injectable"; -import { once } from "lodash"; -import { isErrnoException } from "@k8slens/utilities"; - -const baseNpmInstallArgs = [ - "install", - "--save-optional", - "--audit=false", - "--fund=false", - // NOTE: we do not omit the `optional` dependencies because that is how we specify the non-bundled extensions - "--omit=dev", - "--omit=peer", - "--prefer-offline", -]; - -export type InstallExtension = (name: string) => Promise; - -const installExtensionInjectable = getInjectable({ - id: "install-extension", - instantiate: (di): InstallExtension => { - const pathToNpmCli = di.inject(pathToNpmCliInjectable); - const extensionPackageRootDirectory = di.inject(extensionPackageRootDirectoryInjectable); - const readJsonFile = di.inject(readJsonFileInjectable); - const writeJsonFile = di.inject(writeJsonFileInjectable); - const joinPaths = di.inject(joinPathsInjectable); - const logger = di.inject(prefixedLoggerInjectable, "EXTENSION-INSTALLER"); - - const forkNpm = (...args: string[]) => new Promise((resolve, reject) => { - const child = fork(pathToNpmCli, args, { - cwd: extensionPackageRootDirectory, - silent: true, - env: {}, - }); - let stderr = ""; - - child.stderr?.on("data", data => { - stderr += String(data); - }); - - child.on("close", (code) => { - if (code !== 0) { - reject(new Error(stderr)); - } else { - resolve(); - } - }); - - child.on("error", error => { - reject(error); - }); - }); - - const packageJsonPath = joinPaths(extensionPackageRootDirectory, "package.json"); - - /** - * NOTES: - * - We have to keep the `package.json` because `npm install` removes files from `node_modules` - * if they are no longer in the `package.json` - * - In v6.2.X we saved bundled extensions as `"dependencies"` and external extensions as - * `"optionalDependencies"` at startup. This was done because `"optionalDependencies"` can - * fail to install and that is OK. - * - We continue to maintain this behavior here by only installing new dependencies as - * `"optionalDependencies"` - */ - const fixupPackageJson = once(async () => { - try { - const packageJson = await readJsonFile(packageJsonPath) as PackageJson; - - delete packageJson.dependencies; - - await writeJsonFile(packageJsonPath, packageJson); - } catch (error) { - if (isErrnoException(error) && error.code === "ENOENT") { - return; - } - - throw error; - } - }); - - const installLock = new AwaitLock(); - - return async (name) => { - await installLock.acquireAsync(); - await fixupPackageJson(); - - try { - logger.info(`installing package for extension "${name}"`); - await forkNpm(...baseNpmInstallArgs, name); - logger.info(`installed package for extension "${name}"`); - } finally { - installLock.release(); - } - }; - }, -}); - -export default installExtensionInjectable; diff --git a/packages/core/src/extensions/ipc/ipc-main.ts b/packages/core/src/extensions/ipc/ipc-main.ts deleted file mode 100644 index 42282af464..0000000000 --- a/packages/core/src/extensions/ipc/ipc-main.ts +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { ipcMain } from "electron"; -import { IpcPrefix, IpcRegistrar } from "./ipc-registrar"; -import { Disposers } from "../lens-extension"; -import type { LensMainExtension } from "../lens-main-extension"; -import type { Disposer } from "@k8slens/utilities"; -import { once } from "lodash"; -import { ipcMainHandle } from "../../common/ipc"; -import type { Logger } from "@k8slens/logger"; -import { getEnvironmentSpecificLegacyGlobalDiForExtensionApi } from "@k8slens/legacy-global-di"; -import { loggerInjectionToken } from "@k8slens/logger"; - -interface Dependencies { - readonly logger: Logger; -} - -export abstract class IpcMain extends IpcRegistrar { - private readonly dependencies: Dependencies; - - constructor(extension: LensMainExtension) { - super(extension); - - const di = getEnvironmentSpecificLegacyGlobalDiForExtensionApi("main"); - - this.dependencies = { - logger: di.inject(loggerInjectionToken), - }; - - // Call the static method on the bottom child class. - extension[Disposers].push(() => (this.constructor as typeof IpcMain).resetInstance()); - } - - /** - * Listen for broadcasts within your extension - * @param channel The channel to listen for broadcasts on - * @param listener The function that will be called with the arguments of the broadcast - * @returns An optional disposer, Lens will cleanup when the extension is disabled or uninstalled even if this is not called - */ - listen(channel: string, listener: (event: Electron.IpcRendererEvent, ...args: any[]) => any): Disposer { - const prefixedChannel = `extensions@${this[IpcPrefix]}:${channel}`; - const cleanup = once(() => { - this.dependencies.logger.debug(`[IPC-RENDERER]: removing extension listener`, { channel, extension: { name: this.extension.name, version: this.extension.version }}); - - return ipcMain.removeListener(prefixedChannel, listener); - }); - - this.dependencies.logger.debug(`[IPC-RENDERER]: adding extension listener`, { channel, extension: { name: this.extension.name, version: this.extension.version }}); - ipcMain.addListener(prefixedChannel, listener); - this.extension[Disposers].push(cleanup); - - return cleanup; - } - - /** - * Declare a RPC over `channel`. Lens will cleanup when the extension is disabled or uninstalled - * @param channel The name of the RPC - * @param handler The remote procedure that is called - */ - handle(channel: string, handler: (event: Electron.IpcMainInvokeEvent, ...args: any[]) => any): void { - const prefixedChannel = `extensions@${this[IpcPrefix]}:${channel}`; - - this.dependencies.logger.debug(`[IPC-RENDERER]: adding extension handler`, { channel, extension: { name: this.extension.name, version: this.extension.version }}); - ipcMainHandle(prefixedChannel, handler); - this.extension[Disposers].push(() => { - this.dependencies.logger.debug(`[IPC-RENDERER]: removing extension handler`, { channel, extension: { name: this.extension.name, version: this.extension.version }}); - - return ipcMain.removeHandler(prefixedChannel); - }); - } -} diff --git a/packages/core/src/extensions/ipc/ipc-registrar.ts b/packages/core/src/extensions/ipc/ipc-registrar.ts deleted file mode 100644 index 7fc27ba0fd..0000000000 --- a/packages/core/src/extensions/ipc/ipc-registrar.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { Singleton } from "../../common/utils/singleton"; -import type { LensExtension } from "../lens-extension"; -import { createHash } from "crypto"; -import { broadcastMessage } from "../../common/ipc"; - -export const IpcPrefix = Symbol(); - -export abstract class IpcRegistrar extends Singleton { - readonly [IpcPrefix]: string; - - constructor(protected readonly extension: LensExtension) { - super(); - this[IpcPrefix] = createHash("sha256").update(extension.id).digest("hex"); - } - - /** - * - * @param channel The channel to broadcast to your whole extension, both `main` and `renderer` - * @param args The arguments passed to all listeners - */ - broadcast(channel: string, ...args: any[]): void { - broadcastMessage(`extensions@${this[IpcPrefix]}:${channel}`, ...args); - } -} diff --git a/packages/core/src/extensions/ipc/ipc-renderer.ts b/packages/core/src/extensions/ipc/ipc-renderer.ts deleted file mode 100644 index 9060a19154..0000000000 --- a/packages/core/src/extensions/ipc/ipc-renderer.ts +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { ipcRenderer } from "electron"; -import { IpcPrefix, IpcRegistrar } from "./ipc-registrar"; -import { Disposers } from "../lens-extension"; -import type { LensRendererExtension } from "../lens-renderer-extension"; -import type { Disposer } from "@k8slens/utilities"; -import { once } from "lodash"; - -export abstract class IpcRenderer extends IpcRegistrar { - constructor(extension: LensRendererExtension) { - super(extension); - - // Call the static method on the bottom child class. - extension[Disposers].push(() => (this.constructor as typeof IpcRenderer).resetInstance()); - } - - /** - * Listen for broadcasts within your extension. - * If the lifetime of the listener should be tied to the mounted lifetime of - * a component then putting the returned value in a `disposeOnUnmount` call will suffice. - * @param channel The channel to listen for broadcasts on - * @param listener The function that will be called with the arguments of the broadcast - * @returns An optional disposer, Lens will cleanup even if this is not called - */ - listen(channel: string, listener: (event: Electron.IpcRendererEvent, ...args: any[]) => any): Disposer { - const prefixedChannel = `extensions@${this[IpcPrefix]}:${channel}`; - const cleanup = once(() => { - console.debug(`[IPC-RENDERER]: removing extension listener`, { channel, extension: { name: this.extension.name, version: this.extension.version }}); - - return ipcRenderer.removeListener(prefixedChannel, listener); - }); - - console.debug(`[IPC-RENDERER]: adding extension listener`, { channel, extension: { name: this.extension.name, version: this.extension.version }}); - ipcRenderer.addListener(prefixedChannel, listener); - this.extension[Disposers].push(cleanup); - - return cleanup; - } - - /** - * Request main to execute its function over the `channel` channel. - * This function only interacts with functions registered via `Ipc.IpcMain.handleRpc` - * An error will be thrown if no function has been registered on `main` with this channel ID. - * @param channel The channel to invoke a RPC on - * @param args The arguments to pass to the RPC - * @returns A promise of the resulting value - */ - invoke(channel: string, ...args: any[]): Promise { - const prefixedChannel = `extensions@${this[IpcPrefix]}:${channel}`; - - return ipcRenderer.invoke(prefixedChannel, ...args); - } -} diff --git a/packages/core/src/extensions/lens-extension.ts b/packages/core/src/extensions/lens-extension.ts deleted file mode 100644 index 407d4e9aa2..0000000000 --- a/packages/core/src/extensions/lens-extension.ts +++ /dev/null @@ -1,140 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { action, computed, makeObservable, observable } from "mobx"; -import { disposer } from "@k8slens/utilities"; -import type { ProtocolHandlerRegistration } from "../common/protocol-handler/registration"; -import type { InstalledExtension, LensExtensionId, LensExtensionManifest } from "@k8slens/legacy-extensions"; -import type { Logger } from "./common-api"; -import type { EnsureHashedDirectoryForExtension } from "./extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.injectable"; - -export const Disposers = Symbol("disposers"); - -export interface LensExtensionDependencies { - readonly logger: Logger; - ensureHashedDirectoryForExtension: EnsureHashedDirectoryForExtension; -} - -export class LensExtension { - readonly id: LensExtensionId; - readonly manifest: LensExtensionManifest; - readonly manifestPath: string; - readonly isBundled: boolean; - - get sanitizedExtensionId() { - return sanitizeExtensionName(this.name); - } - - /** - * @ignore - */ - protected readonly dependencies: LensExtensionDependencies; - - protocolHandlers: ProtocolHandlerRegistration[] = []; - - @observable private _isEnabled = false; - - @computed get isEnabled() { - return this._isEnabled; - } - - /** - * @ignore - */ - [Disposers] = disposer(); - - constructor(deps: LensExtensionDependencies, { id, manifest, manifestPath, isBundled }: InstalledExtension) { - this.dependencies = deps; - this.id = id; - this.manifest = manifest as LensExtensionManifest; - this.manifestPath = manifestPath; - this.isBundled = isBundled; - makeObservable(this); - } - - get name() { - return this.manifest.name; - } - - get version() { - return this.manifest.version; - } - - get description() { - return this.manifest.description; - } - - // Name of extension for persisting data - get storeName() { - return this.manifest.storeName || this.name; - } - - /** - * getExtensionFileFolder returns the path to an already created folder. This - * folder is for the sole use of this extension. - * - * Note: there is no security done on this folder, only obfuscation of the - * folder name. - */ - async getExtensionFileFolder(): Promise { - // storeName is read from the manifest and has a fallback to the manifest name, which equals id - return this.dependencies.ensureHashedDirectoryForExtension(this.storeName); - } - - @action - async enable() { - if (this._isEnabled) { - return; - } - - this._isEnabled = true; - this.dependencies.logger.info(`[EXTENSION]: enabled ${this.name}@${this.version}`); - } - - @action - async disable() { - if (!this._isEnabled) { - return; - } - - this._isEnabled = false; - - try { - await this.onDeactivate(); - this[Disposers](); - this.dependencies.logger.info(`[EXTENSION]: disabled ${this.name}@${this.version}`); - } catch (error) { - this.dependencies.logger.error(`[EXTENSION]: disabling ${this.name}@${this.version} threw an error: ${error}`); - } - } - - async activate(): Promise { - return this.onActivate(); - } - - protected onActivate(): Promise | void { - return; - } - - protected onDeactivate(): Promise | void { - return; - } -} - -export function sanitizeExtensionName(name: string) { - return name.replace("@", "").replace("/", "--"); -} - -export function getSanitizedPath(...parts: string[]) { - return parts - .filter(Boolean) - .join("/") - .replace(/\/+/g, "/") - .replace(/\/$/, ""); -} // normalize multi-slashes (e.g. coming from page.id) - -export function extensionDisplayName(name: string, version: string) { - return `${name}@${version}`; -} diff --git a/packages/core/src/extensions/lens-main-extension.ts b/packages/core/src/extensions/lens-main-extension.ts deleted file mode 100644 index 2eab08895b..0000000000 --- a/packages/core/src/extensions/lens-main-extension.ts +++ /dev/null @@ -1,79 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { LensExtensionDependencies } from "./lens-extension"; -import { LensExtension } from "./lens-extension"; -import type { CatalogEntity } from "../common/catalog"; -import type { IComputedValue, IObservableArray } from "mobx"; -import { isObservableArray } from "mobx"; -import type { MenuRegistration } from "../features/application-menu/main/menu-registration"; -import type { TrayMenuRegistration } from "../main/tray/tray-menu-registration"; -import type { ShellEnvModifier } from "../main/shell-session/shell-env-modifier/shell-env-modifier-registration"; -import { getEnvironmentSpecificLegacyGlobalDiForExtensionApi } from "@k8slens/legacy-global-di"; -import type { InstalledExtension } from "./common-api"; -import type { CatalogEntityRegistry } from "../main/catalog"; -import type { NavigateForExtension } from "../main/start-main-application/lens-window/navigate-for-extension.injectable"; -import catalogEntityRegistryInjectable from "../main/catalog/entity-registry.injectable"; -import { loggerInjectionToken } from "@k8slens/logger"; -import navigateForExtensionInjectable from "../main/start-main-application/lens-window/navigate-for-extension.injectable"; -import ensureHashedDirectoryForExtensionInjectable from "./extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.injectable"; - -interface LensMainExtensionDependencies extends LensExtensionDependencies { - readonly entityRegistry: CatalogEntityRegistry; - readonly navigate: NavigateForExtension; -} - -export class LensMainExtension extends LensExtension { - appMenus: MenuRegistration[] | IComputedValue = []; - trayMenus: TrayMenuRegistration[] | IComputedValue = []; - - /** - * @ignore - */ - declare readonly dependencies: LensMainExtensionDependencies; - - constructor(extension: InstalledExtension) { - const di = getEnvironmentSpecificLegacyGlobalDiForExtensionApi("main"); - const deps: LensMainExtensionDependencies = { - ensureHashedDirectoryForExtension: di.inject(ensureHashedDirectoryForExtensionInjectable), - navigate: di.inject(navigateForExtensionInjectable), - entityRegistry: di.inject(catalogEntityRegistryInjectable), - logger: di.inject(loggerInjectionToken), - }; - - super(deps, extension); - } - - /** - * implement this to modify the shell environment that Lens terminals are opened with. The ShellEnvModifier type has the signature - * - * (ctx: ShellEnvContext, env: Record) => Record - * - * @param ctx the shell environment context, specifically the relevant catalog entity for the terminal. This can be used, for example, to get - * cluster-specific information that can be made available in the shell environment by the implementation of terminalShellEnvModifier - * - * @param env the current shell environment that the terminal will be opened with. The implementation should modify this as desired. - * - * @returns the modified shell environment that the terminal will be opened with. The implementation must return env as passed in, if it - * does not modify the shell environment - */ - terminalShellEnvModifier?: ShellEnvModifier; - - async navigate(pageId?: string, params?: Record, frameId?: number) { - await this.dependencies.navigate(this.id, pageId, params, frameId); - } - - addCatalogSource(id: string, source: IObservableArray | IComputedValue) { - if (isObservableArray(source)) { - this.dependencies.entityRegistry.addObservableSource(`${this.name}:${id}`, source); - } else { - this.dependencies.entityRegistry.addComputedSource(`${this.name}:${id}`, source); - } - } - - removeCatalogSource(id: string) { - this.dependencies.entityRegistry.removeSource(`${this.name}:${id}`); - } -} diff --git a/packages/core/src/extensions/lens-renderer-extension.ts b/packages/core/src/extensions/lens-renderer-extension.ts deleted file mode 100644 index b34f8ef84f..0000000000 --- a/packages/core/src/extensions/lens-renderer-extension.ts +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { Disposers, LensExtension } from "./lens-extension"; -import type { Disposer } from "@k8slens/utilities"; -import type { LensExtensionDependencies } from "./lens-extension"; -import type { CatalogEntity, CategoryFilter, CatalogCategoryRegistry } from "../common/catalog"; -import type { EntityFilter, CatalogEntityRegistry } from "../renderer/api/catalog/entity/registry"; -import type { TopBarRegistration } from "../renderer/components/layout/top-bar/top-bar-registration"; -import type { KubernetesCluster } from "../common/catalog-entities"; -import type { WelcomeMenuRegistration } from "../renderer/components/welcome/welcome-menu-items/welcome-menu-registration"; -import type { WelcomeBannerRegistration } from "../renderer/components/welcome/welcome-banner-items/welcome-banner-registration"; -import type { CommandRegistration } from "../renderer/components/command-palette/registered-commands/commands"; -import type { AppPreferenceRegistration } from "../features/preferences/renderer/compliance-for-legacy-extension-api/app-preference-registration"; -import type { AdditionalCategoryColumnRegistration } from "../renderer/components/catalog/custom-category-columns"; -import type { CustomCategoryViewRegistration } from "../renderer/components/catalog/custom-views"; -import type { StatusBarRegistration } from "../renderer/components/status-bar/status-bar-registration"; -import type { KubeObjectMenuRegistration } from "../renderer/components/kube-object-menu/kube-object-menu-registration"; -import type { WorkloadsOverviewDetailRegistration } from "../renderer/components/workloads-overview/workloads-overview-detail-registration"; -import type { KubeObjectStatusRegistration } from "../renderer/components/kube-object-status-icon/kube-object-status-registration"; -import { fromPairs, map, matches, toPairs } from "lodash/fp"; -import { pipeline } from "@ogre-tools/fp"; -import { getExtensionRoutePath } from "../renderer/routes/for-extension"; -import type { KubeObjectHandlerRegistration } from "../renderer/kube-object/handler"; -import type { AppPreferenceTabRegistration } from "../features/preferences/renderer/compliance-for-legacy-extension-api/app-preference-tab-registration"; -import type { KubeObjectDetailRegistration } from "../renderer/components/kube-object-details/kube-object-detail-registration"; -import type { ClusterFrameChildComponent } from "@k8slens/react-application"; -import type { EntitySettingRegistration } from "../renderer/components/entity-settings/extension-registrator.injectable"; -import type { CatalogEntityDetailRegistration } from "../renderer/components/catalog/entity-details/token"; -import type { PageRegistration } from "../renderer/routes/page-registration"; -import type { ClusterPageMenuRegistration } from "../renderer/components/layout/cluster-page-menu"; -import type { IComputedValue } from "mobx"; -import type { NavigateToRoute } from "../common/front-end-routing/navigate-to-route-injection-token"; -import type { Route } from "../common/front-end-routing/front-end-route-injection-token"; -import type { GetExtensionPageParameters } from "../renderer/routes/get-extension-page-parameters.injectable"; -import type { InstalledExtension } from "./common-api"; -import { getEnvironmentSpecificLegacyGlobalDiForExtensionApi } from "@k8slens/legacy-global-di"; -import catalogCategoryRegistryInjectable from "../common/catalog/category-registry.injectable"; -import catalogEntityRegistryInjectable from "../renderer/api/catalog/entity/registry.injectable"; -import { loggerInjectionToken } from "@k8slens/logger"; -import getExtensionPageParametersInjectable from "../renderer/routes/get-extension-page-parameters.injectable"; -import navigateToRouteInjectable from "../renderer/routes/navigate-to-route.injectable"; -import routesInjectable from "../renderer/routes/routes.injectable"; -import ensureHashedDirectoryForExtensionInjectable from "./extension-loader/file-system-provisioner-store/ensure-hashed-directory-for-extension.injectable"; - -interface LensRendererExtensionDependencies extends LensExtensionDependencies { - navigateToRoute: NavigateToRoute; - getExtensionPageParameters: GetExtensionPageParameters; - readonly routes: IComputedValue[]>; - readonly entityRegistry: CatalogEntityRegistry; - readonly categoryRegistry: CatalogCategoryRegistry; -} - -export class LensRendererExtension extends LensExtension { - globalPages: PageRegistration[] = []; - clusterPages: PageRegistration[] = []; - clusterPageMenus: ClusterPageMenuRegistration[] = []; - clusterFrameComponents: ClusterFrameChildComponent[] = []; - kubeObjectStatusTexts: KubeObjectStatusRegistration[] = []; - appPreferences: AppPreferenceRegistration[] = []; - appPreferenceTabs: AppPreferenceTabRegistration[] = []; - entitySettings: EntitySettingRegistration[] = []; - statusBarItems: StatusBarRegistration[] = []; - kubeObjectDetailItems: KubeObjectDetailRegistration[] = []; - kubeObjectMenuItems: KubeObjectMenuRegistration[] = []; - kubeWorkloadsOverviewItems: WorkloadsOverviewDetailRegistration[] = []; - commands: CommandRegistration[] = []; - welcomeMenus: WelcomeMenuRegistration[] = []; - welcomeBanners: WelcomeBannerRegistration[] = []; - catalogEntityDetailItems: CatalogEntityDetailRegistration[] = []; - topBarItems: TopBarRegistration[] = []; - additionalCategoryColumns: AdditionalCategoryColumnRegistration[] = []; - customCategoryViews: CustomCategoryViewRegistration[] = []; - kubeObjectHandlers: KubeObjectHandlerRegistration[] = []; - - /** - * @ignore - */ - declare protected readonly dependencies: LensRendererExtensionDependencies; - - constructor(extension: InstalledExtension) { - const di = getEnvironmentSpecificLegacyGlobalDiForExtensionApi("renderer"); - const deps: LensRendererExtensionDependencies = { - getExtensionPageParameters: di.inject(getExtensionPageParametersInjectable), - navigateToRoute: di.inject(navigateToRouteInjectable), - ensureHashedDirectoryForExtension: di.inject(ensureHashedDirectoryForExtensionInjectable), - categoryRegistry: di.inject(catalogCategoryRegistryInjectable), - entityRegistry: di.inject(catalogEntityRegistryInjectable), - routes: di.inject(routesInjectable), - logger: di.inject(loggerInjectionToken), - }; - - super(deps, extension); - } - - async navigate(pageId?: string, params: object = {}) { - const routes = this.dependencies.routes.get(); - const targetRegistration = [...this.globalPages, ...this.clusterPages] - .find(registration => registration.id === (pageId || undefined)); - - if (!targetRegistration) { - return; - } - - const targetRoutePath = getExtensionRoutePath(this, targetRegistration.id); - const targetRoute = routes.find(matches({ path: targetRoutePath })); - - if (!targetRoute) { - return; - } - - const normalizedParams = this.dependencies.getExtensionPageParameters({ - extension: this, - registration: targetRegistration, - }); - const query = pipeline( - params, - toPairs, - map(([key, value]) => [ - key, - normalizedParams[key].stringify(value), - ]), - fromPairs, - ); - - this.dependencies.navigateToRoute(targetRoute, { - query, - }); - } - - /** - * Defines if extension is enabled for a given cluster. This method is only - * called when the extension is created within a cluster frame. - * - * The default implementation is to return `true` - * - * @deprecated Switch to using "enabled" or "visible" properties in each registration together with `activeCluster` - */ - async isEnabledForCluster(cluster: KubernetesCluster): Promise { - return (void cluster) || true; - } - - /** - * Add a filtering function for the catalog entities. This will be removed if the extension is disabled. - * @param fn The function which should return a truthy value for those entities which should be kept. - * @returns A function to clean up the filter - */ - addCatalogFilter(fn: EntityFilter): Disposer { - const dispose = this.dependencies.entityRegistry.addCatalogFilter(fn); - - this[Disposers].push(dispose); - - return dispose; - } - - /** - * Add a filtering function for the catalog categories. This will be removed if the extension is disabled. - * @param fn The function which should return a truthy value for those categories which should be kept. - * @returns A function to clean up the filter - */ - addCatalogCategoryFilter(fn: CategoryFilter): Disposer { - const dispose = this.dependencies.categoryRegistry.addCatalogCategoryFilter(fn); - - this[Disposers].push(dispose); - - return dispose; - } -} diff --git a/packages/core/src/extensions/main-api/catalog.ts b/packages/core/src/extensions/main-api/catalog.ts deleted file mode 100644 index e4eea56e9e..0000000000 --- a/packages/core/src/extensions/main-api/catalog.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import type { CatalogEntity } from "../../common/catalog"; -import { asLegacyGlobalForExtensionApi } from "@k8slens/legacy-global-di"; -import catalogCategoryRegistryInjectable from "../../common/catalog/category-registry.injectable"; -import catalogEntityRegistryInjectable from "../../main/catalog/entity-registry.injectable"; - -export const catalogCategories = asLegacyGlobalForExtensionApi(catalogCategoryRegistryInjectable); -const catalogEntityRegistry = asLegacyGlobalForExtensionApi(catalogEntityRegistryInjectable); - -export interface CatalogEntityRegistry { - getItemsForApiKind(apiVersion: string, kind: string): CatalogEntity[]; - /** - * @deprecated use a cast instead of a unbounded type parameter - */ - getItemsForApiKind(apiVersion: string, kind: string): T[]; -} - -export const catalogEntities: CatalogEntityRegistry = { - getItemsForApiKind(apiVersion: string, kind: string) { - return catalogEntityRegistry.filterItemsForApiKind(apiVersion, kind); - }, -}; diff --git a/packages/core/src/extensions/main-api/index.ts b/packages/core/src/extensions/main-api/index.ts deleted file mode 100644 index 88fe4ed275..0000000000 --- a/packages/core/src/extensions/main-api/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export * as Catalog from "./catalog"; -export * as Navigation from "./navigation"; -export * as K8sApi from "./k8s-api"; -export * as Power from "./power"; -export { IpcMain as Ipc } from "../ipc/ipc-main"; -export { LensMainExtension as LensExtension } from "../lens-main-extension"; diff --git a/packages/core/src/extensions/main-api/k8s-api.ts b/packages/core/src/extensions/main-api/k8s-api.ts deleted file mode 100644 index 05cffffdbf..0000000000 --- a/packages/core/src/extensions/main-api/k8s-api.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -/** - * @deprecated This function never works - * @returns false - */ -export function isAllowedResource(...args: any[]) { - return Boolean(void args); -} - -export * from "../common-api/k8s-api"; diff --git a/packages/core/src/extensions/main-api/navigation.ts b/packages/core/src/extensions/main-api/navigation.ts deleted file mode 100644 index e9bcc80d55..0000000000 --- a/packages/core/src/extensions/main-api/navigation.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import { getEnvironmentSpecificLegacyGlobalDiForExtensionApi } from "@k8slens/legacy-global-di"; -import navigateInjectable from "../../main/start-main-application/lens-window/navigate.injectable"; - -export function navigate(url: string) { - const di = getEnvironmentSpecificLegacyGlobalDiForExtensionApi("main"); - const navigate = di.inject(navigateInjectable); - - return navigate(url); -} diff --git a/packages/core/src/extensions/main-api/power.ts b/packages/core/src/extensions/main-api/power.ts deleted file mode 100644 index bf9f61b480..0000000000 --- a/packages/core/src/extensions/main-api/power.ts +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { powerMonitor } from "electron"; -import type { Disposer } from "@k8slens/utilities"; - -/** - * Event listener for system power events - */ -export type PowerEventListener = () => void; - -/** - * Adds event listener to system suspend events - * @param listener function which will be called on system suspend - * @returns function to remove event listener - */ -export const onSuspend = (listener: PowerEventListener): Disposer => { - powerMonitor.on("suspend", listener); - - return () => { - powerMonitor.off("suspend", listener); - }; -}; - -/** - * Adds event listener to system resume event - * @param listener function which will be called on system resume - * @returns function to remove event listener - */ -export const onResume = (listener: PowerEventListener): Disposer => { - powerMonitor.on("resume", listener); - - return () => { - powerMonitor.off("resume", listener); - }; -}; - -/** - * Adds event listener to the event which is emitted when - * the system is about to reboot or shut down - * @param listener function which will be called on system shutdown - * @returns function to remove event listener - */ -export const onShutdown = (listener: PowerEventListener): Disposer => { - powerMonitor.on("shutdown", listener); - - return () => { - powerMonitor.off("shutdown", listener); - }; -}; diff --git a/packages/core/src/extensions/main-extensions.injectable.ts b/packages/core/src/extensions/main-extensions.injectable.ts deleted file mode 100644 index 07010af010..0000000000 --- a/packages/core/src/extensions/main-extensions.injectable.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { IComputedValue } from "mobx"; -import extensionsInjectable from "./extensions.injectable"; -import type { LensMainExtension } from "./lens-main-extension"; - -const mainExtensionsInjectable = getInjectable({ - id: "main-extensions", - - instantiate: (di) => - di.inject(extensionsInjectable) as IComputedValue, -}); - -export default mainExtensionsInjectable; diff --git a/packages/core/src/extensions/renderer-api/catalog.ts b/packages/core/src/extensions/renderer-api/catalog.ts deleted file mode 100644 index f8188b9f9e..0000000000 --- a/packages/core/src/extensions/renderer-api/catalog.ts +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - - -import type { CatalogCategory, CatalogEntity } from "../../common/catalog"; -import type { CatalogEntityOnBeforeRun } from "../../renderer/api/catalog/entity/registry"; -import type { Disposer } from "@k8slens/utilities"; -import catalogCategoryRegistryInjectable from "../../common/catalog/category-registry.injectable"; -import { asLegacyGlobalForExtensionApi } from "@k8slens/legacy-global-di"; -import catalogEntityRegistryInjectable from "../../renderer/api/catalog/entity/registry.injectable"; -import activeKubernetesClusterInjectable from "../../renderer/cluster-frame-context/active-kubernetes-cluster.injectable"; - -export const catalogCategories = asLegacyGlobalForExtensionApi(catalogCategoryRegistryInjectable); - -const internalEntityRegistry = asLegacyGlobalForExtensionApi(catalogEntityRegistryInjectable); - -export class CatalogEntityRegistry { - /** - * Currently active/visible entity - */ - get activeEntity() { - return internalEntityRegistry.activeEntity; - } - - get entities(): Map { - return internalEntityRegistry.entities; - } - - getById(id: string) { - return this.entities.get(id); - } - - getItemsForApiKind(apiVersion: string, kind: string): T[] { - return internalEntityRegistry.getItemsForApiKind(apiVersion, kind); - } - - getItemsForCategory(category: CatalogCategory): T[] { - return internalEntityRegistry.getItemsForCategory(category); - } - - /** - * Add a onBeforeRun hook to a catalog entities. If `onBeforeRun` was previously - * added then it will not be added again. - * @param onBeforeRun The function to be called with a `CatalogRunEvent` - * event target will be the catalog entity. onBeforeRun hook can call event.preventDefault() - * to stop run sequence - * @returns A function to remove that hook - */ - addOnBeforeRun(onBeforeRun: CatalogEntityOnBeforeRun): Disposer { - return internalEntityRegistry.addOnBeforeRun(onBeforeRun); - } -} - -export const catalogEntities = new CatalogEntityRegistry(); - -export const activeCluster = asLegacyGlobalForExtensionApi( - activeKubernetesClusterInjectable, -); diff --git a/packages/core/src/extensions/renderer-api/components.ts b/packages/core/src/extensions/renderer-api/components.ts deleted file mode 100644 index 56f5f7e28e..0000000000 --- a/packages/core/src/extensions/renderer-api/components.ts +++ /dev/null @@ -1,176 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { asLegacyGlobalFunctionForExtensionApi, asLegacyGlobalForExtensionApi } from "@k8slens/legacy-global-di"; -import createTerminalTabInjectable from "../../renderer/components/dock/terminal/create-terminal-tab.injectable"; -import terminalStoreInjectable from "../../renderer/components/dock/terminal/store.injectable"; -import logTabStoreInjectable from "../../renderer/components/dock/logs/tab-store.injectable"; - -import commandOverlayInjectable from "../../renderer/components/command-palette/command-overlay.injectable"; -import createPodLogsTabInjectable from "../../renderer/components/dock/logs/create-pod-logs-tab.injectable"; -import createWorkloadLogsTabInjectable from "../../renderer/components/dock/logs/create-workload-logs-tab.injectable"; -import sendCommandInjectable from "../../renderer/components/dock/terminal/send-command.injectable"; -import renameTabInjectable from "../../renderer/components/dock/dock/rename-tab.injectable"; -import { ConfirmDialog as _ConfirmDialog } from "../../renderer/components/confirm-dialog"; -import type { ConfirmDialogBooleanParams, ConfirmDialogParams, ConfirmDialogProps } from "../../renderer/components/confirm-dialog"; -import openConfirmDialogInjectable from "../../renderer/components/confirm-dialog/open.injectable"; -import confirmInjectable from "../../renderer/components/confirm-dialog/confirm.injectable"; -import { - notificationsStoreInjectable, - showCheckedErrorNotificationInjectable, - showErrorNotificationInjectable, - showInfoNotificationInjectable, - showShortInfoNotificationInjectable, - showSuccessNotificationInjectable, -} from "@k8slens/notifications"; -import podStoreInjectable from "../../renderer/components/workloads-pods/store.injectable"; -import getDetailsUrlInjectable from "../../renderer/components/kube-detail-params/get-details-url.injectable"; -import showDetailsInjectable from "../../renderer/components/kube-detail-params/show-details.injectable"; - - -// layouts -export * from "../../renderer/components/layout/main-layout"; -export * from "../../renderer/components/layout/setting-layout"; -export * from "../../renderer/components/layout/page-layout"; -export * from "../../renderer/components/layout/wizard-layout"; -export * from "../../renderer/components/layout/tab-layout"; - -// form-controls -export * from "@k8slens/button"; -export * from "../../renderer/components/checkbox"; -export * from "../../renderer/components/radio"; -export * from "../../renderer/components/select"; -export * from "../../renderer/components/slider"; -export * from "../../renderer/components/switch"; -export * from "../../renderer/components/input/input"; - -// command-overlay -export const CommandOverlay = asLegacyGlobalForExtensionApi(commandOverlayInjectable); - -export type { - CategoryColumnRegistration, - AdditionalCategoryColumnRegistration, -} from "../../renderer/components/catalog/custom-category-columns"; - -// other components -export type { - ConfirmDialogBooleanParams, - ConfirmDialogParams, - ConfirmDialogProps, -}; -export const ConfirmDialog = Object.assign(_ConfirmDialog, { - open: asLegacyGlobalFunctionForExtensionApi(openConfirmDialogInjectable), - confirm: asLegacyGlobalFunctionForExtensionApi(confirmInjectable), -}); - -export * from "@k8slens/icon"; -export * from "@k8slens/tooltip"; -export * from "../../renderer/components/tabs"; -export * from "../../renderer/components/table"; -export * from "../../renderer/components/badge"; -export * from "../../renderer/components/drawer"; -export * from "../../renderer/components/dialog"; -export * from "../../renderer/components/line-progress"; -export * from "../../renderer/components/menu"; - -export { - NotificationStatus, - type CreateNotificationOptions, - type Notification, - type NotificationId, - type NotificationMessage, - type ShowNotification, - type NotificationsStore, -} from"@k8slens/notifications"; - -export const Notifications = { - ok: asLegacyGlobalFunctionForExtensionApi(showSuccessNotificationInjectable), - error: asLegacyGlobalFunctionForExtensionApi(showErrorNotificationInjectable), - checkedError: asLegacyGlobalFunctionForExtensionApi(showCheckedErrorNotificationInjectable), - info: asLegacyGlobalFunctionForExtensionApi(showInfoNotificationInjectable), - shortInfo: asLegacyGlobalFunctionForExtensionApi(showShortInfoNotificationInjectable), -}; - -export * from "@k8slens/spinner"; -export * from "../../renderer/components/stepper"; -export * from "../../renderer/components/wizard"; -export * from "../../renderer/components/workloads-pods/pod-details-list"; -export * from "../../renderer/components/namespaces/namespace-select"; -export * from "../../renderer/components/namespaces/namespace-select-filter"; -export * from "../../renderer/components/layout/sub-title"; -export * from "../../renderer/components/input/search-input"; -export * from "../../renderer/components/chart/bar-chart"; -export * from "../../renderer/components/chart/pie-chart"; -export { - MonacoEditor, - type MonacoEditorProps, type MonacoEditorId, - type MonacoTheme, type MonacoCustomTheme, -} from "../../renderer/components/monaco-editor"; -export * from "../../renderer/components/resource-metrics/resource-metrics"; -export * from "../../renderer/components/workloads-pods/pod-charts"; - -/** - * @deprecated Use `Renderer.Navigation.getDetailsUrl` - */ -export const getDetailsUrl = asLegacyGlobalFunctionForExtensionApi(getDetailsUrlInjectable); - -/** - * @deprecated Use `Renderer.Navigation.showDetails` - */ -export const showDetails = asLegacyGlobalFunctionForExtensionApi(showDetailsInjectable); - -// kube helpers -export * from "../../renderer/components/kube-object-details"; -export * from "../../renderer/components/kube-object-list-layout"; -export * from "../../renderer/components/kube-object-menu"; -export * from "../../renderer/components/kube-object-meta"; -export * from "../../renderer/components/events/kube-event-details"; - -// specific exports -export * from "../../renderer/components/status-brick"; - -export const createTerminalTab = asLegacyGlobalFunctionForExtensionApi(createTerminalTabInjectable); - -export const terminalStore = Object.assign( - asLegacyGlobalForExtensionApi(terminalStoreInjectable), - { - sendCommand: asLegacyGlobalFunctionForExtensionApi(sendCommandInjectable), - }, -); - -const renameTab = asLegacyGlobalFunctionForExtensionApi(renameTabInjectable); -const podStore = asLegacyGlobalForExtensionApi(podStoreInjectable); - -export const logTabStore = Object.assign( - asLegacyGlobalForExtensionApi(logTabStoreInjectable), - { - createPodTab: asLegacyGlobalFunctionForExtensionApi(createPodLogsTabInjectable), - createWorkloadTab: asLegacyGlobalFunctionForExtensionApi(createWorkloadLogsTabInjectable), - renameTab: (tabId: string): void => { - const { selectedPodId } = logTabStore.getData(tabId) ?? {}; - const pod = selectedPodId && podStore.getById(selectedPodId); - - if (pod) { - renameTab(tabId, `Pod ${pod.getName()}`); - } - }, - tabs: undefined, - }, -); - -export class TerminalStore { - static getInstance() { - return terminalStore; - } - - static createInstance() { - return terminalStore; - } - - static resetInstance() { - console.warn("TerminalStore.resetInstance() does nothing"); - } -} - -export const notificationsStore = asLegacyGlobalForExtensionApi(notificationsStoreInjectable); diff --git a/packages/core/src/extensions/renderer-api/index.ts b/packages/core/src/extensions/renderer-api/index.ts deleted file mode 100644 index c58e278a75..0000000000 --- a/packages/core/src/extensions/renderer-api/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -// Lens-extensions apis, required in renderer process runtime - -// APIs -import * as Catalog from "./catalog"; -import * as Component from "./components"; -import * as K8sApi from "./k8s-api"; -import * as Navigation from "./navigation"; -import * as Theme from "./theming"; -import { IpcRenderer as Ipc } from "../ipc/ipc-renderer"; -import { LensRendererExtension as LensExtension } from "../lens-renderer-extension"; - -export { - Catalog, - Component, - K8sApi, - Navigation, - Theme, - Ipc, - LensExtension, -}; diff --git a/packages/core/src/extensions/renderer-api/k8s-api.ts b/packages/core/src/extensions/renderer-api/k8s-api.ts deleted file mode 100644 index cb00484fa2..0000000000 --- a/packages/core/src/extensions/renderer-api/k8s-api.ts +++ /dev/null @@ -1,119 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import type { KubeResource } from "../../common/rbac"; -import { apiResourceRecord } from "../../common/rbac"; -import { getLegacyGlobalDiForExtensionApi, asLegacyGlobalForExtensionApi, asLegacyGlobalFunctionForExtensionApi } from "@k8slens/legacy-global-di"; -import * as kubeApiSpecifics from "@k8slens/kube-api-specifics"; -import { shouldShowResourceInjectionToken } from "../../features/cluster/showing-kube-resources/common/allowed-resources-injection-token"; -import requestMetricsInjectable from "../../common/k8s-api/endpoints/metrics.api/request-metrics.injectable"; - -export function isAllowedResource(resources: KubeResource | KubeResource[]) { - const di = getLegacyGlobalDiForExtensionApi(); - - return [resources].flat().every((resourceName) => { - const resource = apiResourceRecord[resourceName]; - - if (!resource) { - return true; - } - - const _isAllowedResource = di.inject(shouldShowResourceInjectionToken, { - apiName: resourceName, - group: resource.group, - }); - - // Note: Legacy isAllowedResource does not advertise reactivity - return _isAllowedResource.get(); - }); -} - -export const serviceAccountsApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.serviceAccountApiInjectable); -export const clusterRoleApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.clusterRoleApiInjectable); -export const clusterRoleBindingApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.clusterRoleBindingApiInjectable); -export const roleApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.roleApiInjectable); -export const podsApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.podApiInjectable); -export const daemonSetApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.daemonSetApiInjectable); -export const replicaSetApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.replicaSetApiInjectable); -export const statefulSetApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.statefulSetApiInjectable); -export const deploymentApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.deploymentApiInjectable); -export const jobApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.jobApiInjectable); -export const cronJobApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.cronJobApiInjectable); -export const nodesApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.nodeApiInjectable); -export const secretsApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.secretApiInjectable); -export const configMapApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.configMapApiInjectable); -export const resourceQuotaApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.resourceQuotaApiInjectable); -export const limitRangeApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.limitRangeApiInjectable); -export const serviceApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.serviceApiInjectable); -export const hpaApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.horizontalPodAutoscalerApiInjectable); -export const vpaApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.verticalPodAutoscalerApiInjectable); -export const pdbApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.podDisruptionBudgetApiInjectable); -export const pcApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.priorityClassApiInjectable); -export const endpointApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.endpointsApiInjectable); -export const ingressApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.ingressApiInjectable); -export const networkPolicyApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.networkPolicyApiInjectable); -export const persistentVolumeApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.persistentVolumeApiInjectable); -export const pvcApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.persistentVolumeClaimApiInjectable); -export const storageClassApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.storageClassApiInjectable); -export const namespacesApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.namespaceApiInjectable); -export const eventApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.kubeEventApiInjectable); -export const roleBindingApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.roleBindingApiInjectable); -export const crdApi = asLegacyGlobalForExtensionApi(kubeApiSpecifics.customResourceDefinitionApiInjectable); - -export * from "../common-api/k8s-api"; - -export const requestMetrics = asLegacyGlobalFunctionForExtensionApi(requestMetricsInjectable); - -export type { - RequestMetrics, - RequestMetricsParams, -} from "../../common/k8s-api/endpoints/metrics.api/request-metrics.injectable"; -export type { - MetricData, - MetricResult, -} from "../../common/k8s-api/endpoints/metrics.api"; - -export { - KubeObjectStatusLevel, - type KubeObjectStatus, -} from "../../common/k8s-api/kube-object-status"; - -// stores -export type { EventStore } from "../../renderer/components/events/store"; -export type { PodStore as PodsStore } from "../../renderer/components/workloads-pods/store"; -export type { NodeStore as NodesStore } from "../../renderer/components/nodes/store"; -export type { DeploymentStore } from "../../renderer/components/workloads-deployments/store"; -export type { DaemonSetStore } from "../../renderer/components/workloads-daemonsets/store"; -export type { StatefulSetStore } from "../../renderer/components/workloads-statefulsets/store"; -export type { JobStore } from "../../renderer/components/workloads-jobs/store"; -export type { CronJobStore } from "../../renderer/components/workloads-cronjobs/store"; -export type { ConfigMapStore as ConfigMapsStore } from "../../renderer/components/config-maps/store"; -export type { SecretStore as SecretsStore } from "../../renderer/components/config-secrets/store"; -export type { ReplicaSetStore } from "../../renderer/components/workloads-replicasets/store"; -export type { ResourceQuotaStore as ResourceQuotasStore } from "../../renderer/components/config-resource-quotas/store"; -export type { LimitRangeStore as LimitRangesStore } from "../../renderer/components/config-limit-ranges/store"; -export type { - /** - * @deprecated - */ - HorizontalPodAutoscalerStore as HPAStore, - HorizontalPodAutoscalerStore, -} from "../../renderer/components/config-horizontal-pod-autoscalers/store"; -export type { VerticalPodAutoscalerStore } from "../../renderer/components/config-vertical-pod-autoscalers/store"; -export type { PodDisruptionBudgetStore as PodDisruptionBudgetsStore } from "../../renderer/components/config-pod-disruption-budgets/store"; -export type { PriorityClassStore as PriorityClassStoreStore } from "../../renderer/components/config-priority-classes/store"; -export type { ServiceStore } from "../../renderer/components/network-services/store"; -export type { EndpointsStore as EndpointStore } from "../../renderer/components/network-endpoints/store"; -export type { IngressStore } from "../../renderer/components/network-ingresses/ingress-store"; -export type { IngressClassStore } from "../../renderer/components/network-ingresses/ingress-class-store"; -export type { NetworkPolicyStore } from "../../renderer/components/network-policies/store"; -export type { PersistentVolumeStore as PersistentVolumesStore } from "../../renderer/components/storage-volumes/store"; -export type { PersistentVolumeClaimStore as VolumeClaimStore } from "../../renderer/components/storage-volume-claims/store"; -export type { StorageClassStore } from "../../renderer/components/storage-classes/store"; -export type { NamespaceStore } from "../../renderer/components/namespaces/store"; -export type { ServiceAccountStore as ServiceAccountsStore } from "../../renderer/components/user-management/service-accounts/store"; -export type { RoleStore as RolesStore } from "../../renderer/components/user-management/roles/store"; -export type { RoleBindingStore as RoleBindingsStore } from "../../renderer/components/user-management/role-bindings/store"; -export type { CustomResourceDefinitionStore as CRDStore } from "../../renderer/components/custom-resource-definitions/store"; -export type { CustomResourceStore as CRDResourceStore } from "../../common/k8s-api/api-manager/resource.store"; diff --git a/packages/core/src/extensions/renderer-api/navigation.ts b/packages/core/src/extensions/renderer-api/navigation.ts deleted file mode 100644 index 3395a55f6e..0000000000 --- a/packages/core/src/extensions/renderer-api/navigation.ts +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import hideEntityDetailsInjectable from "../../renderer/components/catalog/entity-details/hide.injectable"; -import showEntityDetailsInjectable from "../../renderer/components/catalog/entity-details/show.injectable"; -import getDetailsUrlInjectable from "../../renderer/components/kube-detail-params/get-details-url.injectable"; -import hideDetailsInjectable from "../../renderer/components/kube-detail-params/hide-details.injectable"; -import showDetailsInjectable from "../../renderer/components/kube-detail-params/show-details.injectable"; -import createPageParamInjectable from "../../renderer/navigation/create-page-param.injectable"; -import isActiveRouteInjectable from "../../renderer/navigation/is-route-active.injectable"; -import navigateInjectable from "../../renderer/navigation/navigate.injectable"; -import { asLegacyGlobalFunctionForExtensionApi } from "@k8slens/legacy-global-di"; - -export type { PageParamInit, PageParam } from "../../renderer/navigation/page-param"; -export type { URLParams } from "@k8slens/utilities"; - -export const getDetailsUrl = asLegacyGlobalFunctionForExtensionApi(getDetailsUrlInjectable); -export const showDetails = asLegacyGlobalFunctionForExtensionApi(showDetailsInjectable); -export const hideDetails = asLegacyGlobalFunctionForExtensionApi(hideDetailsInjectable); -export const createPageParam = asLegacyGlobalFunctionForExtensionApi(createPageParamInjectable); -export const isActiveRoute = asLegacyGlobalFunctionForExtensionApi(isActiveRouteInjectable); -export const navigate = asLegacyGlobalFunctionForExtensionApi(navigateInjectable); - -export const showEntityDetails = asLegacyGlobalFunctionForExtensionApi(showEntityDetailsInjectable); -export const hideEntityDetails = asLegacyGlobalFunctionForExtensionApi(hideEntityDetailsInjectable); diff --git a/packages/core/src/extensions/renderer-api/theming.ts b/packages/core/src/extensions/renderer-api/theming.ts deleted file mode 100644 index 9bbec40b9e..0000000000 --- a/packages/core/src/extensions/renderer-api/theming.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -import activeThemeInjectable from "../../renderer/themes/active.injectable"; -import type { LensTheme } from "../../renderer/themes/lens-theme"; -import { asLegacyGlobalForExtensionApi } from "@k8slens/legacy-global-di"; - -export const activeTheme = asLegacyGlobalForExtensionApi(activeThemeInjectable); - -/** - * @deprecated This hides the reactivity of active theme, use {@link activeTheme} instead - */ -export function getActiveTheme() { - return activeTheme.get(); -} - -export type { LensTheme }; diff --git a/packages/core/src/extensions/renderer-extensions.injectable.ts b/packages/core/src/extensions/renderer-extensions.injectable.ts deleted file mode 100644 index 92c3037e01..0000000000 --- a/packages/core/src/extensions/renderer-extensions.injectable.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import { getInjectable } from "@ogre-tools/injectable"; -import type { IComputedValue } from "mobx"; -import extensionsInjectable from "./extensions.injectable"; -import type { LensRendererExtension } from "./lens-renderer-extension"; - -const rendererExtensionsInjectable = getInjectable({ - id: "renderer-extensions", - instantiate: (di) => di.inject(extensionsInjectable) as IComputedValue, -}); - -export default rendererExtensionsInjectable; diff --git a/packages/core/src/features/__snapshots__/extension-special-characters-in-page-registrations.test.tsx.snap b/packages/core/src/features/__snapshots__/extension-special-characters-in-page-registrations.test.tsx.snap deleted file mode 100644 index ff06a6b9ad..0000000000 --- a/packages/core/src/features/__snapshots__/extension-special-characters-in-page-registrations.test.tsx.snap +++ /dev/null @@ -1,567 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`extension special characters in page registrations renders 1`] = ` -
-
-
-
-
-
- - - home - - -
-
-
- - - arrow_back - - -
-
-
- - - arrow_forward - - -
-
-
-
-
-
-
-
- -
-
-

- Welcome to some-product-name! -

-

- To get you started we have auto-detected your clusters in your - - kubeconfig file and added them to the catalog, your centralized - - view for managing all your cloud-native resources. -
-
- If you have any questions or feedback, please join our - - Lens Forums - - . -

- -
-
-
-
-
-
-
-
-
-
-
- WP -
-
-
-
-
-
-
-
- Ca -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - arrow_left - - -
-
- 1 -
-
- - - arrow_right - - -
-
-
-
-
-
-
-
-`; - -exports[`extension special characters in page registrations when navigating to route with ID having special characters renders 1`] = ` -
-
-
-
-
-
- - - home - - -
-
-
- - - arrow_back - - -
-
-
- - - arrow_forward - - -
-
-
-
-
-
-
- Some page -
-
-
-
-
-
-
-
- WP -
-
-
-
-
-
-
-
- Ca -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - arrow_left - - -
-
- 1 -
-
- - - arrow_right - - -
-
-
-
-
-
-
-
-`; diff --git a/packages/core/src/features/__snapshots__/navigate-to-extension-page.test.tsx.snap b/packages/core/src/features/__snapshots__/navigate-to-extension-page.test.tsx.snap deleted file mode 100644 index c24dec4f2d..0000000000 --- a/packages/core/src/features/__snapshots__/navigate-to-extension-page.test.tsx.snap +++ /dev/null @@ -1,1278 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`navigate to extension page renders 1`] = ` -
-
-
-
-
-
- - - home - - -
-
-
- - - arrow_back - - -
-
-
- - - arrow_forward - - -
-
-
-
-
-
-
-
- -
-
-

- Welcome to some-product-name! -

-

- To get you started we have auto-detected your clusters in your - - kubeconfig file and added them to the catalog, your centralized - - view for managing all your cloud-native resources. -
-
- If you have any questions or feedback, please join our - - Lens Forums - - . -

- -
-
-
-
-
-
-
-
-
-
-
- WP -
-
-
-
-
-
-
-
- Ca -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - arrow_left - - -
-
- 1 -
-
- - - arrow_right - - -
-
-
-
-
-
-
-
-`; - -exports[`navigate to extension page when extension navigates to child route renders 1`] = ` -
-
-
-
-
-
- - - home - - -
-
-
- - - arrow_back - - -
-
-
- - - arrow_forward - - -
-
-
-
-
-
-
- Child page -
-
-
-
-
-
-
-
- WP -
-
-
-
-
-
-
-
- Ca -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - arrow_left - - -
-
- 1 -
-
- - - arrow_right - - -
-
-
-
-
-
-
-
-`; - -exports[`navigate to extension page when extension navigates to route with parameters renders 1`] = ` -
-
-
-
-
-
- - - home - - -
-
-
- - - arrow_back - - -
-
-
- - - arrow_forward - - -
-
-
-
-
-
-
-
    -
  • - some-string-value-from-navigate -
  • -
  • - 126 -
  • -
  • - some-array-value-from-navigate -
  • -
- -
-
-
-
-
-
-
-
- WP -
-
-
-
-
-
-
-
- Ca -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - arrow_left - - -
-
- 1 -
-
- - - arrow_right - - -
-
-
-
-
-
-
-
-`; - -exports[`navigate to extension page when extension navigates to route without parameters renders 1`] = ` -
-
-
-
-
-
- - - home - - -
-
-
- - - arrow_back - - -
-
-
- - - arrow_forward - - -
-
-
-
-
-
-
-
    -
  • - some-string-value -
  • -
  • - 42 -
  • -
  • - some-array-value,some-other-array-value -
  • -
- -
-
-
-
-
-
-
-
- WP -
-
-
-
-
-
-
-
- Ca -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - arrow_left - - -
-
- 1 -
-
- - - arrow_right - - -
-
-
-
-
-
-
-
-`; - -exports[`navigate to extension page when extension navigates to route without parameters when changing page parameters renders 1`] = ` -
-
-
-
-
-
- - - home - - -
-
-
- - - arrow_back - - -
-
-
- - - arrow_forward - - -
-
-
-
-
-
-
-
    -
  • - some-changed-string-value -
  • -
  • - 84 -
  • -
  • - some-changed-array-value,some-other-changed-array-value -
  • -
- -
-
-
-
-
-
-
-
- WP -
-
-
-
-
-
-
-
- Ca -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - arrow_left - - -
-
- 1 -
-
- - - arrow_right - - -
-
-
-
-
-
-
-
-`; diff --git a/packages/core/src/features/__snapshots__/navigating-between-routes.test.tsx.snap b/packages/core/src/features/__snapshots__/navigating-between-routes.test.tsx.snap deleted file mode 100644 index 91a68cf004..0000000000 --- a/packages/core/src/features/__snapshots__/navigating-between-routes.test.tsx.snap +++ /dev/null @@ -1,446 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`navigating between routes given route with optional path parameters when navigating to route with path parameters renders 1`] = ` -
-
-
-
-
-
- - - home - - -
-
-
- - - arrow_back - - -
-
-
- - - arrow_forward - - -
-
-
-
-
-
-
-        {
-  "someParameter": "some-value",
-  "someOtherParameter": "some-other-value"
-}
-      
-
-
-
-
-
-
-
- WP -
-
-
-
-
-
-
-
- Ca -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - arrow_left - - -
-
- 1 -
-
- - - arrow_right - - -
-
-
-
-
-
-
-
-`; - -exports[`navigating between routes given route without path parameters when navigating to route renders 1`] = ` -
-
-
-
-
-
- - - home - - -
-
-
- - - arrow_back - - -
-
-
- - - arrow_forward - - -
-
-
-
-
-
-
- Some component -
-
-
-
-
-
-
-
- WP -
-
-
-
-
-
-
-
- Ca -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - arrow_left - - -
-
- 1 -
-
- - - arrow_right - - -
-
-
-
-
-
-
-
-`; diff --git a/packages/core/src/features/add-cluster/__snapshots__/navigation-using-application-menu.test.tsx.snap b/packages/core/src/features/add-cluster/__snapshots__/navigation-using-application-menu.test.tsx.snap deleted file mode 100644 index 1b9d75f07f..0000000000 --- a/packages/core/src/features/add-cluster/__snapshots__/navigation-using-application-menu.test.tsx.snap +++ /dev/null @@ -1,651 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`add-cluster - navigation using application menu renders 1`] = ` -
-
-
-
-
-
- - - home - - -
-
-
- - - arrow_back - - -
-
-
- - - arrow_forward - - -
-
-
-
-
-
-
-
- -
-
-

- Welcome to some-product-name! -

-

- To get you started we have auto-detected your clusters in your - - kubeconfig file and added them to the catalog, your centralized - - view for managing all your cloud-native resources. -
-
- If you have any questions or feedback, please join our - - Lens Forums - - . -

- -
-
-
-
-
-
-
-
-
-
-
- WP -
-
-
-
-
-
-
-
- Ca -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - - arrow_left - - -
-
- 1 -
-
- - - arrow_right - - -
-
-
-
-
-
-
-
-`; - -exports[`add-cluster - navigation using application menu when navigating to add cluster using application menu renders 1`] = ` -
-
-
-
-
-
- - - home - - -
-
-
- - - arrow_back - - -
-
-
- - - arrow_forward - - -
-
-
-
-
-
-
-
-
-

- Add Clusters from Kubeconfig -

-

- Clusters added here are - - not - - merged into the - - ~/.kube/config - - file. - - Read more about adding clusters. - -

-
- -
-
-
-
-
-
- -`; - -exports[`cluster/namespaces - edit namespace from new tab when navigating to namespaces when namespaces resolve when clicking the context menu for a namespace when clicking to edit namespace when call for namespace resolves with namespace given clicking the context menu for second namespace, when clicking to edit namespace renders 1`] = ` - -
-
-
-
-
-
- -
- - - close - - -
- Close -
-
-
-
-
-
-
-