From 6e20368cb5950e962105bc47fcb91c5cead2ca5b Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Fri, 4 Nov 2022 07:08:44 -0700 Subject: [PATCH] Release 6.1.15 (#6517) * Release 6.1.15 Signed-off-by: Sebastian Malton * Bump electron from 19.1.2 to 19.1.3 (#6409) Bumps [electron](https://github.com/electron/electron) from 19.1.2 to 19.1.3. - [Release notes](https://github.com/electron/electron/releases) - [Changelog](https://github.com/electron/electron/blob/main/docs/breaking-changes.md) - [Commits](https://github.com/electron/electron/compare/v19.1.2...v19.1.3) --- updated-dependencies: - dependency-name: electron dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Signed-off-by: Sebastian Malton * React on any KubeObjectStore eventsBuffer change, not just length (#6490) Signed-off-by: Jari Kolehmainen Signed-off-by: Jari Kolehmainen * Bump electron from 19.1.3 to 19.1.4 (#6505) Bumps [electron](https://github.com/electron/electron) from 19.1.3 to 19.1.4. - [Release notes](https://github.com/electron/electron/releases) - [Changelog](https://github.com/electron/electron/blob/main/docs/breaking-changes.md) - [Commits](https://github.com/electron/electron/compare/v19.1.3...v19.1.4) --- updated-dependencies: - dependency-name: electron dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fix compute unix shell environment timeout (#6516) Signed-off-by: Jari Kolehmainen Signed-off-by: Jari Kolehmainen * Fix syncing shell environment when using fish (#6502) * Fix syncing shell environment when using fish - Add some better logging for the future Signed-off-by: Sebastian Malton * Add some unit tests to codify assumptions Signed-off-by: Sebastian Malton * Fix timeout Signed-off-by: Sebastian Malton * Update tests Signed-off-by: Sebastian Malton * Fix tests Signed-off-by: Sebastian Malton * Fix handling of '' in env Signed-off-by: Sebastian Malton * Add function description Signed-off-by: Sebastian Malton Signed-off-by: Sebastian Malton * Replace deprecated github actions ::set-output (#6509) * Replace deprecated github actions ::set-output Signed-off-by: Sebastian Malton * Update to newer versions to remove notices Signed-off-by: Sebastian Malton * Fix getting cache dir on windows Signed-off-by: Sebastian Malton Signed-off-by: Sebastian Malton Signed-off-by: Sebastian Malton Signed-off-by: dependabot[bot] Signed-off-by: Jari Kolehmainen Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Jari Kolehmainen --- .github/workflows/add-to-project-board.yaml | 36 +- .github/workflows/check-docs.yml | 4 +- .github/workflows/codeql-analysis.yml | 58 +-- .github/workflows/electronegativity.yml | 4 +- .github/workflows/license-header.yml | 28 +- .github/workflows/linter.yml | 4 +- .github/workflows/main.yml | 10 +- .github/workflows/mkdocs-delete-version.yml | 14 +- .github/workflows/mkdocs-manual.yml | 6 +- .../workflows/mkdocs-set-default-version.yml | 14 +- .github/workflows/publish-master-npm.yml | 4 +- .github/workflows/publish-release-npm.yml | 4 +- .github/workflows/release.yml | 2 +- .github/workflows/require-milestone.yml | 2 +- .github/workflows/test.yml | 9 +- package.json | 8 +- src/common/k8s-api/kube-object.store.ts | 2 +- .../runnables/setup-shell.injectable.ts | 3 +- .../compute-shell-environment.injectable.ts | 29 +- ...mpute-unix-shell-environment.injectable.ts | 145 ++++-- .../compute-unix-shell-environment.test.ts | 493 ++++++++++++++++++ src/main/utils/shell-env/env.injectable.ts | 14 + .../utils/shell-env/execPath.injectable.ts | 14 + yarn.lock | 322 +++--------- 24 files changed, 824 insertions(+), 405 deletions(-) create mode 100644 src/main/utils/shell-env/compute-unix-shell-environment.test.ts create mode 100644 src/main/utils/shell-env/env.injectable.ts create mode 100644 src/main/utils/shell-env/execPath.injectable.ts diff --git a/.github/workflows/add-to-project-board.yaml b/.github/workflows/add-to-project-board.yaml index 8f23cd406c..5ebb3de16e 100644 --- a/.github/workflows/add-to-project-board.yaml +++ b/.github/workflows/add-to-project-board.yaml @@ -13,21 +13,21 @@ jobs: runs-on: ubuntu-latest name: Add Card to Project(s) steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Get Event Type - run: echo $GITHUB_EVENT_NAME - - name: Assign NEW issues to project 1 - uses: ./.github/actions/add-card-to-project - if: github.event_name == 'issues' && github.event.action == 'opened' - with: - project: 'https://github.com/orgs/lensapp/projects/1' - column_name: 'Backlog' - card_position: 'bottom' - - name: Assign NEW pull requests to project 1 - uses: ./.github/actions/add-card-to-project - if: github.event_name == 'pull_request_target' && github.event.action == 'opened' - with: - project: 'https://github.com/orgs/lensapp/projects/1' - column_name: 'PRs' - card_position: 'bottom' + - name: Checkout + uses: actions/checkout@v3 + - name: Get Event Type + run: echo $GITHUB_EVENT_NAME + - name: Assign NEW issues to project 1 + uses: ./.github/actions/add-card-to-project + if: github.event_name == 'issues' && github.event.action == 'opened' + with: + project: "https://github.com/orgs/lensapp/projects/1" + column_name: "Backlog" + card_position: "bottom" + - name: Assign NEW pull requests to project 1 + uses: ./.github/actions/add-card-to-project + if: github.event_name == 'pull_request_target' && github.event.action == 'opened' + with: + project: "https://github.com/orgs/lensapp/projects/1" + column_name: "PRs" + card_position: "bottom" diff --git a/.github/workflows/check-docs.yml b/.github/workflows/check-docs.yml index 7418a86269..defc5f3ca1 100644 --- a/.github/workflows/check-docs.yml +++ b/.github/workflows/check-docs.yml @@ -12,12 +12,12 @@ jobs: node-version: [16.x] steps: - name: Checkout Release from lens - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 - name: Using Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index fc2692be70..e764763208 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -13,12 +13,12 @@ name: "CodeQL" on: push: - branches: [ master ] + branches: [master] pull_request: # The branches below must be a subset of the branches above - branches: [ master ] + branches: [master] schedule: - - cron: '41 3 * * 2' + - cron: "41 3 * * 2" jobs: analyze: @@ -32,40 +32,40 @@ jobs: strategy: fail-fast: false matrix: - language: [ 'javascript' ] + 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@v2 + - name: Checkout repository + uses: actions/checkout@v3 - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - 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 + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + 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@v1 + # 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@v1 - # â„šī¸ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl + # â„šī¸ 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 + # âœī¸ 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 + #- run: | + # make bootstrap + # make release - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/.github/workflows/electronegativity.yml b/.github/workflows/electronegativity.yml index 0cc4340f39..6ba06e2721 100644 --- a/.github/workflows/electronegativity.yml +++ b/.github/workflows/electronegativity.yml @@ -10,9 +10,9 @@ jobs: build_job: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v3 with: node-version: "16" diff --git a/.github/workflows/license-header.yml b/.github/workflows/license-header.yml index 20b0a01d19..2e33292785 100644 --- a/.github/workflows/license-header.yml +++ b/.github/workflows/license-header.yml @@ -11,18 +11,18 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - 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 + - 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" src/**/*.?css + addlicense -check -l mit -c "OpenLens Authors" src/**/*.?css diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index ac7ac673ca..e1b0bac244 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -10,12 +10,12 @@ jobs: node-version: [16.x] steps: - name: Checkout Release from lens - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 - name: Using Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2fa32efc65..949a4463cb 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -23,12 +23,12 @@ jobs: python-version: "3.x" - name: Checkout Release from lens - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 - name: Using Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} @@ -61,7 +61,7 @@ jobs: pip install mike - name: Checkout Release from lens - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -71,7 +71,7 @@ jobs: git config --local user.name "GitHub Action" - name: Using Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} @@ -88,7 +88,7 @@ jobs: - name: Get the release version if: contains(github.ref, 'refs/tags/v') && !github.event.release.prerelease id: get_version - run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//} + 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 diff --git a/.github/workflows/mkdocs-delete-version.yml b/.github/workflows/mkdocs-delete-version.yml index 0183910d8d..a5ff72b8cb 100644 --- a/.github/workflows/mkdocs-delete-version.yml +++ b/.github/workflows/mkdocs-delete-version.yml @@ -13,26 +13,24 @@ jobs: - name: Set up Python 3.7 uses: actions/setup-python@v2 with: - python-version: '3.x' + python-version: "3.x" - name: Install dependencies run: | python -m pip install --upgrade pip pip install git+https://${{ secrets.GH_TOKEN }}@github.com/lensapp/mkdocs-material-insiders.git pip install mike - + - name: Checkout Release from lens - uses: actions/checkout@v2 + 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" - + 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 }} - \ No newline at end of file + mike delete --push ${{ github.event.inputs.version }} diff --git a/.github/workflows/mkdocs-manual.yml b/.github/workflows/mkdocs-manual.yml index 03ec36da46..6ca8def8e4 100644 --- a/.github/workflows/mkdocs-manual.yml +++ b/.github/workflows/mkdocs-manual.yml @@ -25,13 +25,13 @@ jobs: pip install mike - name: Checkout Version from lens - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 ref: "${{ github.event.inputs.version }}" - name: Using Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} @@ -41,7 +41,7 @@ jobs: yarn typedocs-extensions-api - name: Checkout master branch from lens - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: path: "master" ref: "master" diff --git a/.github/workflows/mkdocs-set-default-version.yml b/.github/workflows/mkdocs-set-default-version.yml index 694a7af726..a4bcf5fbb2 100644 --- a/.github/workflows/mkdocs-set-default-version.yml +++ b/.github/workflows/mkdocs-set-default-version.yml @@ -13,26 +13,24 @@ jobs: - name: Set up Python 3.7 uses: actions/setup-python@v2 with: - python-version: '3.x' + python-version: "3.x" - name: Install dependencies run: | python -m pip install --upgrade pip pip install git+https://${{ secrets.GH_TOKEN }}@github.com/lensapp/mkdocs-material-insiders.git pip install mike - + - name: Checkout Release from lens - uses: actions/checkout@v2 + 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" - + 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 }} - \ No newline at end of file + mike set-default --push ${{ github.event.inputs.version }} diff --git a/.github/workflows/publish-master-npm.yml b/.github/workflows/publish-master-npm.yml index 31f86ae6f0..620245dc70 100644 --- a/.github/workflows/publish-master-npm.yml +++ b/.github/workflows/publish-master-npm.yml @@ -17,12 +17,12 @@ jobs: node-version: [16.x] steps: - name: Checkout Release - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 - name: Using Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/publish-release-npm.yml b/.github/workflows/publish-release-npm.yml index becca1f790..0ce928e3d1 100644 --- a/.github/workflows/publish-release-npm.yml +++ b/.github/workflows/publish-release-npm.yml @@ -12,12 +12,12 @@ jobs: node-version: [16.x] steps: - name: Checkout Release - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 - name: Using Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e672db44a0..f66347a93f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ jobs: if: ${{ github.event.pull_request.merged == true && contains(github.event.pull_request.labels.*.name, 'release') }} steps: - name: Checkout Release from lens - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 - uses: butlerlogic/action-autotag@stable diff --git a/.github/workflows/require-milestone.yml b/.github/workflows/require-milestone.yml index 388aa48013..8fc2c28ba2 100644 --- a/.github/workflows/require-milestone.yml +++ b/.github/workflows/require-milestone.yml @@ -6,7 +6,7 @@ jobs: milestone: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - 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') diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 9f50b2c7b3..c9dfbeef2d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -18,7 +18,7 @@ jobs: node-version: [16.x] steps: - name: Checkout Release from lens - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -28,15 +28,16 @@ jobs: 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@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: Get yarn cache directory path id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" + shell: bash + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT - - uses: actions/cache@v2 + - uses: actions/cache@v3 id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} diff --git a/package.json b/package.json index 8a5ee9e9a1..bc6a0921b9 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "productName": "OpenLens", "description": "OpenLens - Open Source IDE for Kubernetes", "homepage": "https://github.com/lensapp/lens", - "version": "6.1.14", + "version": "6.1.15", "main": "static/build/main.js", "copyright": "Š 2022 OpenLens Authors", "license": "MIT", @@ -330,6 +330,7 @@ "@types/lodash": "^4.14.185", "@types/marked": "^4.0.7", "@types/md5-file": "^4.0.2", + "@types/memorystream": "^0.3.0", "@types/mini-css-extract-plugin": "^2.4.0", "@types/mock-fs": "^4.13.1", "@types/node": "^16.11.59", @@ -375,8 +376,8 @@ "css-loader": "^6.7.1", "deepdash": "^5.3.9", "dompurify": "^2.4.0", - "electron": "^19.0.17", - "electron-builder": "^23.3.3", + "electron": "^19.1.4", + "electron-builder": "^23.6.0", "electron-notarize": "^0.3.0", "esbuild": "^0.15.7", "esbuild-loader": "^2.20.0", @@ -399,6 +400,7 @@ "jest-fetch-mock": "^3.0.3", "jest-mock-extended": "^2.0.9", "make-plural": "^6.2.2", + "memorystream": "^0.3.1", "mini-css-extract-plugin": "^2.6.1", "mock-http": "^1.1.0", "node-gyp": "^8.3.0", diff --git a/src/common/k8s-api/kube-object.store.ts b/src/common/k8s-api/kube-object.store.ts index 5412bbc87c..0856176a59 100644 --- a/src/common/k8s-api/kube-object.store.ts +++ b/src/common/k8s-api/kube-object.store.ts @@ -432,7 +432,7 @@ export abstract class KubeObjectStore< protected eventsBuffer = observable.array>([], { deep: false }); protected bindWatchEventsUpdater(delay = 1000) { - reaction(() => this.eventsBuffer.length, this.updateFromEventsBuffer, { + reaction(() => [...this.eventsBuffer], this.updateFromEventsBuffer, { delay, }); } diff --git a/src/main/start-main-application/runnables/setup-shell.injectable.ts b/src/main/start-main-application/runnables/setup-shell.injectable.ts index 9eb736b2db..6f80b225ac 100644 --- a/src/main/start-main-application/runnables/setup-shell.injectable.ts +++ b/src/main/start-main-application/runnables/setup-shell.injectable.ts @@ -55,7 +55,8 @@ const setupShellInjectable = getInjectable({ ...process.env, }; - logger.debug(`[SHELL-SYNC]: Synced shell env, and updating`, env, process.env); + logger.info(`[SHELL-SYNC]: Synced shell env`); + logger.debug(`[SHELL-SYNC]: updated env`, process.env); }, }; }, diff --git a/src/main/utils/shell-env/compute-shell-environment.injectable.ts b/src/main/utils/shell-env/compute-shell-environment.injectable.ts index e3a60fcd03..63eaede181 100644 --- a/src/main/utils/shell-env/compute-shell-environment.injectable.ts +++ b/src/main/utils/shell-env/compute-shell-environment.injectable.ts @@ -6,7 +6,6 @@ import type { AsyncResult } from "../../../common/utils/async-result"; import { getInjectable } from "@ogre-tools/injectable"; import isWindowsInjectable from "../../../common/vars/is-windows.injectable"; -import { disposer } from "../../../common/utils"; import computeUnixShellEnvironmentInjectable from "./compute-unix-shell-environment.injectable"; export type EnvironmentVariables = Partial>; @@ -28,32 +27,24 @@ const computeShellEnvironmentInjectable = getInjectable({ return async (shell) => { const controller = new AbortController(); const shellEnv = computeUnixShellEnvironment(shell, { signal: controller.signal }); - const cleanup = disposer(); - const timeoutHandle = setTimeout(() => controller.abort(), 30_000); - cleanup.push(() => clearTimeout(timeoutHandle)); + const result = await shellEnv; - try { - return { - callWasSuccessful: true, - response: await shellEnv, - }; - } catch (error) { - if (controller.signal.aborted) { - return { - callWasSuccessful: false, - error: "Resolving shell environment is taking very long. Please review your shell configuration.", - }; - } + clearTimeout(timeoutHandle); + if (result.callWasSuccessful) { + return result; + } + + if (controller.signal.aborted) { return { callWasSuccessful: false, - error: String(error), + error: `Resolving shell environment is taking very long. Please review your shell configuration: ${result.error}`, }; - } finally { - cleanup(); } + + return result; }; }, }); diff --git a/src/main/utils/shell-env/compute-unix-shell-environment.injectable.ts b/src/main/utils/shell-env/compute-unix-shell-environment.injectable.ts index b3d3d4abb5..e540c54687 100644 --- a/src/main/utils/shell-env/compute-unix-shell-environment.injectable.ts +++ b/src/main/utils/shell-env/compute-unix-shell-environment.injectable.ts @@ -6,97 +6,154 @@ import type { EnvironmentVariables } from "./compute-shell-environment.injectabl import { getInjectable } from "@ogre-tools/injectable"; import spawnInjectable from "../../child-process/spawn.injectable"; import randomUUIDInjectable from "../../crypto/random-uuid.injectable"; +import loggerInjectable from "../../../common/logger.injectable"; +import processExecPathInjectable from "./execPath.injectable"; +import processEnvInjectable from "./env.injectable"; +import { object } from "../../../common/utils"; +import type { AsyncResult } from "../../../common/utils/async-result"; import { basename } from "path"; export interface UnixShellEnvOptions { - signal?: AbortSignal; + signal: AbortSignal; } -export type ComputeUnixShellEnvironment = (shell: string, opts?: UnixShellEnvOptions) => Promise; +export type ComputeUnixShellEnvironment = (shell: string, opts: UnixShellEnvOptions) => Promise>; + +/** + * @param src The object containing the current environment variables + * @param overrides The environment variables that want to be overridden before passing the env to a child process + * @returns The combination of environment variables and a function which resets an object of environment variables to the values the keys corresponded to in `src` (rather than `overrides`) + */ +const getResetProcessEnv = (src: Partial>, overrides: Partial>): { + resetEnvPairs: (target: Partial>) => void; + env: Partial>; +} => { + const originals = object.entries(overrides).map(([name]) => [name, src[name]] as const); + + return { + env: { + ...src, + ...overrides, + }, + resetEnvPairs: (target) => { + for (const [name, orginalValue] of originals) { + if (typeof orginalValue === "string") { + target[name] = orginalValue; + } else { + delete target[name]; + } + } + }, + }; +}; const computeUnixShellEnvironmentInjectable = getInjectable({ id: "compute-unix-shell-environment", instantiate: (di): ComputeUnixShellEnvironment => { const powerShellName = /^pwsh(-preview)?$/; - const nonBashLikeShellName = /^t?csh$/; + const cshLikeShellName = /^(t?csh)$/; + const fishLikeShellName = /^fish$/; const spawn = di.inject(spawnInjectable); + const logger = di.inject(loggerInjectable); const randomUUID = di.inject(randomUUIDInjectable); + const processExecPath = di.inject(processExecPathInjectable); + const processEnv = di.inject(processEnvInjectable); - const getShellSpecifices = (shellPath: string, mark: string) => { - const shellName = basename(shellPath); + const getShellSpecifices = (shellName: string) => { + const mark = randomUUID().replace(/-/g, ""); + const regex = new RegExp(`${mark}(\\{.*\\})${mark}`); if (powerShellName.test(shellName)) { // Older versions of PowerShell removes double quotes sometimes so we use "double single quotes" which is how // you escape single quotes inside of a single quoted string. return { - command: `Command '${process.execPath}' -p '\\"${mark}\\" + JSON.stringify(process.env) + \\"${mark}\\"'`, + command: `Command '${processExecPath}' -p '\\"${mark}\\" + JSON.stringify(process.env) + \\"${mark}\\"'`, shellArgs: ["-Login"], + regex, }; } - return { - command: `'${process.execPath}' -p '"${mark}" + JSON.stringify(process.env) + "${mark}"'`, - shellArgs: nonBashLikeShellName.test(shellName) - // tcsh and csh don't support any other options when providing the -l (login) shell option - ? ["-l"] - // zsh (at least, maybe others) don't load RC files when in non-interactive mode, even when using -l (login) option - : ["-li"], - }; + let command = `'${processExecPath}' -p '"${mark}" + JSON.stringify(process.env) + "${mark}"'`; + const shellArgs = ["-l"]; + + if (fishLikeShellName.test(shellName)) { + shellArgs.push("-c", command); + command = ""; + } else if (!cshLikeShellName.test(shellName)) { + // zsh (at least, maybe others) don't load RC files when in non-interactive mode, even when using -l (login) option + shellArgs.push("-i"); + } else { + // Some shells don't support any other options when providing the -l (login) shell option + } + + return { command, shellArgs, regex }; }; - return async (shellPath, opts = {}) => { - const runAsNode = process.env["ELECTRON_RUN_AS_NODE"]; - const noAttach = process.env["ELECTRON_NO_ATTACH_CONSOLE"]; - const env = { - ...process.env, + + return async (shellPath, opts) => { + const { resetEnvPairs, env } = getResetProcessEnv(processEnv, { ELECTRON_RUN_AS_NODE: "1", ELECTRON_NO_ATTACH_CONSOLE: "1", - }; - const mark = randomUUID().replace(/-/g, ""); - const regex = new RegExp(`${mark}(\\{.*\\})${mark}`); - const { command, shellArgs } = getShellSpecifices(shellPath, mark); + TERM: "screen-256color-bce", // required for fish + }); + const shellName = basename(shellPath); + const { command, shellArgs, regex } = getShellSpecifices(shellName); - return new Promise((resolve, reject) => { + logger.info(`[UNIX-SHELL-ENV]: running against ${shellPath}`, { command, shellArgs }); + + return new Promise((resolve) => { const shellProcess = spawn(shellPath, shellArgs, { - detached: true, + signal: opts.signal, env, }); const stdout: Buffer[] = []; - - opts.signal?.addEventListener("abort", () => shellProcess.kill()); + const stderr: Buffer[] = []; shellProcess.stdout.on("data", b => stdout.push(b)); + shellProcess.stderr.on("data", b => stderr.push(b)); - shellProcess.on("error", (err) => reject(err)); + shellProcess.on("error", (err) => resolve({ + callWasSuccessful: false, + error: `Failed to spawn ${shellPath}: ${err}`, + })); shellProcess.on("close", (code, signal) => { if (code || signal) { - return reject(new Error(`Unexpected return code from spawned shell (code: ${code}, signal: ${signal})`)); + const context = { + code, + signal, + stdout: Buffer.concat(stdout).toString("utf-8"), + stderr: Buffer.concat(stderr).toString("utf-8"), + }; + + return resolve({ + callWasSuccessful: false, + error: `Shell did not exit sucessfully: ${JSON.stringify(context, null, 4)}`, + }); } try { const rawOutput = Buffer.concat(stdout).toString("utf-8"); + + logger.info(`[UNIX-SHELL-ENV]: got the following output`, { rawOutput }); + const match = regex.exec(rawOutput); const strippedRawOutput = match ? match[1] : "{}"; - const resolvedEnv = JSON.parse(strippedRawOutput); + const resolvedEnv = JSON.parse(strippedRawOutput) as Partial>; - if (runAsNode) { - resolvedEnv["ELECTRON_RUN_AS_NODE"] = runAsNode; - } else { - delete resolvedEnv["ELECTRON_RUN_AS_NODE"]; - } - - if (noAttach) { - resolvedEnv["ELECTRON_NO_ATTACH_CONSOLE"] = noAttach; - } else { - delete resolvedEnv["ELECTRON_NO_ATTACH_CONSOLE"]; - } - - resolve(resolvedEnv); + resetEnvPairs(resolvedEnv); + resolve({ + callWasSuccessful: true, + response: resolvedEnv, + }); } catch (err) { - reject(err); + resolve({ + callWasSuccessful: false, + error: String(err), + }); } }); + shellProcess.stdin.end(command); }); }; diff --git a/src/main/utils/shell-env/compute-unix-shell-environment.test.ts b/src/main/utils/shell-env/compute-unix-shell-environment.test.ts new file mode 100644 index 0000000000..2de7204ae8 --- /dev/null +++ b/src/main/utils/shell-env/compute-unix-shell-environment.test.ts @@ -0,0 +1,493 @@ +/** + * 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 type { ChildProcessWithoutNullStreams } from "child_process"; +import EventEmitter from "events"; +import { flushPromises } from "../../../common/test-utils/flush-promises"; +import type { Spawn } from "../../child-process/spawn.injectable"; +import spawnInjectable from "../../child-process/spawn.injectable"; +import randomUUIDInjectable from "../../crypto/random-uuid.injectable"; +import { getDiForUnitTesting } from "../../getDiForUnitTesting"; +import type { ComputeUnixShellEnvironment } from "./compute-unix-shell-environment.injectable"; +import computeUnixShellEnvironmentInjectable from "./compute-unix-shell-environment.injectable"; +import processEnvInjectable from "./env.injectable"; +import processExecPathInjectable from "./execPath.injectable"; +import MemoryStream from "memorystream"; + +const expectedEnv = { + SOME_ENV_VAR: "some-env-value", + ELECTRON_RUN_AS_NODE: "1", + ELECTRON_NO_ATTACH_CONSOLE: "1", + TERM: "screen-256color-bce", + SOME_THIRD_NON_UNDEFINED_VALUE: "", +}; + +describe("computeUnixShellEnvironment technical tests", () => { + let di: DiContainer; + let computeUnixShellEnvironment: ComputeUnixShellEnvironment; + let spawnMock: jest.MockedFunction; + let shellProcessFake: ChildProcessWithoutNullStreams; + let stdinValue: string; + let shellStdin: MemoryStream; + let shellStdout: MemoryStream; + let shellStderr: MemoryStream; + let unixShellEnv: ReturnType; + + beforeEach(() => { + di = getDiForUnitTesting({ + doGeneralOverrides: true, + }); + + spawnMock = jest.fn().mockImplementation((spawnfile, spawnargs) => { + shellStdin = new MemoryStream(); + shellStdout = new MemoryStream(); + shellStderr = new MemoryStream(); + stdinValue = ""; + + shellStdin.on("data", (chunk) => { + stdinValue += chunk.toString(); + }); + + return shellProcessFake = Object.assign(new EventEmitter(), { + stdin: shellStdin, + stdout: shellStdout, + stderr: shellStderr, + stdio: [ + shellStdin, + shellStdout, + shellStderr, + ] as any, + killed: false, + kill: jest.fn(), + send: jest.fn(), + disconnect: jest.fn(), + unref: jest.fn(), + ref: jest.fn(), + connected: false, + exitCode: null, + signalCode: null, + spawnargs, + spawnfile, + }); + }); + di.override(spawnInjectable, () => spawnMock); + di.override(randomUUIDInjectable, () => () => "deadbeef"); + + di.override(processEnvInjectable, () => ({ + SOME_ENV_VAR: "some-env-value", + TERM: "some-other-value", + SOME_THIRD_NON_UNDEFINED_VALUE: "", + })); + di.override(processExecPathInjectable, () => "/some/process/exec/path"); + + di.unoverride(computeUnixShellEnvironmentInjectable); + di.permitSideEffects(computeUnixShellEnvironmentInjectable); + computeUnixShellEnvironment = di.inject(computeUnixShellEnvironmentInjectable); + }); + + describe.each([ + "/bin/csh", + "/bin/tcsh", + ])("when shell is %s", (shellPath) => { + beforeEach(async () => { + const controller = new AbortController(); + + unixShellEnv = computeUnixShellEnvironment(shellPath, { signal: controller.signal }); + await flushPromises(); + }); + + it("should spawn a process with the correct arguments", () => { + expect(spawnMock).toBeCalledWith( + shellPath, + [ + "-l", + ], + expect.objectContaining({ + env: expectedEnv, + }), + ); + }); + + it("should send the command via stdin", () => { + expect(stdinValue).toBe(`'/some/process/exec/path' -p '"deadbeef" + JSON.stringify(process.env) + "deadbeef"'`); + }); + + it("should close stdin", () => { + expect(shellStdin.readableEnded).toBe(true); + }); + + describe("when process errors", () => { + beforeEach(() => { + shellProcessFake.emit("error", new Error("some-error")); + }); + + it("should resolve with a failed call", async () => { + await expect(unixShellEnv).resolves.toEqual({ + callWasSuccessful: false, + error: `Failed to spawn ${shellPath}: Error: some-error`, + }); + }); + }); + + describe("when process exits with non-zero exit code", () => { + beforeEach(() => { + shellProcessFake.emit("close", 1, null); + }); + + it("should resolve with a failed call", async () => { + await expect(unixShellEnv).resolves.toEqual({ + callWasSuccessful: false, + error: 'Shell did not exit sucessfully: {\n "code": 1,\n "signal": null,\n "stdout": "",\n "stderr": ""\n}', + }); + }); + }); + + describe("when process exits with a signal", () => { + beforeEach(() => { + shellProcessFake.emit("close", 0, "SIGKILL"); + }); + + it("should resolve with a failed call", async () => { + await expect(unixShellEnv).resolves.toEqual({ + callWasSuccessful: false, + error: 'Shell did not exit sucessfully: {\n "code": 0,\n "signal": "SIGKILL",\n "stdout": "",\n "stderr": ""\n}', + }); + }); + }); + + describe("when process stdout emits some data", () => { + beforeEach(() => { + const fakeInnerEnv = { + PATH: "/bin", + ...expectedEnv, + }; + + shellStdout.emit("data", Buffer.from(`some-other-datadeadbeef${JSON.stringify(fakeInnerEnv)}deadbeefsome-third-other-data`)); + }); + + describe("when process successfully exits", () => { + beforeEach(() => { + shellProcessFake.emit("close", 0); + }); + + it("should resolve the env", async () => { + await expect(unixShellEnv).resolves.toEqual({ + callWasSuccessful: true, + response: { + PATH: "/bin", + SOME_ENV_VAR: "some-env-value", + TERM: "some-other-value", + SOME_THIRD_NON_UNDEFINED_VALUE: "", + }, + }); + }); + }); + }); + }); + + describe.each([ + "/bin/bash", + "/bin/sh", + "/bin/zsh", + ])("when shell is %s", (shellPath) => { + beforeEach(async () => { + const controller = new AbortController(); + + unixShellEnv = computeUnixShellEnvironment(shellPath, { signal: controller.signal }); + await flushPromises(); + }); + + it("should spawn a process with the correct arguments", () => { + expect(spawnMock).toBeCalledWith( + shellPath, + [ + "-l", + "-i", + ], + expect.objectContaining({ + env: expectedEnv, + }), + ); + }); + + it("should send the command via stdin", () => { + expect(stdinValue).toBe(`'/some/process/exec/path' -p '"deadbeef" + JSON.stringify(process.env) + "deadbeef"'`); + }); + + it("should close stdin", () => { + expect(shellStdin.readableEnded).toBe(true); + }); + + describe("when process errors", () => { + beforeEach(() => { + shellProcessFake.emit("error", new Error("some-error")); + }); + + it("should resolve with a failed call", async () => { + await expect(unixShellEnv).resolves.toEqual({ + callWasSuccessful: false, + error: `Failed to spawn ${shellPath}: Error: some-error`, + }); + }); + }); + + describe("when process exits with non-zero exit code", () => { + beforeEach(() => { + shellProcessFake.emit("close", 1, null); + }); + + it("should resolve with a failed call", async () => { + await expect(unixShellEnv).resolves.toEqual({ + callWasSuccessful: false, + error: 'Shell did not exit sucessfully: {\n "code": 1,\n "signal": null,\n "stdout": "",\n "stderr": ""\n}', + }); + }); + }); + + describe("when process exits with a signal", () => { + beforeEach(() => { + shellProcessFake.emit("close", 0, "SIGKILL"); + }); + + it("should resolve with a failed call", async () => { + await expect(unixShellEnv).resolves.toEqual({ + callWasSuccessful: false, + error: 'Shell did not exit sucessfully: {\n "code": 0,\n "signal": "SIGKILL",\n "stdout": "",\n "stderr": ""\n}', + }); + }); + }); + + describe("when process stdout emits some data", () => { + beforeEach(() => { + const fakeInnerEnv = { + PATH: "/bin", + ...expectedEnv, + }; + + shellStdout.emit("data", Buffer.from(`some-other-datadeadbeef${JSON.stringify(fakeInnerEnv)}deadbeefsome-third-other-data`)); + }); + + describe("when process successfully exits", () => { + beforeEach(() => { + shellProcessFake.emit("close", 0); + }); + + it("should resolve the env", async () => { + await expect(unixShellEnv).resolves.toEqual({ + callWasSuccessful: true, + response: { + PATH: "/bin", + SOME_ENV_VAR: "some-env-value", + TERM: "some-other-value", + SOME_THIRD_NON_UNDEFINED_VALUE: "", + }, + }); + }); + }); + }); + }); + + describe.each([ + "/usr/local/bin/fish", + ])("when shell is %s", (shellPath) => { + beforeEach(async () => { + const controller = new AbortController(); + + unixShellEnv = computeUnixShellEnvironment(shellPath, { signal: controller.signal }); + await flushPromises(); + }); + + it("should spawn a process with the correct arguments", () => { + expect(spawnMock).toBeCalledWith( + shellPath, + [ + "-l", + "-c", + `'/some/process/exec/path' -p '"deadbeef" + JSON.stringify(process.env) + "deadbeef"'`, + ], + expect.objectContaining({ + env: expectedEnv, + }), + ); + }); + + it("should not send anything via stdin", () => { + expect(stdinValue).toBe(""); + }); + + it("should close stdin", () => { + expect(shellStdin.readableEnded).toBe(true); + }); + + describe("when process errors", () => { + beforeEach(() => { + shellProcessFake.emit("error", new Error("some-error")); + }); + + it("should resolve with a failed call", async () => { + await expect(unixShellEnv).resolves.toEqual({ + callWasSuccessful: false, + error: `Failed to spawn ${shellPath}: Error: some-error`, + }); + }); + }); + + describe("when process exits with non-zero exit code", () => { + beforeEach(() => { + shellProcessFake.emit("close", 1, null); + }); + + it("should resolve with a failed call", async () => { + await expect(unixShellEnv).resolves.toEqual({ + callWasSuccessful: false, + error: 'Shell did not exit sucessfully: {\n "code": 1,\n "signal": null,\n "stdout": "",\n "stderr": ""\n}', + }); + }); + }); + + describe("when process exits with a signal", () => { + beforeEach(() => { + shellProcessFake.emit("close", 0, "SIGKILL"); + }); + + it("should resolve with a failed call", async () => { + await expect(unixShellEnv).resolves.toEqual({ + callWasSuccessful: false, + error: 'Shell did not exit sucessfully: {\n "code": 0,\n "signal": "SIGKILL",\n "stdout": "",\n "stderr": ""\n}', + }); + }); + }); + + describe("when process stdout emits some data", () => { + beforeEach(() => { + const fakeInnerEnv = { + PATH: "/bin", + ...expectedEnv, + }; + + shellStdout.emit("data", Buffer.from(`some-other-datadeadbeef${JSON.stringify(fakeInnerEnv)}deadbeefsome-third-other-data`)); + }); + + describe("when process successfully exits", () => { + beforeEach(() => { + shellProcessFake.emit("close", 0); + }); + + it("should resolve the env", async () => { + await expect(unixShellEnv).resolves.toEqual({ + callWasSuccessful: true, + response: { + PATH: "/bin", + SOME_ENV_VAR: "some-env-value", + TERM: "some-other-value", + SOME_THIRD_NON_UNDEFINED_VALUE: "", + }, + }); + }); + }); + }); + }); + + describe.each([ + "/usr/local/bin/pwsh", + "/usr/local/bin/pwsh-preview", + ])("when shell is %s", (shellPath) => { + beforeEach(async () => { + const controller = new AbortController(); + + unixShellEnv = computeUnixShellEnvironment(shellPath, { signal: controller.signal }); + await flushPromises(); + }); + + it("should spawn a process with the correct arguments", () => { + expect(spawnMock).toBeCalledWith( + shellPath, + [ + "-Login", + ], + expect.objectContaining({ + env: expectedEnv, + }), + ); + }); + + it("should send the command via stdin", () => { + expect(stdinValue).toBe(`Command '/some/process/exec/path' -p '\\"deadbeef\\" + JSON.stringify(process.env) + \\"deadbeef\\"'`); + }); + + it("should close stdin", () => { + expect(shellStdin.readableEnded).toBe(true); + }); + + describe("when process errors", () => { + beforeEach(() => { + shellProcessFake.emit("error", new Error("some-error")); + }); + + it("should resolve with a failed call", async () => { + await expect(unixShellEnv).resolves.toEqual({ + callWasSuccessful: false, + error: `Failed to spawn ${shellPath}: Error: some-error`, + }); + }); + }); + + describe("when process exits with non-zero exit code", () => { + beforeEach(() => { + shellProcessFake.emit("close", 1, null); + }); + + it("should resolve with a failed call", async () => { + await expect(unixShellEnv).resolves.toEqual({ + callWasSuccessful: false, + error: 'Shell did not exit sucessfully: {\n "code": 1,\n "signal": null,\n "stdout": "",\n "stderr": ""\n}', + }); + }); + }); + + describe("when process exits with a signal", () => { + beforeEach(() => { + shellProcessFake.emit("close", 0, "SIGKILL"); + }); + + it("should resolve with a failed call", async () => { + await expect(unixShellEnv).resolves.toEqual({ + callWasSuccessful: false, + error: 'Shell did not exit sucessfully: {\n "code": 0,\n "signal": "SIGKILL",\n "stdout": "",\n "stderr": ""\n}', + }); + }); + }); + + describe("when process stdout emits some data", () => { + beforeEach(() => { + const fakeInnerEnv = { + PATH: "/bin", + ...expectedEnv, + }; + + shellStdout.emit("data", Buffer.from(`some-other-datadeadbeef${JSON.stringify(fakeInnerEnv)}deadbeefsome-third-other-data`)); + }); + + describe("when process successfully exits", () => { + beforeEach(() => { + shellProcessFake.emit("close", 0); + }); + + it("should resolve the env", async () => { + await expect(unixShellEnv).resolves.toEqual({ + callWasSuccessful: true, + response: { + PATH: "/bin", + SOME_ENV_VAR: "some-env-value", + TERM: "some-other-value", + SOME_THIRD_NON_UNDEFINED_VALUE: "", + }, + }); + }); + }); + }); + }); +}); diff --git a/src/main/utils/shell-env/env.injectable.ts b/src/main/utils/shell-env/env.injectable.ts new file mode 100644 index 0000000000..e9c359354f --- /dev/null +++ b/src/main/utils/shell-env/env.injectable.ts @@ -0,0 +1,14 @@ +/** + * Copyright (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 process from "process"; + +const processEnvInjectable = getInjectable({ + id: "process-env", + instantiate: () => process.env, + causesSideEffects: true, +}); + +export default processEnvInjectable; diff --git a/src/main/utils/shell-env/execPath.injectable.ts b/src/main/utils/shell-env/execPath.injectable.ts new file mode 100644 index 0000000000..75ad886a29 --- /dev/null +++ b/src/main/utils/shell-env/execPath.injectable.ts @@ -0,0 +1,14 @@ +/** + * Copyright (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 process from "process"; + +const processExecPathInjectable = getInjectable({ + id: "process-exec-path", + instantiate: () => process.execPath, + causesSideEffects: true, +}); + +export default processExecPathInjectable; diff --git a/yarn.lock b/yarn.lock index 61f770d8ae..755ad9479c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2228,6 +2228,13 @@ resolved "https://registry.yarnpkg.com/@types/md5-file/-/md5-file-4.0.2.tgz#c7241e88f4aa17218c774befb0fc34f33f21fe36" integrity sha512-8gacRfEqLrmZ6KofpFfxyjsm/LYepeWUWUJGaf5A9W9J5B2/dRZMdkDqFDL6YDa9IweH12IO76jO7mpsK2B3wg== +"@types/memorystream@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@types/memorystream/-/memorystream-0.3.0.tgz#7616df4c42a479805d052a058d990b879d5e368f" + integrity sha512-gzh6mqZcLryYHn4g2MuMWjo9J1+Py/XYwITyZmUxV7ZoBIi7bTbBgSiuC5tcm3UL3gmaiYssQFDlXr/3fK94cw== + dependencies: + "@types/node" "*" + "@types/mime@^1": version "1.3.2" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" @@ -3102,13 +3109,6 @@ ajv@^8.0.0, ajv@^8.8.0: require-from-string "^2.0.2" uri-js "^4.2.2" -ansi-align@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" - integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== - dependencies: - string-width "^4.1.0" - ansi-escapes@^4.2.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -3190,10 +3190,10 @@ app-builder-bin@4.0.0: resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0" integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA== -app-builder-lib@23.3.3: - version "23.3.3" - resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-23.3.3.tgz#78b9dbb0bd8a69842461edd77a3226d0547c5939" - integrity sha512-m0+M53+HYMzqKxwNQZT143K7WwXEGUy9LY31l8dJphXx2P/FQod615mVbxHyqbDCG4J5bHdWm21qZ0e2DVY6CQ== +app-builder-lib@23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-23.6.0.tgz#03cade02838c077db99d86212d61c5fc1d6da1a8" + integrity sha512-dQYDuqm/rmy8GSCE6Xl/3ShJg6Ab4bZJMT8KaTKGzT436gl1DN4REP3FCWfXoh75qGTJ+u+WsdnnpO9Jl8nyMA== dependencies: "7zip-bin" "~5.1.1" "@develar/schema-utils" "~2.6.5" @@ -3201,13 +3201,13 @@ app-builder-lib@23.3.3: "@malept/flatpak-bundler" "^0.4.0" async-exit-hook "^2.0.1" bluebird-lst "^1.0.9" - builder-util "23.3.3" - builder-util-runtime "9.0.3" + 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.3.3" + electron-publish "23.6.0" form-data "^4.0.0" fs-extra "^10.1.0" hosted-git-info "^4.1.0" @@ -3613,20 +3613,6 @@ boolean@^3.0.1: resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b" integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== -boxen@^5.0.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" - integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^6.2.0" - chalk "^4.1.0" - cli-boxes "^2.2.1" - string-width "^4.2.2" - type-fest "^0.20.2" - widest-line "^3.1.0" - wrap-ansi "^7.0.0" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -3728,25 +3714,25 @@ builder-util-runtime@8.9.2: debug "^4.3.2" sax "^1.2.4" -builder-util-runtime@9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.0.3.tgz#6c62c493ba2b73c2af92432db4013b5a327f02b2" - integrity sha512-SfG2wnyjpUbbdtpnqDpWwklujofC6GarGpvdWrEkg9p5AD/xJmTF2buTNaqs3qtsNBEVQDDjZz9xc2GGpVyMfA== +builder-util-runtime@9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.1.1.tgz#2da7b34e78a64ad14ccd070d6eed4662d893bd60" + integrity sha512-azRhYLEoDvRDR8Dhis4JatELC/jUvYjm4cVSj7n9dauGTOM2eeNn9KS0z6YA6oDsjI1xphjNbY6PZZeHPzzqaw== dependencies: debug "^4.3.4" sax "^1.2.4" -builder-util@23.3.3: - version "23.3.3" - resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-23.3.3.tgz#449ee57ec1ffc7e59f7a3a8a1a33d25cf5e39e43" - integrity sha512-MJZlUiq2PY5hjYv9+XNaoYdsITqvLgRDoHSFg/4nzpInbNxNjLQOolL04Zsyp+hgfcbFvMC4h0KkR1CMPHLWbA== +builder-util@23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-23.6.0.tgz#1880ec6da7da3fd6fa19b8bd71df7f39e8d17dd9" + integrity sha512-QiQHweYsh8o+U/KNCZFSvISRnvRctb8m/2rB2I1JdByzvNKxPeFLlHFRPQRXab6aYeXc18j9LpsDLJ3sGQmWTQ== dependencies: "7zip-bin" "~5.1.1" "@types/debug" "^4.1.6" "@types/fs-extra" "^9.0.11" app-builder-bin "4.0.0" bluebird-lst "^1.0.9" - builder-util-runtime "9.0.3" + builder-util-runtime "9.1.1" chalk "^4.1.1" cross-spawn "^7.0.3" debug "^4.3.4" @@ -4010,11 +3996,6 @@ chromium-pickle-js@^0.2.0: resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" integrity sha1-BKEGZywYsIWrd02YPfo+oTjyIgU= -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - ci-info@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" @@ -4056,11 +4037,6 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -cli-boxes@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - cli-columns@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cli-columns/-/cli-columns-4.0.0.tgz#9fe4d65975238d55218c41bd2ed296a7fa555646" @@ -4114,6 +4090,15 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + 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" + clone-deep@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" @@ -4394,18 +4379,6 @@ config-chain@^1.1.11: ini "^1.3.4" proto-list "~1.2.1" -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== - dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" - connect-history-api-fallback@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" @@ -4950,14 +4923,14 @@ dlv@^1.1.3: resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== -dmg-builder@23.3.3: - version "23.3.3" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-23.3.3.tgz#b37547f8403c3e9f7c60265a93d902f5b0c395ea" - integrity sha512-ECwAjt+ZWyOvddrkDx1xRD6IVUCZb5SV6vSMHZd+Va3G2sUXHrnglR1cGDKRF4oYRQm8SYVrpLZKbi8npyDcAQ== +dmg-builder@23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-23.6.0.tgz#d39d3871bce996f16c07d2cafe922d6ecbb2a948" + integrity sha512-jFZvY1JohyHarIAlTbfQOk+HnceGjjAdFjVn3n8xlDWKsYNqbO4muca6qXEZTfGXeQMG7TYim6CeS5XKSfSsGA== dependencies: - app-builder-lib "23.3.3" - builder-util "23.3.3" - builder-util-runtime "9.0.3" + 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" @@ -5138,23 +5111,23 @@ ejs@^3.1.7: dependencies: jake "^10.8.5" -electron-builder@^23.3.3: - version "23.3.3" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-23.3.3.tgz#88d4e584a99b9e36ca4e8432b1163a1ef877355f" - integrity sha512-mFYYdhoFPKevP6y5uaaF3dusmB2OtQ/HnwwpyOePeU7QDS0SEIAUokQsHUanAiJAZcBqtY7iyLBgX18QybdFFw== +electron-builder@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-23.6.0.tgz#c79050cbdce90ed96c5feb67c34e9e0a21b5331b" + integrity sha512-y8D4zO+HXGCNxFBV/JlyhFnoQ0Y0K7/sFH+XwIbj47pqaW8S6PGYQbjoObolKBR1ddQFPt4rwp4CnwMJrW3HAw== dependencies: "@types/yargs" "^17.0.1" - app-builder-lib "23.3.3" - builder-util "23.3.3" - builder-util-runtime "9.0.3" + app-builder-lib "23.6.0" + builder-util "23.6.0" + builder-util-runtime "9.1.1" chalk "^4.1.1" - dmg-builder "23.3.3" + 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" - update-notifier "^5.1.0" - yargs "^17.0.1" + simple-update-notifier "^1.0.7" + yargs "^17.5.1" electron-devtools-installer@^3.2.0: version "3.2.0" @@ -5186,14 +5159,14 @@ electron-osx-sign@^0.6.0: minimist "^1.2.0" plist "^3.0.1" -electron-publish@23.3.3: - version "23.3.3" - resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-23.3.3.tgz#c4125fbb00620acb854f6e994fd3ab3115662ddd" - integrity sha512-1dX17eE5xVXedTxjC+gjsP74oC0+sIHgqysp0ryTlF9+yfQUyXjBk6kcK+zhtBA2SsHMSglDtM+JPxDD/WpPTQ== +electron-publish@23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-23.6.0.tgz#ac9b469e0b07752eb89357dd660e5fb10b3d1ce9" + integrity sha512-jPj3y+eIZQJF/+t5SLvsI5eS4mazCbNYqatv5JihbqOstIM13k0d1Z3vAWntvtt13Itl61SO6seicWdioOU5dg== dependencies: "@types/fs-extra" "^9.0.11" - builder-util "23.3.3" - builder-util-runtime "9.0.3" + 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" @@ -5226,10 +5199,10 @@ electron-window-state@^5.0.3: jsonfile "^4.0.0" mkdirp "^0.5.1" -electron@^19.0.17: - version "19.0.17" - resolved "https://registry.yarnpkg.com/electron/-/electron-19.0.17.tgz#850d806e88b1ef141b88b491dc41661778691c27" - integrity sha512-3Offu61K+d19EZIc76MhKRsSCqfe3jDiqtD0p8jXr6p/TW7+7/jOQp407ZaZu0nQN6/xDIEi2sP4XQBom6GjTQ== +electron@^19.1.4: + version "19.1.4" + resolved "https://registry.yarnpkg.com/electron/-/electron-19.1.4.tgz#545a23061746ea0d031c622d2b11f9f25aaba72e" + integrity sha512-eOjkxgnQr90Ti7a5BWSUorkDkbwuRZZ4QnHg8LvvWapVWKhVhtaTF26mX1HpS+MGMzlRZtUmdW/d495BnYbu1g== dependencies: "@electron/get" "^1.14.1" "@types/node" "^16.11.26" @@ -5542,11 +5515,6 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-goat@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" - integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== - escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -6480,13 +6448,6 @@ global-agent@^3.0.0: semver "^7.3.2" serialize-error "^7.0.1" -global-dirs@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" - integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== - dependencies: - ini "2.0.0" - global-tunnel-ng@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f" @@ -6690,11 +6651,6 @@ has-unicode@^2.0.1: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= -has-yarn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" - integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== - has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" @@ -7027,11 +6983,6 @@ import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= - import-local@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" @@ -7078,11 +7029,6 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - ini@^1.3.4, ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" @@ -7206,13 +7152,6 @@ is-callable@^1.1.4, is-callable@^1.2.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - is-ci@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" @@ -7305,14 +7244,6 @@ is-in-browser@^1.0.2, is-in-browser@^1.1.3: resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= -is-installed-globally@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" - integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== - dependencies: - global-dirs "^3.0.0" - is-path-inside "^3.0.2" - is-lambda@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" @@ -7323,11 +7254,6 @@ is-negative-zero@^2.0.2: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== -is-npm@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" - integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== - is-number-object@^1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" @@ -7423,7 +7349,7 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -7452,11 +7378,6 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== - is2@^2.0.6: version "2.0.7" resolved "https://registry.yarnpkg.com/is2/-/is2-2.0.7.tgz#d084e10cab3bd45d6c9dfde7a48599fcbb93fcac" @@ -8341,13 +8262,6 @@ kuler@^2.0.0: resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== -latest-version@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== - dependencies: - package-json "^6.3.0" - lazy-cache@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" @@ -8892,6 +8806,11 @@ memfs@^3.1.2, memfs@^3.4.1: resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -9921,16 +9840,6 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -package-json@^6.3.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== - dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" - pacote@^13.0.3, pacote@^13.6.1, pacote@^13.6.2: version "13.6.2" resolved "https://registry.yarnpkg.com/pacote/-/pacote-13.6.2.tgz#0d444ba3618ab3e5cd330b451c22967bbd0ca48a" @@ -10505,13 +10414,6 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -pupa@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" - integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== - dependencies: - escape-goat "^2.0.0" - q@^1.0.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -10600,7 +10502,7 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.2.7, rc@^1.2.8: +rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -10902,20 +10804,6 @@ regexpp@^3.2.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== -registry-auth-token@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" - integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== - dependencies: - rc "^1.2.8" - -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== - dependencies: - rc "^1.2.8" - relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" @@ -11280,13 +11168,6 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== - dependencies: - semver "^6.3.0" - semver@^5.6.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -11808,7 +11689,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -12484,13 +12365,6 @@ typed-regex@^0.0.8: resolved "https://registry.yarnpkg.com/typed-regex/-/typed-regex-0.0.8.tgz#e791c5e069dfe4af0fd0e1413891f20553be57a1" integrity sha512-1XkGm1T/rUngbFROIOw9wPnMAKeMsRoc+c9O6GwOHz6aH/FrJFtcyd2sHASbT0OXeGLot5N1shPNpwHGTv9RdQ== -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -12640,26 +12514,6 @@ unzip-crx-3@^0.2.0: mkdirp "^0.5.1" yaku "^0.16.6" -update-notifier@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" - integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== - dependencies: - boxen "^5.0.0" - chalk "^4.1.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" - is-installed-globally "^0.4.0" - is-npm "^5.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.1.0" - pupa "^2.1.1" - semver "^7.3.4" - semver-diff "^3.1.1" - xdg-basedir "^4.0.0" - uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -13097,13 +12951,6 @@ wide-align@^1.1.5: dependencies: string-width "^1.0.2 || 2 || 3 || 4" -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - wildcard@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" @@ -13186,16 +13033,6 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - write-file-atomic@^4.0.0, write-file-atomic@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" @@ -13214,11 +13051,6 @@ ws@^8.2.3, ws@^8.4.2, ws@^8.8.1: resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.1.tgz#5dbad0feb7ade8ecc99b830c1d77c913d4955ff0" integrity sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA== -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== - xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" @@ -13296,7 +13128,12 @@ yargs-parser@^21.0.0: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== -yargs@^17.0.1, yargs@^17.3.1: +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.3.1: version "17.5.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== @@ -13309,6 +13146,19 @@ yargs@^17.0.1, yargs@^17.3.1: y18n "^5.0.5" yargs-parser "^21.0.0" +yargs@^17.5.1: + version "17.6.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" + integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== + 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" + yauzl@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"